MFC PreTranslateMessage(MSG* pMsg)
http://blog.csdn.net/witch_soya/article/details/6880419
你看下这个教程
这个函数仅是在你的进程窗口处于焦点状态时,截获你当前的按键消息。不懂你添加的按钮怎么会闪?最好看看你的PreTranslateMessage内的代码是否有问题,你可以先将PreTranslateMessage内的代码都注释掉,然后看按钮闪不闪,先确定下是否是PreTranslateMessage内代码的问题
为什么ActiveX中的对话框不响应PreTranslateMessage
MSDN说:
----------MFC--------------
CWnd::PreTranslateMessage
Used by class CWinApp to translate window messages before they are dispatched to the TranslateMessage and DispatchMessage Windows functions.
CWnd::WindowProc
Provides a Windows procedure (WindowProc) for a CWnd object. It dispatches messages through the window’s message map.
显然只有通过TranslateMessage和DispatchMessage函数传过来的消息才能在PreTranslateMessage中捕捉到,什么消息是通过这两个函数我不消息,不过鼠标和键盘还有Timer是一定会过的!
还有就是所有的消息都通过WindowProc所以只要重载这个函数就一定能得到你要的消息!
dispatchmessage和handlemessage的区别
GetMessage 是从消息队列中获取消息,它会进入 PreTranslateMessage 给我们提供过滤消息队列的机会, 如果返回TRUE,就交由 TranslateMessage 和 DispatchMessage 处理。其中通过 SendMessage 发送的消息是不插入消息队列,而直接传递到 TranslateMessage 处理,PostMessage 是会经过消息队列的。
现在对应于DUILIB 如下:
DUILIB中 的窗口过程函数 是 HandleMessage,
消息过滤函数是 MessageHandler
请问mfc组件中如何使PreTranslateMessage函数有作用,望给个明确易懂的步骤
PreTranslateMessage是标准窗口的消息预处理响应函数,在任何标准窗口有效。
DLL中窗口的创建是在一个导出函数中,并在调用CWnd::Create这前调用了
AFX_MANAGE_STATE(AfxGetStaticModuleState())来切换模块线程状态,导致该窗口所在的模块线程状态和MFC调用CWinApp::PreTranslateMessage时的不同,所以DLL中的窗口就无法响应PreTranslateMessage函数了。
解决方案:
1.dll导出一条函数 DllPreTranslateMessage
BOOL PASCAL DllPreTranslateMessage(MSG *pMsg)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
return theApp.PreTranslateMessage(pMsg);
}
2.在主程序的CWinApp的PreTranslateMessage中直接调用DLL的DllPreTranslateMessage函数。但记住要先调用DLL中的函数。
BOOL CMyApp::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(DllPreTranslateMessage(pMsg))
return TRUE;
return CWinApp::PreTranslateMessage(pMsg);
}
经过以上两步,DLL中的窗口就可以响应PreTranslateMessage了。
C++的MFC中如何实现SHIFT和CTRL的键盘消息响应
WM_KEYDOWN当一个非系统键被按下时该消息发送给具有键盘焦点的窗口。非系统键即不与ALT联用的情况。其中wParam 指定非系统键的虚拟键码, lParam 指定重复次数,扫描码,扩展键标识符,上下文代码,前一键状态标识符,以及转换状态标识符。它们如下所示:0-15指定当前消息重复的次数。该值代表按键敲击的次数,就如同用户一直按下键盘按键一样。如果按键足够长,会发送多个消息。然而,重复次数不进行累加。16-23指定扫描码。该值取决于OEM。24指定键是否为扩展键,就如同101或102键盘内的右手的ATL和CTRL键。如果是一个扩展键,则该值是1,否则,它是0.25-28保留,未使用。29指定上下文代码,对于WM_KEYDOWN消息,该值总是0.30指定之前的键状态。如果在消息发送之前,键被按下,则该值是1,否则该值是0.31指定转换状态。对于WM_KEYDOWN消息,该值总是0.返回值应用程序如果处理了该消息,则返回值是0.响应 WM_KEYDOWN 消息,判断VK_SHIFT 和 VK_CONTROL。在MFC中是重载OnKeyDown函数,见下面代码void CTestView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags){ if (nChar == VK_SHIFT) AfxMessageBox(_T("Shift")); else if (nChar == VK_CONTROL) AfxMessageBox(_T("Ctrl")); CView::OnKeyDown(nChar, nRepCnt, nFlags);}
怎么在mfc中实现 button的右击事件?
可以借助于vs开发的classwizard功能添加右键事件响应。
1、在资源视图中首先要选择视图,然后选择WM_RIGHTBUTTONDOWN添加事件响应;
2、在代码里面查看响应事件函数;
代码示例
afx_msg void OnRButtonDown( UINT nFlags, CPoint point );
{
// TODO: Add your message handler code hereand/or call default
Flag=false;
DoSomeThing();
CView::OnRButtonDown(nFlags,point);
}
MFC Edit控件内响应回车键的问题
最省事儿的办法:
去掉OK按钮上的default button属性,建一个新按钮,设置default 去掉visable,作为隐藏默认按钮,这个按钮会响应回车;
在这个按钮的响应事件中,通过GetFocus获取焦点识别当前编辑框,并根据具体编辑框分别处理。
正统办法:去掉默认按钮,重载CEdit为自己的编辑框类,重载PreTranslateMessage函数,处理回车;为每个edit绑定控件变量,设置基类为新编辑框类。
如何在任意的控件上相应回车键消息
最省事儿的办法:
去掉OK按钮上的default button属性,建一个新按钮,设置default 去掉visable,作为隐藏默认按钮,这个按钮会响应回车;
在这个按钮的响应事件中,通过GetFocus获取焦点识别当前编辑框,并根据具体编辑框分别处理。
正统办法:去掉默认按钮,重载CEdit为自己的编辑框类,重载PreTranslateMessage函数,处理回车;为每个edit绑定控件变量,设置基类为新编辑框类。
MFC中消息处理函数OnKeyDown无作用
在对话框中,不是用OnKeyDown
而是添加PreTranslateMessage(MSG* pMsg)虚函数。。。
在函数体中,添加如下代码:
if (pMsg->message==WM_KEYDOWN)
{
if (pMsg->wParam==81)
{
MessageBox("q");
}
}
return CDialog::PreTranslateMessage(pMsg);
还有什么不明白的话,可以继续追问~~
MFC OnKeyDown消息捕捉不到
在基于对话框的程序中,焦点往往在程序的一个子控件(control)里而不是主对话框。所以,对话框的成员函数才没有办法调用到OnKeyDown函数。也许认为是像对话框这样的简单程序,不应该响应很复杂的消息吧。为了能够响应键盘按键,需要重写PreTranslateMessage函数,在这个函数里对按键进行响应。 在分配(dispatch)消息给TranslateMessage和DispatchMessage之前,翻译(translate)消息。如果被翻译,并且不应被分配,那么返回非0值;
若没有被翻译,应该被分配,那么返回值为0.以下代码只是在按键之后,弹出一个对话框,具体还可以根据具体按键来响应
BOOL CMyMFCDlg::PreTranslateMessage(MSG* pMSG)
{
if (pMSG ->message == WM_KEYDOWN) // If a keydown message
{
if (pMSG ->wParam == _T('A')) // If 'A' pressed
MessageBox((LPCTSTR)L"A pressed", (LPCTSTR)L"In PreTranslate", MB_OK);
MessageBox((LPCTSTR)L"Key Down In PreTanslate", (LPCTSTR)L"Message", MB_OK);
}
return CDialogEx::PreTranslateMessage(pMSG);
}