MFC如何动态添加控件

2024-05-03 09:16

1. MFC如何动态添加控件

  动态控件的创建过程:
  1.建立控件ID号:
  ID号是控件的标识,创建控件前必须先为它设置一个ID号。
  打开资源中的“String Table”,在空白行上双击鼠标,这时会弹出一个ID属性对话框,在其中的ID编辑框中输入ID,如:IDC_MYBUTTON,在Caption中输入控件标题或注解(注:Caption框不能为空,为空会导致创建失败),这里我输入的是按钮上要显示的文字--动态按钮。
  2.建立控件对象:
  不同种类的控件应创建不同的类对象:
  ·按钮控件 CButton (包括普通按钮、单选按钮和复选按钮)
  ·编辑控件 CEdit
  ·静态文本控件 CStatic
  ·标签控件 CTabCtrl
  ·旋转控件 CSpinButtonCtrl
  ·滑标控件 CSliderCtrl
  ·多信息编辑控件 CRichEditCtrl
  ·进度条控件 CProgressCtrl
  ·滚动条控件 CSrcollBar
  ·组合框控件 CComboBox
  ·列表框控件 CListBox
  ·图像列表控件 CImageCtrl
  ·树状控件 CTreeCtrl
  ·动画控件 CAnimateCtrl

MFC如何动态添加控件

2. 怎么样在MFC中创建动态控件

在MFC中怎么动态创建各种控件,以及添加相应的响应事件。
放置静态控件时必须先建立一个容器,一般是对话框,这时我们在对话框编辑窗口中,从对象窗口中拖出所需控件放在对话框中即可,再恰当批改控件ID,设置控件属性,一个静态控件就创建好了,当对话框被显示时,其上的控件也会显示。
静态控件不须要调用Create()函数来创建。
动态控件是指在须要时由Create()创建的控件,这与预先在对话框中放置的控件是不合的。

一、创建动态控件:

创建动态控件有很大不同,以下以按钮为例,看一下动态控件的创建过程:

1.建立控件ID号:

ID号是控件的标识,创建控件前必须先为它设置一个ID号。

打开资料中的“String Table”,在空白行上双击鼠标,这时会弹出一个ID属性对话框,在此中的ID编辑框中输入ID,如:IDC_MYBUTTON,在Caption中输入控件题目或注解(注:Caption框不能为空,为空会导致创建失败),这里我输入的是按钮上要显示的文字--动态按钮。

2.建立控件对象:

不同种类的控件应创建不合的类对象:

按钮控件      CButton  (包含通俗按钮、单选按钮和复选按钮)
编辑控件      CEdit
静态文本控件  CStatic
标签控件      CTabCtrl
扭转控件      CSpinButtonCtrl
滑标控件      CSliderCtrl
多信息编辑控件 CRichEditCtrl
进度条控件    CProgressCtrl
迁移转变条控件    CSrcollBar
组合框控件    CComboBox
列表框控件    CListBox
图像列表控件  CImageCtrl
树状控件      CTreeCtrl
动画控件      CAnimateCtrl
本例中我们创建一个CButton类的通俗按钮。首先直接定义CButton对象,如:CButton m_MyBut;这种定义只能用来给静态控件定义把握变量,不能直接用于动态控件。
正确做法是用new调用CButton机关函数生成一个实例:
[cpp] view plain copyCButton *p_MyBut = new CButton();然后用CButton类的Create()函数创建,该函数原型如下:
BOOL Create( LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
lpszCaption是按钮上显示的文本;
dwStyle指定按钮风格,可所以按钮风格与窗口风格的组合,取值有:
窗口风格:
WS_CHILD  子窗口,必须有
WS_VISIBLE  窗口可见,一般都有
WS_DISABLED  禁用窗口,创建初始状况为灰色不成用的按钮时应用
WS_TABSTOP  可用Tab键选择
WS_GROUP  成组,用于成组的单选按钮中的第一个按钮
按钮风格:
BS_PUSHBUTTON 下压式按钮,也即通俗按钮
BS_AUTORADIOBUTTON 含主动选中状况的单选按钮
BS_RADIOBUTTON 单选按钮,不常用
BS_AUTOCHECKBOX 含主动选中状况的复选按钮
BS_CHECKBOX 复选按钮,不常用
BS_AUTO3STATE 含主动选中状况的三态复选按钮
BS_3STATE 三态复选按钮,不常用
以上风格指定了创建的按钮类型,不能同时应用,但必须有其一。
BS_BITMAP 按钮大将显示位图
BS_DEFPUSHBUTTON 设置为默认按钮,只用于下压式按钮,一个对话框中只能指定一个默认按钮
rect指定按钮的大小和地位;
pParentWnd指导拥有按钮的父窗口,不能为NULL;
nID指定与按钮接洽关系的ID号,用上一步创建的ID号。
不同控件类的Create()函数略有不同,可参考相干材料。
例:p_MyBut->Create( "动态按钮", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(20,10,80,40), this, IDC_MYBUTTON );
这样,我们就在当前对话框中的(20,10)处创建了宽60,高30,按钮文字为“动态按钮”的下压式按钮。
为了使创建过程更便利易用,我定义了如下函数:
[cpp] view plain copyCButton* 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;  }此中m_Caption.LoadString( nID )是从字符串表中读取按钮文本,如许在创建按钮ID时,应当把文本设置好,参数nStyle为除必须风格外的额外风格。
以下,我调用该函数创建三个按钮,并指定第一个按钮为默认按钮,按钮的ID已预先设置好了:
[cpp] view plain copyCButton *p_MyBut[3];  p_MyBut[0] = NewMyButton( ID_MYBUT1, CRect(10,20,50,35), BS_DEFPUSHBUTTON );  p_MyBut[1] = NewMyButton( ID_MYBUT2, CRect(55,20,95,35), 0 );  p_MyBut[2] = NewMyButton( ID_MYBUT3, CRect(100,20,140,35), 0 );二、动态控件的响应:
动态控件的响应函数不能直接用ClassWizard添加,只能手动添加。仍以上方的按钮为例,我们建造按钮的单击响应函数。
1.在MESSAGE_MAP中添加响应函数:
MESSAGE_MAP表中定义了消息响应函数,其格局为:消息名(ID,函数名),当我们用ClassWizard添加函数时,会主动添加在AFX_MSG_MAP括起的区间内,如:
[cpp] view plain copyBEGIN_MESSAGE_MAP(CTextEditorView, CFormView)   //{{AFX_MSG_MAP(CTextEditorView)   ON_BN_CLICKED(IDC_ICONBUT0, OnIconbut0)   //}}AFX_MSG_MAP  END_MESSAGE_MAP()手工添加时不要添加到AFX_MSG_MAP区间内,以防ClassWizard不克不及正常工作,如:
[cpp] view plain copyBEGIN_MESSAGE_MAP(CTextEditorView, CFormView)   //{{AFX_MSG_MAP(CTextEditorView)   ON_BN_CLICKED(IDC_ICONBUT0, OnIconbut0)   //}}AFX_MSG_MAP   ON_BN_CLICKED(ID_MYBUT1, OnMybut1)   ON_BN_CLICKED(ID_MYBUT2, OnMybut2)   ON_BN_CLICKED(ID_MYBUT3, OnMybut3)  END_MESSAGE_MAP()此中ON_BN_CLICKED是按钮单击消息。
2.在头文件中添加函数定义:
用ClassWizard添加函数时,会在头文件的AFX_MSG区间内添加函数定义,如:
[cpp] view plain copyprotected:   //{{AFX_MSG(CTextEditorView)   afx_msg void OnIconbut0();   //}}AFX_MSG   DECLARE_MESSAGE_MAP()我们仿照这种情势,只是把函数定义添加到AFX_MSG区间外就行了:
[cpp] view plain copyprotected:   //{{AFX_MSG(CTextEditorView)   afx_msg void OnIconbut0();   //}}AFX_MSG   afx_msg void OnMybut1();   afx_msg void OnMybut2();   afx_msg void OnMybut3();   DECLARE_MESSAGE_MAP()