无窗口(windowless)的Atl编写ActiveX怎么响应TAB或方向键激活 最近编写Atl的ActiveX控件遇到一个问题就是无窗口的ActiveX怎么响应Tab及方向键的激活,有窗口没问题,无窗口时很多原来在框架的事件无效了知道的高手请不吝赐教!最好给出代码段,100分奉上! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://support.microsoft.com/kb/318034参考了这个帖子但是代码放入后STDMETHOD(OnFrameWindowActivate)(BOOL fActivate);用来响应的这个函数一直没有反应,从来不调用,怎么回事??? 无窗体控件自己不包含窗口句柄,不能像窗体控件一样被激活,但是可以捕获Windows消息进行定制处理。 无窗口的框架的窗口句柄无效,但是他内部含有CContainedWindow的句柄,现在主要是有个问题在occdlg.cpp中有段代码BOOL COccManager::IsDialogMessage(CWnd* pWndDlg, LPMSG lpMsg){ ............... case WM_KEYDOWN: code = _AfxGetDlgCode(pWndMsg, lpMsg); switch (LOWORD(lpMsg->wParam)) { case VK_TAB: { if (code & DLGC_WANTTAB) // If control wants tabs, bail out. break; bBack = GetKeyState(VK_SHIFT) < 0; pSiteOrWnd = pWndDlg->GetNextDlgTabItem((COleControlSiteOrWnd*)NULL, bBack); ...............}GetNextDlgTabItem无法取得预定无窗口的ActiveX的Tab键顺序,直接把无窗口的ActiveX控件给跳过去了,难道真没有解决办法? 无窗口控件应该实现IOleInPlaceObjectWindowless接口,通过OnWindowMessage方法来处理消息 有个问题就是无法得知Tab键按下是否激活我的当前控件?因为调试跟踪时发现pSiteOrWnd = pWndDlg->GetNextDlgTabItem((COleControlSiteOrWnd*)NULL, bBack); 在此处调用过程中取得的激活控件不是预期的或是在资源编辑时预先设置的顺序!!然则,实现IOleInPlaceObjectWindowless接口,通过OnWindowMessage方法是否真的能解决问题? 重载 COleControl 的消息预处理函数 PreTranslateMessage(MSG* pMsg)PreTranslateMessage(MSG* pMsg){ if(pMsg->message == WM_KEYUP) { if(pMsg->wParam == VK_TAB) Beep(1000,100); } …… } 其实无窗口控件只要实现了IOleInPlaceObjectWindowless接口,TAB或方向键激活就是自动的,因为这是通过IOleInPlaceSiteWindowless容器接口来完成的,跟控件无关。OnWindowMessage方法只是提供了一个机会来处理其它窗口消息而已,不像有窗口控件能直接处理消息。 在此先感谢jameshooo的不断关注,此贴现先挂一段时间,希望能有各位达人能给出更简单有效的方法,两天后结帖 既然无窗口,哪里来的响应tab键? 关于串口自动识别并打开的问题? 求助,receive为什么只能接受一次? 主界面可视化设计一问? atl得编译方式问题 在使用Media Player控制时.如何得到影象文件的时间长度? vc 工程的语言转换 简单问题,以下语句有问题怎么修改好呢? vb中,字符串如何转换成整型? 我得reset怎么啦?? 程序运行中内存引用错误。可能是什么问题? VS2005代码左边中出现一些汉字或符号,怎么去掉。 关于多线程文件传输的问题
参考了这个帖子
但是代码放入后STDMETHOD(OnFrameWindowActivate)(BOOL fActivate);
用来响应的这个函数一直没有反应,从来不调用,怎么回事???
BOOL COccManager::IsDialogMessage(CWnd* pWndDlg, LPMSG lpMsg)
{
...............
case WM_KEYDOWN:
code = _AfxGetDlgCode(pWndMsg, lpMsg);
switch (LOWORD(lpMsg->wParam))
{
case VK_TAB:
{
if (code & DLGC_WANTTAB) // If control wants tabs, bail out.
break; bBack = GetKeyState(VK_SHIFT) < 0;
pSiteOrWnd = pWndDlg->GetNextDlgTabItem((COleControlSiteOrWnd*)NULL, bBack);
...............
}
GetNextDlgTabItem无法取得预定无窗口的ActiveX的Tab键顺序,直接把无窗口的ActiveX控件给跳过去了,
难道真没有解决办法?
PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_KEYUP)
{
if(pMsg->wParam == VK_TAB)
Beep(1000,100);
}
……
}