有时,使用create()在运行时创建的控件不能将消息映射到父窗口内,此时需要使用消息转发的机制,主要原理:注册一个全局的消息,针对接收消息的控件编写继承类,在该继承类中响应消息,并将已注册的全局消息转发给控件类的父窗口,在父窗口中响应该注册消息。

例:

定义一个继承自CTreeCtl的控件类:

class CSTreeCtrl : public CTreeCtrl
{
    DECLARE_DYNAMIC(CSTreeCtrl)
public:
    CSTreeCtrl();
    virtual ~CSTreeCtrl();
    void SetDialog(CDialog* pDia);
protected:
    CDialog*   m_pDia;
    afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
    DECLARE_MESSAGE_MAP()
};

注册一个全局消息并响应控件的鼠标左键单击事件:

UINT TREE_SEL_MESSAGE = ::RegisterWindowMessage (_T("TREE_SEL_MESSAGE"));               //字符串可以任意取,但一定要全局唯一。

IMPLEMENT_DYNAMIC(CSTreeCtrl, CTreeCtrl)
BEGIN_MESSAGE_MAP(CSTreeCtrl, CTreeCtrl)
    ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()

CSTreeCtrl::CSTreeCtrl()
{

}

CSTreeCtrl::~CSTreeCtrl()
{
}

void CSTreeCtrl::SetDialog(CDialog* pDia)
{
    m_pDia = pDia;
}

void CSTreeCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
    
    CTreeCtrl::OnLButtonDown(nFlags, point);
    ::PostMessage(m_pDia->m_hWnd,TREE_SEL_MESSAGE,NULL,NULL);      //转发消息,这里发送消息后立即返回,并不等待消息回应。

//发送消息需要父窗口的窗口句柄从而路由消息,这里可以使用SetDialog传递一个父窗口

//的窗口类指针来获得.
}

在父窗口创建控件并相应注册消息:

Class CMyDlg : public CDialog

{

private:

  CSTreeCtrl          m_TreeCtrl1;

.........

DECLARE_MESSAGE_MAP()

.........

};

生成对注册消息的响应映射

IMPLEMENT_DYNCREATE(CMyDlg, CDialog)
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)

......

ON_REGISTERED_MESSAGE(TREE_SEL_MESSAGE,TreeSel)

......

END_MESSAGE_MAP()

编写响应函数TreeSel,注意这个函数的参数类型要统一:

LRESULT CMyDlg::TreeSel(WPARAM wParam, LPARAM lParam)       //这里的(WPARAM wParam, LPARAM lParam就是

//::PostMessage(m_pDia->m_hWnd,TREE_SEL_MESSAGE,NULL,NULL); 中的NULL,NULL
{
    UserDefineFunction(...);

...
    return 0;
}

create()创建的控件不能映射消息函数的解决的更多相关文章

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

    当我们通过 CWnd::CreateControl() 动态创建 ActiveX   控件时, Windows 消息并不会被发送给我 们的由   CWnd 派生得控件类.例如,即使我们为 WM_KIL ...

  2. 如何用ATL创建ActiveX控件

    演示截图: 代码简介或代码解析: 如何用ATL创建ActiveX控件 实现了一个ActiveX控件,它在一个圆内部有个正多边形,当用户在多变形内部单击将会使多边形的边数在当前的基础上+1,在多变形外部 ...

  3. 用ATL和MFC来创建ActiveX控件

    摘要:目前MFC和ATL代表了两种框架,分别面向不同类型的基于Windows的开发.MFC代表了创建独立的Windows应用的一种简单.一致的方法:ATL提供了一种框架来实现创建COM客户机和服务器所 ...

  4. MFC_1.3 控件子类化 消息反射

    控件子类化 如果想要在默认的控件类中添加一些功能,就需要子类化一个控件类 在类内可以响应控件所有的消息,并且可以添加自己的函数和数据 通过类向导子类化控件的步骤 打开类向导,创建一个 MFC 类,不要 ...

  5. 五种情况下会刷新控件状态(刷新所有子FWinControls的显示)——从DFM读取数据时、新增加子控件时、重新创建当前控件的句柄时、设置父控件时、显示状态被改变时

    五种情况下会刷新控件状态(刷新控件状态才能刷新所有子FWinControls的显示): 在TWinControls.PaintControls中,对所有FWinControls只是重绘了边框,而没有整 ...

  6. 线程池内的异步线程创建UI控件,造成UI线程卡死无响应的问题分析

    winform应用在使用一段时间后,切换到其他系统或者打开word.excel文档,再切换回winform应用时,系统有时出现不响应的现象.有时在锁屏后恢复桌面及应用时也发生此问题. 经微软支持确认, ...

  7. Delphi创建ActiveX控件,实现安全接口及无界面代码

    Delphi创建OCX控件非常的方便,但IE调用时弹出的安全认证非常麻烦,有时OCX也不需要界面,IE调用时需要隐藏,非常不方便.在DELPHI中创建OCX实现安全接口和创建事件中修改部分代码 实现安 ...

  8. winform 用户控件、 动态创建添加控件、timer控件、控件联动

    用户控件: 相当于自定义的一个panel 里面可以放各种其他控件,并可以在后台一下调用整个此自定义控件. 使用方法:在项目上右键.添加.用户控件,之后用户控件的编辑与普通容器控件类似.如果要在后台往窗 ...

  9. WinForm用户控件、动态创建添加控件、timer控件--2016年12月12日

    好文要顶 关注我 收藏该文 徐淳 关注 - 1 粉丝 - 3       0 0     用户控件: 通过布局将多个控件整合为一个控件,根据自己的需要进行修改,可对用户控件内的所有控件及控件属性进行修 ...

随机推荐

  1. 第六百一十七天 how can I 坚持

    没什么特长,唯一有的仅是妄想,哈哈,真逗. 明天就去新项目组了,会接触些新东西吧,啊,挺好,一开始压力大点很正常,但不要放弃啊. 搞不懂我自己啊,貌似不上火了呢. 睡觉了.忘不掉.做不到.

  2. Host基本概念

    TSO            TSO是Time Sharing Option的缩写,是MVS的命令输入处理器.        TSO是在操作系统的管理下,用来支持ISPF菜单式会话系统和资源管理设备( ...

  3. uicollectionview registerclass vs registernib

    当cell是用代码实现的时候用registerclass,当cell是用xib文件实现的时候用registernib

  4. IO调度算法

    简介: 当向设备写入数据块或是从设备读出数据块时,请求都被安置在一个队列中等待完成. 每个块设备都有它自己的队列. I/O调度程序负责维护这些队列的顺序,以更有效地利用介质.I/O调度程序将无序的I/ ...

  5. Linux下安装php环境并且配置Nginx支持php-fpm模块

    因为php安装需要编译,所以服务器应该保证gcc和g++环境的安装 首先释放安装包: tar -xvzf php-5.6.27.tar.gz cd php-5.6.27 接下来进行参数配置,配置前如果 ...

  6. 情感分析的现代方法(包含word2vec Doc2Vec)

    英文原文地址:https://districtdatalabs.silvrback.com/modern-methods-for-sentiment-analysis 转载文章地址:http://da ...

  7. A股各概念板块龙头股大全

    A股各概念板块龙头股大全一.新兴信息产业龙头 1.车联网龙头——软控股份002073 启明信息002232.荣之联002642 2.通信网络龙头——恒宝股份002104 3.通信设备制造龙头——新海宜 ...

  8. Comet4J推技术在SSHE三大框架中应用-linux下亲测可用

    Comet4J(Comet for Java)是一个纯粹基于AJAX(XMLHTTPRequest)的服务器推送框架,消息以JSON方式传递,具备长轮询.长连接.自动选择三种工作模式. 下载地址 co ...

  9. C语言深度挖掘

    二级指针和回调函数的用法: #include <stdio.h> #include <stdlib.h> int add(int num1 ,int num2){ return ...

  10. 阿里云SLB后Nginx、Tomcat获取真实IP

    一.SLB后Nginx如何获取真实IP 前提:nginx作为slb获取真实ip是使用 http_realip_module,默认一键安装包安装的nginx没有安装这个模块需要重新重新编译nginx并加 ...