【C++】【MFC】模态和非模态对话框
1.【C++】关于引用类型学习记录2.【C++】【图像处理】直方图均衡算法解析(以.raw格式的图像为基础进行图像处理、gray levels:256)3.【C++】【图像处理】均值滤波 and 高斯滤波 and 中值滤波 (低通滤波器)and Sobel算子边缘提取算法解析(以.raw格式的图像为基础进行图像处理、gray levels:256)4.【C++】【图像处理】形态学处理(腐蚀、膨胀)算法解析(以.raw格式的图像为基础进行图像处理、gray levels:256)5.【C++】【图像处理】灰度直方图实现算法解析(以.raw格式的图像为基础进行图像处理、gray levels:256)6.【C++】【OpenCV】Visual Studio 2022 配置OpenCV7.【C++】【OpenCV-4.9.0】灰度图取反(Mat属性的使用)8.【C++】【OpenCV-4.9.0】视频写入(VideoWriter,借助samples中的代码示例来进行学习)9.【C++】【MFC】Windows程序运行入口 and DialogBox10.【C++】【YOLO】搭建环境运行YOLO模型,完成目标识别
11.【C++】【MFC】模态和非模态对话框
12.【C++】【MFC】运行时类信息机制和动态创建机制13.【C++】【MFC】CView和CDocument关联以及COMMAND消息走向14.【C++】【MFC】MFC多文档框架15.【C++】【MFC】绘图16.【C++】【MFC】MFC序列化17.【C++】【MFC】控件集合1、模态对话框, 开启后限制操作父窗口
void CMFCApplication1Dlg::OnBnClickedButton2() { // TODO: 在此添加控件通知处理程序代码 CDlgExeC exec; exec.DoModal(); }
调用DoModal即可完成。
其中DoModal完成了对话框的创建和销毁,并且自带了消息循环,这代表对话框对象可以在栈中创建,无需通过new在堆,自由存储区域创建,其次DoModal将返回对应控件ID的整数值,即点击OK则返回1,点击CANCEL则返回2,最后,因为DoModal因为自带了消息循环,所以如果是在InitInstance中创建,则
2、非模态对话框,开启后对任意窗口都无限制
void CMFCApplication1Dlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 CDlgs s = new CDlgs; s.Create(IDD_SHOW); s.ShowWindow(SW_SHOW); }
针对非模态对话框,上述回调函数会出现窗口一闪而过,其因为函数的结束而介绍对话框,所以需要将定义转写至对应头文件当中,且创建窗口转写至OnInitDialog方法内,因为窗口只需要创建一次即可,每一次点击只需要展示窗口。
对话框的退出:
1 void CMyDlg::OnOK() { 2 ::DestroyWindow(m_hWnd); 3 } 4 5 void CMyDlg::OnCancel() { 6 DestroyWindow(); 7 }
非模态的退出如果不自定义上述代码,点击后,会调用父类进行处理,父类则是直接调用 EndDialog 方法来关闭,但是对于非模态只能隐藏界面,而无法真正的关闭程序进程。
最后,模态和非模态的区别,仅仅是因为一个方法导致的 EnableWindow()
BOOL EnableWindow(
BOOL bEnable = TRUE
);
Parameter:
指定特定窗口是否将启用或禁用。 如果此参数是 TRUE,窗口将启用。 如果此参数是 FALSE,窗口将被禁用
所以完全可以自定义模态对话框,在非模态的基础上,一旦打开一个新的 Dialog ,则传入 False 即可禁用父类的活动,关闭时再开启,从而达到模态的效果,
配合 GetParentFrame() 使用更佳,其将获取父类框架句柄。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)