隐藏MFC对话框

时间:2011-11-24 09:55:09

标签: c++ visual-studio winapi visual-c++ mfc

好的,我正在使用此代码隐藏基于对话框的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;
}

以下是对话框的屏幕截图。当我按下关闭或交叉按钮时,首先看起来像this的对话框会变成this,持续时间不到半秒,然后消失(隐藏)。

3 个答案:

答案 0 :(得分:18)

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

答案 1 :(得分:0)

也许是一个显而易见的事情,但是当您重新显示对话框之前进行隐藏时会发生什么?如果您不直接修改窗口样式但使用ShowWindow(SW_HIDE)?

,该怎么办?

最后,您是否尝试在调用SetParent()和/或将其移出客户区之前将对话框的窗口样式切换到WS_CHILD,以便不再显示窗口(MoveWindow(-1000,-1000)或类似的东西)。

答案 2 :(得分:0)

我认为Paul DiLascia建议如下。这仅适用于模态对话框。

可以在OnInitDialog中放入以下代码,将对话框移出屏幕。您需要实现一种方法,以便在适当的时候将其移回屏幕。

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

来自l33t的答案看起来不错,可能更好,但这是另一种选择。