Мне нужно настроить диалоговое окно динамически в зависимости от его размера. Для этого я использую следующую технику:
Я загружаю его и получаю его размер из обработчика CDialog :: OnInitDialog ().
Если размер слишком велик, я заканчиваю диалог, вызывая CDialog :: EndDialog
А затем обновите глобальную переменную и заново установите класс, полученный из диалога, с настройкой размера.
Случается так, что на втором проходе некоторые 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;
переменная dlg
это еще не окно в том месте, где вы устанавливаете m_pMainWnd (диалоговое окно отображается только после OnInitInstance
возвращает TRUE); Следующий код должен работать:
for(;;)
{
CDialogDerivedClass dlg(&nGlobalCounter);
// m_pMainWnd = &dlg;
if(dlg.DoModal() != SPECIAL_VALUE)
break;
}
m_pMainWnd = &dlg;
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