Как использовать диалог в качестве основного окна приложения

В некоторых случаях дилоговые окна можно использовать как главное окно приложения. При разработке такого приложения следует придерживаться следующих соглашений:

  • Диалоговое окно, которое выступает в роли основного окна, может быть создано без владельца.

  • Если в качестве главного окна создан модальный диалог, то неполучится использовать, TranslateAccelerator().

  • При минимизации диалогового окна, иконка должна перерисовываться вручную.

В качестве главного окна приложения можно создавать как модальное, так и немодальное диалоговое окно. При этом нет никакой необходимости иметь перекрываемое окно, которое выступает в роли владельца диалогового окна. Память для окошек редактирования (edit controls) созданных с флагом DS_LOCALEDIT, и статических элементов управления будет браться из динамической памяти (heap), которая представлена в виде hInstance, переданной в вызов CreateDialog() или DialogBox().

Когда для этой цели выбран модальный диалог, и в приложении определены клавиши акселераторов, то Windows создаёт модальный цикл сообщений, который не обрабатывает акселераторы, до тех пор, пока не будет установлена ловушка WH_MSGFILTER и не будет вызвана TranslateAccelerator() из функции ловушки.

Простой способ избежать этого ограничения, это создать немодальное диалоговое окно и вызвать TranslateAccelerator() из основного цикла сообщений.

Иконка для окна хранится в его информации о классе. Поскольку диалог, это окно глобального класса, которое используют все приложения в системе, то смена иконки для этого приложения приведёт к смене иконки для всех диалоговых окон в системе. Ниже показано, как вручную перерисовывать иконку, когда диалог минимизирован:

Пример кода

 BOOL WINAPI GenericDlgProc (HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam)
{

RECT rect ;
switch (msg) {

case WM_INITDIALOG:
hIcon = LoadIcon(); // Загружаем иконку, которая будет отображена
// при минимизации.
return TRUE ;

case WM_ERASEBKGND:
if (IsIconic(hwnd) && hIcon) {
SendMessage( hwnd, WM_ICONERASEBKGND, wParam, 0L );
return TRUE;
}
break;

case WM_QUERYDRAGICON:
return (hIcon);

case WM_PAINT: {
PAINTSTRUCT ps;

BeginPaint( hwnd, &ps );

if (IsIconic(hwnd)) //*** Если свёрнуто в иконку,
// то рисуем иконку.
{
if (hIcon) {

//правильно центрируем иконку...
GetClientRect(hwnd, &rect) ;
rect.left = (rect.right - GetSystemMetrics(SM_CXICON))
>> 1;
rect.top = (rect.bottom - GetSystemMetrics(SM_CYICON))
>> 1;
DrawIcon( ps.hdc, rect.left, rect.top, hIcon );
}
}
EndPaint( hwnd, &ps );
}
break;
}
return FALSE;

} //*** GenericDlgProc

Вышеприведённый пример предполагает, что диалоговое окно принадлежит предопределённому классу диалога. Для private классов диалога нет необходимости вручную рисовать иконку при минимизации. Можно указать иконку при регистрации класса диалога. Незабудьте установить поле cbWndExtra в DLGWINDOWEXTRA. При минимизации диалога, иконка будет нарисована автоматически.

 
« Предыдущая статья   Следующая статья »