Скрытие диалогового окна MFC - PullRequest
4 голосов
/ 24 ноября 2011

Хорошо, поэтому я использую этот код, чтобы скрыть значок на панели задач приложения 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 ]

18 голосов
/ 24 ноября 2011

Если вы показываете свой диалог, используя 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 голосов
/ 20 июля 2017

Я думаю, что Пол ДиЛаскья рекомендовал следующее.Это только для модальных диалогов.

Следующий код можно поместить в OnInitDialog, чтобы переместить диалоговое окно за пределы экрана.Вам нужно будет реализовать метод перемещения его обратно на экран, когда это необходимо.

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

Ответ от l33t выглядит хорошо и, вероятно, лучше, но это альтернатива.

0 голосов
/ 24 ноября 2011

Может быть, очевидная вещь, но что происходит, когда вы делаете скрытие, прежде чем перерисовываете диалог?А что если вы не изменяете стиль окна напрямую, а используете ShowWindow (SW_HIDE)?

Наконец, вы пытались переключить стиль окна диалога на WS_CHILD перед вызовом SetParent () и / или, возможно, вывести его изобласть клиента, чтобы окно больше не отображалось (MoveWindow (-1000, -1000) или что-то в этом роде).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...