Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Zvitische.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
353 Кб
Скачать
☆

Контрольні запитання та завдання

1. Як організувати перемальовування зображення вікна Windows-додатка?

Продемонструємо приклад створення діалогового вікна на основі тексту програми, яка розглядалася у попередній лабораторній роботі. Забезпечимо роботу підпункту меню „Прямокутник” за допомогою вікна діалогу, задача якого буде полягати у прийнятті від користувача параметрів прямокутної фігури та перемальовуванні її у вікні додатка відповідно до заданих параметрів.

2. Що являють собою вікна діалогу?

Як зазначалося, вікно діалогу являє собою спеціальний об’єкт, призначений для полегшення взаємодії користувача з виконуваною програмою та налаштування її на певні умови функціонування. Вікно діалогу складається з елементарних об’єктів, які називаються елементами керування. Система Windows підтримує кілька типів таких об’єктів. У розгляданому прикладі будемо використовувати лише невелику їх частину.

Для опису зовнішнього виду вікна діалогу та забезпечення його інтерфейсу з додатком використовується спеціальний тип ресурсу – DIALOG. На відміну від ресурсу меню, який можна створити вручну, ресурс діалогового вікна краще створювати за допомогою відповідних програмних засобів – редакторів ресурсів.

3. Опишіть особливості побудови та функціонування діалогової процедури.

У процесі роботи з діалоговим вікном користувач виконує деякі дії, про які за допомогою механізму повідомлень стає відомо додатку. В додатка для кожного діалогового вікна повинна існувати своя процедура, призначена для обробки повідомлень цього вікна. Ця процедура називається діалоговою процедурою. Навіть саме примітивне вікно діалогу містить елемент, повідомлення від якого надходить у діалогову процедуру. Зазвичай таке вікно містить кнопку „Ok” або „Cancel”. На мові C відповідна діалогова процедура має такий вигляд:

LRESULT CALLBACK MyDlgProc (HWND Dialog, UINT message, WPARAM wParam, LPARAM lParam)

{

switch (message)

{

case WM_INITDIALOG:

return TRUE;

break;

case WM_COMMAND:

if (LOWORD(wParam) == IDOK) || (LOWORD(wParam) == IDCANCEL)

{

EndDialog(Dialog, LOWORD(wParam));

return TRUE;

}

break;

}

return FALSE;

}

Слід відзначити, що якщо віконна процедура самостійно обробляє повідомлення, то вона повинна повертати одиничне значення, якщо ні, то нульове.

Вікна діалогу, що мають велику кількість елементів керування, повинні, відповідно, мати діалогові процедури, які обробляють повідомлення від цих елементів. В нашому випадку буде визначене одне вікно діалогу. За допомогою цього вікна користувач може задавати координати кутів прямокутника. На рис. 2.2 наведено вигляд вікна додатка з вікном діалогу для завдання координат прямокутника.

При заданні координат користувач сам повинен контролювати правильність введення даних, оскільки алгоритм програми не передбачає перевірки даних, що вводяться в елементи введення діалогового вікна. Правильні значення, які вводяться в кожне з полів введення, повинні містити всі чотири десяткові цифри, із включенням, при необхідності, старших нулів. Для обробки повідомлень від цього діалогового вікна програма додатка містить діалогову процедуру MyDlgProc, призначену для введення координат прямокутника. Структура діалогової процедури аналогічна структурі віконної процедури. На початку діалогової процедури знаходиться програмна конструкція, яка визначає тип повідомлення, що надійшло, і в залежності від нього передає керування в певну точку діалогової процедури.

Рис. 2.2. Вікно діалогу для задання координат кутів прямокутника

Головне повідомлення, яке надходить у віконну процедуру –повідомлення WM_COMMAND. Саме воно несе інформацію про дії користувача над елементами керування вікна діалогу. Повідомлення WM_INITDIALOG надходить у діалогову процедуру один раз. Це відбувається в процесі ініціалізації діалогу перед появою вікна діалогу в області вікна додатка. Далі в діалогову процедуру надходить послідовність повідомлень WM_COMMAND. Параметр wParam цього повідомлення містить ідентифікатор того елемента керування, над яким користувач виконав деяку дію, наприклад, клацнув кнопку „Ok” або „Cancel”. Зверніть увагу, що при описі елементів різних вікон діалогу можуть використовуватися одні й ті самі ідентифікатори. Більше того, цим ідентифікаторам можуть бути призначені одні й ті самі константи. Саме їх значення передаються у структурі повідомлення для ідентифікації конкретного елемента вікна діалогу. Однакові значення не вносять жодної плутанини у роботу додатка, оскільки для кожного вікна діалогу існує своя процедура.

Діалогова процедура MyDlgProc використовує допоміжну процедуру TextToDigit. Процедура TextToDigit описана у прикладі 2.3 і призначена для перетворення рядка з чотирьох символів десяткових цифр у еквівалентне десяткове число. В даній програмі ця процедура використовується для перетворення символьних рядків, які зчитуються з вікон введення діалогу. Ці символьні рядки логічно являють собою координати прямокутника. Перетворені за допомогою процедури TextToDigit значення цих координат використовуються для роботи функції FillRect.

4. Як активувати діалогове вікно?

Для того щоб відобразити діалогове вікно на екрані та виконати з його допомогою деяку роботу, використовується функція DialogBoxParam. Ця функція має такий формат:

function DialogBoxParam(

hInstance: HINSTANCE, // дескриптор додатка

lpTemplateName: LPCTSTR, // вказівник на рядок із заголовком вікна

hWndParent: Hwnd, // дескриптор вікна

lpDialogFunc: DlgProc, // вказівник на діалогову процедуру

dwInitParam: Lparam // значення, яке передається через Lparam

): integer;

У фрагменті програми прикладу 2.3 звернення до цієї функції виконується один раз при виборі відповідного пункту меню. За допомогою цієї функції у діалогову процедуру передається 32-бітне значення, яке отримується за допомогою параметра Lparam.

По закінченні роботи вікно діалогу повинно бути закрите функцією EndDialog, яка має формат:

BOOL EndDialog(

HWND hDlg, // handle to dialog box

int nResult // value to return

);