VC程序中实现控件的动态生成与响应(二)

翻译|其它|编辑:郝浩|2005-03-24 11:02:00.000|阅读 1928 次

概述:

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>


三、回收资源:

  由于动态控件对象是由new生成的,它不会被程序自动释放,所以需手工释放。在控件不再使用时可以删除它:

if( p_MyBut[0] )
delete p_MyBut[0];

    以上就是按钮控件动态生成的方法。下面,再看一下单选按钮的动态生成问题。 四、实例:单选按钮组的动态生成

  单选按钮也属于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];
}
}


  以上就是动态控件的生成和响应方法,各种不同的控件做法略有不同,但思路和步骤都是类似的,希望以上实例对你能够有所帮助。
 


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP