对话框关不掉!!!!!

MeiXygy 2001-07-17 07:42:11
我的一个模态对话框
为什么,按完OK按钮后,对话框不消失,而是要等到,后面的代码运行晚后才消失:
如:void CGeomtric::OnResample()
{ CReSample dlg;
if(dlg.DoModal()==IDOK)
{....}
for ()
for()
{
这里的代码如运行20分钟,上面的对话框就在屏幕上挂20分钟
}
}
但是如果在for语句前弹出一个AfxMessageBox(),则,屏幕上就没有CReSample对话框了,只有消息框,按完ok可正常关闭该消息框。很费解!
但是如果,你把对话框拉出主程序窗口,又可以正常关掉,只有留在主窗口的部分没有擦掉。我怀疑,可能是对话框关掉后,屏幕没有擦掉。
很急,请大虾们不吝赐教!!
...全文
923 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
会思考的草 2001-07-19
  • 打赏
  • 举报
回复
有问题,根据你的代码,对话框类的实例dlg是在OnResample()函数内部被申明的ONOK函数调用触发了DoModal()函数,使对话框返回,但是对话框对象实例要到OnResample()结束的时候才析构,而你的for循环可能是造成无法及时刷新的原因,是不是这样的呢?

关于gboy(boy)的代码,懂一点SDK都知道,PeekMessage函数的作用是强迫系统刷新(和GetMessage不同),这段代码的解释,包括你的程序的异常,都可以在侯俊杰的《MFC深入浅出》里找到最好的解释(还是你自己去看比较好理解)。
不解 2001-07-18
  • 打赏
  • 举报
回复
我认为象这种情况还是创建一个后台计算进程安全。要不在循环之前SendMessage一个重画消息也能解决这个问题.
rick29 2001-07-18
  • 打赏
  • 举报
回复
PeekMessage()与GetMessage()类似,不同的是即使消息没有到达程序,它亦立即返回,这有点像发送消息时PostMessage()和SendMessage()区别。因此它可以交出控制权给系统。另外,也不妨把你的FOR全都放进一个新线程里头去。
gbstar2021 2001-07-18
  • 打赏
  • 举报
回复
agree to DongXY(老鹰) and nustchen(壁虎) 

把以下的代码加入你的耗时循环,使窗口可以刷新
MSG msg;
while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
coolxiao 2001-07-18
  • 打赏
  • 举报
回复
使用率100%,你在干什么啊
darkay 2001-07-18
  • 打赏
  • 举报
回复
其实就是给系统放出使用权而已
DongXY 2001-07-18
  • 打赏
  • 举报
回复
同意上面的。
MeiXygy 2001-07-18
  • 打赏
  • 举报
回复
回复:gboy(boy) \DongXY(老鹰) \nustchen(壁虎) 及所有热心的朋友!

你们的判断很准确,谢谢你们,特别要感谢gboy(boy)。
 gboy(boy)能不能帮我解释一下,为什么加入这段代码,程序就能正常刷新那!这个跟cup使用率持续100%有没有关?我做的是数据处理的操作,piii933,256m内存的机子,动不动就要运行1个小时。
nustchen 2001-07-18
  • 打赏
  • 举报
回复
是的,这是系统还没有做刷新的工作,如果你这时候要做长时间的工作,建议在循环中加入消息处理。
MeiXygy 2001-07-18
  • 打赏
  • 举报
回复
回复codewarrior(会思考的草) :CReSample是一个CDialog的派生类。ok按钮对应的id是idok。
这里问题的难点是:为什么CDialog:ONOK()执行后,对话框的窗体不立即从屏幕上消失。而且,消不消失还同对话框窗体在屏幕上的位置有关。我在程序运行时发现,CGeomtric::OnResample()函数执行时,cpu的使用率是100%。会不会,跟本应用程序,没有时机去处理对话框窗体的擦除。
请高手指教!


wyzegg 2001-07-17
  • 打赏
  • 举报
回复
结果就是这样呀。
Flysnow 2001-07-17
  • 打赏
  • 举报
回复
同意codewarrior(会思考的草)
会思考的草 2001-07-17
  • 打赏
  • 举报
回复
最好能把OK按纽按下所触发的函数单独写在一个函数里,你这样把DoModal函数写在另一个函数里可能会触发别的事件。
会思考的草 2001-07-17
  • 打赏
  • 举报
回复
模式对话框是windows对话框的一种,它只有在DoModel()函数返回后才关闭,否则当模式对话框尚未关闭的时候无法移到程序其他部分工作。关于模式对话框和无模式对话框,《Visual C++技术内幕》有较详细的解释,你可以参看。而且,你的程序里面,CReSample是什么类?你的OK按纽的ID是不是IDOK?请说详细一点。

16,551

社区成员

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

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

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