MFC动态创建控件

动态控件是指在需要时由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构造函数生成一个实例:  
CButton *btn= 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()函数略有不同,可参考相关资料。  
  例:btn->Create( _T("动态按钮"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, CRect(10,10,150,150), this, IDC_MYBUTTON); 

  这样,我们就在当前对话框中的(10,10)处创建了宽150,高150,按钮文字为“动态按钮”的下压式按钮。  MFC动态创建控件_第1张图片

二、动态控件的响应:  
  动态控件的响应函数不能用ClassWizard添加,只能手动添加。仍以上面的按钮为例,我们制作按钮的单击响应函数。  
  1.在MESSAGE_MAP中添加响应函数:  
  

BEGIN_MESSAGE_MAP(CstatictextDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_MYBUTTON,&CstatictextDlg::Button_Clicked)
END_MESSAGE_MAP()

  其中ON_BN_CLICKED是按钮单击消息。  
  2.在头文件中添加函数定义:  

afx_msg void Button_Clicked();

 


  3.编写消息响应函数:  
  以上是把消息和函数关联起来了,具体在单击按钮后应做的工作在函数中完成: 

void CstatictextDlg::Button_Clicked()
{
	btn->MoveWindow(100,100,150,150,TRUE);
	MessageBox(_T("您点击了按钮"));
}


三、回收资源:  
  由于动态控件对象是由new生成的,它不会被程序自动释放,所以需手工释放。在控件不再使用时可以删除它:  
if( btn) 
 delete btn;  

  

你可能感兴趣的:(MFC动态创建控件)