模式对话框是windows对话框的一种,它只有在DoModel()函数返回后才关闭,否则当模式对话框尚未关闭的时候无法移到程序其他部分工作。关于模式对话框和无模式对话框,《Visual C++技术内幕》有较详细的解释,你可以参看。而且,你的程序里面,CReSample是什么类?你的OK按纽的ID是不是IDOK?请说详细一点。

解决方案 »

  1.   

    最好能把OK按纽按下所触发的函数单独写在一个函数里,你这样把DoModal函数写在另一个函数里可能会触发别的事件。
      

  2.   

    回复codewarrior(会思考的草) :CReSample是一个CDialog的派生类。ok按钮对应的id是idok。
    这里问题的难点是:为什么CDialog:ONOK()执行后,对话框的窗体不立即从屏幕上消失。而且,消不消失还同对话框窗体在屏幕上的位置有关。我在程序运行时发现,CGeomtric::OnResample()函数执行时,cpu的使用率是100%。会不会,跟本应用程序,没有时机去处理对话框窗体的擦除。
    请高手指教!
      

  3.   

    agree to DongXY(老鹰) and nustchen(壁虎) 把以下的代码加入你的耗时循环,使窗口可以刷新
        MSG msg;
        while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);  
        }
      

  4.   

    回复:gboy(boy) \DongXY(老鹰) \nustchen(壁虎) 及所有热心的朋友!你们的判断很准确,谢谢你们,特别要感谢gboy(boy)。
     gboy(boy)能不能帮我解释一下,为什么加入这段代码,程序就能正常刷新那!这个跟cup使用率持续100%有没有关?我做的是数据处理的操作,piii933,256m内存的机子,动不动就要运行1个小时。
      

  5.   

    PeekMessage()与GetMessage()类似,不同的是即使消息没有到达程序,它亦立即返回,这有点像发送消息时PostMessage()和SendMessage()区别。因此它可以交出控制权给系统。另外,也不妨把你的FOR全都放进一个新线程里头去。
      

  6.   

    我认为象这种情况还是创建一个后台计算进程安全。要不在循环之前SendMessage一个重画消息也能解决这个问题.
      

  7.   

    有问题,根据你的代码,对话框类的实例dlg是在OnResample()函数内部被申明的ONOK函数调用触发了DoModal()函数,使对话框返回,但是对话框对象实例要到OnResample()结束的时候才析构,而你的for循环可能是造成无法及时刷新的原因,是不是这样的呢?关于gboy(boy)的代码,懂一点SDK都知道,PeekMessage函数的作用是强迫系统刷新(和GetMessage不同),这段代码的解释,包括你的程序的异常,都可以在侯俊杰的《MFC深入浅出》里找到最好的解释(还是你自己去看比较好理解)。