2016-09-29 2 views
1

У меня есть modelless дочерний диалог. В свойствах ресурсов Видимый флаг устанавливается как истинный (согласно моему требованию в свойствах ресурсов видимый флаг должен быть правдой).Диалог с диагональю изначально скрытый

Я хочу программно скрыть диалог при первоначальном отображении.

Я переопределил presubclasswindow и удалил флаг WS_VISIBLE, используя нижеприведенный код, но диалог не скрывается.

void CAddressChildDlg::PreSubclassWindow() 
{ 
    CWnd::PreSubclassWindow(); 
    if (::IsWindow(m_hWnd)) 
    { 
     LONG lStyle = GetWindowLong(m_hWnd, GWL_STYLE); 
     lStyle &= ~WS_VISIBLE; 
     SetWindowLong(m_hWnd, GWL_STYLE, lStyle); 
    } 
} 

Пожалуйста, кто поможет мне достичь моих требований

+2

** ShowWindow (hWnd, SW_HIDE); ** должен сделать это. Для получения дополнительной информации посетите [link] (https://msdn.microsoft.com/en-us/library/ms632599 (VS.85) .aspx # message_only) – Tushar

+0

@Tushar: Какие функции окна только для сообщений быть полезным в отношении этого вопроса? – IInspectable

+0

Если я вызываю ShowWindow (hWnd, SW_HIDE) в OnInitdialog, диалог не становится скрытым. – sujitha

ответ

0

Вы также можете переопределить ON_WM_WINDOWPOSCHANGING

class CMyDialog : public CDialog 
{ 
public: 
    bool m_override_showwindow; 
    //initialize somewhere ... 

    void OnWindowPosChanging(WINDOWPOS* wpos) 
    { 
     if (m_override_showwindow) 
      wpos->flags &= ~SWP_SHOWWINDOW; 
     CDialog::OnWindowPosChanging(wpos); 
    } 
    DECLARE_MESSAGE_MAP() 
    ...  
}; 

BEGIN_MESSAGE_MAP(CMyDialog, CDialog) 
    ON_WM_WINDOWPOSCHANGING() 
    ... 
END_MESSAGE_MAP() 

Включите это переопределение только тогда, когда вы не хотите, чтобы показать диалоговое окно. Обязательно отключите переопределение, иначе диалог никогда не отображается.

dlg.m_override_showwindow = true; 
dlg.Create(...); 
dlg.m_override_showwindow = false; 

MessageBox(L"Test..."); 
dlg.ShowWindow(SW_SHOW); 
+0

Спасибо, Бармак, он работает для меня. – sujitha

1

Вы не ясно, что вы хотите. В заголовке указано, что вы хотите, чтобы диалог был скрыт. то текст в вопросе говорит, что вы хотите, чтобы он был изначально видимым, а затем скрытым. Что это/

Что вы подразумеваете под своим требованием, говорит, что стиль диалога должен быть WS_VISIBLE. если вы хотите сделать его изначально невидимым, тогда не включайте флаг.

Для немодального диалога, как правило, вы создаете их в куче, тогда как модальные диалоги обычно создаются в стеке.

CYourDialog* pDlg = new CYourDialog(... and whatever arguments); 
pDlg->Create(CYourDialog::IDD); // or whatever the ID is... 
pDlg->ShowWindow(SW_NORMAL); // shows window if it was invisible... 
pDlg->ShowWindow(SW_HIDE); // hides window if it was visible... 
+0

Важное различие не существует между * кучей * и * стеком *, оно находится между * динамической продолжительностью хранения * и * продолжительностью автоматического хранения *. – IInspectable