我跟了一下程序,执行到CWnd::RunModalLoop()里面,有这么两步:
// phase1: check to see if we can do idle work
while (bIdle &&
!::PeekMessage(pMsg, NULL, NULL, NULL, PM_NOREMOVE))
{
// ... // show the dialog when the message queue goes idle
if (bShowIdle)
{
// 正常情况下,会执行到这儿
ShowWindow(SW_SHOWNORMAL);
UpdateWindow();
bShowIdle = FALSE;
} // ...}// phase2: pump messages while available
do
{
// ... // 按下Alt键以后,会进到下面
// show the window when certain special messages rec'd
if (bShowIdle &&
(pMsg->message == 0x118 || pMsg->message == WM_SYSKEYDOWN))
{
ShowWindow(SW_SHOWNORMAL);
UpdateWindow();
bShowIdle = FALSE;
} // ...}while (::PeekMessage(pMsg, NULL, NULL, NULL, PM_NOREMOVE));在正常的情况下,会执行到第一步里面的ShowWindow()等。这时对话框能够显示。在某种我不知道的情况下,连第一步while ()循环都不进去。对话框也不显示,只有按下Alt键以后,才会在第二步里面调用ShowWindow(SW_SHOWNORMAL);这时对话框才显示出来。
我在跟程序的时候,了解到bIdle=true;
那么到底是什么原因会造成第一步的::PeekMessage(pMsg, NULL, NULL, NULL, PM_NOREMOVE)获取了消息呢?

解决方案 »

  1.   

    UpdateWindow();
    ShowWindow(SW_SHOWNORMAL);
    //换个顺序试
      

  2.   

    对不起,BS一下自己上面的回复。对话框不显示的原因:
    1 父窗口HWND无效
    2 在ONINITDIALOG里用了ENDDIALOG
    3 无效的对话框资源ID
    4 使用没有注册的的自定义控件
    5 对话框的某些控件创建失败,如RICHEDIT,要加上AfxInitRichEdit();
      

  3.   

    首先我不能修改CDialog::也不能修改CWnd::里面的代码。就算修改能够成功,但问题肯定还是在我的代码上。你所述都原因我想应该不存在。
    1、我跟程序看过CWnd::hWndParent,没有问题。
    2、OnInitDialog()里只有CDialog::OnInitDialog();与return TRUE;
    3、有正常显示的情况,所以对话框资源ID是没有问题的
    45、只使用了普通的EDIT控件,没有使用RICHEDIT更没有使用别的第三方控件
      

  4.   

    CDialog实例是函数内的局部变量,进入函数体才创建,退出函数就销毁的。应该不会有什么隐藏的消息发给这个对话框。不过这一点我也在怀疑,我感觉好像在PeekMessage(pMsg, NULL, NULL, NULL, PM_NOREMOVE)里会不断地得到消息,以至于第一步while进不去。可是我专门发送什么消息阿,不知道CDialog与MFC架构里面有什么这方面的特别处理没有。
    我使用的MFC架构,MFC也不太熟悉,很难想象会有什么隐藏的语句!
      

  5.   

    我没有专门写对话框的消息循环,死循环可能会从何而来?实际上主题中所述的那两个阶段就是消息处理吧?可是看了很久了没看出什么来,再说这是MFC的代码,我不可能改阿。
      

  6.   

    昨天调试的时候发现一个线索,我的程序在启动时要读取一些文件,在读取方式上,大量的采用了hFind = FindFirstFile( szTemp, &ffd );FindClose(hFind);当我注释上面两行代码,换用了其他方式,也就是说保证只换掉这两行代码,不会影响其他代码逻辑。结果,在CDialog::DoModal()之后等几秒钟对话框会自己弹出来。
      

  7.   

    还有一个线索,一旦CDialog::DoModal()之后没有弹出对话框,我等较长时间在通过Alt让对话框显示,如果等的时间较长,在后续操作中,如果保存文件,在调用CFileDialog::DoModal()之前和开始写文件之前会有一个警告说“系统配额不足,无法处理此命令”,并且都将当前路径指定成“桌面”。
    拜托各位,哪怕是提供一点线索和思考。如果分不够,我在另外开贴
      

  8.   

    hFind = FindFirstFile( szTemp, &ffd );
    FindClose(hFind);
    我估计是szTemp的格式不对。