我试着子类化处理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; }