vc中关闭对话框dialog
来源:互联网 发布:js视频进度条 编辑:程序博客网 时间:2024/06/05 19:22
1.首先 调用EndDialog();
对话框默认用的两个按钮的ID分别是IDOK和IDCANCEL,这两个都是在winuser.h 中预定义的系统标准控件ID。
对于标准ID,你不重载时MFC会自动调用父类的相应处理函数。
比如IDOK映射到CDialog::OnOK()函数,IDCANCEL映射到CDialog::OnCancel()。
在这两个函数的源码如下:
void CDialog::OnOK()
{
if (!UpdateData(TRUE))
{
TRACE(traceAppMsg, 0, "UpdateData failed during dialog termination.\n");
// the UpdateData routine will set focus to correct item
return;
}
EndDialog(IDOK);
}
void CDialog::OnCancel()
{
EndDialog(IDCANCEL);
}
可以看出点击这两个按钮,都会调用EndDialog()来关闭对话框,只是返回值不同。
EndDialog()函数调用了DestroyWindow()函数,DestroyWindow()函数又发送了WM_DESTROY消息,该消息的处理函数是OnDestroy(),对话框的生存期最后一个函数是PostNcDestroy()函数。
点那个叉叉呢,首先向对话框发送WM_CLOSE消息,由OnClose()函数处理,它调用DestroyWindow(),其后是和上面一样的路由。
可以看出点叉叉的时候绕过了OnOK()和OnCancel()。
小结一下:
1. 点“确定”、“取消”时的关闭路由为
OnOK()或OnCancel() ---> EndDialog() ---> DestroyWindow() ---> OnDestroy() ---> PostNcDestroy()
2. 点“关闭”标题栏按钮的关闭路由为
OnClose()---> OnCancel() ---> EndDialog() ---> DestroyWindow() ---> OnDestroy() ---> PostNcDestroy()
回答楼主的问题:
请注意,上面提到的这些函数统统都是可以重载的,在重载时加入了你自己的代码后,应该调用父类CDialog同名的函数才能正确路由下去,否则就关不了对话框了。
举个例子,重载了关闭的小叉叉
void CAboutDlg::OnClose()
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
DoSomthing(0; // 执行自己的判断等等
// CDialog::OnClose(); // 把向导生成的父类调用给注释了,这时就关不了对话框了。
}
补充回答,
点叉叉会发送WM_CLOSE消息,如果需要重载的话,应该在对话框的属性窗口中,选择WM_CLOSE消息来添加消息处理函数。
VS的IDE会自动添加如下三段:
1. xxx.h文件,类声明中加入OnClose()函数声明
afx_msg void OnClose();
2. xxx.cpp文件,加入消息映射宏
ON_WM_CLOSE() // 对于Windows标准消息,都是这种简短的格式。
3. xxx.cpp文件,加入函数体
void CMyDlg::OnClose()
{
CDialog::OnClose();
}
上述3处如果都正常的话,叉叉就映射到OnClose()了。
你说的映射到OnCancel()个人觉得有两种可能,
第一、缺ON_WM_CLOSE()宏,却多个一个ON_BN_CLICKED(IDCLOSE, &CMyDlg::OnCancel)宏
第二、在OnClose()中调用了OnCancel()
- vc中关闭对话框dialog
- vc中关闭对话框dialog
- vc中关闭对话框dialog
- vc中关闭对话框dialog
- swt 关闭对话框 关闭dialog
- VC----对话框Dialog
- VC 对话框 DIALOG
- MAXIMO中,在代码中打开和关闭DIALOG对话框
- vc对话框关闭按钮
- Java中Dialog对话框
- Android Dialog点击按钮不关闭对话框
- element ui 对话框el-dialog关闭事件
- VC对话框禁止关闭按钮和禁止任务管理中关闭进程
- Android中自定义对话框(Dialog)
- Android中自定义对话框(Dialog)
- Android中自定义对话框(Dialog)
- Android中自定义对话框Dialog
- Android中Dialog自定义对话框
- Spring - IOC创建对象的时机,创建Bean的Scope 及其 IOC的 生命周期
- 代码手写UI,xib和StoryBoard间的博弈,以及Interface Builder的一些小技巧
- 关于更新局部listview中数据的问题
- 阅读任玉刚博客有感
- webdriver UI自动化测试执行JS脚本
- vc中关闭对话框dialog
- KING_UNITY学习之鼠标点击地面控制人物移动
- LeetCode 144:Binary Tree Preorder Traversal
- qpixmap 鼠标移动,局部放大
- 使用python重写上篇文章的内容分析工具
- range,hash,list分区
- php【基础学习七】string操作
- Android中string资源文件使用技巧
- css 文字长时不换行 显示...