Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с диалоговыми окнами.

1.8K
05 апреля 2004 года
scanf
72 / / 10.12.2003
Вот кусок кода.
При запуске первый диалог появляется как надо.
Но после нажатия на ОК второй диалог появляется и тутже исчезает.
Почему ?
И что можно сделать чтобы второй диалог не исчезал ?


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;
}
4.9K
06 апреля 2004 года
mrhx
43 / / 04.04.2004
Цитата:
Originally posted by scanf
Вот кусок кода.
При запуске первый диалог появляется как надо.
Но после нажатия на ОК второй диалог появляется и тутже исчезает.
Почему ?
И что можно сделать чтобы второй диалог не исчезал ?


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;" - лишняя. (Я ее пометил - (*))

Надеюсь помог. :)

1.8K
06 апреля 2004 года
scanf
72 / / 10.12.2003
Цитата:
Originally posted by mrhx



Если честно, юзал бы ты лучше WinAPI, чем MFC, тем более, что у тебя там одни диалоги :)

Но раз уж спросил, вот мое мнение. Я правда в MFC не очень, но тем не менее - мне кажется вторая строчка "m_pMainWnd = &dlg;" - лишняя. (Я ее пометил - (*))

Надеюсь помог. :)



На щёт WinAPI увы я в них ничего не понимаю (и вобще я новичок в Visual C++) :x .
На щёт кода извени но это явно не то.
Н о всёже спасибо за участие. :)

4.9K
06 апреля 2004 года
mrhx
43 / / 04.04.2004
Цитата:
Originally posted by scanf


На щёт WinAPI увы я в них ничего не понимаю (и вобще я новичок в Visual C++) :x .
На щёт кода извени но это явно не то.
Н о всёже спасибо за участие. :)



Явно не то? Ты хоть попробовал ?

ЗЫ: Поверь, на API все ГОРАЗДО проще!

1.8K
06 апреля 2004 года
scanf
72 / / 10.12.2003
Цитата:
Originally posted by mrhx


Явно не то? Ты хоть попробовал ?

ЗЫ: Поверь, на API все ГОРАЗДО проще!




Попробовал конечно но не помогло.
К томуже мне кажется что ты не обратил внимание на то что первый dlg и вторй относятся к разным классам.
Это работает но всёже я сплоховал не изменив имя второго. :x

CSecDlg dlg; <---------------------------
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
CMyDialogDlg dlg; <----------------------

4.9K
06 апреля 2004 года
mrhx
43 / / 04.04.2004
Цитата:
Originally posted by scanf



Попробовал конечно но не помогло.
К томуже мне кажется что ты не обратил внимание на то что первый dlg и вторй относятся к разным классам.
Это работает но всёже я сплоховал не изменив имя второго. :x

CSecDlg dlg; <---------------------------
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
CMyDialogDlg dlg; <----------------------



Я обратил :)
Ну раз непомогло... может все дело в конкретном классе? То есть внутри CMyDialogDlg что-то не то?

3
07 апреля 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by scanf

Это работает но всёже я сплоховал не изменив имя второго. :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.

1.8K
07 апреля 2004 года
scanf
72 / / 10.12.2003
Цитата:
Originally posted by Green

Здесь ошибки нет, т.к. имена находятся в разных областях видимости.

Сложность кроется в самой специфике MFC.
Дело в том, что ты сначала делаешь главным окном диалог CSecDlg, а при закрытии отого окна приходит WM_QUIT и приложение собирается завершится, поэтому RunModalLoop возвращает значение сразу, а не делает этот самый Loop.
То, что ты делаешь впоследствии главным окном диалог CMyDialogDlg уже не имеет никакого значения.

Теперь немного оффтопа.
Тебе здесь предложили "юзать WinAPI". mrhx, видимо, имел в виду использование Win32 API, без вспомогательных врапперов. Я бы не относился к этому совету серьезно, т.к. любой враппер служит для облегчения работы и повышения производительности. Другое дело, что MFC не лучший враппер. Я бы рекоменловал использовать WTL.






Вопервых спасибо за просвещение.
Ну и естественный вопрос : Что можно сделать чтобы это всётаки работало ?
Если можно конечно.

3
07 апреля 2004 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by scanf

Вопервых спасибо за просвещение.
Ну и естественный вопрос : Что можно сделать чтобы это всётаки работало ?
Если можно конечно.



Простейшее, не делать
m_pMainWnd = &dlg;
для первого диалога.

1.8K
07 апреля 2004 года
scanf
72 / / 10.12.2003
Цитата:
Originally posted by Green


Простейшее, не делать
m_pMainWnd = &dlg;
для первого диалога.



Сработало :o
Выходит что m_pMainWnd получает адрес
окна чтобы основной объект знал когда заканчивать парограму ?

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог