2011-11-24 196 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的答案看起来不错,可能更好,但这是一个替代方案。