• ActiveX 中检测击键消息方法实现


    快捷键, 如箭头键, 首先接收由 ActiveX 控件容器的消息泵。 即使控件有焦点, 没有收到邮件键击, 对控件容器, 如箭头和 TAB 键有特殊含义。 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 中这些控件。
     
    下面是典型 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:

    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);
    }
    每当激活子控件是否将 ActiveX 控件, 中有子控件 UI Activate 需要整个控件。 例如, 如果有一个编辑控件将 ActiveX 控件, 内部将处理程序如下添加到您 ActiveX 控件类:
    int CMyActiveXCtrl::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message)
    { // 添加的消息映射
    if (!m_bUIActive)
    OnActivateInPlace (TRUE, NULL); // == UI-Activate the control
    return COleControl::OnMouseActivate(pDesktopWnd, nHitTest, message);
    }
    因为即使, 是页, 上只控件 InternetExplorer 可能不立即 UI Activate 控件, 它可能需要创建控件时自动申请 UI Activation。 这进行期间 (COleControl::OnCreate WM _ CREATE) 处理程序。 无窗口控件得不到 WM _ CREATE 或任何窗口消息 ; 因此, 此代码不工作无窗口控件中。 还要注意, 这不保证保持激活 UI 控件。 如果有请求以类似方式, UI Activation 页上其他控件一个将最终 UI 激活并接收击键消息所述。 如果用户离开 ActiveX 控件, TABs InternetExplorer 将自动 deactivate UI 控件。
    int CMyActiveXCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    if (COleControl::OnCreate(lpCreateStruct) == -1)
    return -1;
    OnActivateInPlace (TRUE, NULL); // == UI-Activate the control return 0;
    }
     
  • 相关阅读:
    剑指offer-二维数组中的查找
    TF-IDF(term frequency–inverse document frequency)
    Java实现中文字符串的排序功能
    当前课程
    【R】资源整理
    CentOS相关
    【转】Setting up SDL Extension Libraries on MinGW
    【转】Setting up SDL Extension Libraries on Visual Studio 2010 Ultimate
    【转】Setting up SDL Extension Libraries on Code::Blocks 12.11
    【转】Setting up SDL Extension Libraries on Visual Studio 2019 Community
  • 原文地址:https://www.cnblogs.com/tyjsjl/p/2156119.html
Copyright © 2020-2023  润新知