实验七 常用控件应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验七常用控件应用
【实验目的】
(1) 学习和掌握基本控件及其使用方法
(2) 学习各种基本控件和相关函数的建立与调用
【实验要求】
(1) 必须做好实验原理的预习。
(2) 需要对提供的程序代码进行分析,并明确实验中各个环节的意义。
【实验环境】
Microsoft Windows XP
Microsoft Visual C++ 6.0
设计一个如图1所示的用户调查表图,并使用一个静态文本控件用来显示该用户的所有信息,本例子主要用来说明对话框和控件的使用。
图1 用户调查表
【实验步骤】
1.创建工程
1)步骤1:在VC++集成开发环境中,通过菜单File-->New,弹出New对话框;
2)步骤2:在Projects标签中选择MFC App Wizard(exe),在Project name中输入“Eg_1”,Location
读者可以自己选择;
3)步骤3:按下OK按钮,在弹出的MFC App Wizard Step-1对话框中选择程序框架为单文档框架,即
选中Single Document;
4)步骤4:按下OK按钮,在弹出的New Project Information对话框中按下OK按钮后等待创建完相应
的工程。
2. 创建对话框资源
1)在工作区中选中Resourse View标签展开Eg_1Resourse-->Dialog条目,可以察看当前工程中的对话
框资源;
2)选择Dialog条目,单击鼠标右键,弹出活动菜单,选择菜单Insert Dialog命令;
3)将鼠标移动到对话框资源上,单击鼠标右键,在弹出的菜单中选择Properties菜单命令,将对话框
的标题设置为“用户调查表”标识号不变。
4)删除对话框资源本来就有的静态控件,利用鼠标将按钮OK和CANCEL移动到对话框的底部,将按钮的
标题分别改为确定,取消。
5)在工具栏中的静态控件上单击一下鼠标左键,然后在对话框资源中按下鼠标左键拖动,出现一个矩形
框,松开鼠标左键,则在对话框资源中出现一个静态控件,将该静态控件的标题改为“姓名”其标识号改为IDC_STATIC_NAME。
按照上面的方法在对话框资源上加入其它的控件,它们的类型、标题和标识号如下表1:
表1 对话框资源中各控件属性
3. 生成对话框类
资源创建完毕以后,还需要创建一个与对话框资源相关联的类,这个类需要从对话框类派生,然后定义一个派生类的对象,通过派生类的对象使对话框的功能得以实现。
生成对话框类的操作步骤:
1)在对话框资源上单击右键,在弹出的菜单中选择Class Wizard,在MFC Class Wizard对话框弹出以
后紧接着弹出Adding Class。
在打开对话框的过程中,如果系统监测到有新建的对话框资源,菜单资源等,并且该资源没有与之相关联的类,就会弹出对话框,询问是否创建新的类。
2)在Adding Class对话框中确认默认选择Create a new class,单击按钮弹出New Class对话框,在
编辑框中输入新建类的名称CEg_1Dialog,其他设置取默认值。
3)单击OK按钮后显示出MFC Class Wizard对话框。
4. 为控件建立相关联的成员变量
4)在MFC Class Wizard对话框中默认的Projects和 Class name项为Eg_1和CEg_1Dialog。
5)选中Member Variables标签中的Control Ids项中的IDC_EDIT_NAME条目,单击Add Variables按
钮,将弹出Add Variables对话框。
6)在Add Variables对话框中添加成员变量m_Name,与编辑控件IDC_EDIT_NAME相关联,类型为
CString ,catogory为Value。
7)单击OK按钮,添加变量完成。
Add Variables对话框,如图2 :
图2 Add Variables对话框
按照上述方法为其它控件添加相关联的变量,如表2所示:
表2 控件与其相关联的变量对应表
5. 成员变量的初始化
成员变量的初始化需要重载对话框类的OnInitDialog()函数。
OnInitDialog是一个虚函数,它在对话框显示之前被调用,用户可以通过重载该函数对对话框中的各种控件进行初始化。
操作如下:
打开MFC Class Wizard,选中标签Member Map标签中的Control IDs项中的IDC_COMBO1条目,在Messages里面选择WM_INITDIALOG,单击Add Function按钮,然后单击Edit Code按钮,进入源程序,编辑OnInitDialog()函数。
增加以后的代码如下:
BOOL CInvest::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
m_Province.AddString("湖南");
m_Province.AddString("河南");
return TRUE; // return TRUE unless you set the focus to a control }
6. 建立消息映射与响应函数
需要在用户选择了省份以后更新有关城市的信息,这就需要在组合框中增加消息响应函数,功能是当用户打开第二个组合框的下拉式列表框的时候及时更新相关省份的城市信息。
操作步骤:
打开MFC Class Wizard,选中标签Member Map标签中的Control IDs项中的IDC_COMBO2条目,在Messages里面选择CBN_DROPDOWN,单击“Add Function”按钮,接受系统默认的函数名,然后单击“Edit Code”按钮,进入源程序,编辑函数如下:
响应函数
void CEg7_1Dlg::OnDropdownCombo2()
{
// TODO: Add your control notification handler code here
CString m_1;
m_Province.GetWindowText(m_1);
if(m_1=="河南")
{
m_City.ResetContent();
m_City.AddString("郑州");
m_City.AddString("洛阳");
}
if(m_1=="湖南")
{
m_City.ResetContent();
m_City.AddString("长沙");
m_City.AddString("岳阳");
}
}
7. 函数建立与调用
在Workspace工作区打开Class View,选中要加入函数的类CEg_1Dlg,点击鼠标右键,在弹出的对话框中选择“Add Member Function”。
在Function Type(函数类型)中填入CString,表示函数类型是字符串对象;在Function Declaration (函数声明)中填入GetRadio。
该函数用来获得单选按钮的信息。
然后在CEg_1Dlg.cpp文件中找到该函数,添加函数代码如下:
CString CEg_1Dlg::GetRadio()
{
CString Radiotext;
UINT m_6=GetCheckedRadioButton(IDC_RADIO1,IDC_RADIO2);
if(m_6==IDC_RADIO1)
{
Radiotext="男";
}
else
{
Radiotext="女";
}
return(Radiotext);
}
说明:CWnd的成员函数:GetCheckedRadioButton()返回指定组中的第一个所选中的单选钮的ID,如果没有按钮选中则返回0。
该成员函数的原型:
int GetCheckedRadioButton(int nIDFirstButton, int nIDLastButton);
其中,第一个参数是nIDFirstButton同一组中的第一个单选按钮的ID, nIDLastButton是同一组中最后一个单选按钮的ID。
建立第二个成员函数:
1)同样为CEg_1Dlg类加入另一个成员函数GetCheck()以获得复选框的信息。
在Function Type(函数
类型)中填入CString,表示函数类型是字符串对象;在Function Declaration(函数声明)中填入GetCheck。
2)在CEg_1Dlg.cpp文件中找到该函数,添加函数代码如下:
函数代码:
CString CEg_1Dlg::GetCheck()
{
int m=0;
CString str,Checktext;
for(int i=IDC_CHECK1; i<IDC_CHECK6+1; i++)
{
m=((CButton*)GetDlgItem(i))->GetCheck();
if (m==1)
{
CWnd::GetDlgItemText(i,str);
str+=";";
Checktext+=str;
}
}
return(Checktext);
}
重载OnOK()函数:
该例将在OnOK()函数中调用这两个成员函数。
打开对话框资源,双击“确定”按钮,
接受系统默认的函数名,重载OnOK()函数:
void CMy21Dlg::OnOK()
{
// TODO: Add extra validation here
CString m_1,m_2,m_3,str;
m_3=GetRadio(); //调用成员函数以得到单选按钮的信息
str=GetCheck(); //调用成员函数以得到复选框中的信息
}
8. 重载其他函数
重载以后的OnOK()函数源代码如下:
void CMy21Dlg::OnOK()
{
// TODO: Add extra validation here
UpdateData(TRUE); // 将对话框控件中的内容传给其成员变量
CString m_1,m_2,m_3,str;
m_3=GetRadio();
str=GetCheck();
m_Province.GetWindowText(m_1);
m_City.GetWindowText(m_2);
SetDlgItemText(IDC_STATIC_NAME," ");
SetDlgItemText(IDC_STATIC_EMAIL," ");
SetDlgItemText(IDC_STATIC_EDIT," ");
SetDlgItemText(IDC_STATIC_SEX," ");
SetDlgItemText(IDC_STATIC_HOBBY," ");
SetDlgItemText(IDC_STATIC_PROVINCE," ");
SetDlgItemText(IDC_STATIC_CITY," ");
m_Display.SetWindowText(m_Name+","+m_3+","+m_1+m_2+"人也。
\n您的兴趣有:" +str+"\n"+"您的地址:"+m_Email+"\n"+"您要说的话:"+m_Edit);
m_Display.ShowWindow(TRUE);
m_City.ShowWindow(FALSE);
m_Province.ShowWindow(FALSE);
((CEdit*)GetDlgItem(IDC_EDIT_NAME))->ShowWindow(FALSE);
((CEdit*)GetDlgItem(IDC_EDIT_EMAIL))->ShowWindow(FALSE);
((CEdit*)GetDlgItem(IDC_EDIT_EDIT))->ShowWindow(FALSE);
GetDlgItem(IDC_STATIC1)->ShowWindow(FALSE);
GetDlgItem(IDC_STATIC2)->ShowWindow(FALSE);
((CButton*)GetDlgItem(IDC_RADIO1))->ShowWindow(FALSE);
((CButton*)GetDlgItem(IDC_RADIO2))->ShowWindow(FALSE);
for(int j=IDC_CHECK1;j<IDC_CHECK6+1;j++)
{
((CButton*)GetDlgItem(j))->ShowWindow(FALSE);
}
((CButton*)GetDlgItem(IDOK))->ShowWindow(FALSE);
SetDlgItemText(IDCANCEL,"退出 ");
}
9. 运行程序
如图3所示:
图3 运行界面
调查结果如图4所示:
图4 调查结果。