分享
 
 
 

DLL/OCX中的MFC对话框不能处理Tab和回车键的问题

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

原文发表在[http://community.csdn.net/expert/Topicview2.asp?id=3072485]

带子窗口的ActiveX控件问题,如何获取回车键?

问题:

新建一个MFC ActiveX工程,添加一对话框资源,上面有一些标准控件,如按钮、编辑框等,并生成一个类CCtrlPanel。

在CXXXXCtrl类中:

int CXXXXCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

if (COleControl::OnCreate(lpCreateStruct) == -1)

return -1;

m_CtrlPanel.Create(IDD_CTRLPANEL,this);

//m_CtrlPanel在.h文件中申明为:CCtrlPanel m_CtrlPanel;

OnActivateInPlace(TRUE,NULL);

return 0;

}

这样一来,的确做了个带界面的ActiveX控件,可是用于网页中的时候,控件的子窗口,就是CCtrlPanel类收不到tab键、回车键和方向键,这样控件显得很不专业(如:用户在一EDIT框中输入完了内容,回车想表示按那个默认按钮,却不能实现),后来我发现这些按键被CXXXXCtrl类截获了!于是我理所当然的加了如下代码:

BOOL CSluiceCtrl::PreTranslateMessage(MSG* pMsg)

{

if(pMsg->message==WM_KEYDOWN)

{

if(pMsg->wParam==VK_TAB ||pMsg->wParam==VK_RETURN ||

pMsg->wParam==VK_LEFT || pMsg->wParam==VK_RIGHT)

{

m_CtrlPanel.SendMessage(pMsg->message,pMsg->wParam, pMsg->lParam);

return TRUE;

}

}

return COleControl::PreTranslateMessage(pMsg);

}

但结果证明我想得太天真,但我始终不明白这样做为什么不行?还请高手指教!

另外想请教高手,这个问题到底应该如何解决?我甚至最极端的方法也试过了,如下:

BOOL CSluiceCtrl::PreTranslateMessage(MSG* pMsg)

{

m_CtrlPanel.SendMessage(pMsg->message,pMsg->wParam, pMsg->lParam);

return TRUE;

}

答:

PretranslateMessage依赖于MFC的消息循环。如果容器的消息循环不是MFC的,那么PretranslateMessage不会被调用。

int CWinApp::Run()

{

?

?

?

for (;;) {

while (!::PeekMessage(&m_msgCur,...)) {

if (!OnIdle(...)) // do some idle work

break;

}

// I have a message, or else no idle work to do: // pump it

if (!PumpMessage())

break;

}

return ExitInstance();

}

BOOL CWinApp::PumpMessage()

{

?

?

?

if (!::GetMessage(&m_msgCur,...)) {

return FALSE;

}

if (!PreTranslateMessage(&m_msgCur)) {

::TranslateMessage(&m_msgCur);

::DispatchMessage(&m_msgCur);

}

return TRUE;

}

BOOL CWinApp::PreTranslateMessage(MSG* pMsg)

{

for (pWnd = /* window that sent msg */; pWnd; pWnd=pWnd->getParent())

if (pWnd->PreTranslateMessage(pMsg))

return TRUE;

if (pMainWnd = /* main frame and it's not one of the parents */)

if (pMainWnd->PreTranslateMessage(pMsg))

return TRUE;

return FALSE; // not handled

}

MFC对话框相应的键盘处理依赖于MFC的消息循环。

BOOL CDialog::PreTranslateMessage(MSG* pMsg)

{

if (pMsg->message >= WM_KEYFIRST && // for performance

pMsg->message <= WM_KEYLAST)

// maybe translate dialog key

return ::IsDialogMessage(m_hWnd, pMsg);

return FALSE;

}

如果容器的消息循环没有调用IsDialogMessage,那么相应的键盘处理不会被调用。

解决的方法是用Hook来获得需要的键盘输入,然后转发到对话框。参见PRB: Modeless Dialog Box in a DLL Does Not Process TAB Key (233263)

参考文档

PRB: Modeless Dialog Box in a DLL Does Not Process TAB Key (233263)

http://support.microsoft.com/default.aspx?kbid=233263

FAQ: WebBrowser Keystroke Problems

http://www.microsoft.com/mind/0499/faq/faq0499.asp

Meandering Through the Maze of MFC Message and Command Routing

http://www.microsoft.com/msj/0795/dilascia/dilascia.aspx

C++ Q&A: Enabling Menus in MFC Apps, Changing the Behavior of Enter with DLGKEYS Sample App -- MSDN Magazine, July 2000

http://msdn.microsoft.com/msdnmag/issues/0700/c/default.aspx

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有