MFC 单选按钮组向导添加和动态创建
单选按钮组的动态生成
单选按钮也属于CButton类,但由于单选按钮总是成组使用的,所以它在制作和使用上与普通按钮有一定区别。
假设有三个单选按钮组成一组,初始时,第一个单选按钮处于选中状态。
我们先来看静态制作方法:在对话框中放置三个单选按钮,设置属性如下:
Radio1属性:Visible、Group、Tab stop、Auto
Radio2属性:Visible、Tab stop、Auto
Radio3属性:Visible、Tab stop、Auto
这样的属性设置就把三个单选按钮分成了一组,它们一次只能有一个被选中,若对话框中还有其它成组的单选按钮,使用时也会互不干扰。但这时还没有使第一个按钮处于选中状态。接着就用ClassWizard为这组单选按钮添加变量,这里只需为第一个单选按钮添加变量即可。设变量名为m_Radio,类型选为int型。在构造函数中ClassWizard把m_Radio的值设置为-1,我们把它改为0,这样在运行程序时可以看到第一个单选按钮处于选中状态了。之后,还应该用ClassWizard为三个单选按钮添加单击响应函数,在里面修改m_Radio的值对应三个单选按钮就可以了。
以上就是通常制作单选按钮组的办法,现我们欲改为动态生成,主要要解决按钮分组和单击控制问题。以下为制作步骤:
1.定义三个单选按钮的ID:
打开资源中的“String Table”,在其中添加三个ID值:
第一个:ID为IDC_MYRADIO1,Caption为单选1
第二个:ID为IDC_MYRADIO2,Caption为单选2
第三个:ID为IDC_MYRADIO3,Caption为单选3
其中Caption为按钮上要显示的文字,可根据需要设置。
2.用CButton类的Create()函数生成三个单选按钮:
为方便起见,先定义一个函数生成单选按钮:
CButton* CTextEditorView::NewMyRadio(int nID,CRect rect,int
nStyle)
{
CString m_Caption; m_Caption.LoadString( nID );
//取按钮标题 CButton *p_Radio = new CButton();
ASSERT_VALID(p_Radio);
p_Radio->Create( m_Caption, WS_CHILD | WS_VISIBLE |
nStyle | WS_TABSTOP | BS_AUTORADIOBUTTON, rect, this, nID );
//创建按钮 return p_Radio;
}
函数LoadString()用于从“String
Table”中读取按钮文本,Create()函数中设定了单选按钮必须的属性,其中就包括了Visible、Tab
stop、Auto属性。参数nID为单选按钮ID号,rect为单选按钮尺寸,nStyle为除必要属性外的其它属性。返回值为指向新建按钮的指针。
有了这个函数后,创建单选按钮组时只要依次调用该函数即可,其中单选按钮组的第一个单选按钮必须指定WS_GROUP属性。 CButton
*p_MyRadio[3]; p_MyRadio[0] = NewMyRadio( IDC_MYRADIO1,
CRect(15,90,60,105), WS_GROUP ); p_MyRadio[1] = NewMyRadio(
IDC_MYRADIO2, CRect(15,108,60,123), 0 ); p_MyRadio[2] = NewMyRadio(
IDC_MYRADIO3, CRect(15,126,60,141), 0 );
3.定义单选按钮组的控制变量,设置第一个单选按钮为选中状态:
这里不能用ClassWizard添加变量,也不要在DoDataExchange()中添加控制变量,因为动态控件一开始并不存在,在DoDataExchange()中添加控制变量会造成运行错误。这里我们只需在头文件中随意定义一个int型变量作为控制变量即可,如:
int m_SelRadio;
在构造函数中设置其初值为0:m_SelRadio = 0;
在上面的创建按钮的语句中,用SetCheck()函数设置初始选中的按钮: CButton *p_MyRadio[3];
p_MyRadio[0] = NewMyRadio( IDC_MYRADIO1, CRect(15,90,60,105),
WS_GROUP );
p_MyRadio[1] = NewMyRadio( IDC_MYRADIO2, CRect(15,108,60,123), 0
);
p_MyRadio[2] = NewMyRadio( IDC_MYRADIO3, CRect(15,126,60,141), 0
);
p_MyRadio[m_SelRadio]->SetCheck(1);
//设置第一个单选为选中状态
在SetCheck()函数中,参数为1表示设置为选中状态,为0表示未选中状态。
4.添加鼠标单击响应函数:
鼠标单击某单选按钮后,其状态已经能自动改变,这里我们还需修改控制变量m_SelRadio的值,以便跟踪选中的单选按钮。
首先在MESSAGE_MAP中把鼠标单击消息与响应函数联系起来:
BEGIN_MESSAGE_MAP(CTextEditorView, CFormView)
//{{AFX_MSG_MAP(CTextEditorView) ON_BN_CLICKED(IDC_ICONBUT0,
OnIconbut0)
//ClassWizard在此处添加 //}}AFX_MSG_MAP ON_BN_CLICKED(IDC_MYRADIO1,
OnMyRadio1)
//单选按钮1 ON_BN_CLICKED(IDC_MYRADIO2, OnMyRadio2)
//单选按钮2 ON_BN_CLICKED(IDC_MYRADIO3, OnMyRadio3)
//单选按钮3 END_MESSAGE_MAP()
然后在头文件的MESSAGE_MAP中定义单击函数:
protected:
//{{AFX_MSG(CTextEditorView) afx_msg void OnIconbut0();
//ClassWizard在此处添加 //}}AFX_MSG afx_msg void OnMyRadio1();
//单选按钮1 afx_msg void OnMyRadio2();
//单选按钮2 afx_msg void OnMyRadio3();
//单选按钮3 DECLARE_MESSAGE_MAP()
这里注意不要把函数加在AFX_MSG区间内,以防影响ClassWizard的使用。
定义具体的响应函数(这里是用手工加入的,不是用ClassWizard加入的):
//单击单选按钮1 void CTextEditorView::OnMyRadio1() { m_SelRadio=0;
}
//单击单选按钮2 void CTextEditorView::OnMyRadio2() { m_SelRadio=1;
}
//单击单选按钮3 void CTextEditorView::OnMyRadio3() { m_SelRadio=2;
}
5.回收资源:
在析构函数中,回收创建的单选按钮(也可以在不使用单选按钮时立即回收):
CTextEditorView::~CTextEditorView() { int i; for( i=0;
i<3; i++) {
if(p_MyRadio[i])
delete p_MyRadio[i]; } }
以上就是动态控件的生成和响应方法,各种不同的控件做法略有不同,但思路和步骤都是类似的,
MFC 单选按钮组向导添加和动态创建的更多相关文章
- MFC六大核心机制之三:动态创建
MFC中很多地方都使用了动态创建技术.动态创建就是在程序运行时创建指定类的对象.例如MFC的单文档程序中,文档模板类的对象就动态创建了框架窗口对象.文档对象和视图对象.动态创建技术对于希望了解MFC底 ...
- JSF dataTable 添加列 动态创建数据表 列
@Named @ViewScoped public class LiveRangeService implements Serializable { private List< Map<S ...
- MFC 动态创建控件
动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的. 一.创建动态控件: 为了对照,我们先来看一下静态控件的创建. 放置静态控件时必须先建立一个容器,一 ...
- MFC之动态创建按钮
打开VS 创建MFC基于对话框的工程,在对话框初始化方法中动态创建一个按钮实例: 1> CButton *pMyButton = new CButton();CEdit *pMyEdit = n ...
- MFC之RTTI与动态创建
本人能力.精力有限,所言所感都基于自身的实践和有限的阅读.查阅,如有错误,欢迎拍砖,敬请赐教——博客园:钱智慧. 在说RTTI之前需要明白c++中类静态成员的初始化特点:类的静态数据成员需要在类体外显 ...
- MFC原理第四讲.动态创建机制
MFC原理第四讲.动态创建机制 一丶要学习的知识点以及简介 动态创建是什么意思? 动态创建其实就是跟C++的new一样.都是创建对象.但是规避了C++语法的缺陷. 例如: char * ClassNa ...
- mfc 动态创建EDIT控件
知识点: CWnd::Create CWnd::CreateEx Spy++工具 动态创建控件 一. CWnd::Create 参数 virtual BOOL Create( LPCTSTR lpsz ...
- 【转载】MFC动态创建控件及其消息响应函数
原文:http://blog.sina.com.cn/s/blog_4a08244901014ok1.html 这几天专门调研了一下MFC中如何动态创建控件及其消息响应函数. 参考帖子如下: (1)h ...
- MFC动态创建控件及其消息响应函数
这几天专门调研了一下MFC中如何动态创建控件及其消息响应函数. 参考帖子如下: (1)http://topic.csdn.net/u/20101204/13/5f1b1e70-2f1c-4205-ba ...
随机推荐
- Lintcode---二叉树的前序、中序、后序遍历
给出一棵二叉树,返回其节点值的后序遍历. 您在真实的面试中是否遇到过这个题? Yes 样例 给出一棵二叉树 {1,#,2,3}, 1 \ 2 / 3 返回 [3,2,1] 思路:二叉树的后序遍历,简单 ...
- Laravel 项目开发规范
参考:https://fsdhub.com/books/laravel-specification
- 记一次netty版本冲突,报java.lang.NoSuchMethodError: io.netty.util.internal.ObjectUtil.checkPositive的问题
elasticsearch 5.6中使用TransportClient初始化抛异常 在引入elasticsearch5.6的transportclient包中,会引入netty进行通信. <!- ...
- atitit. 管理哲学 大毁灭--- 如何防止企业的自我毁灭
atitit. 管理哲学 大毁灭--- 如何防止企业的自我毁灭 1. 为什么企业组织的生命力 普遍不如国家组织的长久 2 2. 企业的不稳定因子如下:: 2 3. 决策制度 2 3.1. 我们老大说 ...
- Atitit.js获取上传文件全路径
Atitit.js获取上传文件全路径 1. 默认的value只能获取文件名..安全原因.. 1 2. Firefox浏览器的读取 1 3. Html5 的file api 2 4. 解决方法::使用a ...
- todos Vue
<div id="todo-list-example"> <input v-model="newTodoText" v-on:keyup.en ...
- js arguments 内置对象
1.arguments是js的内置对象. 2.在不确定对象是可以用来重载函数. 3.用法如下: function goTo() { var i=arguments.length; alert(i); ...
- VMware12环境下安装CentOS7的vmware-tools
一.最小化安装 1.进入系统之后,要配置network网络. 首先ping www.baidu.com (Ctrl+z 推出正在执行的命令) 如果ping不通,则修改: vi /etc/ ...
- linux学习笔记26--命令wc
Linux系统中的wc(Word Count)命令的功能为统计指定文件中的行数.字数.字节数,并将统计结果显示输出. 1.命令格式: wc [选项]文件... 2.命令功能: 统计指定文件中的行数.字 ...
- hdu 1213 (How Many Tables)(简单的并查集,纯模板)
How Many Tables Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...