对牛乱弹琴

人无远虑,必有近忧

子类化控件

今天用到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;
}


阅读更多
文章标签: 子类化
个人分类: C++
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭