簡體   English   中英

隱藏MFC對話框

[英]Hiding an MFC dialog box

好吧我正在使用此代碼隱藏基於對話框的MFC應用程序(VC ++)的任務欄圖標。 每當我點擊十字或關閉按鈕時,任務欄圖標和對話框都會隱藏。 但我不能把這一件事弄好。 每當我從標題欄點擊關閉或十字按鈕時,對話框首先閃爍並顯示一種中間對話框,然后隱藏。 這非常煩人。 經過兩天徒勞的努力,我在這里發布我的代碼。 所以伙計們請幫助我。 提前致謝。

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;
}

以下是對話框的屏幕截圖。 當我按下關閉或交叉按鈕時,首先看起來像這樣的對話框變成了這個不到半秒,然后消失(隱藏)。

如果使用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);
}

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

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

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

來自l33t的答案看起來不錯,可能更好,但這是另一種選擇。

也許是一個顯而易見的事情,但是當您重新顯示對話框之前進行隱藏時會發生什么? 如果您不直接修改窗口樣式但使用ShowWindow(SW_HIDE),該怎么辦?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM