http://hi.baidu.com/ruwind2010/blog/item/654e10d36563bc83a0ec9cbd.html
在MFC(Microsoft Foundation Class)对响应消息进行了封装,
可以通过重载虚函数PreTranslateMessage()对所关心的消息进行截取与响应:
以下对截取与响应键盘 Enter 消息的截取与响应
这是对话框的响应键盘 Enter 消息方式:
BOOL C**Dlg::PreTranslateMessage(MSG* pMsg)
{
}
这是View视图类响应键盘 Enter 消息的方式:
BOOL C**View::PreTranslateMessage(MSG* pMsg)
{
if (WM_KEYFIRST <= pMsg->message && pMsg->message <= WM_KEYLAST)
{
if(pMsg->wParam==VK_RETURN )
{
}
return CFormView::PreTranslateMessage(pMsg);
}
在上面的代码中,首先将pMsg->message所表示的消息同WM_KEYFIRST 和WM_KEYLAST比较,确定是键盘消息,然后通过消息参数pMsg->wParam的值来判断是否是回车键(VK_RETURN,虚拟键码可以下面相关资料中查到)。
#define VK_LBUTTON
#define VK_RBUTTON
#define VK_CANCEL
#define VK_MBUTTON
#if(_WIN32_WINNT >= 0x0500)
#define VK_XBUTTON1
#define VK_XBUTTON2
#endif
#define VK_BACK
#define VK_TAB
#define VK_CLEAR
#define VK_RETURN
#define VK_SHIFT
#define VK_CONTROL
#define VK_MENU
#define VK_PAUSE
#define VK_CAPITAL
#define VK_KANA
#define VK_HANGEUL
#define VK_HANGUL
#define VK_JUNJA
#define VK_FINAL
#define VK_HANJA
#define VK_KANJI
#define VK_ESCAPE
#define VK_CONVERT
#define VK_NONCONVERT
#define VK_ACCEPT
#define VK_MODECHANGE
#define VK_SPACE
#define VK_PRIOR
#define VK_NEXT
#define VK_END
#define VK_HOME
#define VK_LEFT
#define VK_UP
#define VK_RIGHT
#define VK_DOWN
#define VK_SELECT
#define VK_PRINT
#define VK_EXECUTE
#define VK_SNAPSHOT
#define VK_INSERT
#define VK_DELETE
#define VK_HELP
#define VK_LWIN
#define VK_RWIN
#define VK_APPS
#define VK_SLEEP
#define VK_NUMPAD0
#define VK_NUMPAD1
#define VK_NUMPAD2
#define VK_NUMPAD3
#define VK_NUMPAD4
#define VK_NUMPAD5
#define VK_NUMPAD6
#define VK_NUMPAD7
#define VK_NUMPAD8
#define VK_NUMPAD9
#define VK_MULTIPLY
#define VK_ADD
#define VK_SEPARATOR
#define VK_SUBTRACT
#define VK_DECIMAL
#define VK_DIVIDE
#define VK_F1
#define VK_F2
#define VK_F3
#define VK_F4
#define VK_F5
#define VK_F6
#define VK_F7
#define VK_F8
#define VK_F9
#define VK_F10
#define VK_F11
#define VK_F12
#define VK_F13
#define VK_F14
#define VK_F15
#define VK_F16
#define VK_F17
#define VK_F18
#define VK_F19
#define VK_F20
#define VK_F21
#define VK_F22
#define VK_F23
#define VK_F24
#define VK_NUMLOCK
#define VK_SCROLL
#define VK_OEM_NEC_EQUAL
#define VK_OEM_FJ_JISHO
#define VK_OEM_FJ_MASSHOU 0x93
#define VK_OEM_FJ_TOUROKU 0x94
#define VK_OEM_FJ_LOYA
#define VK_OEM_FJ_ROYA
#define VK_LSHIFT
#define VK_RSHIFT
#define VK_LCONTROL
#define VK_RCONTROL
#define VK_LMENU
#define VK_RMENU
#if(_WIN32_WINNT >= 0x0500)
#define VK_BROWSER_BACK
#define VK_BROWSER_FORWARD
#define VK_BROWSER_REFRESH
#define VK_BROWSER_STOP
#define VK_BROWSER_SEARCH
#define VK_BROWSER_FAVORITES
#define VK_BROWSER_HOME
#define VK_VOLUME_MUTE
#define VK_VOLUME_DOWN
#define VK_VOLUME_UP
#define VK_MEDIA_NEXT_TRACK
#define VK_MEDIA_PREV_TRACK
#define VK_MEDIA_STOP
#define VK_MEDIA_PLAY_PAUSE
#define VK_LAUNCH_MAIL
#define VK_LAUNCH_MEDIA_SELECT 0xB5
#define VK_LAUNCH_APP1
#define VK_LAUNCH_APP2
#endif
#define VK_OEM_1
#define VK_OEM_PLUS
#define VK_OEM_COMMA
#define VK_OEM_MINUS
#define VK_OEM_PERIOD
#define VK_OEM_2
#define VK_OEM_3
#define VK_OEM_4
#define VK_OEM_5
#define VK_OEM_6
#define VK_OEM_7
#define VK_OEM_8
#define VK_OEM_AX
#define VK_OEM_102
#define VK_ICO_HELP
#define VK_ICO_00
#if(WINVER >= 0x0400)
#define VK_PROCESSKEY
#endif
#define VK_ICO_CLEAR
在MFC Active控件中重写handle事件,接受键盘输入,作出相应的处理,但是当控件在C#或者VB表单上被调用时,handle事件只能接受到数字0~9和字母键的输入,因为这些键值没有改变,而其它键值在类Win32KeyboardMap所作的映射在此时失效(失效的原因?)。因此需要在控件的On
而实际上,让人折腾的是,On
BOOL CTunnelComponentCtrl::PreTranslateMessage(MSG* pMsg)
{
// TODO: 在此添加专用代码和/或调用基类
if(InTravelMode())
{
switch(pMsg->message)
{
case WM_KEYDOWN:
{
switch(pMsg->wParam)
{
case VK_DOWN:
case VK_UP:
{ m_Viewer->getEventQueue()->keyPress((osgGA::GUIEventAdapter::KeySymbol)pMsg->wParam);
break;
}
default:
break;
}
break;
}
default:
break;
}
}
return COleControl::PreTranslateMessage(pMsg);
}