C++ 隐藏MFC对话框
好的,我用这段代码来隐藏一个基于对话框的MFC应用程序(VC++)的任务栏图标。每当我单击十字或关闭按钮时,任务栏图标和对话框都会隐藏。但我一件事都做不好。每当我点击标题栏上的“关闭”或“交叉”按钮时,对话框首先闪烁,显示一种中间对话框,然后隐藏。这很烦人。经过两天徒劳的努力,我把我的代码发布在这里。所以请大家帮帮我。提前谢谢C++ 隐藏MFC对话框,c++,visual-studio,winapi,visual-c++,mfc,C++,Visual Studio,Winapi,Visual C++,Mfc,好的,我用这段代码来隐藏一个基于对话框的MFC应用程序(VC++)的任务栏图标。每当我单击十字或关闭按钮时,任务栏图标和对话框都会隐藏。但我一件事都做不好。每当我点击标题栏上的“关闭”或“交叉”按钮时,对话框首先闪烁,显示一种中间对话框,然后隐藏。这很烦人。经过两天徒劳的努力,我把我的代码发布在这里。所以请大家帮帮我。提前谢谢 void CMyAppDlg::OnBnClickedCancel() { // TODO: Add your control notification handle
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;
}
以下是对话框的屏幕截图。当我按下“关闭”或“交叉”按钮时,最初看起来像的对话框会在不到半秒的时间内变成一个对话框,然后消失(隐藏)。这可能是一件显而易见的事情,但在重新复制对话框之前进行隐藏时会发生什么?另外,如果不直接修改窗口样式,而是使用ShowWindow(SW_HIDE),该怎么办
最后,在调用SetParent()和/或可能将其移出客户端区域以使窗口不再显示(MoveWindow(-1000,-1000)或类似内容)之前,您是否尝试过将对话框的窗口样式切换为WS_CHILD。如果您使用
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的答案看起来不错,可能更好,但这是另一种选择。如果不希望任务栏中出现对话框,请更改窗口样式。不要弄乱不可见的父窗口(不可见的子窗口…不可见的子窗口)。查看WS_EX_TOOLWINDOW。另外,不应直接切换WS_VISIBLE。使用ShowWindow(SW_HIDE)。除非您有示例代码显示它可以工作,否则它不太可能工作。包括MFC专家在内的许多人都尝试过。在推测之前先研究MFC源代码。我会解释为什么这个回答不起作用,但我已经多年没有尝试解决这个问题了。所以你也不知道为什么你觉得有必要对一个6岁的问题发布一个smartass回答?为什么还要麻烦呢?再看看。在发表了我的评论之后,我开始复制我在文章中得到的答案。我发表评论的一个很好的理由是为了节省一些时间。许多年前,我花了很多时间,包括研究MFC源代码,来解决最初隐藏模态对话框的问题。主要问题是,与其他代码混合的代码是显式显示模式对话框的代码,重写需要替换相对较大的代码部分。您确实说过“将其移出客户端区域”,但您不确定。这很接近,但并不是实际需要的。在Windows 10中按Alt+Tab时,此方法不会隐藏应用程序。