单选按钮组的动态生成

单选按钮也属于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 单选按钮组向导添加和动态创建的更多相关文章

  1. MFC六大核心机制之三:动态创建

    MFC中很多地方都使用了动态创建技术.动态创建就是在程序运行时创建指定类的对象.例如MFC的单文档程序中,文档模板类的对象就动态创建了框架窗口对象.文档对象和视图对象.动态创建技术对于希望了解MFC底 ...

  2. JSF dataTable 添加列 动态创建数据表 列

    @Named @ViewScoped public class LiveRangeService implements Serializable { private List< Map<S ...

  3. MFC 动态创建控件

    动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的.   一.创建动态控件:   为了对照,我们先来看一下静态控件的创建.   放置静态控件时必须先建立一个容器,一 ...

  4. MFC之动态创建按钮

    打开VS 创建MFC基于对话框的工程,在对话框初始化方法中动态创建一个按钮实例: 1> CButton *pMyButton = new CButton();CEdit *pMyEdit = n ...

  5. MFC之RTTI与动态创建

    本人能力.精力有限,所言所感都基于自身的实践和有限的阅读.查阅,如有错误,欢迎拍砖,敬请赐教——博客园:钱智慧. 在说RTTI之前需要明白c++中类静态成员的初始化特点:类的静态数据成员需要在类体外显 ...

  6. MFC原理第四讲.动态创建机制

    MFC原理第四讲.动态创建机制 一丶要学习的知识点以及简介 动态创建是什么意思? 动态创建其实就是跟C++的new一样.都是创建对象.但是规避了C++语法的缺陷. 例如: char * ClassNa ...

  7. mfc 动态创建EDIT控件

    知识点: CWnd::Create CWnd::CreateEx Spy++工具 动态创建控件 一. CWnd::Create 参数 virtual BOOL Create( LPCTSTR lpsz ...

  8. 【转载】MFC动态创建控件及其消息响应函数

    原文:http://blog.sina.com.cn/s/blog_4a08244901014ok1.html 这几天专门调研了一下MFC中如何动态创建控件及其消息响应函数. 参考帖子如下: (1)h ...

  9. MFC动态创建控件及其消息响应函数

    这几天专门调研了一下MFC中如何动态创建控件及其消息响应函数. 参考帖子如下: (1)http://topic.csdn.net/u/20101204/13/5f1b1e70-2f1c-4205-ba ...

随机推荐

  1. Java并发编程(六):Java里实现对象安全发布的四种方式

    接上篇,首先要了解什么是对象的发布与逸出? Java里安全发布对象的四种方法1.单例(注意懒汉和饿汉的区别)2.静态属性,注意类里的静态域和静态代码块的顺序有要求3.枚举4.final

  2. 点滴积累【C#】---操作xml,将xml数据显示到treeview

    效果: 代码: XmlDocument xml = new XmlDocument(); private void Form1_Load(object sender, EventArgs e) { C ...

  3. Linux 连续运行多条命令

    每条命令使用";"隔开.则不管前边的命令运行成功与否都会继续运行下一条命令 这里,有益将第二条命令中的echo多写了一个o.命令运行出错,但并不影响兴许命令的运行 能够这么想,假设 ...

  4. [gj]来公司停电了-维护机器

    停电出现的问题 一早来机房跳闸了. 很多vm手动起来后有些服务不太正常了. 机房锁坏了.不知道谁进去干啥了.导致跳闸 闸门不知道在哪里.导致所有机器停电了 牵扯到的技术点: 1,nexus启动. ng ...

  5. springboot整合docker部署(两种构建Docker镜像方式)--2019-3-5转

    原文:https://www.cnblogs.com/shamo89/p/9201513.html 项目结构 package hello; import org.springframework.boo ...

  6. QWidget::setLayout: Attempting to set QLayout "" on MainWindow "", which already has a layout

    http://blog.csdn.net/zhuyingqingfen/article/details/6562246 如题,出现这个的原因是,如果你的窗口继承的是QMainwindow,需要设置 s ...

  7. [转]AngularJS ui-router (嵌套路由)

    本文转自:http://www.oschina.net/translate/angularjs-ui-router-nested-routes http://www.codeproject.com/A ...

  8. flutter datatable

    最后,还是用到了 PaginatedDataTable 我把header改成了最终条件显示. 主要是要有listview之类的scrollview容器,否则会报错. 切换页的时候,记得加入空行,否则会 ...

  9. zend studio 10.6.2 字体大小 设置

    如果汉化的:窗体-->常规-->外观-->颜色和字体-->基本-->文字字体  点击编辑 如果未汉化:Window->Preferences->General ...

  10. UFLDL深度学习笔记 (二)SoftMax 回归(矩阵化推导)

    UFLDL深度学习笔记 (二)Softmax 回归 本文为学习"UFLDL Softmax回归"的笔记与代码实现,文中略过了对代价函数求偏导的过程,本篇笔记主要补充求偏导步骤的详细 ...