Проблема с диалоговыми окнами.
При запуске первый диалог появляется как надо.
Но после нажатия на ОК второй диалог появляется и тутже исчезает.
Почему ?
И что можно сделать чтобы второй диалог не исчезал ?
BOOL CMyDialogApp::InitInstance()
{
CWinApp::InitInstance();
AfxEnableControlContainer();
CSecDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: Place code here to handle when the dialog is
// dismissed with OK
CMyDialogDlg dlg;
m_pMainWnd = &dlg;
nResponse = dlg.DoModal();
if (nResponse == IDOK) {}
else if (nResponse == IDCANCEL) {}
}
else if (nResponse == IDCANCEL)
{
// TODO: Place code here to handle when the dialog is
// dismissed with Cancel
}
return FALSE;
}
Вот кусок кода.
При запуске первый диалог появляется как надо.
Но после нажатия на ОК второй диалог появляется и тутже исчезает.
Почему ?
И что можно сделать чтобы второй диалог не исчезал ?
BOOL CMyDialogApp::InitInstance()
{
CWinApp::InitInstance();
AfxEnableControlContainer();
CSecDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
CMyDialogDlg dlg;
m_pMainWnd = &dlg; // (*)
Если честно, юзал бы ты лучше WinAPI, чем MFC, тем более, что у тебя там одни диалоги :)
Но раз уж спросил, вот мое мнение. Я правда в MFC не очень, но тем не менее - мне кажется вторая строчка "m_pMainWnd = &dlg;" - лишняя. (Я ее пометил - (*))
Надеюсь помог. :)
Если честно, юзал бы ты лучше WinAPI, чем MFC, тем более, что у тебя там одни диалоги :)
Но раз уж спросил, вот мое мнение. Я правда в MFC не очень, но тем не менее - мне кажется вторая строчка "m_pMainWnd = &dlg;" - лишняя. (Я ее пометил - (*))
Надеюсь помог. :)
На щёт WinAPI увы я в них ничего не понимаю (и вобще я новичок в Visual C++) :x .
На щёт кода извени но это явно не то.
Н о всёже спасибо за участие. :)
На щёт WinAPI увы я в них ничего не понимаю (и вобще я новичок в Visual C++) :x .
На щёт кода извени но это явно не то.
Н о всёже спасибо за участие. :)
Явно не то? Ты хоть попробовал ?
ЗЫ: Поверь, на API все ГОРАЗДО проще!
Явно не то? Ты хоть попробовал ?
ЗЫ: Поверь, на API все ГОРАЗДО проще!
Попробовал конечно но не помогло.
К томуже мне кажется что ты не обратил внимание на то что первый dlg и вторй относятся к разным классам.
Это работает но всёже я сплоховал не изменив имя второго. :x
CSecDlg dlg; <---------------------------
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
CMyDialogDlg dlg; <----------------------
Попробовал конечно но не помогло.
К томуже мне кажется что ты не обратил внимание на то что первый dlg и вторй относятся к разным классам.
Это работает но всёже я сплоховал не изменив имя второго. :x
CSecDlg dlg; <---------------------------
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
CMyDialogDlg dlg; <----------------------
Я обратил :)
Ну раз непомогло... может все дело в конкретном классе? То есть внутри CMyDialogDlg что-то не то?
Это работает но всёже я сплоховал не изменив имя второго. :x
CSecDlg dlg; <---------------------------
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
CMyDialogDlg dlg; <----------------------
Здесь ошибки нет, т.к. имена находятся в разных областях видимости.
Сложность кроется в самой специфике MFC.
Дело в том, что ты сначала делаешь главным окном диалог CSecDlg, а при закрытии отого окна приходит WM_QUIT и приложение собирается завершится, поэтому RunModalLoop возвращает значение сразу, а не делает этот самый Loop.
То, что ты делаешь впоследствии главным окном диалог CMyDialogDlg уже не имеет никакого значения.
Теперь немного оффтопа.
Тебе здесь предложили "юзать WinAPI". mrhx, видимо, имел в виду использование Win32 API, без вспомогательных врапперов. Я бы не относился к этому совету серьезно, т.к. любой враппер служит для облегчения работы и повышения производительности. Другое дело, что MFC не лучший враппер. Я бы рекоменловал использовать WTL.
Здесь ошибки нет, т.к. имена находятся в разных областях видимости.
Сложность кроется в самой специфике MFC.
Дело в том, что ты сначала делаешь главным окном диалог CSecDlg, а при закрытии отого окна приходит WM_QUIT и приложение собирается завершится, поэтому RunModalLoop возвращает значение сразу, а не делает этот самый Loop.
То, что ты делаешь впоследствии главным окном диалог CMyDialogDlg уже не имеет никакого значения.
Теперь немного оффтопа.
Тебе здесь предложили "юзать WinAPI". mrhx, видимо, имел в виду использование Win32 API, без вспомогательных врапперов. Я бы не относился к этому совету серьезно, т.к. любой враппер служит для облегчения работы и повышения производительности. Другое дело, что MFC не лучший враппер. Я бы рекоменловал использовать WTL.
Вопервых спасибо за просвещение.
Ну и естественный вопрос : Что можно сделать чтобы это всётаки работало ?
Если можно конечно.
Вопервых спасибо за просвещение.
Ну и естественный вопрос : Что можно сделать чтобы это всётаки работало ?
Если можно конечно.
Простейшее, не делать
m_pMainWnd = &dlg;
для первого диалога.
Простейшее, не делать
m_pMainWnd = &dlg;
для первого диалога.
Сработало :o
Выходит что m_pMainWnd получает адрес
окна чтобы основной объект знал когда заканчивать парограму ?