当前位置:
文档之家› 第6章 VC++和MFC之窗口和对话框编程
第6章 VC++和MFC之窗口和对话框编程
: 树式控件
: 选项卡控件
: 动画
: 多信息编辑
: 日期-时间选择器
: 月历
: IP地址
: 自定义控件
: 扩展组合框
2
选择
0
按钮
0
复选框
8 控
文本编辑框
件
组合框
工
列表框
具
分组框
箱
..
单选按钮
静态文本框
图形控件
水平滚动条
垂直滚动条
滑块控件
微调控件
进度指示器控件
2
热键
0
列表控件
0
树形控件
8 控
选项卡控件
第6章 MFC编程实例之窗口和对话框编程
§6. 1 MFC编程实例之窗口程序
第一步:使用新建项目向导建立窗口程序框架
其中:1. 单个文档(SDI):只有一个视窗的窗口程序
2. 多个文档(MDI):可以有多个视窗的窗口程序
注:选择“文件—>新建/打开”
3. 多个顶级文档:可以有多个窗口(框架)的窗口程序
第三步:手工添加代码且生成解决方案(编译)和执行
编译、执行:“顶层菜单+1层菜单1”结果
执行:“顶层菜单+1层菜单2”结果
向工具栏中添加和编辑按钮
编译、执行结果⑴
执行结果⑵
直接点击“11”按钮运行结果:
直接点击“12”按钮运行结果:(参见程序“MfcWin(6-1)”)
注意:如果“按钮”是独立的(不同某菜单项关联),则需手工添 加代码来实现。参见附件:关于VC++杂谈(二)
注:本节仅以CFontDialog类为例进行讲解
步骤1:在CMfcWinView类中声明3个变量
步骤2:在CM3:在CMfcWinView类添加一个菜单命令,用于弹出 字体对话框并保存返回值
手工添加代码
步骤4:在CMfcWinView::OnDraw()函数中手工添加代码
编辑相应控件的标识符如下:
IDC_DISPLAY
IDC_PROGRESS IDC_MILLISECONT
IDC_START
使用添加成员变量向导 为控件标识符添加变量
(也可以手工添加)
其中: 标识符“IDC_DISPLAY” 添加int变量“m_Display” 标识符“IDC_MILLISECONT” 添加int变量“m_Millisecond” 标识符“IDC_PROGRESS”添加CProgressCtrl变量“m_CtrlProgress”
件
动画控件
工
扩展文本编辑框
具 箱
日期-时间选择器
..
月历控件
IP地址控件
扩展组合框
自定义控件
超文本连接控件
拆分按钮
网络地址控件
命令按钮空间
注:删除所有控件
添加控件如下:
其中:“线程 1”、 “线程 2”是分组框; “示例编辑框”(2个) 是文本编辑框; “时间/秒”是静态文本框; “开始”是按钮; 含有绿色的长方形图形是进度指示器控件(进度条)
生成的SDI项目
运行结果:
运行结果:
向导生成的SDI项目分析
生成了4+1个类
分析:“类视图”列表中4+1个类之间的关系如图:
CAboutDlg
其中:CMfcWinApp是主类相当于main()
第二步:向导+手工添加、编辑资源
添加标题
汉字是手工 添加的标题
编译、执行结果:
手工添加声明代码
/**********************自己手工书写的代码起始位置*********************/ //定义一个结构类型,类型名是“threadInfo”。注意:这个位置是在类的外部 struct threadInfo {
UINT nMilliSecond; //注:“typedef unsigned int UINT; ” CProgressCtrl* pctrlProcess; //声明一个进度条类“CProgressCtrl”指针对象
§6. 2 MFC对话框程序的实现
利用新建项目向导生成对话框程序框架
向对话框添加控件
6
: 选择
:图形控件
. 0
: 静态文本
: 编辑框
控
: 分组框
: 按钮
件 工
: 复选框
: 单选按钮
具
: 组合框
: 列表框
条
: 水平滚动条
: 垂直滚动条
..
: 微调按钮
: 进度指示器
: 滑块
: 热键
: 列表控件
注:或者双击开始按钮控件
手工编写实现代码
编译运行结果
注:参见程序“MultiThread(两个线程)”和“MThread(三个线程)”
§6. 3 窗口中对话框的实现
重新打开“MfcWin”项目
在对话框中添加一个树形控件和一个静态文本控件 并进行如下调整
树形控件的属性设置
静态文本控件的属性设置
行(处理)对话框以外的操作(事情) 例如,前面我们建立的对话框都是模态对话框 非模态对话框:采用异步调用方式,即在关闭这个对话框之前能够
进行(处理)对话框以外的操作(事情) 其中:
1.非模态对话框的建立不使用CDialog::DoModal函数,而是使 用CDialog::Create函数, Create函数原型如下:
为对话框资源添加类
为对话框添加类重载初始化函数
为树形控件标识符“IDC_TREE1”添加变量“m_TreeCtrl”
添加树形控件点击树节点时响应的事件处理程序
添加的结果
手工添加代码
编译、执行结果(注:参见程序“MfcWin(6-2) ”和“MfcWin(6-3)”)
说明:对话框分为两种类型,模态对话框和非模态对话框。 模态对话框:采用同步调用方式,即在关闭这个对话框之前不能进
给菜单标识符添加事件处理程序
编译、执行结果
使用添加资源向导在项目中 添加一个对话框资源且编辑对话框
编辑标题:属性的Caption中的“Dialog”改写成“测试“1MENU1”菜单项”
使用工具箱在对话框中添加两个Static Text控件,且编辑控件(在属性页中)如下
编辑属性ID中的“ID_DIALOG1”为“ID_MENU11_DLG”
//“pctrlProcess” };
UINT ThreadFunc2(LPVOID lpParam); //声明一个函数,将来做为第2个线程函数 //注意:这个位置也是在类的外部 //说明,工作者线程对应的函数的原型必须
//是:UINT <函数名>(LPVOID lpParam) //注意:“typedef void *LPVOID;”。 //即没有类型就意味着可以是任何类型 /**********************自己手工书写的代码结束位置*********************/
Create(UINT nIDTemplate, CWnd* pParentWnd = NULL)
⑴ nIDTemplat是对话框资源的ID ⑵ pParentWnd是指向窗口类对象指针,默认值NULL或this指
针(均表示当前窗口)。例如: Create(IDD_MENU11_DLG, NULL);
或 Create(IDD_MENU11_DLG,this); 2. 不能采用“依赖关系”同非模态对话框对象关联,可采用“关
联关系”或在函数中声明当前对话框类的指针对象与之关联。
例如:正确代码:
CDialog11 *pDlg11=new CDialog11; pDlg11->Create(IDD_MENU11_DLG,this); pDlg11->ShowWindow(SW_SHOW); 错误代码:
CWnd::DestroyWindow()
§6. 4 通用对话框的使用
通用对话框有: •CFontDialog类:用于选择字体对话框 •CColorDialog类:用于选择颜色对话框 •CFileDialog类:用于实现打开和保存文件对话框 •CFindReplaceDialog类:用于查找和替换文本对话框 •CPrintDialog类:用于打印和打印设置对话框 • 等等……
CDialog11 dlg11; dlg11.Create(IDD_MENU11_DLG, this); dlg11.ShowWindow(SW_SHOW);
注:课后练习,用“关联关系”实现上述关联
3. 当点击非模态对话框的“退出”按钮退出对话框,其结果是对 话框并没有真正退出(撤销),只是隐藏起来(不显示了)。 要想撤销非模态对话框,需要重载CDialog::OnCancel/OnOk函 数,并且在重载的函数中不要有以下语句: CDialog::OnCancel(); 和 CDialog::OnOk(); OnCancel和OnOk()函数均调用CDialog::EndDialog()函数来撤 销模态对话框,非模态对话框的撤销需调用以下函数来实现:
编译、执行结果
(注:参见程序“MfcWin(6-2) ”和“MfcWin(6-3)”)
课后练习
构造两个并行对话框之间的数据交换程序 程序运行结果,参见下页。
向菜单栏中添加菜单项
用鼠标把它拖到第一项,双击“1层菜单1”菜单项打开右面的属性页 将属性页之菜单编辑器中的ID中的标识符名“ID_32771”改写成“ID_MENU_11”
按照设置“1层菜单1”方法设置“1层菜单2”菜单项
编译、执行结果
使用添加事件处理程序(消息映射函数) 向导