修改对话框为BCG工程手动添加控件文档格式.docx
- 文档编号:22286409
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:10
- 大小:20.59KB
修改对话框为BCG工程手动添加控件文档格式.docx
《修改对话框为BCG工程手动添加控件文档格式.docx》由会员分享,可在线阅读,更多相关《修改对话框为BCG工程手动添加控件文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
returnFALSE;
3.在resource.h中添加ID_EXTRA_EDIT资源号。
#defineID_EXTRA_EDIT1001
3.多文档App类的InitInstance函数中的SetRegistryKey和SetRegistryBase的使用。
SetRegistryKey这个函数将应用程序的设置保存在注册表而不是INI文件中。
这个函数设置m_pszRegistryKey,它被CWinApp的成员函数GetProfileInt,GetProfileString,WriteProfileInt和WriteProfileString使用。
如果调用了这个函数,最近使用(MRU)的文件也被保存到注册表中。
通常注册表的键为公司的名字。
它保存在如下形式的键中:
HKEY_CURRENT_USER\Software\<
公司名>
\<
应用程序名>
sectionname>
valuename>
。
4.以下为从网上找的关于vc中动态添加控件的资料:
VC中动态添加控件
动态控件是指在需要时由Create()创建的控件,这与预先在对话框中放置的控件是不同的。
一、创建动态控件:
为了对照,我们先来看一下静态控件的创建。
放置静态控件时必须先建立一个容器,一般是对话框,这时我们在对话框编辑窗口中,从工具窗口中拖出所需控件放在对话框中即可,再适当修改控件ID,设置控件属性,一个静态控件就创建好了,当对话框被显示时,其上的控件也会显示。
静态控件不需要调用Create()函数来创建。
而创建动态控件有很大不同,以下以按钮为例,看一下动态控件的创建过程:
1.建立控件ID号:
ID号是控件的标识,创建控件前必须先为它设置一个ID号。
打开资源中的“StringTable”,在空白行上双击鼠标,这时会弹出一个ID属性对话框,在其中的ID编辑框中输入ID,如:
IDC_MYBUTTON,在Caption中输入控件标题或注解(注:
Caption框不能为空,为空会导致创建失败),这里我输入的是按钮上要显示的文字--动态按钮。
2.建立控件对象:
不同种类的控件应创建不同的类对象:
·
按钮控件CButton(包括普通按钮、单选按钮和复选按钮)
编辑控件CEdit
静态文本控件CStatic
标签控件CTabCtrl
旋转控件CSpinButtonCtrl
滑标控件CSliderCtrl
多信息编辑控件CRichEditCtrl
进度条控件CProgressCtrl
滚动条控件CSrcollBar
组合框控件CComboBox
列表框控件CListBox
图像列表控件CImageCtrl
树状控件CTreeCtrl
动画控件CAnimateCtrl
本例中我们创建一个CButton类的普通按钮。
注意不能直接定义CButton对象,如:
CButtonm_MyBut;
这种定义只能用来给静态控件定义控制变量,不能用于动态控件。
正确做法是用new调用CButton构造函数生成一个实例:
CButton*p_MyBut=newCButton();
然后用CButton类的Create()函数创建,该函数原型如下:
BOOLCreate(LPCTSTRlpszCaption,DWORDdwStyle,constRECT&
rect,CWnd*pParentWnd,UINTnID);
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,按钮文字为“动态按钮”的下压式按钮。
为了使创建过程更方便易用,我定义了如下函数:
CButton*CTextEditorView:
NewMyButton(intnID,CRectrect,intnStyle)
{
CStringm_Caption;
m_Caption.LoadString(nID);
//取按钮标题
CButton*p_Button=newCButton();
ASSERT_VALID(p_Button);
p_Button->
Create(m_Caption,WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|nStyle,rect,this,nID);
//创建按钮
returnp_Button;
}
其中m_Caption.LoadString(nID)是从字符串表中读取按钮文本,这样在创建按钮ID时,应该把文本设置好,参数nStyle为除必须风格外的额外风格。
以下,我调用该函数创建三个按钮,并指定第一个按钮为默认按钮,按钮的ID已预先设置好了:
CButton*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括起的区间内,如:
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不能正常工作,如:
ON_BN_CLICKED(ID_MYBUT1,OnMybut1)
ON_BN_CLICKED(ID_MYBUT2,OnMybut2)
ON_BN_CLICKED(ID_MYBUT3,OnMybut3)
其中ON_BN_CLICKED是按钮单击消息。
2.在头文件中添加函数定义:
用ClassWizard添加函数时,会在头文件的AFX_MSG区间内添加函数定义,如:
protected:
//{{AFX_MSG(CTextEditorView)
afx_msgvoidOnIconbut0();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
我们模仿这种形式,只是把函数定义添加到AFX_MSG区间外就行了:
afx_msgvoidOnMybut1();
afx_msgvoidOnMybut2();
afx_msgvoidOnMybut3();
3.编写消息响应函数:
以上是把消息和函数关联起来了,具体在单击按钮后应做的工作在函数中完成:
voidCTextEditorView:
OnMybut1()
MessageBox("
哈!
你单击了动态按钮。
"
);
}
OnMybut2()
……
OnMybut3()
除了按钮的响应函数外,你还可以用上面获得的指针访问按钮,如:
修改按钮的大小和位置:
p_MyBut[0]->
MoveWindow(……);
修改按钮文本:
SetWindowText(……);
显示/隐藏按钮:
ShowWindow(……);
等等。
三、回收资源:
由于动态控件对象是由new生成的,它不会被程序自动释放,所以需手工释放。
在控件不再使用时可以删除它:
if(p_MyBut[0])
deletep_MyBut[0];
以上就是按钮控件动态生成的方法。
下面,再看一下单选按钮的动态生成问题。
四、实例:
单选按钮组的动态生成
单选按钮也属于CButton类,但由于单选按钮总是成组使用的,所以它在制作和使用上与普通按钮有一定区别。
假设有三个单选按钮组成一组,初始时,第一个单选按钮处于选中状态。
我们先来看静态制作方法:
在对话框中放置三个单选按钮,设置属性如下:
Radio1属性:
Visible、Group、Tabstop、Auto
Radio2属性:
Visible、Tabstop、Auto
Radio3属性:
这样的属性设置就把三个单选按钮分成了一组,它们一次只能有一个被选中,若对话框中还有其它成组的单选按钮,使用时也会互不干扰。
但这时还没有使第一个按钮处于选中状态。
接着就用ClassWizard为这组单选按钮添加变量,这里只需为第一个单选按钮添加变量即可。
设变量名为m_Radio,类型选为int型。
在构造函数中ClassWizard把m_Radio的值设置为-1,我们把它改为0,这样在运行程序时可以看到第一个单选按钮处于选中状态了。
之后,还应该用ClassWizard为三个单选按钮添加单击响应函数,在里面修改m_Radio的值对应三个单选按钮就可以了。
以上就是通常制作单选按钮组的办法,现我们欲改为动态生成,主要要解决按钮分组和单击控制问题。
以下为制作步骤:
1.定义三个单选按钮的ID:
打开资源中的“StringTable”,在其中添加三个ID值:
第一个:
ID为IDC_MYRADIO1,Caption为单选1
第二个:
ID为IDC_MYRADIO2,Caption为单选2
第三个:
ID为IDC_MYRADIO3,Caption为单选3
其中Caption为按钮上要显示的文字,可根据需要设置。
2.用CButton类的Create()函数生成三个单选按钮:
为方便起见,先定义一个函数生成单选按钮:
NewMyRadio(intnID,CRectrect,intnStyle)
CStringm_Caption;
m_Caption.LoadString(nID);
CButton*p_Radio=newCButton();
ASSERT_VALID(p_Radio);
p_Radio->
Create(m_Caption,WS_CHILD|WS_VISIBLE|nStyle|WS_TABSTOP|BS_AUTORADIOBUTTON,rect,this,nID);
returnp_Radio;
函数LoadString()用于从“StringTable”中读取按钮文本,Create()函数中设定了单选按钮必须的属性,其中就包括了Visible、Tabstop、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型变量作为控制变量即可,如:
intm_SelRadio;
在构造函数中设置其初值为0:
m_SelRadio=0;
在上面的创建按钮的语句中,用SetCheck()函数设置初始选中的按钮:
p_MyRadio[m_SelRadio]->
SetCheck
(1);
//设置第一个单选为选中状态
在SetCheck()函数中,参数为1表示设置为选中状态,为0表示未选中状态。
4.添加鼠标单击响应函数:
鼠标单击某单选按钮后,其状态已经能自动改变,这里我们还需修改控制变量m_SelRadio的值,以便跟踪选中的单选按钮。
首先在MESSAGE_MAP中把鼠标单击消息与响应函数联系起来:
ON_BN_CLICKED(IDC_ICONBUT0,OnIconbut0)//ClassWizard在此处添加
ON_BN_CLICKED(IDC_MYRADIO1,OnMyRadio1)//单选按钮1
ON_BN_CLICKED(IDC_MYRADIO2,OnMyRadio2)//单选按钮2
ON_BN_CLICKED(IDC_MYRADIO3,OnMyRadio3)//单选按钮3
然后在头文件的MESSAGE_MAP中定义单击函数:
//ClassWizard在此处添加
afx_msgvoidOnMyRadio1();
//单选按钮1
afx_msgvoidOnMyRadio2();
//单选按钮2
afx_msgvoidOnMyRadio3();
//单选按钮3
这里注意不要把函数加在AFX_MSG区间内,以防影响ClassWizard的使用。
定义具体的响应函数(这里是用手工加入的,不是用ClassWizard加入的):
//单击单选按钮1voidCTextEditorView:
OnMyRadio1()
m_SelRadio=0;
//单击单选按钮2voidCTextEditorView:
OnMyRadio2()
m_SelRadio=1;
//单击单选按钮3voidCTextEditorView:
OnMyRadio3()
m_SelRadio=2;
5.回收资源:
在析构函数中,回收创建的单选按钮(也可以在不使用单选按钮时立即回收):
CTextEditorView:
~CTextEditorView()
inti;
for(i=0;
i<
3;
i++)
if(p_MyRadio[i])
deletep_MyRadio[i];
以上就是动态控件的生成和响应方法,各种不同的控件做法略有不同,但思路和步骤都是类似的,希望以上实例对你能够有所帮助。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 修改 对话框 BCG 工程 手动 添加 控件
![提示](https://static.bdocx.com/images/bang_tan.gif)