2008-11-06 40 views
3

我正在對C++ MFC項目進行一些小改動。我是.NET開發人員,所以Windows編程對我來說是新的。MFC - 在顯示對話框後立即執行代碼(Form.Shown的.NET等效)

我需要在CDialog第一次完全顯示(畫)後立即啓動一些方法,但只需要一次。

我怎樣才能做到這一點?在.NET中,我會處理Form.Shown事件。

我需要處理一些消息嗎?哪一個? 我是否需要重寫一些CDialog方法? 還是有沒有簡單的方法?我正在考慮處理WM_ACTIVATE,然後使用一個標誌來確保我只調用另一個方法一次。

回答

3

找到答案在這裏:Waiting until the dialog box is displayed before doing something

Short story: 
INT_PTR CALLBACK 
DlgProc(HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam) 
{ 
    switch (uiMsg) { 

    case WM_INITDIALOG: 
    return TRUE; 

    case WM_WINDOWPOSCHANGED: 
    if ((((WINDOWPOS*)lParam)->flags & SWP_SHOWWINDOW) && 
     !g_fShown) { 
     g_fShown = TRUE; 
     PostMessage(hwnd, WM_APP, 0, 0); 
    } 
    break; 


    case WM_APP: 
     MessageBox(hwnd, 
       IsWindowVisible(hwnd) ? TEXT("Visible") 
             : TEXT("Not Visible"), 
       TEXT("Title"), MB_OK); 
     break; 

    case WM_CLOSE: 
    EndDialog(hwnd, 0); 
    break; 
    } 

    return FALSE; 
} 

如果你使用MFC像我你需要映射WM_WINDOWPOSCHANGED,然後使用ON_MESSAGE映射WM_APP。有關更多詳細信息,請參閱this CodeProject article

0

我已經使用了很多次並取得巨大成功的另一種方法是使用計時器。將它設置爲10m0s。它只會在顯示對話框後觸發。

+0

在某些情況下,計時器可能不會觸發。文章我指的是(http://blogs.msdn.com/oldnewthing/archive/2006/09/25/770536.aspx)涵蓋。 – Sumrak 2008-11-07 19:43:55

0

地獄把代碼放在OnPaint()中,然後在你的班級中使用bool m_fullyInitilized。 我也喜歡這個計時器..雖然我通常會用100ms。在這種情況下,我還將所有的啓動代碼移出oninit,以防止在那裏進行太多的處理。

相關問題