设计一个如图1所示的用户信息信息表,并使用一个静态文本控件用来显示该用户的所有信息,本例子主要用来说明对话框和控件的使用。
图1 用户信息表
1.创建工程:
步骤1.在VC++集成开发环境中,通过菜单File | New,弹出New对话框;
步骤2.在Projects标签中选择MFC App Wizard(exe),在Project name中输入“Example”,Location读者可以自己选择;
步骤3.按下OK按钮,在弹出的MFC App Wizard Step-1对话框中选择程序框架为基于对话框的,即选中Dialog Based;
步骤4.按下OK按钮,在弹出的New Project Information对话框中按下OK按钮后等待创建完相应的工程。
将鼠标移动到对话框资源上,单击鼠标右键,在弹出的菜单中选择Properties菜单命令,将对话框的标题设置为“用户信息表”标识号不变。
将静态文本控件删除,利用鼠标将按钮确定和取消移动到对话框的底部。
在工具栏中的静态控件上单击一下鼠标左键,然后在对话框资源中按下鼠标左键拖动,出现一个矩形框,松开鼠标左键,则在对话框资源中出现一个静态控件,将该静态控件的标题改为“姓名”其标识号改为IDC_STATIC_NAME。
按照上面的方法在对话框资源上加入其它的控件,它们的类型、标题和标识号如下表1:
控件类型 资源ID 标题
按钮 IDOK 确定
IDCANCEL 取消
静态文本
IDC_STATIC_NAME 姓名
IDC_STATIC_SEX 性别
IDC_STATIC_EMAIL Email
IDC_STATIC_PROVINCE 省份
IDC_STATIC_CITY 城市
IDC_STATIC_HOBBY 兴趣
IDC_STATIC_EDIT 其它
IDC_STATIC_RESULT 您的信息如下
IDC_STATIC
编辑框 IDC_EDIT_NAME
IDC_EDIT_EMAIL
IDC_EDIT_EDIT
单选按钮 IDC_RADIO1 男
IDC_RADIO2 女
复选按钮 IDC_CHECK1 运动
IDC_CHECK2 游戏
IDC_CHECK3 电影
IDC_CHECK4 读书
IDC_CHECK5 音乐
IDC_CHECK6 旅游
2 为控件建立相关联的成员变量
在MFC Class Wizard对话框中默认的Projects和 Class name项为Example和CExampleDlg。
选中MemberVariables标签中的Control Ids项中的IDC_EDIT_NAME条目,单击Add Variables按钮,将弹出Add Variables对话框。
在Add Variables对话框中添加成员变量m_Name,与编辑控件IDC_EDIT_NAME相关联,类型为CString ,catogory为Value。
单击OK按钮,添加变量完成。
Add Variables 对话框,如图2 :
图2 Add Variables对话框
按照上述方法为其它控件添加相关联的变量,如表2所示:
表2 控件与其相关联的变量对应表
3 成员变量的初始化
成员变量的初始化需要重载对话框类的OnInitDialog()函数。OnInitDialog是一个虚函数,它在对话框显示之前被调用,用户可以通过重载该函数对对话框中的各种控件进行初始化。
操作如下:
打开MFC Class Wizard,选中标签Message Maps标签中的Object IDs项中的CExampleDialog条目,在Messages里面选择WM_INITDIALOG,然后单击Edit Code按钮,进入源程序,编辑OnInitDialog()函数。
在代码
return TRUE; // return TRUE unless you set the focus to a control
之前,增加两行代码如下:
m_Province.AddString("湖南");
m_Province.AddString("河南");
4 建立消息映射与响应函数
需要在用户选择了省份以后更新有关城市的信息,这就需要在组合框中增加消息响应函数,功能是当用户打开第二个组合框的下拉式列表框的时候及时更新相关省份的城市信息。
响应函数
void CExampleDlg::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("岳阳");
}
}
5 函数建立与调用
在Workspace工作区打开ClassView,选中要加入函数的类CExampleDlg,点击鼠标右键,在弹出的对话框中选择“Add Member Funtion” 。
在Funtion Type(函数类型)中填入CString,表示函数类型是字符串对象;在Funtion Declareation(函数声明)中填入GetRadio。该函数用来获得单选按钮的信息。点击OK。
然后在CExampleDlg.cpp文件中找到该函数,添加函数代码如下:
CString CExampleDlg::GetRadio()
{
if(m_6==IDC_RADIO1)
{
}
else
{
}
return(Radiotext);
}
说明:CWnd的成员函数:GetCheckedRadioButton()返回指定组中的第一个所选中的单选钮的ID,如果没有按钮选中则返回0。
int GetCheckedRadioButton(int nIDFirstButton,int nIDLastButton);
其中,第一个参数是nIDFirstButton同一组中的第一个单选按钮的ID, nIDLastButton是同一组中最后一个单选按钮的ID。
建立第二个成员函数:
同样为CExampleDlg类加入另一个成员函数GetCheck()以获得复选框的信息。在Funtion Type(函数类型)中填入CString,表示函数类型是字符串对象;在Funtion Declareation(函数声明)中填入GetCheck。
在CExampleDlg.cpp文件中找到该函数,添加函数代码如下:
函数代码:
CString CExampleDlg::GetCheck()
{
}
return(Checktext);
}
重载OnOK()函数:
该例将在OnOK()函数中调用这两个成员函数。打开对话框资源,双击“确定”按钮,接受系统默认的函数名,重载OnOK()函数:
重载以后的OnOK()函数源代码如下:
void CExampleDlg::OnOK()
{
// TODO: Add extra validation here
UpdateData(TRUE); // 将对话框控件中的内容传给其成员变量
CString m_1,m_2,m_3,str,result;
m_3=GetRadio();
str=GetCheck();
m_Province.GetWindowText(m_1);
m_City.GetWindowText(m_2);
SetDlgItemText(IDC_EDIT_NAME,"");
SetDlgItemText(IDC_EDIT_EMAIL,"");
result=m_Name+","+m_3+","+m_1+m_2+"人。\n兴趣有:" +str+"\n"+"EMail地址:"+m_Email+"\n"+"其他:"+m_Edit;
SetDlgItemText(IDC_STATIC,result);
}
运行程序
如图3所示:
图3 运行界面