Windows Mobile平台上重写Back健的行为
2010-08-22 12:56:00 来源:WEB开发网这个Back健的处理很奇怪,如果默认不做任何处理,即使当前Dialog上存在一个Edit Control,它还是不会充当回退删除健的角色,还是会关闭当前对话框,回退到上一个。解决的办法也很简单按Back健时,OS会抛出一个WM_HOTKEY的消息出来,我们可以捕获这个消息重写Back健的行为
代码如下:
在OnInitDialog时 发送SHCMBM_OVERRIDEKEY 重写VK_BACK的行为。
HWND hwndMenuBar = SHFindMenuBar(m_hWnd);
SendMessage(hwndMenuBar, SHCMBM_OVERRIDEKEY, VK_TBACK, MAKELPARAM(SHMBOF_NODEFAULT | SHMBOF_NOTIFY, SHMBOF_NODEFAULT | SHMBOF_NOTIFY));
然后在Dailog响应 WM_HOTKEY时进行如下处理:
LRESULT CMyDlg::OnHotKey(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
if(VK_TBACK == HIWORD(lParam))
{
bHandled = true;
SHSendBackToFocusWindow(uMsg, wParam, lParam);
}
return 0;
}
如果当前窗口不是一个DialogBox或是没有EditBox,当按下后退键时,应该显示上一个窗口。但是当前的窗口不应被销毁,而只是被前一个窗口覆盖。
如果当前窗口是一个MessageBox或者是一个没有EditBox的模态Dialog,当按下后退键时,应该关闭该对话框。对于 MessageBox,对话框的返回值可能是 IDNO, IDCANCEL或IDOK;对于模态对话框,对话框会得到一个ID值为IDCANCEL的WM_COMMAND的消息。
如果当前的窗口含有EditBox,当按下后退键时,应该删除EditBox中的最后一个字符。
对于第三种情况,系统并不会自动处理,需要我们自己做一点工作。
首先,我们需要向MenuBar发送一个SHCMBM_OVERRIDEKEY消息,来通知Menubar我们要改变后退键的行为。
SHCMBM_OVERRIDEKEY消息的wParam参数是要改变行为的键值,如下表所示:
KeyMeaning
VK_TBACKBack button
VK_TSOFT1Left SoftKeyBar button
VK_TSOFT2Right SoftKeyBar button
VK_TVOLUMEUPUp volume button
VK_TVOLUMEDOWNDown volume button
VK_TRECORDRecord button
SHCMBM_OVERRIDEKEY消息的lParam参数是我们要改变的行为,其中lParam的低字节是掩码,高字节是值。
更多精彩
赞助商链接