快捷键, 如箭头键, 首先接收由 ActiveX 控件容器的消息泵。 即使控件有焦点, 没有收到邮件键击, 对控件容器, 如箭头和 TAB 键有特殊含义。 MFCActiveX 控件有机会以通过覆盖其 PreTranslateMessage 函数截获这些消息。
对于 MFCActiveX 控件但是, 可以不总是调用 PreTranslateMessage。
对于 MFCActiveX 控件但是, 可以不总是调用 PreTranslateMessage。
MFCActiveX 控件中 PreTranslateMessage 由调用 TranslateAccelerator IOleInPlaceActiveObject 接口的控件的方法。 为控件 UI 活动是当前 InternetExplorer 只调用此方法。 仅一个控件一次只能 UI 活动。
任何控件当首次加载网页 InternetExplorer 不会自动 UI Activate。 InternetExplorer 等待用户标签可 ActiveX 控制页到 UI Activate 上它。 它们是使用鼠标时也, MFCActiveX 控件 UI Activate 本身。 MFCActiveX 控件, 中这样 COleControl::OnLButtonUp 中。
如果您有子控件内您 COleControl, 子控件上单击鼠标消息不发送到 COleControl 和即使子控件具有只被授予键盘焦点 MFC 不 UI - 不激活 ActiveX 控件。 InternetExplorer 截获击键并不授予机会来筛选 PreTranslateMessage 中这些控件。
任何控件当首次加载网页 InternetExplorer 不会自动 UI Activate。 InternetExplorer 等待用户标签可 ActiveX 控制页到 UI Activate 上它。 它们是使用鼠标时也, MFCActiveX 控件 UI Activate 本身。 MFCActiveX 控件, 中这样 COleControl::OnLButtonUp 中。
如果您有子控件内您 COleControl, 子控件上单击鼠标消息不发送到 COleControl 和即使子控件具有只被授予键盘焦点 MFC 不 UI - 不激活 ActiveX 控件。 InternetExplorer 截获击键并不授予机会来筛选 PreTranslateMessage 中这些控件。
下面是典型 PreTranslateMessage。 此代码转发箭头, HOME, 并 END 键以便他们可以使用 MESSAGE_MAP 项接收回控件:
// trap keys and forward on to the control
BOOL CMyActiveXCtrl::PreTranslateMessage(MSG* pMsg)
{
switch (pMsg->message)
{
case WM_CHAR: // 击键OnChar消息
SendMessage (pMsg->message, pMsg->wParam, pMsg->lParam);
break;
case WM_KEYDOWN:
case WM_KEYUP:
switch (pMsg->wParam)
{
case VK_RETURN:每当激活子控件是否将 ActiveX 控件, 中有子控件 UI Activate 需要整个控件。 例如, 如果有一个编辑控件将 ActiveX 控件, 内部将处理程序如下添加到您 ActiveX 控件类:
case VK_UP:
case VK_DOWN:
case VK_LEFT:
case VK_RIGHT:
case VK_HOME:
case VK_END:
SendMessage (pMsg->message, pMsg->wParam, pMsg->lParam); // Windowless controls won't be able to call SendMessage. // Instead, just respond to the message here.
return TRUE;
}
break;
}
return COleControl::PreTranslateMessage(pMsg);
}
int CMyActiveXCtrl::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message)因为即使, 是页, 上只控件 InternetExplorer 可能不立即 UI Activate 控件, 它可能需要创建控件时自动申请 UI Activation。 这进行期间 (COleControl::OnCreate WM _ CREATE) 处理程序。 无窗口控件得不到 WM _ CREATE 或任何窗口消息 ; 因此, 此代码不工作无窗口控件中。 还要注意, 这不保证保持激活 UI 控件。 如果有请求以类似方式, UI Activation 页上其他控件一个将最终 UI 激活并接收击键消息所述。 如果用户离开 ActiveX 控件, TABs InternetExplorer 将自动 deactivate UI 控件。
{ // 添加的消息映射
if (!m_bUIActive)
OnActivateInPlace (TRUE, NULL); // == UI-Activate the control
return COleControl::OnMouseActivate(pDesktopWnd, nHitTest, message);
}
int CMyActiveXCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (COleControl::OnCreate(lpCreateStruct) == -1)
return -1;
OnActivateInPlace (TRUE, NULL); // == UI-Activate the control return 0;
}