Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 隐藏MFC对话框_C++_Visual Studio_Winapi_Visual C++_Mfc - Fatal编程技术网

C++ 隐藏MFC对话框

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

好的,我用这段代码来隐藏一个基于对话框的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;
}

以下是对话框的屏幕截图。当我按下“关闭”或“交叉”按钮时,最初看起来像的对话框会在不到半秒的时间内变成一个对话框,然后消失(隐藏)。

这可能是一件显而易见的事情,但在重新复制对话框之前进行隐藏时会发生什么?另外,如果不直接修改窗口样式,而是使用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时,此方法不会隐藏应用程序。