none
MFC非模态窗口上的控件不显示 RRS feed

  • 问题

  • 我创建了一个非模态窗口,创建代码如下:

    INITDlg *initDlg=new INITDlg();

    BOOL bResult = initDlg->Create(IDD_INITIAL_DIALOG,this);

    ASSERT(bResult);

    initDlg->ShowWindow(SW_SHOW);

    Sleep(2000);

    initDlg->DestroyWindow();

    delete initDlg;

    但是运行后,对话框上的控件都没有显示。如果将initDlg->ShowWindow(SW_SHOW);改成initDlg->ShowWindow(SW_SHOWMAXIMIZED);则对话框上的控件全部正常显示。跟踪了显示过程,SW_SHOW只调用了一次OnSize(),而SW_SHOWMAXIMIZED调用了两次。

    请教大家出现以上问题是什么原因,我希望窗口在正常大小下显示控件,有没有什么办法解决?

    2012年7月3日 2:38

答案

  • 非模态对话框和主窗口共用一个消息循环,所以在ShowWindow以后您又用了Sleep()操作,导致当前有些消息处理被阻塞,然后您用调用了DestroyWindow来销毁该非模态对话框窗口。


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    • 已标记为答案 minizon 2012年7月6日 7:22
    2012年7月3日 22:22
    版主

全部回复

  • SW_SHOWMAXIMIZED = SHOW + MAXIMIZE 所以调用了两次

    猜测SHOW的时候可能控件还没有完全初始化,而后调用MAX的时候初始化完毕,还是程序有BUG


    0xDEADBEEF

    2012年7月3日 16:55
    版主
  • 非模态对话框和主窗口共用一个消息循环,所以在ShowWindow以后您又用了Sleep()操作,导致当前有些消息处理被阻塞,然后您用调用了DestroyWindow来销毁该非模态对话框窗口。


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    • 已标记为答案 minizon 2012年7月6日 7:22
    2012年7月3日 22:22
    版主
  • 我在ShowWindow之后用了initDlg->UpdateWindow();就看到控件了。
    2012年7月6日 7:23