Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Органи управління
Для діалога з користувачем застосовують спеціальні вікна. Система описує декілька класів стандартних вікон – органів управління. Це добре відомі кнопки, статичні органи, списки, редактори, комбіновані списки, смуги прокрутки. Крім них, операційна система описує класи панель інструментів і рядок стану, які будуть розшлядатись пізніше (л.р.№7). Відмінні риси органів управління: - для них вже описані класи вікон; - всі вони дочірні вікна (стилю WS_CHILD); - для них описані додаткові стилі і списки оброблюваних і одержуваних повідомлень; - для них майже завжди потрібно описувати ідентифікатори. Батьківське вікно від дочірніх вікон одержує повідомлення. Повідомлення містить ідентифікатор дочірнього вікна-відправника повідомлення. І функція батьківського вікна завжди може визначити це дочірнє вікно. Список імен розглядуваних в л.р.№2, л.р.№3 класів та їх повідомлення перераховані в табл.2.1.
Таблиця 2.1.Список органів управління
Кнопки Створення кнопок. Для створення кнопки викликають функцію 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. описують ідентифікатор кнопки, наприклад: #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, але додатково має третій стан. В третьому стані він зображується сірим кольором, наприклад для індикації недоступного для втсановлення параметру.
|