- •Теоретична частина
- •Lresult callback WndProc (hwnd hwnd, uint iMsg, wparam wParam, lparam lParam) {
- •DialogBox(hInstance, "aboutbox", hwnd,AboutDiaProc);
- •Int up_lfx, up_lfy, lo_rtx, lo_rty;
- •DialogBox(hInstance, "aboutbox", hwnd,AboutDiaProc);
- •InvalidateRect(hwnd, null, true);
- •InvalidateRect(hwnd, null, true);
- •ValidateRect(hwnd, null);
- •Запустіть програму на виконання. Практична частина
DialogBox(hInstance, "aboutbox", hwnd,AboutDiaProc);
break;
case IDM_TEXT:
…
break;
…
При обробці в WndProc повідомлення WM_CREATE, програма ATIDIA одержує дескриптор екземпляра програми і зберігає його в статичній змінній:
hInstance = ((LPCREATESTRUCT) lParam) -> hInstance;
Програма ATIDIA обробляє ті повідомлення WM_COMMAND, у яких молодше слово параметра wParam дорівнює IDM_ABOUT, IDM_TEXT, IDM_INTEGER, IDM_EXIT. Наприклад, коли програма одержує молодше слово параметра wParam рівне IDM_ABOUT, вона викликає функцію DialogBox:
DialogBox(hInstance, "ABOUTBOX", hwnd, AboutDiaProc);
Для цієї функції потрібно дескриптор екземпляра (збережений при обробці повідомлення WM_CREATE), ім'я вікна діалогу (як воно визначено у файлі опису ресурсів), дескриптор батьківського вікна діалогу (яким є головне вікно програми) і адреса процедури діалогу.
Вибір з меню пункту "About Box..." приводить до виводу на екран вікна діалогу About Dialog. Закрити це вікно діалогу можна, клацнувши на кнопці OK мишею, натиснувши клавішу <Spacebar> чи <Enter>. При натисканні клавіш <Spacebar> чи <Enter> у будь-якім вікні діалогу, у якому мається кнопка за замовчуванням, Windows посилає діалоговій процедурі повідомлення WM_COMMAND, у якому молодше слово параметра wParam дорівнює ідентифікатору заданої за замовчуванням кнопки.
Функція DialogBox, що викликається для виводу на екран вікна діалогу, не повертає керування в WndProc доти, поки вікно діалогу не буде закрито. Значенням функції, що повертається, DialogBox є другий параметр функції EndDialog, що викликається в процедурі діалогу. Потім WndProc може передати керування Windows.
Аналогічно додаються і два інших діалоги з незначними відмінностями, обумовленими введенням інформації.
У першому випадку, коли вводитися текст використовується функція GetDlgItemText(). У загальному виді вона виглядає так:
UINT GetDlgItemText(
HWND hDlg, // дескриптор діалогового вікна
int nIDDlgItem, // ідентифікатор елемента керування
LPTSTR lpString, // адреса буфера для тексту
int nMaxCount // максимальний розмір рядка
);
У atidia ця функція зчитує уміст вікна редагування в глобальну перемінну textscreen, що потім виводитися в робочу область вікна.
В другому випадку, коли вводяться числові дані використовується функція GetDlgItemInt(). У загальному виді вона виглядає так:
UINT GetDlgItemInt(
HWND hDlg, // дескриптор діалогового вікна
int nIDDlgItem, // ідентифікатор елемента керування
BOOL *lpTranslated, // покажчик на булєву змінну, що показує чи коректно введені дані. Може мати значення NULL.
BOOL bSigned // показує яке значення лічене знакове чи беззнакове
);
У atidia ця функція використовується для чотирьох вікон редагування. Вона зчитує уміст вікна редагування в одну з глобальних перемінних up_lfx, up_lfy, lo_rtx, lo_rty, за значеннями яких потім малюється прямокутник.
Додайте до програми код, що містить дві діалогові процедури:
BOOL CALLBACK AboutDiaProc(HWND, UINT, WPARAM, LPARAM) ;
BOOL CALLBACK TextDiaProc(HWND, UINT, WPARAM, LPARAM) ;
BOOL CALLBACK IntDiaProc(HWND, UINT, WPARAM, LPARAM) ;
static char szAppName[] = "Dialogs" ;
static char textscreen[80] = "A line of text" ;