用戶登錄  |  用戶注冊
首 頁源碼下載網絡學院最新源碼源碼排行屏蔽廣告
當前位置:新興網絡 > 網絡學院 > 編程開發 > C/C++

VC++ 對指定控件進行子類化操作

減小字體 增大字體 作者:佚名  來源:本站整理  發布時間:2011-03-03 13:21:20

VC++ 對指定控件進行子類化操作,以下實例演示了通過子類化限制文本框只能輸入浮點數以及實現Static 的超鏈接效果。

C/C++ code復制代碼
#include <windows.h>
#include "resource.h"

// 手型光標的資源定義
#ifndef IDC_HAND
#define IDC_HAND MAKEINTRESOURCE(32649)
#endif

// 全局變量,用于保存默認的Edit、Static窗口過程以便子類化窗口調用
WNDPROC EditProc, StaticProc;

// 浮點數輸入框的子類化窗口過程
LRESULT CALLBACK ProcFloat(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
  // 不允許數字、小數點、退格之外的任何輸入
  if (Msg == WM_CHAR && wParam != '.' && (wParam <= '0' || wParam >= '9') && wParam != VK_BACK)
  {
    // 發出聲音表示警告
    MessageBeep(MB_OK);
    return 0;
  }
  else
    // 如果是其它消息,則調用原有的窗口過程
    return CallWindowProc(EditProc, hWnd, Msg, wParam, lParam);
}

// 超級鏈接的子類化窗口過程
LRESULT CALLBACK ProcLink(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
  switch (Msg)
  {
  case WM_SETCURSOR:
    // 當鼠標移至鏈接上時,改變光標
    SetCursor(LoadCursor(NULL, IDC_HAND));
    break;
  case WM_LBUTTONDOWN:
    // 打開鏈接
    ShellExecute(NULL, "open", "http://home.ncust.edu.cn/~titilima", NULL, NULL, SW_SHOWNORMAL);
    break;
  default:
    // 如果是其它消息,則調用原有的窗口過程
    return CallWindowProc(StaticProc, hWnd, Msg, wParam, lParam);
  }
  return 0;
}

// 主窗口對話框窗口過程
LRESULT CALLBACK ProcMain(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
{
  switch (Msg)
  {
  case WM_INITDIALOG:
    // 進行子類化,保存原窗口過程
    EditProc = (WNDPROC)SetWindowLong(GetDlgItem(hDlg, IDC_EDIT), GWL_WNDPROC, (LONG)ProcFloat);
    StaticProc = (WNDPROC)SetWindowLong(GetDlgItem(hDlg, IDC_ST_HOMEPAGE), GWL_WNDPROC, (LONG)ProcLink);
    break;
  case WM_CLOSE:
    // 最小化
    ShowWindow(hDlg, SW_MINIMIZE);
    break;
  case WM_COMMAND:
    // 退出
    if (LOWORD(wParam) == IDC_BTN_EXIT)
      EndDialog(hDlg, 0);
    break;
  case WM_CTLCOLORSTATIC:
    // 改變超級鏈接的顏色
    if (GetDlgItem(hDlg, IDC_ST_HOMEPAGE) == (HWND)lParam)
    {
      // 設置文本顏色
      SetTextColor((HDC)wParam, 0xff0000);
      // 設置背景模式為透明
      SetBkMode((HDC)wParam, TRANSPARENT);
      // 返回DC的畫刷
      return (LRESULT)CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
    }
    break;
  case WM_DESTROY:
    // 退出處理
    PostQuitMessage(0);
    break;
  }
  return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
  // 顯示主窗口對話框
  DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_DIALOG), NULL, (DLGPROC)ProcMain, 0);
  return 0;
}
附件下載.rar

Tags:VC++ 子類化 控件

作者:佚名
  • 好的評價 如果您覺得此文章好,就請您
      100%(3)
  • 差的評價 如果您覺得此文章差,就請您
      0%(0)

網絡學院評論評論內容只代表網友觀點,與本站立場無關!

   評論摘要(共 1 條,得分 100 分,平均 100 分) 查看完整評論
[回復] 1dsa是   打分:100 分  發表時間:2017-04-07
· sdas范德薩
美国百家乐注册 体彩新11选5任选8 中彩网双色球中奖号码分布图 官方36棋牌游戏大厅 海盗大亨5种什么赚钱 董欣纯天然护肤品怎样赚钱 江西多乐彩任五最大遗漏 北京11选5开奖结果走势图 36棋牌游戏大厅下载手机版 竞彩足球微信 股票融资费用ˉ杨方配资 选号投注单式投注记录 1月陕西十一选五走势图 河南快赢481怎么下载 浙江十一选五开奖走势图 天天乐棋牌游戏官网 澳洲幸运8开奖现场