您的位置:首页 > 其它

子类化实现DialogBox中Edit控件的WM_CHAR消息

2009-06-10 09:22 387 查看
这两天用Win32SDK重新实现一次MyWowToc,目的就是实践一下SDK编程的学习成果,这下严重体会到了在GUI方面Delphi对Win32的封装技术真是太强大了,为啥子现在才学SDK呢,主要为了后面搞DDK相关的东东。接着说主题吧,MyWowToc主要就是为 模仿wowtoc1.41,模仿就得像点吧,人家在Interface Version文本框中是不能输入除数字外的其它字符的,虽然将EDIT样式设为ES_NUMBER即可,但是这里主要为了熟悉SDK开发过程,况且以后可能会有其它的字符控制要求,这就想用WM_CHAR消息来自己控制EIDT中的输入,这个在Delphi、VC#和VC中都是很容易实现的,VC麻烦点,那也就是继承一下CEDIT类然后处理onChar函数就行了。可是我现在做的主窗口是DialogBox,这家伙的窗口处理过程不能响应WM_KEYDOWN、WM_CHAR等几个和输入焦点有关的消息。用GG搜索了好多网页,可能关键字不对都没有找到解决方案,最后在看雪论坛有位高人提到用子类化可以解决,但是没有给出具体的方案来,最后搜索到一遍文章,名为“关于MFC子类化(SubClassWindow)”,看过以后,茅塞顿开啊,原来这么简单。。直接上实例代码吧 容易理解。
#include <windows.h>
WNDPROC wpOrigEditProc;
//处理对话框消息
BOOL CALLBACK DialogProc(HWND hdlg,UINT message,WPARAM wParam,LPARAM lParam);
//处理自定义EDIT控件消息
LRESULT CALLBACK EditProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam);
//入口函数
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
//显示对话框
DialogBox(NULL,(LPCTSTR)IDD_DIALOG,NULL,(DLGPROC) DialogProc);
return 0;
}
BOOL CALLBACK DialogProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)
{
//用于保存EDIT控件的句柄
HWND hwndEdit=NULL;
switch (message)
{
case WM_COMMAND:
//根据文本框中的字符数,控制另一个按钮的状态,字符为5时按钮可用,否则不可用
if(HIWORD (wParam) == EN_CHANGE&&LOWORD(wParam)==IDC_ADDONVER_EDIT)
{

if ((int)SendMessage((HWND)lParam,EM_LINELENGTH,-1,0)==5)
{
EnableWindow(hWnd,TRUE);

}
else
{
EnableWindow(hWnd,FALSE);
}
}
case WM_INITDIALOG:
//取得EDIT控件的句柄
hwndEdit=GetDlgItem(hDlg,IDC_ADDONVER_EDIT);
//实现子类化,具体参数说明请查MSDN
wpOrigEditProc = (WNDPROC) SetWindowLong(hwndEdit,GWL_WNDPROC,(LONG) EditProc);
break;
case WM_DESTROY:
SetWindowLong(hwndEdit, GWL_WNDPROC,(LONG) wpOrigEditProc);
break;
case WM_CLOSE:
EndDialog(hDlg,0);
return 1;
default:
return 0;
}
return 0;
}
LRESULT CALLBACK EditProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
//这里就是一直希望可以自己处理的WM_CHAR消息了,0-9和BackSpace键放行
if (uMsg==WM_CHAR)
{
if(!(wParam<='9'&&wParam>='0'))
{
if(!(wParam==VK_BACK))
return 0;
}

}
//调用原来的默认消息处理函数,和DefWindowProc意思一样
return CallWindowProc(wpOrigEditProc, hWnd, uMsg,wParam, lParam);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: