MFC, EndDialog, повторное создание диалога вызывает неожиданное поведение

Мне нужно настроить диалоговое окно динамически в зависимости от его размера. Для этого я использую следующую технику:

  1. Я загружаю его и получаю его размер из обработчика CDialog :: OnInitDialog ().

  2. Если размер слишком велик, я заканчиваю диалог, вызывая CDialog :: EndDialog

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

Случается так, что на втором проходе некоторые API начинают работать странно. Например, MessageBox не отображается (поэтому все макросы ASSERT перестают работать), а некоторые API-интерфейсы SetWindowText вызывают сбой приложения. Есть идеи почему?

Вот фрагменты кода:

#define SPECIAL_VALUE -1
//From CWinApp-derived class
BOOL CWinAppDerivedClass::InitInstance()
{
//...

for(;;)
{
CDialogDerivedClass dlg(&nGlobalCounter);
m_pMainWnd = &dlg;
if(dlg.DoModal() != SPECIAL_VALUE)
break;
}

//...
}

А затем из самого диалогового класса:

//From CDialogDerivedClass
BOOL CDialogDerivedClass::OnInitDialog()
{
//The following API shows message box only on the 1st pass, why?
::MessageBox(NULL, L"1", L"2", MB_OK);

//...

if(checkedDialogSizeIndicatesReload)
{
this->EndDialog(SPECIAL_VALUE);
return FALSE;
}

//Continue loading dialog as usual
...
}

РЕДАКТИРОВАТЬ: Я случайно заметил, что, если я закомментирую следующую строку, это, похоже, сработает. Есть идеи почему?

//m_pMainWnd = &dlg;

0

Решение

переменная dlg это еще не окно в том месте, где вы устанавливаете m_pMainWnd (диалоговое окно отображается только после OnInitInstance возвращает TRUE); Следующий код должен работать:

for(;;)
{
CDialogDerivedClass dlg(&nGlobalCounter);
//  m_pMainWnd = &dlg;
if(dlg.DoModal() != SPECIAL_VALUE)
break;
}
m_pMainWnd = &dlg;
1

Другие решения

InitDialog — это последнее сообщение, обработанное до того, как на экране появится диалоговое окно — вы можете определить и отрегулировать размер на месте и не иметь ничего общего с тем, что вы делаете.

if(checkedDialogSizeIndicatesReload)
{
// look up SetWindowPos -
// I am nt sure if there is another parameter or not that is optional
int x,y,cx,cy;
WINDOWPLACEMENT wp;
GetWindowPlacement(&wp);
// calc new size here
SetWindowPos(this,x,y,cx,cy);
}

// window appears when the message handler returns
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector