1. OnInitDialog 对话框初始化函数

在MFC主对话框OnInitDialog()中弹出对话框

BOOL CXXXDlg::OnInitDialog()

{
  CDialogEx::OnInitDialog();
  SetIcon(m_hIcon, TRUE);
  SetIcon(m_hIcon, FALSE);

  CChildDlg dlg;
  dlg.DoModal();

  //你的业务代码

}

在MFC中新建基于对话框的程序时,会使用到OnInitDialog()函数,OnInitDialog函数主要用于对话框对象初始化操作,比如:在对话框类的定义中有指针、数据或者布尔类型变量等,这些成员的初始化都可以放在OnInitDialog函数中。

其函数原型是: virtual BOOL OnInitDialog(),是虚函数,在对话框显示之前被调用。

有时候需要在OnInitDialog弹出对话框,例如密码框来决定是否显示主对话框。那么子对话框CChildDlg的风格必须是Popup或Overlapped风格,Child风格是弹不出来的.

设置dialog的标题:

在对应对话框的初始化函数OnInitDialog()中添加以下代码:

CString title;

title.Format("%d",Id);//在标题栏动态显示Id的值

this->SetWindowText(title);

首先OnOK是对ID_OK的响应, OnCancel是对IDCANCEL的响应. 前者对应键盘的Enter, 后者对应Esc.

MFC:

1、Called when the user clicks the OK button (the button with an ID ofIDOK).

2、The framework calls this member function when the user clicks the Cancel button or presses the ESC key in a modal or modeless dialog box.

两个函数都是CDialog类的virtual的成员函数, 也就是MFC是希望你去重载它们. 两个函数有一个共同点,就是都会调用CDialog::EndDialog. 这个CDialog::EndDialog函数是在CDialog::OnOK();中调用的。EndDialog的作用如下,摘自MSDN:

Call this method to destroy a modal dialog box

Do not call EndDialog to destroy a modeless dialog box. Call CWindow::DestroyWindow instead

模态对话框可以用EndDialog来销毁, 非模态对话框要用DestroyWindow来销毁. 以下摘自MSDN:

If you implement the OK button in a modeless dialog box, you must override the OnOK method and call DestroyWindow inside it. Do not call the base-class method, because it calls EndDialog which makes the dialog box invisible but does not destroy it.

为什么强调用谁来销毁,因为这牵涉到资源释放的问题:

//调用基类的OnOK()函数,执行基类中的EndDialog(IDOK)函数,作用是关闭对话框,并把IDOK作为对话框的返回值,返回给调用对话(DoModal)的地方。

1、对于模态对话框:

void CMyDlg::OnOK()
{
CDialog::OnOK();
}

2、对于非模态对话框,你关闭对话框时,就不能只调用CDialog的OnOK, 还应该DestroyWindow,像下面这样:

void CMyDlg::OnOK()
{
CDialog::OnOK();//关闭窗口,窗口不可见,但是并没有销毁
DestroyWindow();//销毁窗口,释放窗口资源
}
--

OnOK 和OnCancel函数:

MFC默认建立的Dialog按Esc响应OnCancel,回车响应OnOK,都会关闭对话框。

而点击下方两个按钮功能相同,点击确定是响应OnOK, 点击取消调用OnCancel。

而OnOK和OnCancel之间是有区别的:

CDialog::OnOK首先调用UpdateData(TRUE)将数据传给对话框成员变量,然后调用CDialog::EndDialog关闭对话框。 
CDialog::OnCancel只调用CDialog::EndDialog关闭对话框。

所以我们在销毁dialog需要进行一些数据交换就可以在OnOK中进行。

/*
* Dialog Box Command IDs
*/
#define IDOK 1
#define IDCANCEL 2

INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: 在此放置处理何时用
// “确定”来关闭对话框的代码
}
else if (nResponse == IDCANCEL)
{
// TODO: 在此放置处理何时用
// “取消”来关闭对话框的代码
}
else if (nResponse == -1)
{
TRACE(traceAppMsg, 0, "警告: 对话框创建失败,应用程序将意外终止。\n");
}

在对话框程序中,

1)用户点击X关闭按钮,调用的是CDialog::OnCancel函

使用RichEdit切记:

在mfc中使用工具栏里的RichEdit 控件时,应该在对话框构造函数中用

AfxInitRichEdit()或者 AfxInitRichEdit2()。

否则程序启动后没有界面。

解决MFC对话框不显示最小化、最大化和关闭按钮的问题

右击属性栏,发现如下设置成了灰色的了
解决办法:
设置System Menu为True,上面的最大化和最小化就可以设置了
 
RichEdit2不换行的问题:
Auto HScroll
属性中设置mulitiline为TRUE,wantreturn设置为true,Audo Vscroll为TRUE、Vertical SCroll为TRue
TransParent必须为false(否则滚动滑轮,字会花掉).
 
 

MFC Dialog使用的更多相关文章

  1. 《MFC dialog中加入OpenGL窗体》

    <MFC dialog中加入OpenGL窗体> 最近学习了如何在MFC对话框程序中加入OpenGL窗体的方法,在这里将自己的实现过程归纳一下. 步骤零: 加入PictureControl控 ...

  2. 在MFC Dialog中显示cmd窗口

    打开Project -> Properties,在Build Events -> Post-Build Event里的Command Line中输入: editbin /SUBSYSTEM ...

  3. MFC 对话框控件自动布局

    MFC 设计界面程序总是不够智能,没有这样,没有那样. 今天为了加强mfc功能,设计了一个自动布局的类,使用非常简单. 原理: 每个控件都有一个矩形区域,矩形区域就是控件在对话框中的显示位置和大小, ...

  4. MFC学习(三):项目学习

    1. 概述 MFC程序由CWinApp.MainFrm(含Menu,可用CSplitterWndEx分割).众多Dialog等组成. MFC既可以使用纯Dialog的形式,也可以使用Document+ ...

  5. mfc对话框嵌入Flash的交互(转)

    原文转自 http://blog.csdn.net/yacper/article/details/5021081 研究Flash嵌入游戏中的可行性....... 渲染问题已解决 事件响应已解决 下面是 ...

  6. VC++ 对话框程序响应键盘消息的处理方法的说明(非常重要)

    基于MFC对话框的应用程序在响应按键消息和热键方面都力不从心,CDialog类的消息循环中去掉了TranslateAccelerator函数,因此不能响应热键:同时由于对话框上可能有很多控件,且默认情 ...

  7. 【转】如何在Windows+VS2005使用最新静态libcurl 7.35.0获取网页数据,支持HTTPS

    地址: http://blog.csdn.net/hujkay作者:Jekkay Hu(34538980@qq.com)关键词:Windows,curl,ssl,  visual c++ 2005, ...

  8. VC++2005下的ADO SQL语句(like,count,distinct)和操作(转)

    http://blog.sina.com.cn/s/blog_56fd66a70100hxjf.html http://timke.blog.163.com/blog/#m=0 环境:MFC  Dia ...

  9. 由Tencent://Message协议想到的一个解决方案

    参考网址:http://www.cnblogs.com/phinecos/archive/2009/03/06/1404951.html 源代码下载:http://files.cnblogs.com/ ...

随机推荐

  1. #Node.js的fs导入遇到的问题和解决方案

    一直在使用VS Code,今天打算用Node.js进行文件IO时候遇到了一些问题,fs是Node.js的核心功能之一,一开始我用Javascript编写fs模块的导入. var fs = requir ...

  2. 用python一步一步教你玩微信小程序【跳一跳】

    12月28日,微信上线了小游戏「跳一跳」,瞬间成了全民游戏,如何牢牢占据排行榜的第一位呢?用Python帮助你,Python真的无所不能. 作为技术出身的我们,是不是想用技术改变排名呢? 注意:本文适 ...

  3. Grafana和influxdb监控nginx日志中的请求响应时间图形化监控

    监控效果如图: 监控方法: 通过logstash过滤nginx日志,然后解析出nginx日志中的request time字段 然后output到influxdb时序数据库中 通过grafana展示数据 ...

  4. 后端for循环补充

    我们的for循环里面,在外面可以调用它最后一次循环的值,pycharm尽管会飘黄色,但是系统是可以识别出来的,能够调用,而且是循环最后一次的值

  5. Wxpython入门

    Wxpython入门 api文档以及中文教程: https://pan.baidu.com/s/1TDTgHg9Mwc74ODQy68YnlQ 提取码:354n 入门示例 frame=wx.Frame ...

  6. Android高级工程师面试实战,您会挂么?

    xxx公司面试总结 面试形势 群聊(2个面试官+HR+自己) 面试流程 自我介绍 面试官根据你的介绍开始问 你对我们公司有什么想了解的么(复活卡,要时回到没有了也就没有了,可以让面试官给自己提一下建议 ...

  7. JSON WEB Token(JWT)

    最近面试被问及单点登陆怎么解决?自己的项目前后端分离,自己实现token认证,token有失效时间,token中包含用户基本的信息.且一个当用户重新登陆后,原来的token就会失效,这么安全的一个to ...

  8. WinIo驱动级键盘模拟编程

    转自:http://blog.sina.com.cn/s/blog_455d7a320100vr37.html 前天无聊,翻翻自己的兴趣项目文件夹,发现了这个放下很久的项目!那是大三时候的事了.当时是 ...

  9. (84)Wangdao.com第十八天_JavaScript Promise 对象

    Promise 对象 是 JavaScript 的异步操作解决方案,为异步操作提供统一接口. 目前 JavaScript 原生支持 Promise 对象 它起到代理作用(proxy),充当异步操作与回 ...

  10. 9. http协议_响应状态码_页面渲染流程_路由_中间件

    1. http协议 超文本传输协议 协议详细规定了 浏览器 和 万维网服务器 之间互相通信的规则 客户端与服务端通信时传输的内容我们称之为报文(请求报文.响应报文) 常见的发送 get 请求方式 在浏 ...