zoukankan      html  css  js  c++  java
  • 20110329 14:53 ActiveX控件中接收并处理Windows消息的问题

    问题描述:

    新建一个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键、回车键和方向键,这样控件显得很不专业。本想使用 BOOL   CSluiceCtrl::PreTranslateMessage(MSG*   pMsg) 来实现,但没成功。

    问题分析:

    引用蒋晟:“PretranslateMessage依赖于MFC的消息循环。如果容器的消息循环不是MFC的,那么PretranslateMessage不会被调用。
    MFC对话框相应的键盘处理依赖于MFC的消息循环。如果容器的消息循环没有调用IsDialogMessage,那么相应的键盘处理不会被调用
    。”

    PreTranslateMessage是在CWinThread::PumpMessage内调用的,而ocx内本就没有CWinThread线程,所以ocx内是不会调用PreTranslateMessage的。 但ocx是窗口的话,它会来窗口消息,重载DefWindowProc,直接在内处理就行了。

    解决方法:

    1、重载DefWindowProc函数CXXXXCtrl::DefWindowProc(),在其中增加处理过程如下:
    if (message == WM_KEYDOWN)
    {
    AfxMessageBox("Hey");
    OnBtnMakecall();
    return 0L;
    }
    //AfxMessageBox("Hey1");

    return CDialog::DefWindowProc(message, wParam, lParam);

    2、重载OnCommand函数CCtrlPanel::OnCommand(WPARAM wParam, LPARAM lParam),在其中添加发送消息,如下:

    SendMessage (hwnd, WM_LBUTTONDOWN, SB_TOP, 0) ;

  • 相关阅读:
    很久以前写的一个功能测试用例
    中外白领和无领的一天
    Five bugs in five minutes...
    Oracle SQL 性能优化技巧
    10款常用Java测试工具[转载]
    AJAX、AJAX实例及AJAX源代码(asp)
    各大银行的暗示[笑话]
    Tomcat集群与负载均衡(转载)
    简述CMMI2级的7个PA
    全面介绍单元测试 -转贴
  • 原文地址:https://www.cnblogs.com/lidabo/p/2814748.html
Copyright © 2011-2022 走看看