Visual Studio 隐藏MFC对话方块

ecbunoof  于 2022-11-17  发布在  其他
关注(0)|答案(3)|浏览(178)

好了,我使用这段代码来隐藏基于对话框的MFC应用程序的任务栏图标(VC++)。每当我单击交叉或关闭按钮时,任务栏图标和对话框就会隐藏起来。但有一点我做得不对。每当我单击标题栏中的关闭或交叉按钮时,对话框先闪烁,显示一种中间对话框,然后隐藏。2这是非常烦人的。3我在这里张贴我的代码后,两天的徒劳的努力。4所以,伙计们请帮助我。先谢谢你。

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,时间不到半秒,然后消失(隐藏)。

ui7jx7zq

ui7jx7zq1#

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

eqqqjvef2#

我认为Paul DiLascia推荐了以下内容。这只适用于模态对话框。
下列程式码可以放在OnInitDialog中,将对话方块移离屏幕。您需要实作方法,在适当的时候将它移回屏幕。

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

l33t的答案看起来不错,可能更好,但这是一个替代方案。

w1e3prcc

w1e3prcc3#

也许这是显而易见的,但是当你在重定对话框的父级之前隐藏对话框时会发生什么呢?如果你不直接修改窗口样式而是使用ShowWindow(SW_HIDE)呢?
最后,在调用SetParent()之前,您是否尝试过将对话框的窗口样式切换为WS_CHILD和/或将其移出客户区,以便不再显示窗口(MoveWindow(-1000, -1000)或类似的内容)?

相关问题