C++MFC基于对话框的编程——模态(非模态)对话框

目录

一、添加MFC功能

二、创建基于MFC的应用程序框架

三、初识界面

四、上案例

1.拖控件button(两个)

2.改控件名字

2.1改名方法1

2.2改名方法2

3.添加两个新的对话框(Dialog)

4.写入代码

4.1.创建IDD_EXEC对话框的关联类

4.2写入主对话框的事件代码


一、添加MFC功能

当点开新建项目选项卡面板,没有MFC应用的,看这里

菜单栏——工具——(第一个选项)获取工具和功能(T)

选中工作负荷中的使用C++的桌面开发——详细安装选择MFC

 执行修改,等待安装即可

二、创建基于MFC的应用程序框架

1.VS2017菜单栏文件——新建——项目

2.项目面板选择VSC++选项下的MFC应用,并且选择文件位置及项目名称

 3.应用程序类型选择——基于对话框——点击下一步

4.模板属性不用管,下一步

 5.界面功能,默认,不用管,下一步

 6.之后的一直按照默认的来,最后点完成,完成创建

三、初识界面

1.创建好项目之后,打开资源视图(资源视图打开方法:菜单栏视图——其他窗口——资源视图(R)),资源视图,.rc后缀的文件夹下——点开Dialog文件夹——点开IDD_***_DIALOG

 

 左边大方框部分就是我们的Dialog对话框,之后的拖入控件Button的操作都要从这里入手

2.对话框中间蓝色虚线围起来的部分是展示内容的区域,我们写入代码,拖入控件显示任何东西都在这里(显示区域),上方一般是放菜单或者工具的地方左上角的工具箱可以拖入控件,比如button按钮(这里跟C#几乎一毛一样)——工具箱找不着看这里:菜单栏——视图——工具箱

 

四、上案例

在做案例之前,先把对话框中原来的(确定,取消,button全部delete删除掉)此处可用ctrl+a&delete大法

我们的目标界面是有两个button,实现模态对话框(有了它之后你只能先把这个弹出的对话框叉掉才能点电脑的其他区域)和非模态对话框(这个button弹出的对话框不是最优先级的,可以点击电脑的其他地方)

1.拖控件button(两个)

工具箱中找到button,直接鼠标左键拖入可视区域想要放置的区域,两个哦(也可以Ctrl+C&Ctrl+V大法把刚拖入的控件粘贴)

2.改控件名字

2.1改名方法1

左键单击选中控件,右键弹出选项中选择最底下的属性,属性面板中找到Caption把Button1改为模态对话框改好后单击空白的地方结束输入

此方法也适用于改整个对话框的名字,修改对话框属性的Caption改为自己想要的名字

 

 

2.2改名方法2

 写在前面:此方法改完后千万别双击button2

虽然在C++图形库QT中可以双击改控件名,但在MFC中千万别用(会后悔的~)

左键单击选中button2,直接输入想要的名字:非模态对话框,确认输入后可以回车,但千万别双击,因为双击后会生成一个时间代码,并且由对话框编辑器跳转至代码

3.添加两个新的对话框(Dialog)

打开资源视图,点开.rc后缀名文件下的子文件夹Dialog右键——插入Dialog(E)

他的默认名字是(ID)是IDD_DIALOG1

 

这个DIALOG1我们即将把它作为,点击第一个(我们拖了两个控件button的对话框)点击点击模态对话框之后弹出的对话框,IDD_DIALOG1是刚创建的对话框的ID名,我们可以修改他的属性——ID,改为:IDD_EXEC,因为在QT中模态叫做EXEC,这里可以随便改,后续写函数会用到对话框的ID,最好起一个符合其内容的ID

 

给IDD_EXEC拖入一个button改Caption为:生成模态显示框了

 

 如法炮制另一个对话框,ID改为IDD_SHOW,button的Caption为生成非模态显示框了

4.写入代码

上述对话框就像是QT中的ui文件,就只是一个框架,要想让框架可以执行某些功能,就得插入相应的.h或者.cpp文件对ui文件进行关联

4.1.创建IDD_EXEC对话框的关联类

右键对话框面板,添加类,起个类名:CDialogExec,点击确定,弹出一个CDialogExec.h文件

 

且在类视图(菜单——视图——类视图可以打开)里生成了一个CDialogExec的类

那是怎么和IDD_EXEC对话框 联系起来的呢?点开CDialogExec::__unnamed_enum_027a_1(位置如下图)

可以看到enum枚举的是我们刚刚修改好的dialog对话框的ID,如果这一行有红色下划波浪线(报红,可以忽略)那是因为我们修改了对话框ID编译器还没反应过来

 现在,模态对话框已经通过枚举ID关联起来了

4.2写入主对话框的事件代码

这里所说的主对话框是两个BUTTON的那个

我们要写一个单击button就可以弹出相应对话框的功能

我们需要给button写入事件,事件button的属性中,闪电图标下的BN_CLICKED事件,其右边的小三角形,点开会有一个<add>...这就是添加事件,单击之后生成事件代码模板

 

 void Cpra01Dlg::OnBnClickedButton1()
{
    // TODO: 在此添加控件通知处理程序代码
}

这个就是我们刚刚添加的时间代码,目前是空实现

第二种添加事件方法是选中控件,右键——添加事件处理程序——类列表:默认不要动;消息类型:BN_CLICKED

最后一种添加事件的方法就是双击控件——简单粗暴,生成事件代码(默认情况是单击事件)

现在有两个button的事件代码了

在模态对话框单击事件的函数模板里写入CDialogExec类的实现代码,既然是类,又不在本文件中,那么就得引用CDialogExec的头文件,但是这里和其他C++编译场景不同的是,如果类名字的第一个字母是大写的C,则引用头文件时要省略C引用头文件

//如果去掉C报错就加上C

 写入如下单击事件代码

//模态对话框按钮的单击事件
void Cpra01Dlg::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	//创建CDialogExec对象
	CDialogExec dlg;//创建对象dlg
	dlg.DoModal();//生成模态对话框用DoModal()函数
}

运行试一下,除非把模态对话框点掉,否则无法进行其他操作

 和模态对话框IDD_EXEC同样的步骤关联非模态对话框IDD_SHOW

 引用头文件

 写入button2单击事件函数代码

//非模态对话框按钮的单击事件
void Cpra01Dlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码
	//弹出非模态对话框
	//创建CDialogShow对象
	CDialogShow dlg;
	//显示对话框
	dlg.Create(IDD_SHOW);//用creat函数,传入要创建的对话框的ID
	dlg.ShowWindow(SW_SHOWNORMAL);//显示对话框,传入参数是SW_DENORMAL意思是Normal显示
	//ShowWindow的父类是CWnd,鼠标停靠在showWindow那里会有小字提示,然后在根据提示找
}

此时运行非模态对话框点开只会一闪而过

问题在哪儿?

观察,分析,我们的模态和非模态对话框的事件都是一个局部的方法,方法的代码就那么几行,事件代码运行完了,窗口也完了

那么为什么模态对话框那里没有一闪而过?

那是因为DoModal()起到了阻塞作用

那么要解决一闪而过的问题就只能把它引诱到堆区(堆区是由程序员决定释放的,堆区的概念可以看之前写在C++专栏的四区文章)

还有一个方法呢就是把CDialogShow dlg写到CDialogShow类的成员函数里面,延长生命周期

在类视图里找到Cpra01Dlg类,这是整个MFC对话框的类,在这里面添加CDialogShow dlg;为私有变量,此时,记得添加CDialogShow的头文件(并且要把写单击事件里创建的对象CDialogShow dlg;代码注释掉,否则运行会报错)按照截图对应着来

 

 

 运行成功,不是一闪而过

还有一个更简单的方法是,在创建的CDialogShow dlg对象前面加上static放入全局区,延长生命周期,只简单的加一个static也可以改变非模态对话框的命运

最后,退掉非模态对话框第二次点击的时候程序就崩掉了,因为我们的dlg.Create(IDD_SHOW);//只能用一次(在这里)第二次点击就没有再creat了

解决方法就是,把这段代码放入构造函数中(不推荐,别问我为什么),放入同一个文件的OnInitDialog()函数中,这个函数前面的都不用看,找到后面的/ TODO: 在此添加额外的初始化代码,在这里creat窗口就可以反复调用了

 

 

此时报红,是因为我用的是改成static的方法,改用第一个方法,写到成员变量中就行了 

 

如有不对的地方,烦请在评论区或者私信指教~

~--_^^_--~

  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
目 录 译者序 前言 第一部分 基础知识 第1章 窗口 2 1.1 窗口和API环境 2 1.1.1 三种类型窗口 2 1.1.2 客户区和客户区 3 1.2 窗口和MFC环境 4 1.3 怎样应用MFC创建一个窗口 5 1.4 怎样使用MFC销毁一个窗口 9 1.4.1 捆绑到一个已有的窗口 9 1.4.2 窗口类 10 1.4.3 窗口进程 10 1.5 怎样使用MFC创建一个窗口类 11 1.5.1 使用AfxRegisterWndClass () 函数注册一个窗口类 11 1.5.2 使用AfxRegisterClass ()函数 创建一个窗口类 12 1.6 怎样销毁一个MFC窗口类 14 1.7 厂商安装的窗口类 14 1.8 其他类型窗口 15 1.9 桌面窗口 16 1.10 小结 16 第2章 类 18 2.1 基类 18 2.1.1 CObject 18 2.1.2 CCmdTarget 19 2.1.3 CWnd 19 2.2 应用程序、框架、文档和视图类 19 2.2.1 CWinApp(O/C/W) 20 2.2.2 CView (O/C/W) 21 2.3 其他用户界面类 22 2.3.1 通用控件类 23 2.3.2 菜单类 23 2.3.3 对话框类 24 2.3.4 控制条类 24 2.3.5 属性类 25 2.4 绘图类 25 2.4.1 设备环境类 25 2.4.2 图形对象类 25 2.5 文件类 26 2.6 数据库类 26 2.6.1 ODBC类 26 2.6.2 DAO类 27 2.7 数据集类 27 2.8 其他数据类 27 2.9 通信类 28 2.10 其他类 29 2.11 小结 31 第3章 消息处理 32 3.1 发送或寄送一个消息 32 3.1.1 发送一个消息 32 3.1.2 寄送一个消息 32 3.1.3 发送一个消息与寄送一个消息 的比较 32 3.2 怎样使用MFC发送一个消息 33 3.3 怎样用MFC寄送一个消息 33 3.4 三种类型的消息 34 3.4.1 窗口消息 34 3.4.2 命令消息 34 3.4.3 控件通知 34 3.5 MFC怎样接收一个寄送的消息 36 3.6 MFC怎样处理一个接收到的消息 36 3.7 处理用户界面的对象 44 3.8 创建自定义窗口消息 45 3.8.1 静态分配的窗口消息 45 3.8.2 动态分配的窗口消息 46 3.9 重定向消息 47 3.9.1 子分类和超分类 47 3.9.2 用MFC子分类窗口 48 3.9.3 重载OnCmdMsg ( ) 49 3.9.4 使用SetWindowsHookEx ( ) 49 3.9.5 使用SetCapture ( ) 49 3.9.6 专有的消息泵 50 3.10 小结 50 第4章 绘图 51 4.1 设备环境 51 4.2 在MFC环境中创建一个设备环境 52 4.2.1 屏幕 52 4.2.2 打印机 53 4.2.3 内存 54 4.2.4 信息 54 4.3 绘图例程 55 4.3.1 画点 55 4.3.2 画线 55 4.3.3 画形状 55 4.3.4 形状填充和翻转 55 4.3.5 滚动 56 4.3.6 绘制文本 56 4.3.7 绘制位图和图标 56 4.4 绘图属性 56 4.4.1 设备环境属性 57 4.4.2 画线属性 58 4.4.3 形状填充属性 58 4.4.4 文本绘制属性 58 4.4.5 映像模式 59 4.4.6 调色板属性 62 4.4.7 混合属性 62 4.4.8 剪裁属性 63 4.4.9 位图绘制属性 64 4.5 元文件和路径 65 4.5.1 元文件 65 4.5.2 路径 66 4.6 颜色和调色板 66 4.6.1 抖动色 67 4.6.2 未经抖动色 67 4.6.3 系统调色板 67 4.6.4 使用系统调色板 68 4.6.5 动画色 71 4.7 控制什么时候在哪里绘图 71 4.7.1 处理WM_PAINT 71 4.7.2 只绘制被无效化的区域 72 4.7.3 处理WM_DRAWITEM 72 4.7.4 在其他时间绘图 73 4.8 小结 74 第二部分 用户界面实例 第5章 应用程序与环境 76 5.1 例1 规划MFC应用程序 76 5.2 例2 用AppWizard创建一个MFC 应用程序 79 5.3 例3 用ClassWizard创建一个类 83 5.4 例4 初始化应用程序屏幕 84 5.5 例5 保存应用程序屏幕 86 5.6 例6 处理命令行选项 88 5.7 例7 动态改变应用程序图标 91 5.8 例8 提示用户优先选项 93 5.9 例9 保存和恢复用户优先选项 97 5.10 例10 终止应用程序 100 5.11 例11 创建一个启动窗口 101 第6章 菜单 107 6.1 例12 使用菜单编辑器 107 6.2 例13 添加一个菜单命令处理函数 109 6.3 例14 根据当前可视文档动态改 变菜单 110 6.4 例15 启用和禁用菜单命令 111 6.5 例16 复选标记菜单命令 112 6.6 例17 单选标记菜单命令 113 6.7 例18 动态修改菜单 114 6.8 例19 动态修改系统菜单 116 6.9 例20 触发一个菜单命令 117 6.10 例21 创建弹出式菜单 117 第7章 工具栏和状态栏 120 7.1 例22 使用工具栏编辑器 120 7.2 例23 启用和禁用工具栏按钮 122 7.3 例24 为工具栏按钮添加字 123 7.4 例25 标准工具栏大小 128 7.5 例26 保持工具栏按钮按下 129 7.6 例27 保持工具栏按钮组中 一个按钮按下 130 7.7 例28 为工具栏添加按钮控件 131 7.8 例29 修改应用程序的状态栏 136 7.9 例30 更新状态栏窗格 138 7.10 例31 为状态栏添加其他控件 139 第8章 视图 145 8.1 例32 滚动视图 145 8.2 例33 改变鼠标光标形状 147 8.3 例34 沙漏光标 148 8.4 例35 窗体视图 149 8.5 例36 列表视图 152 8.6 例37 动态分割一个视图 163 第9章 对话框和对话条 166 9.1 例38 使用对话框编辑器 166 9.2 例39 创建一个对话框类 168 9.3 例40 模式对话框 170 9.4 例41 无模式对话框 171 9.5 例42 在无模式对话框的控件间 切换焦点 172 9.6 例43 对话框中的动画 173 9.7 例44 消息框 174 9.8 例45 对话条 176 第10章 控件窗口 182 10.1 例46 在任意位置创建一个控 件窗口 182 10.2 例47 用子分类定制一个通用 控件窗口 183 10.3 例48 用超分类定制一个通用 控件窗口 188 10.4 例49 在按钮上放置位图 190 10.5 例50 动态填充一个组合框 192 10.6 例51 排序一个列表控件 194 10.7 例52 分隔线控件 196 第11章 绘图 198 11.1 例53 绘制图形 198 11.2 例54 绘制文本 201 11.3 例55 从任意位置装入一个图 标并绘制 203 11.4 例56 从任意位置装入一个位 图和绘制一个位图 204 11.5 例57 从文件中创建一个位图 206 11.6 例58 创建一个自绘位图 211 第三部分 内部处理实例 第12章 消息 215 12.1 例59 添加消息处理函数或重 载MFC类 216 12.2 例60 添加命令范围消息处理函数 219 12.3 例61 重定向命令消息 221 12.4 例62 创建自己的窗口消息 222 第13章 文件、串行化和数据库 225 13.1 例63 访问二进制文件 225 13.2 例64 访问标准I/O文件 227 13.3 例65 访问内存文件 228 13.4 例66 在数据类中实现串行化 229 13.5 例67 串行化SDI或MDI文档 235 13.6 例68 按要求串行化 240 13.7 例69 透明地更新串行化的文档 242 13.8 例70 串行化多态类 246 13.9 例71 串行化数据集 248 13.10 例72 访问ODBC数据库 252 13.11 例73 访问DAO数据库 257 第14章 杂类 263 14.1 例74 剪切、拷贝和粘贴文本 数据 263 14.2 例75 剪切、拷贝、粘贴多信 息文本数据 268 14.3 例76 剪切、拷贝和粘贴二进制 数据 273 14.4 例77 数组函数 280 14.5 例78 列表函数 281 14.6 例79 映像函数 283 14.7 例80 系统键盘输入 285 14.8 例81 时间 288 第四部分 打包实例 第15章 库 291 15.1 例82 静态链接C/C++库 291 15.2 例83 动态链接C/C++库 295 15.3 例84 动态链接MFC扩展类库 300 15.4 例85 资源库 303 第五部分 附录 附录A 控件窗口风格 305 附录B 消息、控件通知和消息映像宏 323 附录C 访问其他应用程序类 328 附录D 开发中注意事项 330 附录E MFC快速参考指南 339

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值