右键菜单弹出后,窗口接收不到键盘消息;
怎样可以在右键菜单弹出后,窗口还能接收到键盘消息
怎样可以在右键菜单弹出后,窗口还能接收到键盘消息
解决方案 »
- wireshark源码分析抓tds协议包的问题?
- 兼容DC如何定期替换选入的位图?其中的位图可以直接存为BMP文件吗?
- 征求 VirtualWall 中文名称,谢谢大家!
- HtmlHelp ?设置了htmlhelp.h及htmlhelp.lib文件的路径,还是不行!
- 如何通过应用程序代码,使得程序在管理员登陆之前就能自动运行
- 小小的问题,Cstring 付给filecopy的变量,居然不行?
- udp控件
- 熟悉Turbo C,熟悉VC6的开发环境,现正飞速搞定C++,请问两个月之后是否能精通VC6?
- 求助 关于客户端SOCKET的重用问题!
- 一个关于在内存DC中绘图以及填充的问题
- 关于ImageList_AddMasked的问题
- 关于改进的中值滤波算法,我有已经有相关的文字描述,算法里有步骤,要处理的图片也有,请问各位高人给我做一下以下这四个步骤??
LRESULT C**View::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if( message == WM_MENUCHAR )
{
if( (char)LOWORD(wParam) == 'z')
{
//AfxMessageBox("View MENU_KEY = 'z'"); //在这里添加你的z按键消息响应函数;
}
if( (char)LOWORD(wParam) == 'm')
{
//AfxMessageBox("View MENU_KEY = 'm'"); //在这里添加你的m按键消息响应函数;
CDC * pdc = this->GetDC();
pdc->MoveTo(0,0);
pdc->LineTo(100,100);
}
}
return CView::DefWindowProc(message, wParam, lParam);
}
WM_MENUCHAR的相关定义:
char chUser = (char) LOWORD(wParam); // ASCII character
UINT fuFlag = (UINT) HIWORD(wParam); // menu flag
HMENU hmenu = (HMENU) lParam; // handle of menu
我的菜单加载是在这里:
void C**View::OnLButtonDown(UINT nFlags, CPoint point)
{
CMainFrame* pfrm =(CMainFrame*)AfxGetMainWnd(); //获得程序主框架指针
pfrm->GetMenu(); //获得程序菜单指针
CMenu* pm = pfrm->GetMenu()->GetSubMenu(0); //指向“文件”菜单
CPoint pt;
GetCursorPos(&pt);
pm->TrackPopupMenu(TPM_LEFTALIGN,pt.x,pt.y,this); //单击右键菜单时弹出“文件”菜单指针
CView::OnLButtonDown(nFlags, point);
}
问题其实还是在TrackPopupMenu这个函数上,最后一个参数this指明了Menu的消息将发往当前的View类窗口。(如果改成AfxGetMainWnd(),将发往主窗体,响应的DefWindowProc则应该定义在CMainFrame类中)这个消息的截获我先前在PreTranslateMessage(MSG* pMsg) 中去做,没有实现,后来才换到DefWindowProc当中的。原因可能就是下面这段话当中的"理论上"所对应的"现实",可能菜单这个时候发送消息使用的是SendMessage:1.在MFC下,PreTranslateMessage()函数中只能得到PostMessage()发送的消息,而对于
SendMessage()是无能为力的,因为这种类型的消息是由GetMessage、PeekMessage()等函数系统
自身处理的。 2.Windows操作系统中,对于产生的键盘消息,基本上都是由PostMessage()形式发送的,所以对于
键盘操作,理论上PreTranslateMessage()都是可以得到的。
引自:http://blog.csdn.net/caleeoo/archive/2008/02/25/2119173.aspx问题残留:如果是组合按键的话,例如:Shift+z,可以用"Z"来代替,但是如果是Ctrl+z那就不知道怎么弄了。
楼主去试试吧,我想组合键应该也没有问题。 End......
现在我处理的方法,如果按了CTRL键,就不让用户在使用右键菜单