【转载】MFC动态创建控件及其消息响应函数
原文:http://blog.sina.com.cn/s/blog_4a08244901014ok1.html
这几天专门调研了一下MFC中如何动态创建控件及其消息响应函数。
参考帖子如下:
(1)http://topic.csdn.net/u/20101204/13/5f1b1e70-2f1c-4205-ba10-41616d16f07e.html
(2)http://www.cppblog.com/deercoder/articles/107132.html
这两篇帖子是比较经典的,能够回答我的问题。但是如何动态创建消息响应函数呢?这需要利用另外一个命令:
ON_COMMAND_RANGE
参考如下帖子:http://topic.csdn.net/t/20020728/22/906766.html
注意:ON_COMMAND_RANGE映射了一组控件ID与其相应的消息响应函数,因为要区分是哪个控件ID的消息响应函数,所以其消息响应函数需要加上参数:UINT nID
下面我自己新建了一个MFC工程,开始测试上面帖子中的用法。经过反复比较,发现还有一个细节需要注意:
需要在String Table中加入初始化时的那个控件ID,具体操作如下:
打开资源中的“String Table”,在空白行上双击鼠标,这时会弹出一个ID属性对话框,在其中的ID编辑框中输入ID,如:IDC_MYBUTTON,在Caption中输入控件标题或注解(注:Caption框不能为空,为空会导致创建失败),这里我输入的是按钮上要显示的文字--动态按钮。
这样后面的操作就不会出错了。
具体代码如下:
(1)建立控件ID号:在String Table中加入一个新ID:IDC_MYBUTTON。注意和默认的ID的值保持距离
(2)建立控件对象:
注意不能直接定义CButton对象,如:CButton m_MyBut;这种定义只能用来给静态控件定义控制变量,不能用于动态控件。
对于一个Dialog资源,先关联一个类,比如CTestDlg
然后在CTestDlg.cpp中位置加入:
ON_COMMAND_RANGE(IDC_MYBUTTON,IDC_MYBUTTON+10,&CTestDlg::OnMYBTN)
如下所示:
BEGIN_MESSAGE_MAP(CTestDlg, CDialog)
ON_COMMAND_RANGE(IDC_MYBUTTON,IDC_MYBUTTON+10,&CTestDlg::OnMYBTN)
ON_BN_CLICKED(IDC_BUTTON1, &CTestDlg::OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2, &CTestDlg::OnBnClickedButton2)
END_MESSAGE_MAP()
然后添加一个创建控件的函数:
| CButton* CTextEditorView::NewMyButton(int nID,CRect rect,int nStyle) { CString m_Caption; m_Caption.LoadString( nID ); //取按钮标题 CButton *p_Button = new CButton(); ASSERT_VALID(p_Button); p_Button->Create( m_Caption, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | nStyle, rect, this, nID ); //创建按钮 return p_Button; } |
然后使用工具箱新建了一个button(IDC_BUTTON1),使得这个button的消息响应函数是用来新建三个新按钮。其消息响应函数如下:
void CTestDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
if(btn_flag==false)
{
p_MyBut[0] = NewMyButton( IDC_MYBUTTON, CRect(20,20,50,60), BS_DEFPUSHBUTTON );
p_MyBut[1] = NewMyButton( IDC_MYBUTTON+1, CRect(70,20,95,50), 0 );
p_MyBut[2] = NewMyButton( IDC_MYBUTTON+50, CRect(120,20,140,35), 0 );
btn_flag=p_MyBut[0] && p_MyBut[1] && p_MyBut[2]; //btn_flag=true;
}
}
另外又设置了一个button(IDC_BUTTON2),按下这个按钮就销毁之前创建的三个新按钮。
void CTestDlg::OnBnClickedButton2()
{
if(btn_flag)
{
if(p_MyBut[0]) delete p_MyBut[0];
if(p_MyBut[1]) delete p_MyBut[1];
if(p_MyBut[2]) delete p_MyBut[2];
btn_flag=false;
}
}
设置全局变量:bool btn_flag;用来表示是否按下了button1,新建了三个按钮
设置全局变量:CButton *p_MyBut[3];用来存放新建的三个按钮
而这三个按钮的消息响应函数如下:注意需要加参数!
void CTestDlg::OnMYBTN(UINT nID)
{
int index = nID - IDC_MYBUTTON;
CString strBtn;
strBtn.Format(_T("BUTTON%d"),index);
MessageBox(strBtn);
}
========================================================
最后实现的功能就是按Button1生成三个新按钮,每个按钮都可以触发一个messagebox。而按Button2可以销毁三个新生成的按钮。
【转载】MFC动态创建控件及其消息响应函数的更多相关文章
- MFC动态创建控件及其消息响应函数
这几天专门调研了一下MFC中如何动态创建控件及其消息响应函数. 参考帖子如下: (1)http://topic.csdn.net/u/20101204/13/5f1b1e70-2f1c-4205-ba ...
- MFC 动态创建控件
动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态控件: 为了对照,我们先来看一下静态控件的创建. 放置静态控件时必须先建立一个容器,一 ...
- 小子给大家分享一个或者多个新手创建tableview经常会遇到的坑(动态创建控件,xib的重用)
小子最近做了一个根据接口返回的数据在Cell中动态创建控件,感觉应该会一部分人卡在这里,小子就跟大家分享一下: 1.控件重复创建:这个问题出现的原因是动态创建的cell内容的时候,无法进行重用设置,所 ...
- VisionPro笔记(1):动态创建控件
VisionPro学习笔记(1):动态创建控件 有的时候可能需要在程序中动态创建控件,VisionPro实例中提供了一例动态创建Blob控件的方法.当然,动态创建过多的控件会极大的消耗系统的资源,建 ...
- delphi动态创建控件
动态创建控件 其实动态创建控件很简单,相信看过本文后你会全明白的. 1 先在单元的initialization 部分注册它,(这样在单元使用时会自动注册的)如: RegisterClass( TBut ...
- 在DELPHI中动态创建控件以及控件的事件
在DELPHI中我们经常要动态的创建控件以及控件的事件.例如,我们可能想根据程序需要动态的创建一些Tshape组件来创建某个图形,并使得在鼠标移动上去之后可以完成某些操作.这一般需要需要三步: 生成一 ...
- Winfrom动态创建控件
FlowLayoutPanel flowLayoutPanel1 = new FlowLayoutPanel();for (int i = 0; i < 9; i++){ Button b ...
- 动态创建控件 #Create(...)
在类中创建一个控件对象;例:CButton m_btn; 用Create创建一个对象(#其实已经与其绑定)m_btn.Create(.....); #注意Create()函数的参数 问题一:点击一个b ...
- 【VS开发】MFC CListCtrl列表控件的消息响应
MFC里的CListCtrl选中一行,消息是哪个.实在想不起来了.找了一篇文章,比较有用: http://www.cnblogs.com/hongfei/archive/2012/12/25/2832 ...
随机推荐
- java vector的多线程安全是否有用
在网上搜了不少文章,发现有不少没讲清楚的,也有不少好文,本文希望更易懂地描述该问题.如有不对的地方,请多多指正~~ vector的使用主要有如下两种场景:(1)vector所谓的多线程安全,只是针对单 ...
- 【gp数据库】OLTP和OLAP区别详解
原来一直使用Oracle,新公司使用greenplum后发现系统的并发性差很多,后来才了解因为Oracle属于OLTP类型,而gp数据库属于OLAP类型的.具体了解如下: 数据库系统一般分为两种类型, ...
- 解决NSTextContainer分页时文本截断问题
解决NSTextContainer分页时文本截断问题 NSTextContainer与NSLayoutManager配合使用可以将大文本文件分页,但是,分页过程中会遇到问题,显示字符被截断的问题:) ...
- 使用keychain永久存储数据
使用keychain永久存储数据 https://github.com/soffes/sskeychain keychain当然还是使用开源的好:),keychain是干啥用的?这个,baidu一下你 ...
- 可以触发点击事件并变色的UILabel
可以触发点击事件并变色的UILabel 谁说UILabel不能够当做button处理点击事件呢?今天,笔者就像大家提供一个改造过的,能够触发点击事件并变色的UILabel:) 效果图: 还能当做计时器 ...
- Python学习---xml文件的解析[beautifulsoup4模块学习]
1.1. 安装beautifulsoup4 pip install beautifulsoup4 [更多参考]https://blog.csdn.net/sunhuaqiang1/article/de ...
- Linux which/whereis/locate命令详解
which 查看可执行文件的位置,从全局环境变量PATH里面查找对应的路径,默认是找 bash内所规范的目录 whereis 查看文件的位置,配合参数-b,用于程序名的搜索,从linux数据库查找. ...
- 【跨域】#001 JSONP原理解析【总结】
一.JSONP 是什么? 1.1 概念 JSONP(JSON with Padding)是资料格式 JSON 的一种“使用模式”,可以让网页从别的网域要资料.由于同源策略,一般来说位于 server1 ...
- 编程题1001.A+B Format (20)
代码链接点击这里 由于有点久没写代码了,本次作业提交了三次才全部正解. 一开始以为是非常容易的题目,就没有带入多组数据,便以最简单的思路提交了代码. 发现了有特别多错误后,我并没有选择马上找同学帮忙, ...
- C++11 的右值引用
作者:Tinro链接:https://www.zhihu.com/question/22111546/answer/30801982来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...