• 让动态创建的ActiveX控件响应Windows消息


    当我们通过

    CWnd::CreateControl()

    动态创建

    ActiveX

     

    控件时,

    Windows

    消息并不会被发送给我

    们的由

     

    CWnd

    派生得控件类。例如,即使我们为

    WM_KILLFOCUS

     

    消息创建了句柄,这个句柄

     

    也是不会被调用的。(不信你试试

    :))

    引起这个问题的原因时,

    CWnd::CreateControl()

    并不会使我控件的

     

    HWND

    子类化。

    知道了原因,要解决问题就不难了。我们只要在控件创建之后使它子类化就行了。通过一下步

    骤可以实现:

    1.

    当然是添加控件啦,先生成控件的

    C++

    包容类。

    2.

    再要创建控件的类中声明成员变量,此成员变量是包容类的指针对象。

    3.

    在包容类的头文件中添加:

    //{{AFX_MSG(CMyClass)

    //}}AFX_MSG

    DECLARE_MESSAGE_MAP()

    CMyClass

    是实际的类名。

    4.

    在包容类的

    CPP

    文件的

    #include

    段下面添加:

    BEGIN_MESSAGE_MAP(CMyClass,

    CWnd)

    //{{AFX_MSG_MAP(CMyClass)

    //}}AFX_MSG_MAP

    END_MESSAGE_MAP()

    5.

     

    删除工程目录下的

    .clw

     

    文件,在工程中打开

    ClassWizard

    ,先选

    yes

    ,在选

    Add

    All

    6.

    现在你就可以使用

    ClassWizard

    为控件包容类添加消息映射和处理函数了。

    完成这些修改后,你必须创建控件并且使它子类化,下面是个例子:

    void

    CSDIApp2View::OnInitialUpdate()

    {

    CView::OnInitialUpdate();

    m_pFlexGrid

    =

    new

    CMSFlexGrid;

    CRect

    rect;

    GetClientRect(&rect);

    m_pFlexGrid->Create(NULL,

    WS_CHILD

    |

    WS_VISIBLE,

    rect,

    this,

    IDC_FLEXGRID);

    HWND

    hWnd

    =

    m_pFlexGrid->Detach();

    m_pFlexGrid->SubclassWindow(hWnd);

    }

  • 相关阅读:
    Uva 10779 collector's problem
    poj 2728 最优比率树(最小生成树问题)
    LA 3126 二分图匹配 最小路径覆盖
    poj 1149 最大流构图
    Step By Step(Java XML篇)
    Step By Step(Java 输入输出篇)
    Step By Step(Java 集合篇)
    Step By Step(Java 线程篇)
    Step By Step(Java 反射篇)
    Step By Step(Java 国际化篇)
  • 原文地址:https://www.cnblogs.com/lidabo/p/3605128.html
Copyright © 2020-2023  润新知