Инициализация диалогового окна

Вы инициализируете диалоговое окно и его содержание, в то время, когда обрабатываете сообщение WM_INITDIALOG. Самая большая общая задача - это инициализировать органы управления, которые отражают текущие параметры настройки диалогового окна. Еще одна общая задача - это выровнять по центру диалоговое окно на экране или внутри его окна владельца. Не последняя задача для некоторых диалоговых окон состоит и в том, чтобы установить фокус ввода данных в заданный орган управления, а не соглашаться на фокус ввода данных по умолчанию.

В примере ниже, в то время, когда обрабатывается сообщение WM_INITDIALOG, процедура диалогового окна выравнивает по центру блок диалога и устанавливает фокус ввода данных. Чтобы выровнять по центру блок диалога, процедура извлекает прямоугольники окна для диалогового окна и окна владельца и вычисляет новую позицию блока диалога. Чтобы установить фокус ввода данных, процедура проверяет параметр wParam, чтобы выяснить идентификатор заданного по умолчанию фокуса ввода данных:

Пример
HWND hwndOwner; 
RECT rc, rcDlg, rcOwner; 
 
    case WM_INITDIALOG: 
 
        // Получим прямоугольники окна владельца
        // и блока диалога. 
 
        if ((hwndOwner = GetParent(hwndDlg)) == NULL) 
        {
            hwndOwner = GetDesktopWindow(); 
        }

        GetWindowRect(hwndOwner, &rcOwner); 
        GetWindowRect(hwndDlg, &rcDlg); 
        CopyRect(&rc, &rcOwner); 
 
         // Сместим  прямоугольники окна владельца и блока диалога так,
         // чтобы правое и нижнее значения обозначали ширину и  
         // высоту, а затем сместим окно владельца снова, чтобы 
         // не учитывать  пространство занятое блоком диалога.
 
        OffsetRect(&rcDlg, -rcDlg.left, -rcDlg.top); 
        OffsetRect(&rc, -rc.left, -rc.top); 
        OffsetRect(&rc, -rcDlg.right, -rcDlg.bottom); 
 
         // Новая позиция - сумма половины оставшегося пространства
         // и первоначальной позиции окна владельца. 
 
        SetWindowPos(hwndDlg, 
            HWND_TOP, 
            rcOwner.left + (rc.right / 2), 
            rcOwner.top + (rc.bottom / 2), 
            0, 0,          // игнорирует параметры размера 
            SWP_NOSIZE); 
 
        if (GetDlgCtrlID((HWND) wParam) != ID_ITEMNAME) 
        { 
            SetFocus(GetDlgItem(hwndDlg, ID_ITEMNAME)); 
            return FALSE; 
        } 
        return TRUE; 

В данных выше операторах, процедура использует функцию GetParent, чтобы извлечь дескриптор окна владельца блока диалога. Функция возвращает дескриптор окна владельца блокам диалога, а дескриптор родительского окна дочерним окнам. Поскольку приложение может создать диалоговое окно, которое не имеет владельца, процедура проверяет возвращенный дескриптор и использует функцию GetDesktopWindow, чтобы извлечь дескриптор окна рабочего стола, если необходимо. После вычисления новой позиции, процедура использует функцию SetWindowPos, чтобы переместить диалоговое окно, установить значение HWND_TOP и гарантировать, что блок диалога остается поверх окна владельца.

Перед установкой фокуса ввода данных, процедура проверяет идентификатор органа управления с фокусом ввода данных по умолчанию. Система передает дескриптор окна с фокусом ввода данных по умолчанию в параметре wParam. Функция GetDlgCtrlID возвращает идентификатор органа управления идентифицированный дескриптором окна. Если он не соответствует правильному идентификатору, процедура использует функцию SetFocus, чтобы установить фокус ввода данных. Функция GetDlgItem обязана извлекать дескриптор окна требуемого органа управления.

Назад в оглавление
На главную страницу

Hosted by uCoz