Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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






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

Стилі Пояснення
   
BS_3STATE Прапорець, який може знаходитись в ввімкненому, вимкненому та невизначеному стані
BS_AUTO 3STATE Те ж, що й BS_3STATE, але вигляд квадратика автоматично змінюється при перемиканні, циклічно відображуючи ввімкнений, вимкнений і неактивний стан
BS_AUTO RADIOBUTTON Перемикач, який може знаходитись уу ввімкненому (всередині напівжирна крапка) або вимкненому (всередині немає крапки) стані. Може бути ввімкнений лише один перемикач групи
BS_DEF PUSHBUTTON Те ж, що й BS_PUSHBUTTON, але кнопка має товсту чорну рамку. Якщо така кнопка знаходиться в діалоговому вікні, то вона надсилає повідолмення батьківському вікну при натисненні клавіші Enter, навіть якщо вона не має фокусу введення. Цей стиль визначає кнопку за замовчуванням
   
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

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

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

static HWND hButton;

3. викликають функцію 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, але додатково має третій стан. В третьому стані він зображується сірим кольором, наприклад для індикації недоступного для втсановлення параметру.

 


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.01 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал