2016-09-29 71 views
1

我有無模型的子對話框。在資源屬性中,Visible標誌被設置爲true(根據我在資源屬性中可見標誌的要求應該是true)。顯示最初隱藏的無模型對話框

我想以編程方式在初始顯示時隱藏對話框。

我重寫了presubclasswindow,並使用下面的代碼刪除了WS_VISIBLE標誌,但對話框沒有隱藏起來。

void CAddressChildDlg::PreSubclassWindow() 
{ 
    CWnd::PreSubclassWindow(); 
    if (::IsWindow(m_hWnd)) 
    { 
     LONG lStyle = GetWindowLong(m_hWnd, GWL_STYLE); 
     lStyle &= ~WS_VISIBLE; 
     SetWindowLong(m_hWnd, GWL_STYLE, lStyle); 
    } 
} 

請人幫我實現我的要求

+2

** ShowWindow(hWnd,SW_HIDE); **應該這樣做。有關更多詳細信息,請訪問[鏈接](https://msdn.microsoft.com/en-us/library/ms632599(VS.85).aspx#message_only) – Tushar

+0

@Tushar:純消息窗口的功能應該是對這個問題有幫助嗎? – IInspectable

+0

如果我在OnInitdialog中調用ShowWindow(hWnd,SW_HIDE),那麼對話框不會隱藏起來 – sujitha

回答

0

您還可以覆蓋ON_WM_WINDOWPOSCHANGING

class CMyDialog : public CDialog 
{ 
public: 
    bool m_override_showwindow; 
    //initialize somewhere ... 

    void OnWindowPosChanging(WINDOWPOS* wpos) 
    { 
     if (m_override_showwindow) 
      wpos->flags &= ~SWP_SHOWWINDOW; 
     CDialog::OnWindowPosChanging(wpos); 
    } 
    DECLARE_MESSAGE_MAP() 
    ...  
}; 

BEGIN_MESSAGE_MAP(CMyDialog, CDialog) 
    ON_WM_WINDOWPOSCHANGING() 
    ... 
END_MESSAGE_MAP() 

只啓用此覆蓋,當你不希望它顯示對話框。確保禁用覆蓋,否則對話框從不顯示。

dlg.m_override_showwindow = true; 
dlg.Create(...); 
dlg.m_override_showwindow = false; 

MessageBox(L"Test..."); 
dlg.ShowWindow(SW_SHOW); 
+0

謝謝巴馬克,它爲我工作。 – sujitha

1

你是不是清楚你要什麼。你的標題說你想要隱藏對話框。那麼問題中的文字說明您希望它最初可見然後隱藏。這是什麼/

你的意思是你的要求是什麼,說對話框樣式必須是WS_VISIBLE。如果您想使其初始不可見,則不要包含該標誌。

對於無模式對話框,通常是在堆上創建它們,而模式對話框通常是在堆棧上創建的。

CYourDialog* pDlg = new CYourDialog(... and whatever arguments); 
pDlg->Create(CYourDialog::IDD); // or whatever the ID is... 
pDlg->ShowWindow(SW_NORMAL); // shows window if it was invisible... 
pDlg->ShowWindow(SW_HIDE); // hides window if it was visible... 
+0

重要的區別不在*堆*和*堆棧*之間,它介於*動態存儲持續時間*和*自動存儲持續時間*之間。 – IInspectable