请教各位大虾:
    我需要在我的窗口(对话框)显示完成之后执行一个功能。
问题是:我怎么知道我的窗口已经完全显示了呢?
    在显示完窗口之后,windows会不会发个事件通知一下?
thanks.

解决方案 »

  1.   

    OnInitDialog()
    的return TRUE之前
      

  2.   

    WM_INITDIALOG 其实就是 OnInitDialog了,这个事件是在窗口显示之前发生的
    这个事件执行的过程中window是不会显示的。我现在能想到的办法是
    1.使用Timer
    2.处理WM_PAINT在第一次显示完成之后处理。该方法能达到效果。但总是看着难受。
      

  3.   

    在OnInitDialog()的reture TRUE之前settimer
      

  4.   

    我在对话框的PreTranslateMessage中TRACE了所有的消息(嗯,应该是可以通过PreTranslateMessage派发的所有消息,有些消息比如WM_INITDIALOG不在此内):
    BOOL CTestDlg::PreTranslateMessage(MSG* pMsg) 
    {
    // TODO: Add your specialized code here and/or call the base class
    TRACE("message = 0x%X\n", pMsg->message);

    return CDialog::PreTranslateMessage(pMsg);
    }我发现对话框总是会收到一个0x113的消息,这个消息产生于对话框完全显示之后。
    经过查阅源代码发现0x113对应WM_TIMER,由于我从未设置定时器,所以这个应该是windows默认的逻辑之一,我的想法是处理这个消息,但是由于自定义的WM_TIMER消息也是由PreTranslateMessage派发,所以处理为:
    BOOL CTestDlg::PreTranslateMessage(MSG* pMsg) 
    {
    // TODO: Add your specialized code here and/or call the base class
    static BOOL bFirst = TRUE;
    if (bFirst)
    {
    switch (pMsg->message)
    {
    case WM_TIMER:
    bFirst = FALSE;
    // 要加的处理代码
    }
    }

    return CDialog::PreTranslateMessage(pMsg);
    }但是如果在OnInitDialog中设置了定时器这个方法可能会有问题。
      

  5.   

    但是这样的代码不能保证在以后的WINDOWS版本上也能运行
      

  6.   

    我现在是的做法是在OnPaint里,PostMessage触发我的按钮动作
    效果还行。
    但总感觉的不是很爽。不知道window显示完成之后有没有个通知的。