2014-10-05 47 views
0

是否有任何方法可以從對話框中的控件中確定最小化對話框?從控件中確定對話框最小化

我正在使用窗口消息ON_WM_SIZE,當對話框被最小化時,應該用類型SIZE_MINIMIZED調用。

BEGIN_MESSAGE_MAP(CEditT, CEdit) 
    ON_WM_SIZE() 
END_MESSAGE_MAP() 

void CEditT::OnSize(UINT nType, int cx, int cy) 
{ 
    CEdit::OnSize(nType, cx, cy); 
    switch(nType) 
    { 
     case SIZE_MINIMIZED: 
     m_backgroundRedraw = TRUE; 
    } 
} 

但是,當Dialog被最小化時,這個方法永遠不會被調用。我需要跟蹤最小化,以便在重新恢復時使用幻燈片正確重繪控制。

回答

0

首先使用

CWnd *parent = GetParent(); 
HWND hWnd = parent->GetSafeHwnd(); // get its window handle 
BOOL dlgMinimized = IsMinimized(hWnd); // get min. state 

找到你的控制範圍之內的父對話框的API記錄爲:

BOOL WINAPI IsIconic(
    _In_ HWND hWnd 
); 

參考here

IsMinimized是一個在windowsx.h中定義的宏,對應於Microsoft提供的IsIconic。

我會建議一種不同的方法。在您的Dialog的OnSize()方法中捕捉SIZE_MAXIMIZED nType,並在成員變量中保持此狀態。然後,您可以在對話框中設置WM_USER + XXX消息處理程序來檢查它,以便使用當前值進行響應。

此時,您需要從子控件中的一部分代碼中調用SendMessage(WM_USER + XXX,...)實際上被調用,以便它可以執行一些任務。要查看發送給孩子的信息,我會用spy ++進行檢查。

+0

好的2個問題。 IsMinimized方法從哪裏來?你會建議你打電話給這個嗎? WM_ERASEBKGND和WM_PAINT僅在窗口未最小化時調用! – Vinzenz 2014-10-05 15:12:27

0

這並不需要那麼複雜。您應該在對話框級別捕獲WM_SYSCOMMAND消息。該消息處理事件最小化。然後,只需調用控件的暴露方法來響應該事件。