2011-11-24 198 views
4

好的,我使用這段代碼來隱藏基於對話框的MFC應用程序(VC++)的任務欄圖標。每當我點擊十字或關閉按鈕時,任務欄圖標和對話框就會隱藏起來。但是我不能把這件事做對。每當我點擊標題欄中的關閉按鈕或十字按鈕時,對話框首先閃爍並顯示一種中間對話框,然後隱藏。這非常煩人。經過兩天的徒勞努力,我在這裏發佈我的代碼。所以,大家請幫助我。提前致謝。隱藏MFC對話框

void CMyAppDlg::OnBnClickedCancel() 
{ 
    // TODO: Add your control notification handler code here 
    CWnd* pWnd; 
    pWnd = AfxGetMainWnd(); 

    RemoveTaskbarIcon(pWnd); 
    pWnd->ModifyStyle(WS_VISIBLE, 0); 
    mVisible = FALSE; 
} 

BOOL CMyAppDlg::RemoveTaskbarIcon(CWnd* pWnd) 
{ 
    LPCTSTR pstrOwnerClass = AfxRegisterWndClass(0); 

    // Create static invisible window 
    if (!::IsWindow(mWndInvisible.m_hWnd)) 
    { 
    if (!mWndInvisible.CreateEx(0, pstrOwnerClass, _T(""), 
      WS_POPUP, 
      CW_USEDEFAULT, 
      CW_USEDEFAULT, 
      CW_USEDEFAULT, 
      CW_USEDEFAULT, 
      NULL, 0)) 
     return FALSE; 
    } 

    pWnd->SetParent(&mWndInvisible); 

    return TRUE; 
} 

下面是對話框的截圖。當我按下關閉或十字按鈕時,首先看起來像this的對話框變成this不到半秒鐘,然後消失(隱藏)。

+2

如果您不想在任務欄中顯示對話框,請更改窗口樣式。不要混淆不可見的父窗口(不可見的窗口的子窗口不可見)。看看WS_EX_TOOLWINDOW。 –

+0

你也不應該直接切換WS_VISIBLE。使用ShowWindow(SW_HIDE)。 –

回答

0

也許是一件顯而易見的事情,但是當你重置對話之前做隱藏時會發生什麼?另外如果你不直接修改窗口風格但使用ShowWindow(SW_HIDE)?

最後,您是否曾嘗試在調用SetParent()之前將對話框的窗口樣式切換爲WS_CHILD,或者可能將其移出客戶區以便窗口不再顯示(MoveWindow(-1000,-1000 ) 或類似的東西)。

+0

除非你有示例代碼顯示它可以工作,否則它不太可能工作。包括MFC專家在內的許多人已經嘗試過。在猜測之前研究MFC源代碼。我會解釋爲什麼這個迴應不起作用,但是我試圖解決這個問題已經很多年了。 – user34660

+0

所以你不知道你有什麼線索,但是你覺得需要發佈一個smartass回覆到一個6歲的問題?爲什麼還要打擾? – Roel

+0

再看一遍。發表我的評論後,我開始複製我在[最初隱藏對話框]中的答案(http://simplesamples.info/MFC/DlgPosChanged.aspx)。發表評論的一個很好的理由是爲了節省一些時間。 – user34660

16

如果使用CDialog::DoModal()顯示對話框,框架將確保顯示對話框。只有一種方法可以防止顯示模式對話框:

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

BOOL CHiddenDialog::OnInitDialog() 
{ 
    CDialog::OnInitDialog(); 
    m_visible = FALSE; 

    return TRUE; 
} 

void CHiddenDialog::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos) 
{ 
    if (!m_visible) 
     lpwndpos->flags &= ~SWP_SHOWWINDOW; 

    CDialog::OnWindowPosChanging(lpwndpos); 
} 
0

我認爲Paul DiLascia建議如下。這僅適用於模態對話框。

下面的代碼可以放在OnInitDialog中,將對話框移出屏幕。您需要實施一種適當的方法將其移回屏幕上。

CRect DialogRect; 
GetWindowRect(&DialogRect); 
int DialogWidth = DialogRect.Width(); 
int DialogHeight = DialogRect.Height(); 
MoveWindow(0-DialogWidth, 0-DialogHeight, DialogWidth, DialogHeight); 

從l33t的答案看起來不錯,可能更好,但這是一個替代方案。