文章目录
1.预备知识
1. MFC(Microsoft Foundation Classes)
MFC 是微软公司提供的一组类库,用于开发 Windows 应用程序。它提供了一种面向对象的编程框架,使开发者能够更轻松地创建 Windows 图形用户界面(GUI)应用程序。MFC 包含了许多类和函数,用于处理窗口、对话框、控件、消息处理等方面的编程任务。
2. 对话框(Dialog)
在 Windows 应用程序中,对话框是一种常见的用户界面元素,用于与用户交互。对话框通常包含各种控件,如按钮、文本框、单选框、复选框等,用于用户输入和显示信息。在 MFC 中,对话框可以通过资源编辑器创建,并使用 MFC 类来管理和操作。
3. 控件(Control)
控件是对话框上的可视元素,用于接收用户输入或显示信息。常见的控件包括静态文本框、按钮、文本框、单选按钮、复选框、组合框等。控件可以用于收集用户数据、触发操作或显示应用程序状态。
4. 事件处理
在 MFC 应用程序中,控件可以与事件关联,以便在用户与控件交互时触发特定的事件。事件处理程序是一段代码,用于响应特定事件,例如按钮点击、文本框内容改变等。您可以编写事件处理程序来执行所需的操作。
5. 数据交换(Data Exchange)
数据交换是一种机制,用于将数据从控件传输到应用程序变量,或将数据从应用程序变量传输到控件。这有助于在用户输入和应用程序数据之间建立连接。在 MFC 中,数据交换通常使用 DDX
和 DDV
宏来实现。
6. 模态对话框
模态对话框是一种对话框类型,它在打开时会阻塞应用程序的其他操作,直到用户关闭对话框为止。模态对话框通常用于需要用户完成某项任务后才能继续应用程序的情况,如收集用户信息或进行设置。
7. 资源编辑器
资源编辑器是用于创建和编辑 Windows 应用程序资源的工具。资源可以包括对话框、图像、图标、字符串等。在 MFC 中,您可以使用资源编辑器来设计对话框界面和添加控件。
8.常用控件
1.CButton
类CButton提供了对Windows按钮控件的操作。按钮控件是一个小的矩形子窗口,可以通过单击选中(按下)或不选中。按钮可以单独使用,也可以成组使用,它还可以具有文本标题。在用户单击它的时候,按钮通常要改变显示外观。典型的按钮控件有:复选框、单选钮和下压式按钮(push button)。一个CButton对象可以是它们中的一种,这由它的按钮风格和成员函数Create的初始化决定。
此外,类CButtonBitmap是从类CButton继承而来的,不过它支持按钮的图像标签。一个CButtonBitmap对象可以分别为它的四种状态(未按下、按下、获得焦点和禁止存取)设置不同的位图。既可以从对话框模板中创建一个按钮控件,也可以直接在代码中创建。无论哪种情况,都要先调用构造函数CButton构造一个CButton对象,然后调用成员函数Create创建Windows按钮控件并应用到CButton对象上。在一个从类CButton派生出来的类中,构造可以一步完成。程序员可以为这个派生类编写一个构造函数,并在其中调用Create函数。如果想处理Windows的通知消息,如位图按钮控件发给它的父对象(通常是从CDialog继承来的)的消息,就要在父对象中加入消息映射入口以及处理每个消息的成员函数。
2.CEdit
CEdit类提供了Windows编辑控件中的功能。编辑控件是一个子窗口矩形,用户可以向其中输入文本。可以通过对话模板或直接从代码中创建一个编辑控件。在两种情形下,首先调用CEdit构造程序构造CEdit对象,再调用Create成员函数创建Windows编辑控件并将其与CEdit对象连接。
构造在CEdit的派生类中可以单步实现。为派生类编写构造程序并从构造程序中调用Create。CEdit从CWnd继承了重要的功能,要在CEdit对象中设置或获取文本,使用CWnd成员函数SetWindowText和GetWindowText,可以设置和得到编辑控件的全部内容,即使它是一个多行控件。如果编辑控件是多行的,使用CEdit成员函数GetLine,GetSel,GetSel和ReplaceSel来获取和写入控件的部分文本。如果要处理编辑控件发往其父类(通常是一个CDialog派生类)的通知消息,则向父类中为每一消息添加一个消息映射入口和消息处理成员函数。
3.CComboBox
类CComboBox封装了Windows组合框。组合框由一个列表框和一个静态控件(或编辑控件)组成。列表框部分可以是一直显示的,也可以是隐藏的,在用户单击编辑控件边上的按钮(下拉箭头)时下拉该列表框。列表框中当前选中的项(如果有的话)显示在静态控件或编辑控件中。如果组合框带有下拉风格,则当用户在编辑框中输入列表项的开始字符时,对应项(如果有的话)中的第一个将会加亮显示。
2.实验目的
掌握基于对话框的应用程序中常用控件的使用。
3.实验内容
设计一个如图所示的用户调查表图:
当用户选择确定按钮的时候用一个静态文本控件用来显示该用户的所有信息:
4.代码实现
首先打开MFC向导,选择基于对话框后点击“完成”,创建项目。
首先在工具箱中拖拽所需的控件并修改必要的属性。
- 整个窗体需要修改
Caption
为用户调查表
。 - 所有的
Static Text
、Check Box
、Radio Button
和Button
需要修改Caption
为所需的标签。 - 标签为
男
的Radio Button
需要修改Group
为True
。 - 所有的
Combo Box
需要修改sort
为False
。 - 省份的下拉框需要提供
data
为河北;山西;黑龙江;吉林;辽宁;江苏;浙江;安徽;福建;江西;山东;河南;湖北;湖南;广东;海南;四川;贵州;云南;陕西;甘肃;青海;台湾;内蒙古;广西;西藏;宁夏;新疆;北京;天津;上海;重庆;香港;澳门
。 - “您要说的话”对应的
Edit Control
需要修改Multiline
、Want Return
和Vertical Scroll
为True
。
省份和城市对应
首先,上网搜索所有省份对应的行政区划并重写“城市”下拉框的下拉事件:
void CEx3Dlg::OnCbnDropdownCombo2()
{
switch (province.GetCurSel())
{
case 0:
city.AddString(TEXT("石家庄"));
city.AddString(TEXT("唐山"));
city.AddString(TEXT("邯郸"));
city.AddString(TEXT("秦皇岛"));
city.AddString(TEXT("保定"));
city.AddString(TEXT("张家口"));
city.AddString(TEXT("承德"));
city.AddString(TEXT("廊坊"));
city.AddString(TEXT("沧州"));
city.AddString(TEXT("衡水"));
city.AddString(TEXT("邢台"));
break;
case 1:
city.AddString(TEXT("太原"));
city.AddString(TEXT("大同"));
city.AddString(TEXT("阳同"));
city.AddString(TEXT("长治"));
city.AddString(TEXT("晋城"));
city.AddString(TEXT("朔州"));
city.AddString(TEXT("晋中"));
city.AddString(TEXT("运城"));
city.AddString(TEXT("忻州"));
city.AddString(TEXT("临汾"));
city.AddString(TEXT("吕梁"));
break;
case 2:
city.AddString(TEXT("哈尔滨"));
city.AddString(TEXT("齐齐哈尔"));
city.AddString(TEXT("牡丹江"));
city.AddString(TEXT("佳木斯"));
city.AddString(TEXT("七台河"));
city.AddString(TEXT("大庆"));
city.AddString(TEXT("黑河"));
city.AddString(TEXT("绥化"));
city.AddString(TEXT("伊春"));
city.AddString(TEXT("鹤岗"));
city.AddString(TEXT("双鸭山"));
city.AddString(TEXT("鸡西"));
break;
case 3:
city.AddString(TEXT("长春"));
city.AddString(TEXT("吉林"));
city.AddString(TEXT("四平"));
city.AddString(TEXT("辽源"));
city.AddString(TEXT("通化"));
city.AddString(TEXT("白山"));
city.AddString(TEXT("松原"));
city.AddString(TEXT("白城"));
break;
case 4:
city.AddString(TEXT("沈阳"));
city.AddString(TEXT("大连"));
city.AddString(TEXT("鞍山"));
city.AddString(TEXT("抚顺"));
city.AddString(TEXT("本溪"));
city.AddString(TEXT("丹东"));
city.AddString(TEXT("锦州"));
city.AddString(TEXT("营口"));
city.AddString(TEXT("阜新"));
city.AddString(TEXT("辽阳"));
city.AddString(TEXT("盘锦"));
city.AddString(TEXT("铁岭"));
city.AddString(TEXT("葫芦岛"));
city.AddString(TEXT("朝阳"));
break;
case 5:
city.AddString(TEXT("南京"));
city.AddString(TEXT("苏州"));
city.AddString(TEXT("无锡"));
city.AddString(TEXT("常州"));
city.AddString(TEXT("镇江"));
city.AddString(TEXT("扬州"));
city.AddString(TEXT("泰州"));
city.AddString(TEXT("南通"));
city.AddString(TEXT("淮安"));
city.AddString(TEXT("连云港"));
city.AddString(TEXT("盐城"));
city.AddString(TEXT("徐州"));
city.AddString(TEXT("宿迁"));
break;
case 6:
city.AddString(TEXT("杭州"));
city.AddString(TEXT("湖州"));
city.AddString(TEXT("嘉兴"));
city.AddString(TEXT("绍兴"));
city.AddString(TEXT("宁波"));
city.AddString(TEXT("舟山"));
city.AddString(TEXT("衢州"));
city.AddString(TEXT("金华"));
city.AddString(TEXT("台州"));
city.AddString(TEXT("丽水"));
city.AddString(TEXT("温州"));
break;
case 7:
city.AddString(TEXT("合肥"));
city.AddString(TEXT("芜湖"));
city.AddString(TEXT("蚌埠"));
city.AddString(TEXT("淮南"));
city.AddString(TEXT("马鞍山"));
city.AddString(TEXT("淮北"));
city.AddString(TEXT("铜陵"));
city.AddString(TEXT("安庆"));
city.AddString(TEXT("黄山"));
city.AddString(TEXT("阜阳"));
city.AddString(TEXT("宿州"));
city.AddString(TEXT("滁州"));
city.AddString(TEXT("六安"));
city.AddString(TEXT("宣城"));
city.AddString(TEXT("池州"));
city.AddString(TEXT("亳州"));
break;
case 8:
city.AddString(TEXT("福州"));
city.AddString(TEXT("厦门"));
city.AddString(TEXT("莆田"));
city.AddString(TEXT("龙岩"));
city.AddString(TEXT("漳州"));
city.AddString(TEXT("三明"));
city.AddString(TEXT("泉州"));
city.AddString(TEXT("宁德"));
city.AddString(TEXT("南平"));
break;
case 9:
city.AddString(TEXT("南昌"));
city.AddString(TEXT("九江"));
city.AddString(TEXT("萍乡"));
city.AddString(TEXT("鹰潭"));
city.AddString(TEXT("上饶"));
city.AddString(TEXT("抚州"));
city.AddString(TEXT("新余"));
city.AddString(TEXT("宜春"));
city.AddString(TEXT("景德镇"));
city.AddString(TEXT("吉安"));
city.AddString(TEXT("赣州"));
break;
case 10:
city.AddString(TEXT("济南"));
city.AddString(TEXT("青岛"));
city.AddString(TEXT("淄博"));
city.AddString(TEXT("枣庄"));
city.AddString(TEXT("东营"));
city.AddString(TEXT("烟台"));
city.AddString(TEXT("潍坊"));
city.AddString(TEXT("济宁"));
city.AddString(TEXT("泰安"));
city.AddString(TEXT("威海"));
city.AddString(TEXT("日照"));
city.AddString(TEXT("莱芜"));
city.AddString(TEXT("临沂"));
city.AddString(TEXT("德州"));
city.AddString(TEXT("聊城"));
city.AddString(TEXT("滨州"));
city.AddString(TEXT("菏泽"));
break;
case 11:
city.AddString(TEXT("郑州"));
city.AddString(TEXT("开封"));
city.AddString(TEXT("洛阳"));
city.AddString(TEXT("平顶山"));
city.AddString(TEXT("焦作"));
city.AddString(TEXT("鹤壁"));
city.AddString(TEXT("新乡"));
city.AddString(TEXT("安阳"));
city.AddString(TEXT("濮阳"));
city.AddString(TEXT("许昌"));
city.AddString(TEXT("漯河"));
city.AddString(TEXT("三门峡"));
city.AddString(TEXT("南阳"));
city.AddString(TEXT("商丘"));
city.AddString(TEXT("信阳"));
city.AddString(TEXT("周口"));
city.AddString(TEXT("驻马店"));
city.AddString(TEXT("济源市"));
break;
case 12:
city.AddString(TEXT("武汉"));
city.AddString(TEXT("黄石"));
city.AddString(TEXT("襄阳"));
city.AddString(TEXT("荆州"));
city.AddString(TEXT("宜昌"));
city.AddString(TEXT("十堰"));
city.AddString(TEXT("孝感"));
city.AddString(TEXT("荆门"));
city.AddString(TEXT("鄂州"));
city.AddString(TEXT("黄冈"));
city.AddString(TEXT("咸宁"));
city.AddString(TEXT("随州"));
city.AddString(TEXT("恩施土家族苗族自治州"));
break;
case 13:
city.AddString(TEXT("长沙"));
city.AddString(TEXT("株洲"));
city.AddString(TEXT("湘潭"));
city.AddString(TEXT("衡阳"));
city.AddString(TEXT("邵阳"));
city.AddString(TEXT("岳阳"));
city.AddString(TEXT("常德"));
city.AddString(TEXT("张家界"));
city.AddString(TEXT("益阳"));
city.AddString(TEXT("娄底"));
city.AddString(TEXT("郴州"));
city.AddString(TEXT("永州"));
city.AddString(TEXT("怀化"));
break;
case 14:
city.AddString(TEXT("广州"));
city.AddString(TEXT("深圳"));
city.AddString(TEXT("佛山"));
city.AddString(TEXT("东莞"));
city.AddString(TEXT("中山"));
city.AddString(TEXT("珠海"));
city.AddString(TEXT("江门"));
city.AddString(TEXT("肇庆"));
city.AddString(TEXT("惠州"));
city.AddString(TEXT("汕头"));
city.AddString(TEXT("潮州"));
city.AddString(TEXT("揭阳"));
city.AddString(TEXT("汕尾"));
city.AddString(TEXT("湛江"));
city.AddString(TEXT("茂名"));
city.AddString(TEXT("阳江"));
city.AddString(TEXT("韶关"));
city.AddString(TEXT("清远"));
city.AddString(TEXT("云浮"));
city.AddString(TEXT("梅州"));
city.AddString(TEXT("河源"));
break;
case 15:
city.AddString(TEXT("海口"));
city.AddString(TEXT("三亚"));
city.AddString(TEXT("三沙"));
city.AddString(TEXT("儋州"));
break;
case 16:
city.AddString(TEXT("成都"));
city.AddString(TEXT("自贡"));
city.AddString(TEXT("攀枝花"));
city.AddString(TEXT("泸州"));
city.AddString(TEXT("德阳"));
city.AddString(TEXT("绵阳"));
city.AddString(TEXT("广元"));
city.AddString(TEXT("遂宁"));
city.AddString(TEXT("内江"));
city.AddString(TEXT("乐山"));
city.AddString(TEXT("南充"));
city.AddString(TEXT("眉山"));
city.AddString(TEXT("宜宾"));
city.AddString(TEXT("广安"));
city.AddString(TEXT("达州"));
city.AddString(TEXT("雅安"));
city.AddString(TEXT("巴中"));
city.AddString(TEXT("资阳"));
break;
case 17:
city.AddString(TEXT("贵阳"));
city.AddString(TEXT("六盘水"));
city.AddString(TEXT("遵义"));
city.AddString(TEXT("安顺"));
city.AddString(TEXT("铜仁"));
city.AddString(TEXT("毕节"));
city.AddString(TEXT("黔西南布依族苗族自治州"));
city.AddString(TEXT("黔东南苗族侗族自治州"));
city.AddString(TEXT("黔南布依族苗族自治州"));
break;
case 18:
city.AddString(TEXT("昆明"));
city.AddString(TEXT("曲靖"));
city.AddString(TEXT("玉溪"));
city.AddString(TEXT("丽江"));
city.AddString(TEXT("普洱"));
city.AddString(TEXT("保山"));
city.AddString(TEXT("昭通"));
city.AddString(TEXT("临沧"));
break;
case 19:
city.AddString(TEXT("西安"));
city.AddString(TEXT("宝鸡"));
city.AddString(TEXT(" 咸阳市 、 铜川"));
city.AddString(TEXT("渭南"));
city.AddString(TEXT(" 延安市 、榆林"));
city.AddString(TEXT(" 汉中市 、安康"));
city.AddString(TEXT("商洛"));
break;
case 20:
city.AddString(TEXT("兰州"));
city.AddString(TEXT("嘉峪关"));
city.AddString(TEXT("金昌"));
city.AddString(TEXT("白银"));
city.AddString(TEXT("天水"));
city.AddString(TEXT("武威"));
city.AddString(TEXT("张掖"));
city.AddString(TEXT("酒泉"));
city.AddString(TEXT("平凉"));
city.AddString(TEXT("庆阳"));
city.AddString(TEXT("定西"));
city.AddString(TEXT("陇南"));
break;
case 21:
city.AddString(TEXT("西宁"));
city.AddString(TEXT("海东"));
city.AddString(TEXT("海北"));
city.AddString(TEXT("海南"));
city.AddString(TEXT("海西"));
city.AddString(TEXT("黄南"));
city.AddString(TEXT("果洛"));
break;
case 22:
city.AddString(TEXT("台北"));
city.AddString(TEXT("高雄"));
city.AddString(TEXT("新北"));
city.AddString(TEXT("台中"));
city.AddString(TEXT("台南"));
city.AddString(TEXT("桃园"));
break;
case 23:
city.AddString(TEXT("呼和浩特"));
city.AddString(TEXT("包头"));
city.AddString(TEXT("乌海"));
city.AddString(TEXT("赤峰"));
city.AddString(TEXT("通辽"));
city.AddString(TEXT("鄂尔多斯"));
city.AddString(TEXT("呼伦贝尔"));
city.AddString(TEXT("巴彦淖尔"));
city.AddString(TEXT("乌兰察布"));
city.AddString(TEXT("兴安盟"));
city.AddString(TEXT("锡林郭勒盟"));
city.AddString(TEXT("阿拉善盟"));
break;
case 24:
city.AddString(TEXT("南宁"));
city.AddString(TEXT("柳州"));
city.AddString(TEXT("桂林"));
city.AddString(TEXT("梧州"));
city.AddString(TEXT("北海"));
city.AddString(TEXT("防城港"));
city.AddString(TEXT("钦州"));
city.AddString(TEXT("贵港"));
city.AddString(TEXT("玉林"));
city.AddString(TEXT("百色"));
city.AddString(TEXT("贺州"));
city.AddString(TEXT("河池"));
city.AddString(TEXT("来宾"));
city.AddString(TEXT("崇左"));
break;
case 25:
city.AddString(TEXT("拉萨"));
city.AddString(TEXT("日喀则地区"));
city.AddString(TEXT("山南地区"));
city.AddString(TEXT("林芝地区"));
city.AddString(TEXT("昌都地区"));
city.AddString(TEXT("那曲地区"));
city.AddString(TEXT("阿里地区"));
break;
case 26:
city.AddString(TEXT("银川"));
city.AddString(TEXT("石嘴山"));
city.AddString(TEXT("吴忠"));
city.AddString(TEXT("固原"));
city.AddString(TEXT("中卫"));
break;
case 27:
city.AddString(TEXT("乌鲁木齐"));
city.AddString(TEXT("克拉玛依"));
city.AddString(TEXT("吐鲁番"));
city.AddString(TEXT("哈密"));
city.AddString(TEXT("昌吉回族自治州"));
city.AddString(TEXT("博尔塔拉蒙古自治州"));
city.AddString(TEXT("巴音郭楞蒙古自治州"));
city.AddString(TEXT("阿克苏"));
city.AddString(TEXT("克孜勒苏柯尔克孜自治州"));
city.AddString(TEXT("喀什"));
city.AddString(TEXT("和田"));
city.AddString(TEXT("伊犁哈萨克自治州"));
break;
case 28:
city.AddString(TEXT("东城"));
city.AddString(TEXT("西城"));
city.AddString(TEXT("朝阳"));
city.AddString(TEXT("丰台"));
city.AddString(TEXT("石景山"));
city.AddString(TEXT("海淀"));
city.AddString(TEXT("顺义"));
city.AddString(TEXT("通州"));
city.AddString(TEXT("大兴"));
city.AddString(TEXT("房山"));
city.AddString(TEXT("门头沟"));
city.AddString(TEXT("昌平"));
city.AddString(TEXT("平谷"));
city.AddString(TEXT("密云"));
city.AddString(TEXT("怀柔"));
city.AddString(TEXT("延庆"));
break;
case 29:
city.AddString(TEXT("滨海新区"));
city.AddString(TEXT("和平区"));
city.AddString(TEXT("河东区"));
city.AddString(TEXT("河西区"));
city.AddString(TEXT("南开区"));
city.AddString(TEXT("河北区"));
city.AddString(TEXT("红桥区"));
city.AddString(TEXT("东丽区"));
city.AddString(TEXT("西青区"));
city.AddString(TEXT("津南区"));
city.AddString(TEXT("北辰区"));
city.AddString(TEXT("武清区"));
city.AddString(TEXT("宝坻区"));
city.AddString(TEXT("静海区"));
city.AddString(TEXT("宁河区"));
city.AddString(TEXT("蓟州区"));
break;
case 30:
city.AddString(TEXT("黄浦"));
city.AddString(TEXT("徐汇区"));
city.AddString(TEXT("长宁"));
city.AddString(TEXT("静安"));
city.AddString(TEXT("普陀"));
city.AddString(TEXT("虹口"));
city.AddString(TEXT("杨浦"));
city.AddString(TEXT("闵行"));
city.AddString(TEXT("宝山"));
city.AddString(TEXT("嘉定"));
city.AddString(TEXT("浦东新区"));
city.AddString(TEXT("金山"));
city.AddString(TEXT("松江"));
city.AddString(TEXT("青浦"));
city.AddString(TEXT("奉贤"));
city.AddString(TEXT("崇明"));
break;
case 31:
city.AddString(TEXT("万州区"));
city.AddString(TEXT("黔江区"));
city.AddString(TEXT("涪陵区"));
city.AddString(TEXT("渝中区"));
city.AddString(TEXT("大渡口区"));
city.AddString(TEXT("江北区"));
city.AddString(TEXT("沙坪坝区"));
city.AddString(TEXT("九龙坡区"));
city.AddString(TEXT("南岸区"));
city.AddString(TEXT("北碚区"));
city.AddString(TEXT("渝北区"));
city.AddString(TEXT("巴南区"));
city.AddString(TEXT("长寿区"));
city.AddString(TEXT("江津区"));
city.AddString(TEXT("合川区"));
city.AddString(TEXT("永川区"));
city.AddString(TEXT("南川区"));
city.AddString(TEXT("綦江区"));
city.AddString(TEXT("大足区"));
city.AddString(TEXT("璧山区"));
city.AddString(TEXT("铜梁区"));
city.AddString(TEXT("潼南区"));
city.AddString(TEXT("荣昌区"));
city.AddString(TEXT("开州区"));
city.AddString(TEXT("梁平区"));
city.AddString(TEXT("武隆区"));
break;
case 32:
city.AddString(TEXT("中西区"));
city.AddString(TEXT("东区"));
city.AddString(TEXT("南区"));
city.AddString(TEXT("湾仔区"));
city.AddString(TEXT("九龙城区"));
city.AddString(TEXT("观塘区"));
city.AddString(TEXT("深水埗区"));
city.AddString(TEXT("黄大仙区"));
city.AddString(TEXT("油尖旺区"));
city.AddString(TEXT("离岛区"));
city.AddString(TEXT("葵青区"));
city.AddString(TEXT("北区"));
city.AddString(TEXT("西贡区"));
city.AddString(TEXT("沙田区"));
city.AddString(TEXT("大埔区"));
city.AddString(TEXT("荃湾区"));
city.AddString(TEXT("屯门区"));
city.AddString(TEXT("元朗区"));
break;
case 33:
city.AddString(TEXT("花地玛堂区"));
city.AddString(TEXT("圣安多尼堂区"));
city.AddString(TEXT("大堂区"));
city.AddString(TEXT("望德堂区"));
city.AddString(TEXT("风顺堂区"));
city.AddString(TEXT("嘉模堂区"));
city.AddString(TEXT("圣方济各堂区"));
city.AddString(TEXT("路氹城"));
}
}
当用户选择的省份改变的时候需要清空“城市”下拉框:
void CEx3Dlg::OnCbnSelchangeCombo1()
{
city.ResetContent();
}
弹出对话框
首先打开资源视图,右键添加Dialog,设计如题目所示的界面。将Static Edit
控件的Client Edge
属性更改为True
,并双击按钮实现点击事件(以“确定”的方式退出)如下:
void CShow::OnBnClickedButton1()
{
OnOK();
}
为了显示用户信息,对其中的Static Edit
控件添加变量showStr
,并在初始化的时候更新静态文本值:
BOOL CShow::Create(LPCTSTR lpszTemplateName, CWnd *pParentWnd)
{
UpdateData(FALSE);
return CDialogEx::Create(lpszTemplateName, pParentWnd);
}
显示用户信息
首先在预处理区域包含头文件:
#include "Show.h"
依次对主界面的控件添加变量,具体如下:
CString name;
BOOL sex;
CString email;
CComboBox province;
CComboBox city;
CString others;
afx_msg void OnBnClickedButton1();
afx_msg void OnCbnDropdownCombo2();
BOOL exercise;
BOOL game;
BOOL music;
BOOL movie;
BOOL travel;
afx_msg void OnBnClickedButton2();
virtual void OnOK();
afx_msg void OnCbnSelchangeCombo2();
afx_msg void OnCbnEditupdateCombo1();
afx_msg void OnCbnSelchangeCombo1();
BOOL read;
进而实现点击事件如下:
void CEx3Dlg::OnBnClickedButton1()
{
UpdateData(TRUE);
// ShowInformation showDlg(this);
CShow dlg;
CString province_s, city_s;
CString &s(dlg.showStr);
// CString s;
province.GetLBText(province.GetCurSel(), province_s);
city.GetLBText(city.GetCurSel(), city_s);
/*if (!others.IsEmpty())
{
CStringA t(others);
others.Format(TEXT("\n您想说的话有:%s"), t.GetBuffer());
}*/
// CStringA t_name(name), t_province(province_s), t_city(city_s), t_email(email), t_other(others);
if (exercise || game || music || read || movie || travel)
s = name + (sex ? TEXT(",女,") : TEXT(",男,")) + province_s + city_s + TEXT("人也。\n您的兴趣有:") + (exercise ? TEXT("运动;") : TEXT("")) + (game ? TEXT("游戏;") : TEXT("")) + (music ? TEXT("音乐;") : TEXT("")) + (read ? TEXT("读书;") : TEXT("")) + (movie ? TEXT("电影;") : TEXT("")) + (travel ? TEXT("旅游;") : TEXT("")) + TEXT("\n您的地址:") + email + (others.IsEmpty() ? TEXT("") : TEXT("\n您想说的话有:")) + others;
// s.Format(TEXT("%s,%s,%s%s人也。\n您的兴趣有%s%s%s%s%s%s\n您的地址:%s%s"), t_name.GetBuffer(), sex ? TEXT("男") : TEXT("女"), t_province.GetBuffer(), t_city.GetBuffer(), exercise ? TEXT("运动;") : TEXT(""), game ? TEXT("游戏;") : TEXT(""), music ? TEXT("音乐;") : TEXT(""), read ? TEXT("读书;") : TEXT(""), movie ? TEXT("电影;") : TEXT(""), travel ? TEXT("旅游;") : TEXT(""), t_email.GetBuffer(), t_other.GetBuffer());
else
s = name + (sex ? TEXT(",女,") : TEXT(",男,")) + province_s + city_s + TEXT("人也。\n您的地址:") + email + (others.IsEmpty() ? TEXT("") : TEXT("\n您想说的话有:")) + others;
// s.Format(TEXT("%s,%s,%s%s人也。\n您的地址:%s%s"), t_name.GetBuffer(), sex ? TEXT("男") : TEXT("女"), t_province.GetBuffer(), t_city.GetBuffer(), t_email.GetBuffer(), t_other.GetBuffer());
// MessageBox(s);
// dlg.UpdateData(FALSE);
dlg.DoModal();
// CShow dlg(s);
// dlg.showWidget.SetWindowTextW(s);
// dlg.DoModal();
}
接着重写OnOk
函数,防止在文本框换行的时候直接退出程序:
void CEx3Dlg::OnOK()
{
// TODO: 在此添加专用代码和/或调用基类
//CDialogEx::OnOK();
}
最后实现退出功能:
void CEx3Dlg::OnBnClickedButton2()
{
OnCancel();
}
5.运行结果
首先输入如下用户数据:
点击确定:
6.总结
1.实验中遇到的困难
如何生成待显示字符串的问题
一个很自然的想法是使用Format
格式化输出,于是如下实现:
s.Format(TEXT("%s,%s,%s%s人也。\n您的兴趣有%s%s%s%s%s%s\n您的地址:%s%s"), t_name.GetBuffer(), sex ? TEXT("男") : TEXT("女"), t_province.GetBuffer(), t_city.GetBuffer(), exercise ? TEXT("运动;") : TEXT(""), game ? TEXT("游戏;") : TEXT(""), music ? TEXT("音乐;") : TEXT(""), read ? TEXT("读书;") : TEXT(""), movie ? TEXT("电影;") : TEXT(""), travel ? TEXT("旅游;") : TEXT(""), t_email.GetBuffer(), t_other.GetBuffer());
但运行后发现格式化中的%s
不能正确输出字符串,这里涉及到编码的问题。于是不将CString
转为const char*
后再输出,直接使用+
拼接字符串如下:
s = name + (sex ? TEXT(",女,") : TEXT(",男,")) + province_s + city_s + TEXT("人也。\n您的兴趣有:") + (exercise ? TEXT("运动;") : TEXT("")) + (game ? TEXT("游戏;") : TEXT("")) + (music ? TEXT("音乐;") : TEXT("")) + (read ? TEXT("读书;") : TEXT("")) + (movie ? TEXT("电影;") : TEXT("")) + (travel ? TEXT("旅游;") : TEXT("")) + TEXT("\n您的地址:") + email + (others.IsEmpty() ? TEXT("") : TEXT("\n您想说的话有:")) + others;
调试过程中发现还是乱码,解决方法是在项目属性里将“字符集”从“使用多字节字符集”改为“使用Unicode字符集”。
如何弹出模态对话框的问题
最开始将对话框名取为了ShowInformation
,运行时库文件各种报错,其原因是对话框名不正确。后来将名字改为以C开头就不报错了,参见MFC创建模态对话框。
弹出对话框时如何传递待显示字符串的问题
为弹出的对话框添加变量即可,我选择了value型的变量,一开始将变量的更新写在了按钮消息响应函数中,但这样做在对话框弹出时会运行时触发错误,错误位置在DoModal()
函数中。解决方法是将dlg.UpdateData(FALSE);
放在对话框创建函数BOOL CShow::Create(LPCTSTR lpszTemplateName, CWnd* pParentWnd)
中。
如何避免“城市”下拉框的项数增多的问题
这需要及时清空并及时更新数据,最开始将数据清空和数据更新同时写在void CEx3Dlg::OnCbnDropdownCombo2()
中,但这会导致清空失效。解决方法是将清空数据另外写在消息响应函数void CEx3Dlg::OnCbnSelchangeCombo1()
中。
2. 心得体会
通过本次实验,我掌握了MFC中常用控件的基本使用方法,包括文本框、单选按钮、复选框、下拉框、静态文本等。这些控件是构建MFC应用程序界面的基本组成部分,了解它们的使用对于开发MFC应用至关重要。
在实验中,我学会了如何设置控件的属性,包括修改控件的文本内容、样式、对齐方式等。这些属性设置可以使界面更具美感和实用性。通过重写控件的事件处理函数,我实现了一些控件之间的交互,例如清空下拉框内容、生成用户信息字符串等。这为实现复杂的交互功能奠定了基础。在实验中,我创建了一个模态对话框用于显示用户信息,学会了如何在主对话框中弹出模态对话框,并将数据传递给模态对话框进行显示。这对于实现分离的用户界面和功能逻辑非常有用。在实验中遇到了编码问题,由于字符集设置不正确,导致字符串输出乱码。通过将项目字符集设置为Unicode字符集,成功解决了这一问题。
总的来说,本次实验使我对MFC应用程序的界面设计和控件使用有了更深入的理解,为今后的开发奠定了坚实的基础。同时,通过不断的调试和解决问题,我也提高了自己的问题解决能力。希望能够进一步探索MFC的更多功能和应用场景,不断提升自己的编程技能。