create()创建的控件不能映射消息函数的解决
有时,使用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()创建的控件不能映射消息函数的解决的更多相关文章
- 让动态创建的ActiveX控件响应Windows消息
当我们通过 CWnd::CreateControl() 动态创建 ActiveX 控件时, Windows 消息并不会被发送给我 们的由 CWnd 派生得控件类.例如,即使我们为 WM_KIL ...
- 如何用ATL创建ActiveX控件
演示截图: 代码简介或代码解析: 如何用ATL创建ActiveX控件 实现了一个ActiveX控件,它在一个圆内部有个正多边形,当用户在多变形内部单击将会使多边形的边数在当前的基础上+1,在多变形外部 ...
- 用ATL和MFC来创建ActiveX控件
摘要:目前MFC和ATL代表了两种框架,分别面向不同类型的基于Windows的开发.MFC代表了创建独立的Windows应用的一种简单.一致的方法:ATL提供了一种框架来实现创建COM客户机和服务器所 ...
- MFC_1.3 控件子类化 消息反射
控件子类化 如果想要在默认的控件类中添加一些功能,就需要子类化一个控件类 在类内可以响应控件所有的消息,并且可以添加自己的函数和数据 通过类向导子类化控件的步骤 打开类向导,创建一个 MFC 类,不要 ...
- 五种情况下会刷新控件状态(刷新所有子FWinControls的显示)——从DFM读取数据时、新增加子控件时、重新创建当前控件的句柄时、设置父控件时、显示状态被改变时
五种情况下会刷新控件状态(刷新控件状态才能刷新所有子FWinControls的显示): 在TWinControls.PaintControls中,对所有FWinControls只是重绘了边框,而没有整 ...
- 线程池内的异步线程创建UI控件,造成UI线程卡死无响应的问题分析
winform应用在使用一段时间后,切换到其他系统或者打开word.excel文档,再切换回winform应用时,系统有时出现不响应的现象.有时在锁屏后恢复桌面及应用时也发生此问题. 经微软支持确认, ...
- Delphi创建ActiveX控件,实现安全接口及无界面代码
Delphi创建OCX控件非常的方便,但IE调用时弹出的安全认证非常麻烦,有时OCX也不需要界面,IE调用时需要隐藏,非常不方便.在DELPHI中创建OCX实现安全接口和创建事件中修改部分代码 实现安 ...
- winform 用户控件、 动态创建添加控件、timer控件、控件联动
用户控件: 相当于自定义的一个panel 里面可以放各种其他控件,并可以在后台一下调用整个此自定义控件. 使用方法:在项目上右键.添加.用户控件,之后用户控件的编辑与普通容器控件类似.如果要在后台往窗 ...
- WinForm用户控件、动态创建添加控件、timer控件--2016年12月12日
好文要顶 关注我 收藏该文 徐淳 关注 - 1 粉丝 - 3 0 0 用户控件: 通过布局将多个控件整合为一个控件,根据自己的需要进行修改,可对用户控件内的所有控件及控件属性进行修 ...
随机推荐
- delphi FMX 数字下拉滑动
滑动输入数字 NumberBox控件 HorzIncrement:划动自动增加输入值的步长 combobox控件 http://docwiki.embarcadero.com/RADStudio/Be ...
- mybatis - resultMap
resultMap有比较强大的自动映射,下面是摘自mybatis中文官网的的片段: 当自动映射查询结果时,MyBatis会获取sql返回的列名并在java类中查找相同名字的属性(忽略大小写). 这意味 ...
- SpringMVC无法获取请求中的参数的问题的调查与解决(2)
由于Request的getInputSteam()一旦获取一次后,就再也无法获取了 在实际项目中导致下面的问题: 1,多个拦截器,Filter都需要从InputStream中拿数据的情况无法处理: 2 ...
- C++:名字查找先于类型检查
Sub-Title: Name Hiding. "In C++, there is no overloading across scopes - derived class scopes a ...
- 如果客户端禁用cookie,session还能使用吗?
记得在以前找工作的时候,可多次被问到如果客户端被禁用cookie,session还能使用吗? 今天终于找到了相关的答案:我们来看一下: session是在服务器段保持会话数据的一种方法,对应的cook ...
- Hcm data loader for cancel work relationship
好好总结一下这个task.没有做好的东西:1.现有的资料和各种各样的工具没有很好的利用起来,造成了用了很多的时间去了解和自己学习.非常的不舒服的.下次要避免这样的浪费时间,学会在工作中学习.现在以及以 ...
- linux 学习6 软件包安装
一.软件包管理简介 二.RPM包管理-rpm命令管理 三.RPM包管理-yum在线管理 四.源码包管理 五.脚本安装包与软件包选择 .软件包分类 源码包 脚本安装包 二进制包(RPM包.系统默认 ...
- LIKE模糊查询的通配符
LIKE模糊查询的通配符 通配符 说明 示例 % 包含零个或多个字符的任意字符串. WHERE title LIKE '%computer%' 将查找在书名中任意位置包含单词 "comput ...
- crm 2013邮箱设置 “允许使用凭据进行电子邮件处理” 被禁用的解决
记录一下: 在CRM 2013/2015的邮箱设置时发现“允许使用凭据进行电子邮件处理” 选项被禁用而且无法输入凭证(如下图): 查阅官方说明得知考虑邮件安全性只能在IFD部署或https访问模式下才 ...
- Visual Studio 2015激活码,Visual Studio 2015密钥
微软刚刚为开发人员奉上了最新大礼Visual Studio 2015正式版.如果你是MSDN订阅用户,现在就可以去下载丰富的相关资源.如果你指向体验一把尝尝鲜,微软也是很慷慨的. Visual Stu ...