MFC每日一练之《创建modal对话框和非modal对话框》
来源:互联网 发布:青花瓷歌词 知乎 编辑:程序博客网 时间:2024/04/29 08:34
- 编程环境:VS2008
- 练习目的:记住模式和非模式对话框区别
- 关键函数:CDialog::DoModal(),CDialog::Create(),CWnd::ShowWindow(),CWnd::DestroyWindow()
- 两者区别
区别分类 modal对话框 非modal对话框 使用中的区别 不关闭此对话框无法操作其他对话框随意切换操作对话框构建方式 局部变量或以new的方式从堆中构建都可以不能以局部变量构建创建函数调用CDialg::DoModal()方法创建调用CDialg::Create()和CWnd::ShowWindow(SW_SHOW)方法创建并显示阻塞情况当前线程阻塞直到关闭modal对话框CDialg::Create()创建后立即返回继续执行下面代码 - 创建过程
首先我们在创建的MFC工程的主对话框新建两个Button控件,caption分别命名为“model“和”modeless“。
然后新建两个对话框caption分别命名为”设备信息“和”设备状态“,并且为对话框关联名为CDlgDeviceInfo和CDlgDeviceState对话框类。
再为两个Button分别创建单击事件,代码如下:void CModalDLGCreateDlg::OnBnClickedBtnModel(){// TODO: 在此添加控件通知处理程序代码}void CModalDLGCreateDlg::OnBnClickedBtnModeless(){// TODO: 在此添加控件通知处理程序代码}
我们最终代码实现的功能是:
一、单击"model" Button后关联了CDlgDeviceInfo类的对话框以模式对话框方式弹出显示。
二、单击"modeless" Button后关联了CDlgDeviceState类的对话框以非模式对话框方式弹出显示。
实现功能一,在OnBnClickedBtnModel()单击事件函数中添加如下代码:void CModalDLGCreateDlg::OnBnClickedBtnModel(){CDlgDeviceInfo dlgDeviceInfo;int Ret;Ret = dlgDeviceInfo.DoModal();switch(Ret){case IDOK:MessageBoxA(NULL,"Model dialg ONOK is called","debug",MB_OK);break;case IDCANCEL:MessageBoxA(NULL,"Model dialg ONCANCEL is called","debug",MB_OK);break;default:MessageBoxA(NULL,"Model dialg sth else is happened","debug",MB_OK);break;}}
当然记得包含CDlgDeviceInfo类声明的头文件“#include DlgDeviceInfo.h”。顺便验证一下CDialog::DoModal()的返回值与创建的模式对话框中使用CDialog::OnOK()和CDialog::OnCancel()函数的关系。
实现功能二,在主窗口的头文件中包含CDlgDeviceState类的头文件“#include DlgDeviceState.h”,并在主对话框类中添加私有成员变量dlgDeviceState,最后在OnBnClickedBtnModeless()的单击事件函数中添加如下代码:void CModalDLGCreateDlg::OnBnClickedBtnModeless(){if(!IsWindow(dlgDeviceState.m_hWnd)){BOOL Ret = dlgDeviceState.Create(IDD_DLG_DEVICE_STATE,this);if(!Ret){AfxMessageBox(_T("Error Creating Modeless Diaglog!"),MB_OK);}else{AfxMessageBox(_T("Creating Modeless Diaglog Succeed"),MB_OK);dlgDeviceState.ShowWindow(SW_SHOW);}}else{AfxMessageBox(_T("dlgDeviceState对象已关联对话框"),MB_OK);dlgDeviceState.ShowWindow(SW_SHOW);}}
为了防止重复创建对话框资源,需要用IsWindow(HWND hWnd)判断成员变量dlgDeviceState是否已经关联了对话框资源。如果没有则关联CDlgDeviceState类对话框,并完成对话框的显示。
为了能够销毁modeless对话框,在主对话框创建一个Button,caption修改为“关闭modeless”,添加了此button的单击事件函数后添加如下代码:void CModalDLGCreateDlg::OnBnClickedBtnCloseModeless(){if(IsWindow(dlgDeviceState.m_hWnd)){if(!dlgDeviceState.DestroyWindow()){AfxMessageBox(_T("销毁Modeless对话框失败"),MB_OK);}else{AfxMessageBox(_T("销毁Modeless对话框成功"),MB_OK);}}}
至此,modeless对话框的创建和销毁练习完毕!
注:已将测试代码工程传至资源中,资源名“VS2008创建model和modeless对话框测试”。
- 两者区别
- MFC每日一练之《创建modal对话框和非modal对话框》
- bootstrap modal对话框
- react-native modal自定义对话框
- 在iPhone中创建模态(modal)等待对话框
- 如何使用Bootstrap的modal组件自定义alert,confirm和modal对话框
- 利用bootstrap的modal组件自定义alert,confirm和modal对话框
- 模态(modal)和非模态(modeless)对话框的区别
- jquery bootstrap 中的 模式对话框 modal 设置宽度和高度
- 关于模态对话框(modal dialog)
- Selenium 处理 modal 对话框(转)
- jQuery Modal bootstrap风格对话框插件
- 模式对话框和非模式对话框MFC
- 4-1 MFC学习之模式对话框和非模式对话框以及对话框的回调
- MFC非模式对话框的创建和销毁(转)
- mfc 无模态(非模式)对话框的创建和关闭
- MFC单文档 对话框 模式对话框和非模式对话框
- <MFC>创建对话框和新建对话框类
- Modal
- 理解 LDA
- 如何在Eclipse下查看JDK源代码
- Javascript之dom解析
- 你所应该知道的Dom4J
- Dinner Hall
- MFC每日一练之《创建modal对话框和非modal对话框》
- 百度地图之一百度地图搭建开发环境(老罗视频笔记整理)
- uva 12086 - Potentiometers
- Android网络连接处理学习笔记
- 公交查询源码
- MATLAB总结:plot常用用法总结
- Python实现简单时间人流数据收集工具
- 第 4次实验任务
- 一张图让你看懂JavaScript各类型的关系