文章目录

  • 对话框程序设计概述
    • 常用成员函数
    • 对话框主要属性
  • 一、在对话框使用按钮控件
    • 1、按钮添加变量
    • 2、按钮添加事件处理程序
    • Messagebox
    • AfxMessagebox
  • 二、对话框窗口消息
    • 1、为消息对话框显示消息处理函数
      • WM_CREATE
      • WM_CLOSE
      • WM_DESTROY
    • 2、为对话框添加自定义消息
  • 三、模态对话框和非模态对话框
    • 1、模态对话框
    • 2、非模态对话框
  • 四、通用对话框
    • 1、文件对话框的使用
      • 示例:
        • 简单文件打开对话框
        • 设置初始目录的文件打开对话框
        • 获取文件打开对话框所选的路径名
        • 获取文件打开对话框所选的文件名
        • 获取文件打开对话框所选的文件标题
        • 获取所选文件的扩展名
        • 打开文件对话框选择多个文件
        • 设置文件打开对话框的过滤功能
        • 设置打开对话框的过滤功能
        • 带有标题的文件打开对话框
        • 最简单文件保存对话框
        • 带自定义保存文件名的保存文件对话框
        • 带自定义文件名和扩展名的保存文件对话框
    • 2、字体对话框的使用
    • 3、浏览文件夹对话框的使用
    • 4、查找 / 替换对话框的使用
      • 示例:

对话框程序设计概述

常用成员函数

对话框主要属性

一、在对话框使用按钮控件

1、按钮添加变量

变量名的基本形式:变量名=属性+类型+对象描述

2、按钮添加事件处理程序

事件处理程序是某个事件发生后控件要执行的程序。
事件处理程序就是一个类成员函数

Messagebox

AfxMessagebox

二、对话框窗口消息

通常用于向用户显示一段文本字符串信息

   在**WM_CREATE**消息的时候,对话框还没有被显示在屏幕上要对控件初始化,通常是在对话框类的虚函数OnInitDialog 中进行 **WM_DESTROY和WM_CLOSE发送顺序:**

  1. 用户单击窗口右上角的关闭按钮,发送WM_CLOSE消息在此过程中调用DestroyWindow 函数,发送WM_DESTROY 消息
  2. 此消息处理过程中调用PostQuitMessage 函数发送WM_QUIT 消息到消息队列中
  3. GetMessage 捕获到WM_QUIT 消息返回0,退出消息循环(应用程序真正退出,就是从任务管理器里消失)

1、为消息对话框显示消息处理函数

**注意:**WM_CLOSE 和WM_DESTROY 的触发条件是不同的

WM_CREATE

WM_CREATE 出现在对话框出现之前

int CTest1Dlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{if (CDialogEx::OnCreate(lpCreateStruct) == -1)return -1;AfxMessageBox(_T("我是消息对话框,马上出现"));return 0;
}

WM_CLOSE

询问是否关闭程序

void CTest1Dlg::OnClose()
{if (AfxMessageBox(_T("确定要关闭程序吗?"), MB_YESNO) == IDYES)CDialogEx::OnClose();
}

WM_DESTROY

以下代码体现主对话框虽然关闭了,但并不意味着进程的退出

void CTest1Dlg::OnDestroy()
{CDialogEx::OnDestroy();AfxMessageBox(_T("主对话框已消失,但进程未退出!"));
}

2、为对话框添加自定义消息

在对话框中可以直接使用这两个函数,虽然这两个函数都是发送消息,但存在一定的区别。SendMessage 函数发送出消息后,该函数SendMessage 不会立即返回,而要等到发出消息所对应的消息处理函数执行完毕后才能返回,继续执行消息函数后面的代码。PostMessage 发出消息后立即返回,马上执行PostMessage后面的代码,而不会去管消息处理函数是否执行完毕。

三、模态对话框和非模态对话框

   模态对话框使用CDialog::DoModal 函数进行创建。DoModel 会启动一个模态对话框自己的消息循环,这也是模态对话框要关闭后才能使用程序其他窗口的原因。DoModel 函数在对话框关闭后才会返回。
   非模态对话框使用CDialog::Create 函数来实现,Create不会启动新的消息循环,对话框与应用程序共用一个消息循环,因此不会独占用户输入

1、模态对话框

  1. 资源视图Dialog ,在右键快捷菜单中选择“插入Dialog ”命令
  2. 在caption 属性(标题栏中显示的文本)中改为“模态对话框”
  3. 在对话框空白处右击,在快捷菜单中选择添加类以CDialog为基类(或以CDialogEx,比CDialog扩展一些功能)
  4. 在资源视图IDD_TEST1_DIALOG 的对话框,添加消息按钮函数
void CTestDlg::OnBnClickedButton1()
{CDlgModel dlg;dlg.DoModal();//创建并显示模态对话框
}
  1. 在TestDlg.cpp 中添加头文件
#include <DlgModel.h>

2、非模态对话框

  1. 定义非模态对话框指针
  2. 切换资源视图添加消息按钮函数
  3. 切换类视图重写函数下添加OnCancel() 重载函数,然后在OnOK(),OnCancel()中添加如下代码:
void CDlgModeless::OnOK{CDialog::OnOK();DestroyWindow();//销毁窗口,发出WM_DESTROY 消息
}
void CDlgModeless::OnCancel{CDialog::OnCancel();DestroyWindow();//销毁窗口,发出WM_DESTROY 消息
}
  1. 响应对话框WM_DESTROY 消息。切换类视图,在消息列表添加WM_DESTROY 响应函数OnDestroy :
void CDlgModeless::OnDestroy{CDialog::OnDestroy();delete this;g_dlgModeless=null;
}
  1. 保存运行

四、通用对话框

是操作系统提供给所有应用程序使用的对话框,其功能已经实现好了,可以直接使用。例如,打开、保存文件对话框、字体选择对话框、颜色选择对话框、打印设置对话框、查找替换对话框等等。

  在VS2017中所有的通用对话框都是从CCommonDialog 继承而来

1、文件对话框的使用

打开文件或保存文件的对话框,在文件对话框用户可以设置路径名和文件名等。
  类CFILEDialog 实现文件对话框的各种功能,构造函数的第一个参数是TRUE 时,为打开对话框;第一个参数为FALSE 时,为保存对话框。
  构造函数原型如下:



示例:

简单文件打开对话框

void CTextDlg::OnBnClickedButton1()
{CFileDialog dlg(true, NULL, _T("MyDat"), NULL, NULL, this);dlg.m_ofn.lpstrInitialDir=_T("c:\\windows");dlg.DoModal();
}

设置初始目录的文件打开对话框

void CTextDlg::OnBnClickedButton1()
{CFileDialog dlg(true, NULL, _T("MyDat"), NULL, NULL, this);dlg.m_ofn.lpstrInitialDir=_T("c:\\windows");dlg.DoModal();AfxMessageBox(_T("设置的目录路径为:") + dlg.GetFolderPath());//GetFolderPath();
}

获取文件打开对话框所选的路径名

void CTextDlg::OnBnClickedButton1()
{CFileDialog dlg(true, NULL, NULL, NULL, NULL, this);dlg.m_ofn.lpstrInitialDir=_T("c:");if(IDOK==dlg.DoModal())AfxMessageBox(_T("设置的目录路径为:") + dlg.GetPathName());
}

获取文件打开对话框所选的文件名

类似同上

AfxMessageBox(_T("设置的目录路径为:") + dlg.GetFileName());

获取文件打开对话框所选的文件标题

AfxMessageBox(_T("设置的目录路径为:") + dlg.GetFileTitle());

获取所选文件的扩展名

AfxMessageBox(_T("设置的目录路径为:") + dlg.GetFileExt());

打开文件对话框选择多个文件

p186

设置文件打开对话框的过滤功能

设置打开对话框的过滤功能

带有标题的文件打开对话框

void CTextDlg::OnBnClickedButton1()
{CFileDialog dlg(true, NULL, NULL, NULL, NULL, this);dlg.m_pOFN->lpstrTitle = _T("请选择要打开的文件");dlg.DoModal();
}

最简单文件保存对话框

void CTextDlg::OnBnClickedButton1()
{CFileDialog dlg(false, NULL, NULL, NULL, NULL, this);dlg.DoModal();
}

带自定义保存文件名的保存文件对话框

void CTextDlg::OnBnClickedButton1()
{CFileDialog dlg(false, NULL,_T("Mydata"), NULL, NULL, this);dlg.DoModal();
}

带自定义文件名和扩展名的保存文件对话框

void CTextDlg::OnBnClickedButton1()
{LPCTSTR lpszFilters;lpszFilters = _T("BMP文件|*.bmp|DIB文件|*.dib||");CFileDialog dlgfile(FALSE, _T(""),_T("图片"), OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, lpszFilters, this);if (dlgfile.DoModal()) {CString sPathName = dlgfile.GetPathName();AfxMessageBox(sPathName);}
}

2、字体对话框的使用

3、浏览文件夹对话框的使用

可以让用户来选择文件夹。显示文件夹对话框可调用系统函数SHBrowseForFolder 该函数由操作系统shell32.lib 提供可直接拿来使用。

4、查找 / 替换对话框的使用

    该对话框比较特殊,属于非模态对话框,它的使用与其他通用对话框有所不同。注意,该对话框只是提供一个接受用户要求的接口,使我们知道用户提出了何种要求(返回请求查找 / 替换),真正的工作需要另行编程实现。与文件对话框相似,用户打开文件对话框不能真的打开文件,而是让我们知道用户打开的文件是哪一个(图形窗口的形式返回要打开的文件路径)
    类CFindReplaceDialog 对该对话框进行了封装,作为非模态对话框必须用new 操作符来分配存储空间,再用Create 函数对其进行初始化,最后用Show Window 函数显示对话框。里面就有成员函数Create 函数原型:

BOOL Create (
BOOL bFindDialogOnly,               //1、对话框类型,TRUE时查找对话框,FALSE时查找/替换对话框
LPCTSTR lpszFindWhat,               //2、在查找对话框中显示的字符串
LPCTSTR lpszReplaceWht = NULL,     //3、在替换窗中显示的字符串
DWORD dwFlag,                       //4、标志位,用来定制对话框,可以是多个标志灯的组合,主要取值如下所述
CWnd* pParentWnd = NULL                //5、指向对话框父窗口,NULL则为主框架窗口,使用时需让它指向接收查找/替换消息的窗口
);

dwFlag 标志位的标志:

示例:

  1. 在新建的Text 工程中在解决方案视图打开TestDlg.cpp 在开头定义全局变量
CFindReplaceDialog* CFindReplaceDlg = NULL;     //指向查找对话框或替代对话框
BOOL bLastCase = FALSE;                            //记录上一次的大小写情况
int pos = 0, curpos;                           //pos是当前查找索引;curpos是当前索引
//gstrEdit 存放上一次编辑框中的正文内容;gstrLast存放上一次查找框中的内容
CString gstrEdit, gstrLast;
  1. 添加编辑框(Edit Control)该编辑框显示正文内容,设置编辑框Want Return 属性和Multisim 属性为True ,再为编辑框添加控件变量m_edt 和值变量 m_strEdit。添加“显示查找对话框”,添加按钮单击时间处理代码:

------ 待补充-----

2)MFC对话框程序设计相关推荐

  1. MFC Windows 程序设计[五十六]之开启子对话框(附源码)

    MFC Windows 程序设计[五十六]之开启子对话框 程序之美 前言 主体 运行效果 核心代码 逻辑分析 结束语 程序之美 前言 MFC是微软公司提供的一个类库(class libraries), ...

  2. 模式对话框和非模式对话框的区别(出自MFC windows程序设计第二版p370)

    模式对话框和非模式对话框的区别:(出自<MFC windows程序设计>第二版p370) 1.显示模式对话框需要调用CDialog::DoModal,而显示无模式对话框则要调用CDialo ...

  3. MFC应用程序设计(第二版)学习笔记

    第一章, Windows应用开发基础 基本概念 windows API函数按功能大体分为以下: 窗口管理函数 WUI 图形设备管理函数 GUI 系统服务函数 SUI 早期开发使用软件开发工具包sdk, ...

  4. 使用VC++6.0创建MFC对话框程序

    使用VC++6.0创建MFC对话框程序

  5. MFC对话框中的工具栏、状态栏设计小结

    对网上的资料结合自己的实践的总结,由于大部分都是网上先辈们的经验,这里只是直接将内容拿来,格式优化一下更易读而已. 对话框中建立工具栏的方法 工具栏中包含了一组用于执行命令的按钮,每个按钮都用一个图标 ...

  6. CEF:MFC 对话框 Demo(VS2013)

    原文链接:https://blog.csdn.net/blackwoodcliff/article/details/74276848 随着 HTML5 的崛起和 IE 的淘汰,微软 Web Brows ...

  7. 用回车键实现MFC对话框中TAB键控件输入焦点在控件中跳转的效果(转)

    用回车键实现MFC对话框中TAB键控件输入焦点在控件中跳转的效果(转) 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://hcq11.blogbus.com/logs/5 ...

  8. MFC对话框动态刷新图片(仿照全屏屏保)

    最近做MFC对话框工程 用到全屏刷新图片的功能,由于功能实现比较简单,便使用CImage类配合定时器制作,下面贴上实现方式: 增加消息响应事件: //在对话框属性的消息中 添加WM_PAINT与WM_ ...

  9. MFC对话框自适应大小(四舍五入)高精度版本

    最近写MFC对话框项目需要控件自适应窗口的大小-,使用以前用过的方法经过多次测试发现对话框内的部件"每经过一次拉伸或收缩都会有一定比例的缩小(控件朝左上方向缩小)":   为了解决 ...

  10. BCGControlBar MFC对话框换肤 续

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 系统环境 ...

最新文章

  1. python类装饰器详解-Python类中的装饰器在当前类中的声明与调用详解
  2. 手把手教你写网络爬虫(4)Scrapy入门
  3. window.open 弹出居中窗口
  4. .NET 反编译调试神器:dnSpy了解一下
  5. zigbee cc2530地址空间 layout 和flash操作
  6. jboss启动初始页面_JBoss BRMS最佳实践– BPM流程初始化层的提示
  7. 夜间模式html,夜间模式.html
  8. java .insert_Java StringBuffer.insert 插入字符
  9. c/c++教程 - 2.2 引用的使用方法,引用做函数参数,引用做返回值,引用的本质,常量引用
  10. 格雷码 Gray Code
  11. http://snaps.php.net,科技常识:Windows下编译PHP和memcache扩展教程
  12. 4am永远 鼠标按键设置_适合我的精英手柄,机械按键与体感最爱:北通宙斯T6体验...
  13. Matlab加矩形窗程序,基于MATLAB结合矩形窗设计FIR滤波器
  14. 2019计算机单招试题,(完整版)2019高职单招计算机类专业练习卷
  15. mmdet更改faster-rcnn的主干网络训练
  16. 内网渗透-window权限维持
  17. 满分的一份软件测试工程师简历,凭什么?
  18. contourf的colorbar如何设置显示范围
  19. java计算年份_如何计算Java中2个日期之间的年份和年份
  20. 活期存款利息的计算方法

热门文章

  1. 互联网日报 | 4月29日 星期四 | 虎牙20亿购买LPL直播版权;返利网正式借壳登陆A股;淘宝直播全面开放官方货品池
  2. 海康ehome协议分析(3):PTZ云台控制
  3. 遍历Map集合的4种常用方法
  4. 必刷2022年辽宁最新消防设施操作员模拟题库及答案
  5. axure原型图手机界面尺寸
  6. 一些基本数字图像处理算法
  7. WinRAR 曝出代码执行漏洞,你的官方中文无广告版该升级了
  8. FLUENT 流体计算应用教程
  9. pkcs8格式证书转换pkcs1格式
  10. 2018CVPR:Non-local Neural Networks(自注意力机制捕获远程依赖)