Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ІК (Говорущенко) Методичка.doc
Скачиваний:
6
Добавлен:
23.02.2016
Размер:
762.88 Кб
Скачать

IV. Контрольні питання

  1. Чим відрізняється текст додатку, який створює вікно, від тексту додатку, який не створює вікон?

  2. Який алгоритм роботи головної функції додатку?

  3. Які дії повинен виконати додаток для створення вікна?

  4. Опис яких програмних об’єктів потрібно включити в текст додатку для реєстрації класу вікон?

  5. В якому місці і як відбувається виклик функції вікна?

  6. Яке призначення формальних параметрів функції вікна?

Лабораторна робота №2

Тема: Органи управління. Кнопки. Статичний орган управління. Смуга прокрутки.

Мета: Знайомство зі створенням органів управління з точки зору мови програмування, зі створенням кнопок, статичного органу управління, смуг прокрутки.

І. Теоретичні відомості

Органи управління

Для діалога з користувачем застосовують спеціальні вікна. Система описує декілька класів стандартних вікон – органів управління. Це добре відомі кнопки, статичні органи, списки, редактори, комбіновані списки, смуги прокрутки. Крім них, операційна система описує класи панель інструментів і рядок стану, які будуть розшлядатись пізніше (л.р.№7).

Відмінні риси органів управління:

  • для них вже описані класи вікон;

  • всі вони дочірні вікна (стилю WS_CHILD);

  • для них описані додаткові стилі і списки оброблюваних і одержуваних повідомлень;

  • для них майже завжди потрібно описувати ідентифікатори.

Батьківське вікно від дочірніх вікон одержує повідомлення. Повідомлення містить ідентифікатор дочірнього вікна-відправника повідомлення. І функція батьківського вікна завжди може визначити це дочірнє вікно.

Список імен розглядуваних в л.р.№2, л.р.№3 класів та їх повідомлення перераховані в табл.2.1.

Таблиця 2.1.Список органів управління

Клас

Пояснення

Повідомлення батьківському вікну

BUTTON

Вікно, стан якого змінюється рпи виборі і натсиканні. Це кнопки, які натискаються (push button – звичайні кнопки з текстом), перемикачі (radio button – кола з текстом, розташовним ліворуч або праворуч), прапорці (check box – прямокутники з текстом, розташованим ліворуч або праворуч)

WM_COMMAND

COMBO

BOX

Орган управління, що складається з списку та поля вибору. Список може бути згорнутий або розгорнутий. Якщо список розгорнутий, при вводі символів в полі вибору список встановлює в початок перше входження найбільш схожого рядку списку

WM_COMMAND

EDIT

Вікно введення тексту з клавіатури чи редактор

WM_COMMAND

LISTBOX

Список символьних рядків. При перегляді в кожен момент підсвічується один рядок і про неї передається повідомлення батьківському вікну

WM_COMMAND

SCROLLBAR

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

WM_HSCROLL або WM_VSCROLL

STATIC

Текстове поле, прямокутник виділення та інші елементи оформлення

WM_NCHITTEST

Кнопки

Створення кнопок. Для створення кнопки викликають функцію CreateWindow. Її виклик для створення кнопки має наступні особливості:

  1. в якості lpClassName вказують ім’я класу BUTTON;

  2. аргумент lpWindowNameвизначає текст на кнопці;

  3. аргумент dwStyleзадає стиль кнопки. Його значення задають комбінацією контсантиWS_CHILD, константи з префіксомBS_ (табл.2.2) і, майже завжди, константиWS_VISIBLE. Можна вказувати лише одну константу з табл.2.2. Виключенням єBS_LEFTTEXTтаBS_RIGHTBUTTON. Їх використовують сумісно з іншими константами табл.2.2 для створення прапорців і перемикачів з текстом ліворуч;

  4. значення hWndParent визначає батьківське вікно, в робочій області якого створюється кнопка. Дескриптор вікна-батька вказується обов’язково;

  5. значення hMenuповинно бути рівне ідентифікатору кнопки;

  6. для органів управління в якості lpParamвказуютьNULL.

Таблиця 2.2. Список стилів кнопок

Стилі

Пояснення

1

2

BS_3STATE

Прапорець, який може знаходитись в ввімкненому, вимкненому та невизначеному стані

BS_AUTO

3STATE

Те ж, що й BS_3STATE, але вигляд квадратика автоматично змінюється при перемиканні, циклічно відображуючи ввімкнений, вимкнений і неактивний стан

BS_AUTO

RADIOBUTTON

Перемикач, який може знаходитись уу ввімкненому (всередині напівжирна крапка) або вимкненому (всередині немає крапки) стані. Може бути ввімкнений лише один перемикач групи

BS_DEF

PUSHBUTTON

Те ж, що й BS_PUSHBUTTON, але кнопка має товсту чорну рамку. Якщо така кнопка знаходиться в діалоговому вікні, то вона надсилає повідолмення батьківському вікну при натисненні клавіші Enter, навіть якщо вона не має фокусу введення. Цей стиль визначає кнопку за замовчуванням

1

2

BS_AUTO

CHECKBOX

Прапорець, який може знаходитись лие у ввімкненому або вимкненому стані

BS_CHECKBOX

Прапорець стилю BS_AUTOCHECKBOX з текстом праворуч

BS_GROUPBOX

Прямокутник, в яком групують органи управління. Він не приймає повідомлення. Текст цього органу відображається в верхньому лівому куті прямокутника

BS_LEFTTEXT, BS_RIGHTBUTTON

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

BS_PUSH

BUTTON

Стандартна кнопка

BS_RADIO

BUTTON

Перемикач, який може знаходитись у ввімкненому або вимкненому стані. Текст розташовано праворуч

BS_ICON

Органом управління є іконка

BS_MULTILINE

Розподіляє текст в деяких рядках всередині кнопки

BS_NOTIFY

Орган управління надсилає батьківському вікну повідолмення BN_DBLCLK, BN_KILLFOCUS, BN_SETFOCUS

BS_PUSHLIKE

Прапорець або перемикач поводить себе подібно кнопці – припіднімається або притоплюється

BS_TEXT

Орган управління є текстом

BS_RIGHT, BS_LEFT, BS_TOP, BS_BOTTOM

Текст вирівнено відповідно по правому, лівому, верхньому або нижньому краю в прямокутнику кнопки

BS_CENTER

Центрує текст по горизонталі в прямокутнику кнопки

BS_VCENTER

Центрує текст по вертикалі в прямокутнику кнопки

Алгоритм створення кнопки:

  1. описують ідентифікатор кнопки, наприклад:

#define ID_BUTTON 3000

За допомогою цього ідентифікатора розпізнають кнопку. В описі ідентифікатора зщадають довільне цілочисельне значення.

  1. описують дескриптор дочірнього вікна для кнопки. Наприклад, в тілі функції батьківського вікна це можна зробити наступним чином:

static HWND hButton;

  1. викликають функцію CreateWindow.

Наступний лістинг демонструє створення звичайної кнопки з чорною рамкою шириною 200 і виостою 20 пікселів з текстом “Приклад кнопки” в лівому верхньому куті робочої області вікна.

#include "Functions.h"

#define ID_BUTTON 3330

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

HINSTANCE hInstance;

char szClassName[]="Example";

INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, PSTR, INT nCmdShow)

{ MSG msg; HWND hwnd; hInstacne=hInst;

if (!RegClass(WndProc, szClassName, COLOR_WINDOW)) return FALSE;

hwnd=CreateWindow(szClassName, "Приклад",

WS_OVERLAPPEDWINDOW|WS_VISIBLE,

CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,

CW_USEDEFAULT, 0, 0, hInstance, NULL);

if (!hwnd) return FALSE;

while (GetMessage(&msg, NULL, 0, 0)) DispatchMessage(&msg);

return msg.wParam; }

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)

{ static HWND hButton;

switch (msg)

{ case WM_CREATE:

{hButton=CreateWindow("BUTTON", "Приклад кнопки",

WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,

0, 0, 200, 20, hwnd, (HMENU) ID_BUTTON, hInstance, NULL);

if (!hButton) return 1;

SetFocus(hButton); return 0; }

case WM_DESTROY: {PostQuitMessage(0); return 0; }

} return DefWindowProc(hwnd, msg, wParam. LParam); }

Функція батьківського вікна буде одеружвати від кнопки повідомлення з кодом WM_COMMAND. Так кнопка інформує батьківське вікно про те, що з нею щось зробили. Функція вікна-батька WndProc в цьому прикладі не обробляє повідомлення WM_COMMAND.

Кнопки і повідомлення. До обговорення повідомлень, одержуваних функцією вікна, пригадаємо заголовок цієї функції:

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM waram, LPARAM lParam)

Нехай функція батьківського вікна від кнопки одержала повідомлення WM_COMMAND.

Тоді молодше слово wParam(LOWORD(wParam)) дорівнює ідентифікатору кнопки. В прикладі LOWORD(wParam)=ID_BUTTON.

Старше слово цього параметру дорівнює коду сповіщення. За ним судять про здійснену над кнопкою дію. Наприклад, при натисканні на кнопку HIWORD(wParam)=BN_CLICKED.

Параметр lParam містить десриптор вікна кнопки. В попередньому прикладіlParam=(HWND)hButton.

Кнопка стилю BS_GROUPBOXне обробляє повідомлення від миші або клавіатури і не надсилає повідомлення батьківському вікну. Її використовують в якості рамки із заголовком, що об’єднує, всередині якої розташовують інші органи управління.

Користувач управляє станом кнопок за допомогою миші та клавіатури. Додатки для зміни координат кнопок виликають звичайні функції переміщення та зміни розташування вікон. А для управління станом кнопок передають повідомлення.

Існує 2 способи передачі повідомлень вікнам:

1. запис повідомлення в чергу додатку. З цією метою викликають функцію PostMessage:

BOOL PostMessage(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

Вона розташовує повідолмення в чергу повідомлень вікна hwnd і повертає управління. У випадку успішного запису повідомлення значення, що повертається, дорівнює TRUE. Записане повідомлення буде обране в цилі обробки повідомлень. ПараметрuMsgмістить код, аwParamтаlParamмістять параметри повідомлення, що передається.

2. безпосередня передача повідомлення функції вікна. Для цього викликають функцію SendMessage:

LRESULT SendMessage (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

Її параметри ідентичні параметрам функції PostMessage. Але на відміну від неї функція SendMessage викликає функцію вікна і повертає управління лише після обробки повідомлення функцією вікна. Значення, що повертається, залежить від обробника повідомлення в фунгкції вікна.

Кнопки в загальному випадку знаходяться в одному з трьох станів – натиснутому, відтиснутому та невизначеному. Для одерждання стану кнопки передають повідомлення BM_GETSTATE:

WORD nSt=(WORD)SendMessage(hButton,BM_GETSTATE,0,0L);

Перемикачам і прапорцям для зміни стану надсилають повідомлення BM_SETCHECK. Параметр wParam повідомлення BM_SETCHECK задає новий стан. Для примусового встановлення їх стану є додаткова причина. Перемикачі та прапорці стилів BS_3STATE, BS_CHECKBOX, BS_RADIOBUTTON не перемальовуються при їх перемиканні. Для їх перемалювання надсилають повідомлення BM_SETCHECK.

Наприклад, наступний оператор переводить перемикач або прапорець з дескриптором hButton у ввімкнений стан:

SendMessage(hButton, BM_SETSTATE, BST_CHECKED, 0L);

Прапорці і перемикачі.Важливим різновидом кнопок є прапорці і перемикачі. Їх використовують для вибору режиму роботи додатку.

В додатках перемикачі стилів BS_RADIOBUTTON та BS_AUTORADIOBUTTON використовують аналогічно кнопкам перемикання діапазонів в радіоприймачі. В одній групі розташовують декілька таких “радіоперемикачів”, причому включеним може бути лише один з них. Такі перемикачі називають перемикачами із залежною фіксацією. Включення одного перемикача в групі викликає вимкнення останніх.

Прапорці BS_CHECKBOX,BS_AUTOCHECKBOX,BS_3STATE,BS_AUTO3STATEвикористовують як окремі незалежні прапорці. В групі прапорців можуть бути ввімкнені одночасно декілька прапорців.

З перемикачем стилю BS_AUTORADIOBUTTONі прапорцем стилюBS_AUTOCHECKBOXпрацюють так, як і з кнопками стилюBS_PUSHBUTTONабоBS_DEFPUSHBUTTON. При натисканні лівої кнопки миші такий перемикач або прапорець автоматично змінює свій стан. При цьому неперекреслений квадратик стає перекресленим і навпаки. Стан перемикача відзначається жирною крапкою. При зміні стану прапорця або перемикача батьківське вікно одержує повідомленняWM_COMMANDз кодом сповіщенняBN_CLICKED.

Прапорець стилю BS_3STATEабоBS_AUTO3STATEзовні схожий на прапорецьBS_CHECKBOX, але додатково має третій стан. В третьому стані він зображується сірим кольором, наприклад для індикації недоступного для втсановлення параметру.