В MFC, как мне избежать того, чтобы диалоговые окна оставались поверх окна моего приложения? - PullRequest
2 голосов
/ 24 декабря 2009

У меня есть приложение на основе диалогового окна (MFC - VS 2008). У меня есть контроль над списком. Я выскакиваю другие диалоговые окна, но я также хочу иметь возможность вернуться к диалогу родительского приложения. Я могу вернуться к диалоговому окну родительского приложения, но проблема в том, что даже если я нажму на него мышью, он останется скрытым за «дочерними» окнами.

Я хочу, чтобы оно вышло на передний план.

Возможно, что-то очевидно, что я делаю неправильно. Что мне нужно сделать, чтобы родительское окно вышло вперед, когда оно имеет фокус? Я предполагаю, что у дочернего dlg есть свойство, которого не должно быть, или что-то отсутствует

Я могу опубликовать код rc, если это поможет.

EDIT:

вот код .rc для двух диалоговых окон. Первое - это окно мэйнфрейма.

Второй запускается со следующим кодом:

HistogramWindow *histwind;

histwind = new  HistogramWindow(this);  
histwind->Create(IDD_DIALOG_HISTOGRAM);
histwind->ShowWindow(SW_SHOW);

IDD_DTHISTOGRAMDLG_DIALOG DIALOGEX 0, 0, 320, 200
STYLE DS_SETFONT | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
EXSTYLE WS_EX_APPWINDOW
CAPTION "dtHistogramDlg"
FONT 8, "MS Shell Dlg", 0, 0, 0x1
BEGIN
    DEFPUSHBUTTON   "OK",IDOK,209,179,50,14,NOT WS_VISIBLE
    PUSHBUTTON      "Cancel",IDCANCEL,263,179,50,14,NOT WS_VISIBLE
    CONTROL         "",IDC_LIST_SYMBOL_SETS,"SysListView32",LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP,7,7,60,50
END

IDD_DIALOG_HISTOGRAM DIALOGEX 0, 0, 317, 184
STYLE DS_SETFONT | DS_FIXEDSYS | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
EXSTYLE WS_EX_APPWINDOW
CAPTION "Histogram"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
    DEFPUSHBUTTON   "OK",IDOK,205,163,50,14,NOT WS_VISIBLE
    PUSHBUTTON      "Cancel",IDCANCEL,260,163,50,14,NOT WS_VISIBLE
    CONTROL         "",IDC_STATIC,"Static",SS_BLACKFRAME,7,7,20,20
END

Ответы [ 4 ]

4 голосов
/ 24 декабря 2009

Вы, вероятно, используете модальное диалоговое окно, вызывая DoModal.
Вместо этого вам нужно создать немодальное диалоговое окно .

Для этого используйте CWnd :: Create и CWnd :: ShowWindow .

Пример:

CMyDialog *m_pMyDialog = new CMyDialog(this);
m_pMyDialog->Create(CMyDialog::IDD);
m_pMyDialog->ShowWindow(SW_SHOW);   
1 голос
/ 29 августа 2016

У меня была такая же проблема, но второй диалог запускался внутри CWinThread.

Мое решение было:

m_pDlg-> Создать (IDD_DIALOG, CWnd :: FromHandle (GetDesktopWindow ()));

Я нашел дополнительную справочную информацию: http://www.codeproject.com/Articles/1651/Tutorial-Modeless-Dialogs-with-MFC

1 голос
/ 26 декабря 2009

Мой друг предложил следующее (и это работает)

  • установить стиль 2-го dlg на WS_CHILD
  • histwind-> SetParent (NULL);
  • histwind-> ModifyStyle (WS_CHILD, 0);

Это работает, однако при перемещении родительского окна сзади ребенка происходит странное поведение. При перемещении окно скрыто, пока я не отпущу мышь.

Пока это будет работать.

спасибо всем, кто помог.

1 голос
/ 26 декабря 2009

Попробуйте удалить EXSTYLE WS_EX_APPWINDOW для второго диалога.

...