【话题】无窗口(windowless)的Atl编写ActiveX怎么响应TAB或方向键激活
|
chilly-tracy回复于18日11点47分
http://support.microsoft.com/kb/318034 参考了这个帖子 但是代码放入后STDMETHOD(OnFrameWindowActivate)(BOOL fActivate); 用来响应的这个函数一直没有反应,从来不调用,怎么回事???
|
|
czx01_09回复于18日12点00分
有个问题就是无法得知Tab键按下是否激活我的当前控件?因为调试跟踪时发现pSiteOrWnd = pWndDlg->GetNextDlgTabItem((COleControlSiteOrWnd*)NULL, bBack); 在此处调用过程中取得的激活控件不是预期的或是在资源编辑时预先设置的顺序!!然则,实现IOleInPlaceObjectWindowless接口,通过OnWindowMessage方法是否真的能解决问题?
|
|
小舟夜泊回复于18日12点06分
无窗口控件应该实现IOleInPlaceObjectWindowless接口,通过OnWindowMessage方法来处理消息
|
|
wfnlskaje回复于18日12点12分
无窗体控件自己不包含窗口句柄,不能像窗体控件一样被激活,但是可以捕获Windows消息进行定制处理。
|
|
sghlmol回复于18日12点17分
重载 COleControl 的消息预处理函数 PreTranslateMessage(MSG* pMsg) PreTranslateMessage(MSG* pMsg) { if(pMsg->message == WM_KEYUP) { if(pMsg->wParam == VK_TAB) Beep(1000,100); } …… }
|
|
lifenliu2007回复于18日12点24分
UP
|
|
vanilla-sky回复于18日12点36分
在此先感谢jameshooo的不断关注,此贴现先挂一段时间,希望能有各位达人能给出更简单有效的方法,两天后结帖
|
|
星语心愿MD回复于18日12点42分
这是容器要做的事,你实现的仅仅是控件,所以只能靠自己去试验
|
|
jieshenziao回复于18日12点48分
无窗口的框架的窗口句柄无效,但是他内部含有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控件给跳过去了, 难道真没有解决办法?
|
|
wusibo回复于18日12点51分
其实无窗口控件只要实现了IOleInPlaceObjectWindowless接口,TAB或方向键激活就是自动的,因为这是通过IOleInPlaceSiteWindowless容器接口来完成的,跟控件无关。OnWindowMessage方法只是提供了一个机会来处理其它窗口消息而已,不像有窗口控件能直接处理消息。
|
|