早教吧 育儿知识 作业答案 考试题库 百科 知识分享

请问mfc组件中如何使PreTranslateMessage函数有作用,望给个明确易懂的步骤dll组件:BOOLCDlg::PreTranslateMessage(MSG*pMsg){\x09if(pMsg->message==WMKEYDOWN)\x09{\x09\x09MessageBox("您按下了rt");\x09}\x09returnCDialog::Pr

题目详情
请问mfc组件中如何使PreTranslateMessage函数有作用,望给个明确易懂的步骤
dll组件:
BOOL CDlg::PreTranslateMessage(MSG* pMsg)
{
\x09if (pMsg->message==WM_KEYDOWN)
\x09{
\x09\x09 MessageBox("您按下了rt");
\x09}
\x09return CDialog::PreTranslateMessage(pMsg);
}
如上面,我在程序中添着,没反应,在exe程序中可以的,希望给个方法,理论我不大懂
▼优质解答
答案和解析
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了.
看了 请问mfc组件中如何使Pre...的网友还看了以下:

英语翻译教师节来了,我有许多悄悄话要对您说.在您的谆谆教导下,我的音乐知识见长,我从来没有这么自信  2020-05-13 …

帮忙仿写一段话.还是要写母亲的.您是一棵大树,春天倚着您幻想夏天倚着您繁荣秋天倚着您成熟冬天倚着您  2020-06-17 …

英语高手进来,请帮我翻译几句求饶的话,最好是美国俚语对不起,我真的不是故意的,请您不要这样做好吗?  2020-06-19 …

英语翻译很抱歉打扰您,D取消了1月底去贵公司拜访的计划,因为我公司的vicepresident(大  2020-06-24 …

英语翻译首先,我想说我很荣幸能成为您的学生.您教了我很多东西,在您的身上我看到了一个好老师的风范.  2020-06-26 …

秘密花园的仿写简单点的求您了求您了求您了我给您跪了。  2020-07-07 …

妈妈我想对你说开头亲爱的妈妈,是您带着痛苦的泪水和幸福的笑容把我迎到了这五彩斑澜的世界;是您给了我十  2020-12-09 …

英语翻译!快快快祖国,祖国您是多么伟大您走过了五千多年您创造了炎黄子孙您给了我们美好的家园祖国,祖国  2020-12-09 …

11.在采集病史过程中,下列提问不妥的是()A.您病了多长时间了?B.您感到哪儿不舒服?C.您的粪便  2020-12-20 …

您现在离我只有五步远.您不答应,我就跟您拼了!这句话解释的是什麽词语?他蔺相如有什麽能耐,就靠一张嘴  2020-12-21 …