子类化控件

本文详细介绍了如何在Win32程序中解决IP Address Control控件无法处理鼠标右键粘贴和Ctrl+V功能的问题,通过子类化窗口过程来实现对WM_PASTE和WM_RBUTTONDOWN消息的处理。提供了具体的代码示例,包括如何修改默认的Edit、Static窗口过程,以实现对非数字字符的限制和超级链接的交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天用到IP Address Control,使用时发现,如果用在MFC程序里面,他会自动判断输入是否合法,
但如果是Win32程序,他只能禁止输入字母,不能处理鼠标右键粘贴功能和“Ctrl+V”功能,

我试着子类化处理WM_PASTE和WM_RBUTTONDOWN消息,但发现Edit控件可以用这个办法,IP Address Control处理不了这两个消息。


现在还是不知道IP Address Control这个控件如何处理,后续弄明白了在来更新,先记录一下如何子类化Edit,代码如下(转载):



#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、付费专栏及课程。

余额充值