码迷,mamicode.com
首页 > Windows程序 > 详细

Win32 Dialog对话框处理WM_KEYDOWN事件

时间:2014-12-10 14:16:45      阅读:562      评论:0      收藏:0      [点我收藏+]

标签:对话框   win32   wm_keydown事件   tab方向键处理   

MFC中重写虚函数PreTranslateMessage里是可以过滤WM_KEYDOWN消息的。但是如果是Win32 SDK中利用DialogBox/DialogBoxParam创建模态对话框一般行为是不处理WM_KEYDOWN消息的。如果该对话框中没有任何的子控件的话,在对话框的窗口回调函数DlgProc()中是可以过滤到WM_KEYDOWN消息的,不过并不是所有的键的消息都可以捕获到,例如像Tab键,上下左右方向键VK_UP/VK_DOWN/VK_LEFT/VK_RIGHT等都没有办法捕获到。

如果该模态对话框中有子控件,哪怕是一个static静态文本控件的话,这个时候对话框的窗口回调函数中就无法获取任何的WM_KEYDOWN消息了。
所以模态对话框在没有任何子控件的情况下想要处理Tab键/VK_UP/Down/Left/Rigth键的话,可以使用下面的方式:

INT_PTR CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
	UNREFERENCED_PARAMETER(lParam);
	switch (message)
	{
	case WM_INITDIALOG:
		{
			OldWndProc = (WNDPROC)SetWindowLong(hDlg, GWL_WNDPROC, (LONG)NewDlgProc); // 设置新的窗口过程回调函数
		}
		return (INT_PTR)TRUE;
	}
     // ...  其它消息处理,这里省略
	return (INT_PTR)FALSE;
}

LRESULT CALLBACK NewDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) // 该对话框新的窗口回调函数,过滤WM_KEYDOWN消息。
{
	switch(message)
	{
		case WM_GETDLGCODE:
		{
		  	return (DLGC_WANTALLKEYS | CallWindowProc(OldWndProc, hWnd, message, wParam, lParam)); // 注意这里,否则没有办法捕获Tab/方向键
		}

		case WM_KEYDOWN:
		{
			TCHAR szText[MAX_PATH] = {0};
			StringCchPrintf(szText, _countof(szText), _T("%d"), wParam);
			SetWindowText(hWnd, szText);
		}
		break;

		default:
			break;
	}
	return CallWindowProc(OldWndProc, hWnd, message, wParam, lParam);
}


补充:如果对话框上有其它子控件的话,使用方式和它类型,子类化,自己设置控件新的窗口回调函数,新窗口回调函数与上面的类似。比如对话框中有个static静态文本控件的话,也是这样捕获Tab/方向键事件的。


Win32 Dialog对话框处理WM_KEYDOWN事件

标签:对话框   win32   wm_keydown事件   tab方向键处理   

原文地址:http://blog.csdn.net/visualeleven/article/details/41844795

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!