Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лабораторная 1, сем 2, ЯП (2).docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
798.8 Кб
Скачать

Создание и обработка диалогового окна

Создание диалогового окна и работа с ним требует выполнение следующей последовательности действий:

  • Определение шаблона окна в редакторе диалоговых окон.

  • Определение диалоговой процедуры.

Диалоговая процедура должна иметь спецификатор CALLBACK, так как она вызывается операционной системой. Имя можен быть произвольным, но сложилась традиция завершать это имя префиксом DlgProc. Функция принимает тот же набор параметров, что и оконная процедура. Однако есть отличия:

  • Оконная процедура возвращает значение типа LRESULT, а диалоговая - BOOL;

  • Если оконная процедура не обрабатывает какое-то сообщение, то она вызывает DefWindowProc. Если диалоговая процедура не обрабатывает какое-то обращение, то она возвращает FALSE. Если же сообщение ею обрабатывается, то она возвращает TRUE.

  • Диалоговая процедура не обрабатывает сообщения WM_CREATE. Вместо этого она выполняет инициализацию при обработке специального сообщения WM_INITDIALOG.

  • Диалоговая процедура не обрабатывает сообщение WM_PAINT, так как все функции в ней реализуются элементами управления.

Первым сообщением, которое получает и обрабатывает диалоговая процедура, является WM_INITDIALOG. Если после обработки этого сообщения процедура возвращает TRUE, то Windows помещает фокус ввода на первое окно элемента управления, которое имеет стиль WS_TABSTOP. Можно установить фокус ввода на любой элемент управления функцией SetFocus, но тогда диалоговая процедура должна вернуть значение FALSE.

HWND SetFocus(           HWND hWnd // Дескриптор элемента упраления, в котрором устанавливается фокус,

// получают функцией GetDlgItem (смотри выше)

);

В блоке сообщения WM_INITDIALOG можно инициализировать любой из элементов управления, если в этом есть необходимость.

Основным сообщением, обрабатываемым в диалоговой процедуре является сообщение WM_COMMAND. Если источником сообщения является элемент управления, младшее слово параметра wParam содержит идентификатор элемента управления , старшее слово параметра wParam содержит код уведомления, а параметр lParam – дескриптор элемента управления.

Обработав сообщения WM_COMMAND диалоговая процедура должна вызвать функцию

BOOL EndDialog(           HWND hDlg, // дескриптор диалогового окна

    INT_PTR nResult // значение возвращаемое из функции ( TRUE или FALSE )

);

  • Вызов функции создания диалогового окна из окна, в котором этот диалог создается ( вызов из родительского окна )

Функция создания окна диалога

INT_PTR DialogBox(           HINSTANCE hInstance, // дескриптор экземпляра приложения

    LPCTSTR lpTemplate, // идентификатор шаблона диалога, преобразованный с помощью макроса // MAKEINTRESOURCE к типу LPCTSTR

    HWND hWndParent, // дескриптор родительского окна для окна диалога

    DLGPROC lpDialogFunc // имя диалоговой процедуры

);

Если окна диалога не было создано, по каким то причинам, то функция возвращает 0.

  • Организация обмена данными между диалоговой процедурой и функцией, вызывающей окно. Обмен осуществляется через глобальные объекты, так как параметры процедуры строго регламентированы.

Функция читает символьный текст из элемента управления

UINT GetDlgItemText(           HWND hDlg, // дескриптор диалогового окна

    int nIDDlgItem, // идентификатор элемента управления, ассоциируемый с извлекаемым текстом

    LPTSTR lpString, // буфер, куда записывается извлекаемый текст

    int nMaxCount // максимальное количество символов, копируемых в буфер lpString

);

Функция записывает символьный текст в элемент управления

BOOL SetDlgItemText(           HWND hDlg, // дескриптор диалогового окна

    int nIDDlgItem, // идентификатор элемента управления, ассоциируемый с помещаемым текстом

    LPCTSTR lpString // буфер, откуда берется текст для размещения в элемент управления

);

Функция читает символьное изображение десятичного числа из элемента управления и преобразует его к целочисленному значению

UINT GetDlgItemInt(           HWND hDlg, // дескриптор диалогового окна

    int nIDDlgItem, // идентификатор элемента управления, ассоциируемый с извлекаемым текстом

    BOOL *lpTranslated, // записывается признак успешности преобразования

    BOOL bSigned // если параметр TRUE, то учитывается знак минус при преобразовании и возвращается //значение типа int. При этом пробел между минусом и первой цифрой не допускается

);

Функция записывает символьное изображение целого десятичного числа в элемент управления

BOOL SetDlgItemInt(           HWND hDlg, // дескриптор диалогового окна

    int nIDDlgItem, // идентификатор элемента управления, ассоциируемый с помещаемым текстом

    UINT uValue, // целое, которое преобразуется к строке

    BOOL bSigned // если параметр TRUE, то учитывается знак минус при преобразовании.

// При этом пробел между минусом и первой цифрой не допускается

);