mfc动态创建控件
来源:互联网 发布:java存储过程调用 编辑:程序博客网 时间:2024/04/29 10:45
动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的。
一、创建动态控件:
为了对照,我们先来看一下静态控件的创建。
放置静态控件时必须先建立一个容器,一般是对话框,这时我们在对话框编辑窗口中,从工具窗口中拖出所需控件放在对话框中即可,再适当修改控件ID,设置控件属性,一个静态控件就创建好了,当对话框被显示时,其上的控件也会显示。
静态控件不需要调用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类的Create()函数创建,该函数原型如下:
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,按钮文字为“动态按钮”的下压式按钮。
为了使创建过程更方便易用,我定义了如下函数:
{
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为除必须风格外的额外风格。
以下,调用该函数在ONINIATIAL中创建三个按钮,并指定第一个按钮为默认按钮,按钮的ID在STRING TABLE中已预先设置好了:
//CButton *p_MyBtn[3];//为了在后面释放资源,改为在类头文件中声明为
//公有变量
p_MyBtn[0]=NewMyButton(ID_MYBTN1,CRect(10,20,60,40),BS_DEFPUSHBUTTON);
p_MyBtn[1]=NewMyButton(ID_MYBTN2,CRect(10,50,60,70),0);
p_MyBtn[2]=NewMyButton(ID_MYBTN3,CRect(10,80,60,100),0);
二、动态控件的响应:
动态控件的响应函数不能用ClassWizard添加,只能手动添加。仍以上面的按钮为例,我们制作按钮的单击响应函数。
1.在MESSAGE_MAP中添加响应函数:
MESSAGE_MAP表中定义了消息响应函数,其格式为:消息名(ID,函数名),当我们用ClassWizard添加函数时,会自动添加在AFX_MSG_MAP括起的区间内,如:
BEGIN_MESSAGE_MAP(CTextEditorView, CFormView)
//{{AFX_MSG_MAP(CTextEditorView)
ON_BN_CLICKED(IDC_ICONBUT0, OnIconbut0)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
手工添加时不要添加到AFX_MSG_MAP区间内,以防ClassWizard不能正常工作,如:
BEGIN_MESSAGE_MAP(CTextEditorView, CFormView)
//{{AFX_MSG_MAP(CTextEditorView)
ON_BN_CLICKED(IDC_ICONBUT0, OnIconbut0)
//}}AFX_MSG_MAP
ON_BN_CLICKED(ID_MYBTN1, OnMybtn1)
ON_BN_CLICKED(ID_MYBTN2, OnMybtn2)
ON_BN_CLICKED(ID_MYBTN3, OnMybtn3)
END_MESSAGE_MAP()
其中ON_BN_CLICKED是按钮单击消息。
2.在头文件中添加函数定义:
用ClassWizard添加函数时,会在头文件的AFX_MSG区间内添加函数定义,如:
protected:
//{{AFX_MSG(CTextEditorView)
afx_msg void OnIconbut0();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
我们模仿这种形式,只是把函数定义添加到AFX_MSG区间外就行了:
protected:
//{{AFX_MSG(CTextEditorView)
afx_msg void OnIconbut0();
//}}AFX_MSG
afx_msg void OnMybtn1();
afx_msg void OnMybtn2();
afx_msg void OnMybtn3();
DECLARE_MESSAGE_MAP()
3.编写消息响应函数:
以上是把消息和函数关联起来了,具体在单击按钮后应做的工作在函数中完成:
void CTextEditorView::OnMybtn1()
{
MessageBox( "哈!你单击了动态按钮。" );
}
void CTextEditorView::OnMybtn2()
{
……
}
void CTextEditorView::OnMybtn3()
{
……
}
除了按钮的响应函数外,你还可以用上面获得的指针访问按钮,如:
修改按钮的大小和位置:p_MyBtn[0]->MoveWindow(……);
修改按钮文本:p_MyBtn[0]->SetWindowText(……);
显示/隐藏按钮:p_MyBtn[0]->ShowWindow(……);等等。
三、回收资源:
由于动态控件对象是由new生成的,它不会被程序自动释放,所以需手工释放。在控件不再使用时可以删除它,在对话框中的析构函数中销毁(析构函数没有手动添加):
CMonthCalCtrlDlg::~CMonthCalCtrlDlg()
{
for(int i=0;i<3;i++)
{if(p_MyBtn[i])
delete p_MyBtn[i];
p_MyBtn[0]=NULL;//若采用其他方式释放,则加上这句,否则会出错
}
}
以上就是按钮控件动态生成的方法。
- mfc动态创建控件
- MFC动态创建控件
- MFC 动态创建控件
- MFC动态创建控件
- 动态创建mfc控件
- MFC 动态创建控件
- MFC动态创建控件--CStatic
- MFC中动态创建控件
- 深入浅出MFC:动态创建控件
- MFC动态创建CEdit控件
- MFC动态创建控件的消息处理
- MFC动态创建控件的消息处理
- MFC中动态创建一个控件
- MFC动态创建控件的消息处理
- MFC动态创建CButton控件显示不正常
- MFC 动态创建对话框和控件
- MFC 动态创建控件 字体设置问题
- 控件的动态创建-MFC方式
- Linux下多线程(pthread)编程实例
- Ogre的渲染系统
- 【转】睡五分钟等于六钟头的方法
- Delphi 下的RTTI
- 升级ubuntu到version 10.04
- mfc动态创建控件
- 冒泡排序+二分查找
- 解决ORA-12528
- bountinbox 检测 呵呵,从没有写过这么经典的代码
- Java Decompiler:一种快速的Java反编译器
- WPF制作自己的模拟窗体
- Java中方法在内存中的表示
- JavaWeb服务器工作原理
- 感情投资比金钱投资更能增加员工的积极性