MFC建立的对话框无法关闭

renhceng 2013-03-05 11:38:08
用mfc基本对话框建立了一个无边框无按钮的对话框,希望它显示一定时间后关闭。但是关不了:
CStart start;
start.DoModal();
Sleep(100);
start.DestroyWindow();

用enddialog函数也不可以。为什么?怎么解决?
...全文
646 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
GoToSkyBird1 2013-03-08
  • 打赏
  • 举报
回复
在弹出的消息框中弹添加以下消息响应函数,我刚试过了可以的。

BOOL CDlgStart::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class
	Sleep(1000);
  this->OnOK();
	
  return CDialog::PreTranslateMessage(pMsg);
}
心希盼 2013-03-08
  • 打赏
  • 举报
回复
关键在于DoModel 这个会阻塞UI界面的。
luawkk 2013-03-08
  • 打赏
  • 举报
回复
start.DoModal(); 这里阻塞了 后面的无法执行,当然关闭不了了
tingyuyiye01 2013-03-08
  • 打赏
  • 举报
回复
线程在你的DoMal()的时候就已经堵塞了,同意三楼的做法
renhceng 2013-03-07
  • 打赏
  • 举报
回复
enddialog也不可以,为什么?
threenewbee 2013-03-06
  • 打赏
  • 举报
回复
start.DoModal(); 这一句阻塞了,直到关闭对话框,才运行下面的代码。 修改成非模态的 CStart *pDlg = new CStart; // 最好将pDlg 定义为成员变量,退出时好析构 pDlg->Create(IDD_xx, this); // IDD_XX为CStart的ID号 pDlg->MoveWindow(200, 200, 400, 400); // 窗口显示的位置 pDlg->ShowWindow(SW_SHOW); // 显示窗口
Qyee16 2013-03-06
  • 打赏
  • 举报
回复
settime(10000);10s ON_WM_TIME OnTime() 到时间,关闭对话框
MoreWindows 2013-03-06
  • 打赏
  • 举报
回复
显示对话框前启动一个线程并将对话框句柄作参数传给该线程, 然后这个线程等待若干时间后关闭这个对话框就可以了。 多线程可以参考《秒杀多线程系列》文章,有十四篇,很详细的。 http://blog.csdn.net/column/details/killthreadseries.html
lyshiba 2013-03-06
  • 打赏
  • 举报
回复
start.DoModal();函数式卡在那边了啊,需要你手动关闭啊。
bsnry 2013-03-06
  • 打赏
  • 举报
回复
引用 2 楼 caozhy 的回复:
start.DoModal(); 这一句阻塞了,直到关闭对话框,才运行下面的代码。 修改成非模态的 CStart *pDlg = new CStart; // 最好将pDlg 定义为成员变量,退出时好析构 pDlg->Create(IDD_xx, this); // IDD_XX为CStart的ID号 pDlg->MoveWindow(200, 200,……
引用 3 楼 rxguoblp 的回复:
原因:DoModal生成的是模态对话框,此对话框一旦生成后,线程堵塞,在手动关闭对话框之前,你的start.DestroyWindow()这句话永远得不到执行的机会,lz可以在start.DestroyWindow()前面加个断点试试看。 解决方法: 1.在DoModal之前启动一个定时器,时间到了之后在TIMER响应函数里面关闭对话框; 2.也可以如楼上所言,建立……
模态对话框 可以接受部分消息, wm_timer接受不到
rxguoblp 2013-03-06
  • 打赏
  • 举报
回复
原因:DoModal生成的是模态对话框,此对话框一旦生成后,线程堵塞,在手动关闭对话框之前,你的start.DestroyWindow()这句话永远得不到执行的机会,lz可以在start.DestroyWindow()前面加个断点试试看。 解决方法: 1.在DoModal之前启动一个定时器,时间到了之后在TIMER响应函数里面关闭对话框; 2.也可以如楼上所言,建立非模态的对话框,这样你的DestroyWindow()就有执行的机会了。
小兵_小白 2013-03-06
  • 打赏
  • 举报
回复
定时器设置一下,模态对话框为阻塞的。
  • 打赏
  • 举报
回复
也可以在模态对话框内部生成定时器,等一段时间后CDialog::OnOK退出
jimette 2013-03-06
  • 打赏
  • 举报
回复
CDialog aboutDlg(IDD_ABOUTBOX); // Create and show the dialog box INT_PTR nRet = -1; nRet = aboutDlg.DoModal();
N_badfly 2013-03-06
  • 打赏
  • 举报
回复
自己看看MSDN吧,每个参数都有用的
renhceng 2013-03-06
  • 打赏
  • 举报
回复
BOOL CStart::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext) { // TODO: Add your specialized code here and/or call the base class return CDialog::Create(IDD, pParentWnd); } Create函数怎么会这么多参数?只用到IDD, pParentWnd两个呀。。。。这是类向导自己生成的。。。。
今晚又失眠 2013-03-06
  • 打赏
  • 举报
回复
start.DoModal();。。。。。
No.4 简单的MFC对话框演示程序 “MultiDialog” 演示如何在工程中拥有多个对话框,及如何在一个对话框中调用另一个对话框。 重点:1、多个对话框类的建立;2、对话框的模式(Modal)调用方法;3、Spin控件的使用。 新建一个基于对话框MFC工程, 通过菜单"Insert>>Resource"打开添加资源对话框, 在其中选择Dialog后点击New创建一个新的对话框 按Ctrl+W打开ClassWizard,系统会提示刚才创建了一个新的对话框资源,是否建立对应的类, 选择建立,然后在New Class窗口中Class Name栏输入它的名称:CSubClass1, 确定后系统会自动生成SubClass1.h和SubClass1.cpp并加入工程中,其中有已经创建好的CSubClass1的类的基本代码。 把这个对话框的Caption属性改为“难度选择”,在它上面画三个Radio“简单”、“标准”、“困难”, 并建立相关联的变量m_Option1。(要注意的是在ClassWizard中注意Class Name中应该选CSubClass1而不是之前的主对话框类) 按照相同方法建立第二个新对话框,类名“CSubClass2”,Caption为“关卡选择”。 在上面画一个Edit和一个Spin,注意先画Edit后画Spin,将Spin的Auto buddy和Set buddy integer勾上。 按Ctrl+W打开ClassWizard,为Edit建立关联变量,不过注意是int型而不是CString型, 也为Spin建立关联变量m_Spin1,注意这次是Control型变量CSpinButtonCtrl。 下面为这两个对话框添加代码。 双击“难度选择”对话框的OK按钮,建立对话框的OnOK映射。 在其中加入(在CDialog::OnOK();之前): UpdateData(TRUE); if ((m_Option1>2) ||(m_Option1<0)) { MessageBox("错误的选择!","提示",MB_OK); return; } 下面对“关卡选择”对话框添加初始化代码, 由于关卡的有效值只有1到6,因此需要在初始化时设置Spin控件的有效值范围。 按Ctrl+W打开ClassWizard,在左侧列表选择这个对话框类CSubDialog2, 在右侧列表中选择WM_INITDIALOG,点击右边的“Add Function...”按钮, 接着点击右边的“Edit Code”按钮,在其中中加入(在CDialog::OnInitDialog()那句之后,在return TRUE那句之前): m_Spin1.SetRange(1,6); m_Text1=1; m_Spin1.SetPos(1); 其中CSpinButtonCtrl::SetRange()函数的作用是设置和他关联的Spin控件的范围,两个参数分别是下界和上界。 而CSpinButtonCtrl::SetPos()是设定Spin的当前位置。 两个新的对话框都已建立完毕,下来是如何在主对话框中使用的问题。 首先,两个新对话框都有各自的类,分别在SubDialog1.h和SubDialog2.h中有定义。(类的细节则在对应的cpp中定义) 因此,主对话框想要调用这两个新对话框,需要先包含这两个头文件, 在你要使用的地方(本例是MultiDialogDlg.cpp中)文件前面加上 #include "SubDialog1.h" #include "SubDialog2.h" 然后在想要调用的地方就可以使用了。 本例中,首先为主窗口的两个Edit建立CString型关联变量m_Text1和m_Text2, 然后在两个按钮的消息映射函数中分别加入: CSubDialog1 dialog1; //定义CSubDialog1型对话框的一个新对象 dialog1.DoModal(); //使用“模式”调用,显示对话框 m_Text1.Format("%d",dialog1.m_Option1); //此句在上面对话框没有关闭前不会执行到 UpdateData(FALSE); 和 CSubDialog2 dialog1; dialog1.DoModal(); m_Text2.Format("%d",dialog1.m_Text1); UpdateData(FALSE); 其中第一句均为定义对话框新实例的语句,定义一个你想要的类型的对话框。 第二句是通过调用CDialog::DoModal()方法,来显示这个对话框,并进入“模式”(Modal)状态 在“模式”状态,当子对话框没有关闭之前,调用它的父对话框不能被响应, 并且其语句执行会停留在刚才的DoModal语句上等待,直到子对话框关闭才接着执行下一个语句。 第三第四句将子对话框得到的数据(即类的成员变量)显示在父对话框的Edit上。 四句执行完后退出该函数,这时刚才定义的CSubDialog1等对话框类变量被销毁,因此创建的话框也被销毁。
现在流行的Windows下的编程语言实在不少,所以在BBS上常常有人会问:我应该使用什么编程语言呢?其中,有一个大家认可的答案:真正的程序员使用Visual C++。 的确,Visual C++是一个功能强大、灵活、方便的编程工具,可以完成其他编程语言所无法完成的任务,可以让程序员方便地实现自己的设计,尽情的发挥自己地创造性。 Visual C++的强大无比的功能除了得益于C++的特性之外,更重要的是它具有体系完整、机制灵活、功能丰富的MFC类库。 所以,要讲Visual C++,必须讲MFC类库。 MFC的类库可以分两个层次,首先是实现MFC编程框架体系的核心MFC类库,然后是建立在核心MFC类库基础之上的扩展类库,例如,支持COM的类库,实现网络功能的类库,等等。随着Visual C++的不断升级,MFC类库的功能越来越丰富,越来越强大,但是,MFC核心类库是相对稳定的,特别是从Visual C++ 4.2开始到现在的Visual C++6.0。 本书的中心就是深入浅出地解析MFC类库,分析怎么使用MFC类库以及MFC类库的内部实现,揭开MFC复杂、深奥的面纱,让读者对MFC有一个全面、透彻、清晰的理解。关于MFC的核心实现,主要有以下几个方面。 首先,MFC采用C++的面向对象的特征封装了Windows的对象和Win32函数,一定程度上隐蔽了底层Win32的复杂性。 其次,MFC采用消息映射的方法来处理Windows消息和事件,隐藏了Windows窗口的窗口过程,简化了消息处理的复杂性和烦琐性。 还有,MFC提供了一个以文档-视为中心的编程模式,并实现了以文档-视为中心的编程框架,简化了数据处理的过程。 而且,MFC提出了模块状态、线程状态、模块线程状态来支持多线程的编程设计和DLL的编程。 本书分别从使用MFC的角度和MFC内部设计及实现的角度讨论了上述内容,分析了MFC核心的设计和实现;然后,在此基础上,进一步讨论了MFC对一些常用类的实现。有关章节的内容如下: 第一章,MFC概述。 第二章,解释MFC对Win32 API和Windows对象的封装,讨论各类MFC对象的使用,分析MFC对象和Windows对象的关系。 第三章,讨论CObject的特性及其实现,包括动态类信息、动态创建、序列化的实现等内容。 第四章,讨论MFC的消息映射机制,分析MFC对各类消息的处理,例如对Windows消息、控制通知消息、命令消息、状态更新消息、反射消息的处理等;并揭示了MFC通过消息映射手段实现C++虚拟函数机制的原理。 第五章和第六章,分析MFC编程框架启动和关闭一个应用程序的过程,揭示MFC框架的内幕,剖析以文档模板为核心创建基于文档-视的应用程序的过程,展示MFC框架处理消息和调用虚拟函数的时机和位置。 第七、八、九章,介绍MFC的动态链接库、进程、线程等概念,以及MFC动态链接库的种类和使用,讨论MFC下多线程编程的问题。并且进一步阐述MFC的核心概念之一:状态(模块状态、线程状态、模块线程状态),揭示MFC对多线程的支持机制,MFC实现规则DLL和扩展DLL的内幕。 第十章,阐述MFC下的调试手段。 第十一章,讨论CFile类,主要分析了CFile的使用和它对Win32文件函数的封装。 第十二章,讨论模式和无模式对话框,分析MFC如何设计和实现这两种对话框的功能,分析CDialog和CFormView为实现有关功能而设计的虚拟函数、消息处理函数等。 第十三章,讨论MFC工具栏和状态栏的设计及其实现,分析MFC是如何以CControlBar为基础,派生出CStatusBar、CToolBar、CDialogBar等子类,实现MFC工具栏和状态栏标准处理。 第十四章,讨论MFC的Socket类。 第一章到第十章介绍了MFC的核心概念以及实现。在此基础上,第十一章到第十四章讨论了MFC一些常用类的实现。 本书的内容对MFC的初学者(最好对Visual C++和Windows有所了解)和提高者都是很有帮助的。 如果您是一个初学者,可以读第一至第六章。主要目的是建立MFC的全面理解,了解MFC框架是如何支持程序员编程的。如果有读不懂的地方,可以跳过,直接阅读有关分析的结论。特别是第五章和第六章,可以重点阅读,了解MFC是怎样来处理有关消息、调用有关虚拟函数的。 然后,还可以读第十章,第十一至第十四章。特别第十二章,可以重点阅读,它是MFC从CWnd或者CView派生出特定的类实现特定功能的例子,可以帮助您进一步理解MFC,并且学习如何设计和实现一个特定的类。 如果您对MFC有一定的掌握,可以进一步阅读第八和第九章,了解MFC处理DLL和线程的知识。对于第一至第六章、第十至第十四
VC++ MFC 经典教程 - 基础篇 1.CP_YourFirstWindowsProgram.mp4 10.MFC_GDI_画直线和曲线.mp4 11.MFC_GDI_画椭圆_多边形及其他形状.mp4 12.MFC_GDI_画笔和画刷.mp4 13.MFC_GDI_画文本和字体.mp4 14.MFC_GDI_备用对象和取消选定.mp4 15.MFC_Ruler.mp4 16.MFC_窗口滚动条.mp4 17.MFC_Accel.mp4 18.MFC_Accel(2).mp4 19.MFC_消息框.mp4 2.Windows_编程模型.mp4 20MFC_客户区鼠标消息.mp4 21.MFC_TicTac-1.mp4 22.MFC_TicTac-2.mp4 23.MFC_TicTac-3.mp4 24.MFC_鼠标滚轮.mp4 25.MFC_捕获鼠标.mp4 26.MFC_VisualKB-1.mp4 27.MFC_VisualKB-2.mp4 29.MFC_菜单.mp4 3.MFC_第一个MFC程序设计.mp4 30.MFC_CButton类.mp4 31.MFC_E_FontView-1.mp4 32.MFC_E_FontView-2.mp4 33.MFC_CEdit类.mp4 34.MFC_MyPad.mp4 35.MFC_对话框_静态文本_编辑框.mp4 36.MFC_对话框_访问控件_7种方法_A.mp4 37.MFC_对话框_访问控件_7种方法_B.mp4 38.MFC_对话框_访问控件_7种方法_C.mp4 39.MFC_对话框_复选框_单选钮.mp4 4.MFC_消息映射.mp4 40.MFC_模态对话框.mp4 41.MFC_非模态对话框.mp4 42.MFC_属性表.mp4 43.MFC_公用对话框.mp4 44.MFC_数组类-1.mp4 45.MFC_数组类-2.mp4 46.MFC_CArray.mp4 47.MFC_列表类.mp4 48.MFC_映射类.mp4 49.MFC_类型指针类.mp4 5.MFC_使用向导快速进行MFC程序设计.mp4 50.MFC_CFile.mp4 51.MFC_CArchive.mp4 52.MFC_四个对象四种方法.mp4 53. MFC_Ruler.mp4 54.MFC_Ruler.mp4 55.MFC_Ruler.mp4 56.MFC_SdiSquares.mp4 57.MFC_Scroll_Ruler.mp4 58.MFC_CHtmlView.mp4 59.MFC_CTreeView.mp4 6.MFC_字符集和TEXT宏.mp4 60.MFC_CListView.mp4 61.MFC_MdiSquares.mp4 62.MFC_动态拆分窗口.mp4 63.MFC_ToolBar.mp4 64.MFC_ToolBar_Ex13a.mp4 65.MFC_StatusBar.mp4 66.MFC_StatusBar_Ex13b.mp4 67.MFC_Rebar.mp4 68.MFC_EZPrint.mp4 69.MFC_Print_Bubble.mp4 7.MFC_建立应用程序.mp4 8.MFC_第一个MFC程序设计(不用向导).mp4 9.MFC_Windows_GDI_设备描述表类.mp4 数据结构与算法_C语言 01.swap.mp4 02.BubbleSort.mp4 03.SelecttionSort.mp4 04.顺序查找.mp4 05.C_DS_折半查找.mp4 06.递归.mp4 07递归算法_折半查找.mp4 08.Permutations.mp4 09.插入排序.mp4 10.快速排序.mp4 11.归并排序.mp4 12.顺序栈.mp4 13.顺序队列.mp4 14.链表的基本概念.mp4 15.单链表的基本运算.mp4 16.循环单链表.mp4 17.双向链表.mp4 18.链式栈.mp4 19.链式队列.mp4 20.基数排序.mp4 21.树.mp4 22.二叉树的存储表示与实现.mp4 23.二叉树的遍历.mp4 24.二叉查找树.mp4 25.红黑树.mp4 26.堆.mp4 27.堆排序.mp4 28.哈希表.mp4 29.图_邻接矩阵

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧