子类化的例子

 #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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值