Повідомлення і їх структура

Програмування в Windows грунтується на використанні інтерфейсу прикладного програмування API (Application Program Interface) API надають програмісту набір готових класів, функцій, структур і констант Їх кількість становить близько двох тисяч API-функції забезпечують взаємодію додатки із зовнішніми пристроями і ресурсами операційної системи

Головним елементом віконного додатки в середовищі Windows є вікно, яке може містити елементи управління: кнопки, списки, вікна редагування, смуги прокрутки і тп Ці елементи також є вікнами, що володіють особливими властивостями Події, що відбуваються з елементами управління і з самим вікном, призводять до формування повідомлень спеціально оформлених груп даних

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

Відмітною ознакою повідомлення є його код, який для системних повідомлень лежить в діапазоні від 1 до 0x3FF Так як з кодами працювати в програмі незручно, то кожному коду зіставляється своя символічна константа, по імені якої можна визначити джерело повідомлення Наприклад, при переміщенні миші виникає повідомлення WMMOUSEMOVE (код 0x200), при натисканні на ліву кнопку миші повідомлення WMLBUTTONDOWN (код 0x201) При перемальовуванні вікно отримує повідомлення WMPAINT Ці події відносяться до класу апаратних, оскільки в їх обробці беруть участь драйвери зовнішніх пристроїв Наприклад, при натисканні клавіші драйвер клавіатури формує пакет даних і пересилає його в формі повідомлення в системну чергу повідомлень Windows Розглянемо подальшу долю повідомлення

Для 32-розрядних додатків час для виконання розподіляється між потоками додатки, як мінімум, додаток створює один потік Для кожного потоку створюється своя черга повідомлень, яка не має фіксованого розміру Повідомлення з системної черги розподіляються між чергами повідомлень потоків, звідки потім витягуються додатком за допомогою функції GetMessageOВознікает питання, в яку чергу потоку направляється повідомлення із системної черги Припустимо, що на екрані багато вікон додатків і виникло подія, ініційоване мишею У цьому випадку повідомлення від миші буде адресовані потоку-власнику вікна, над яким знаходиться курсор, тк за допомогою миші логічно активізувати саме дії, повязані з поточним вікном А значить, повідомлення від миші ставляться в чергу потоку, активізував поточний вікно

Джерелами повідомлень, крім пристроїв, можуть бути прикладні програми або ОС Якщо повідомлення створюється в прикладній програмі і надсилається в Windows, щоб ОС виконала необхідні дії, то таке повідомлення має код, що перевищує 0x3FF Програміст може також передбачити власні повідомлення і направляти їх в різні вікна програми для оповіщення про різних ситуаціях в обчислювальній системі

Розглянемо структуру одного повідомлення Повідомлення передаються в програму за допомогою спеціальної структури MSG, що включає 6 полів, і описаної у файлі winuserh Оскільки мова програмування практично не впливає на загальну структуру Windows-програми, розглянемо реалізацію на С Поля структури MSG:

{

HWND hwnd / / Дескриптор вікна, якому адресовано / / повідомлення

UINT message / / Код даного повідомлення

WPARAM wParam / / Доп інформація

LPARAM IParam / / Доп інформація

DWORD time / / Час відправлення повідомлення

POINT pt / / Позиція курсору миші на момент / / відправлення повідомлення

} MSG

Усі обєкти (вікна, файли, процеси, потоки, події і тд) і системні ресурси в Windows описуються за допомогою дескрипторів Розрізняють, наприклад, дескриптори примірників додатків (Handle of Instance, HInstance), вікон (HWND), піктограм (HIcon), шрифти-TOB (HFont), піря (HPen) і тд Визначення цих дескрипторів доступні при підключенні Windowsh, який посилається на Windefh Так як повідомлення посилається певного вікна, то його дескриптор вказується в структурі повідомлення Поля wParam і IParam містять додаткові дані, необхідні для обробки повідомлення, їх вміст розрізняється для повідомлень кожного типу Наприклад, для повідомлення WMMOUSEMOVE поле wParam містить інформацію про стан клавіш миші (натиснуті або відпущені), а також про стан клавіш Ctrl і Shift, а поле IParam містить позицію курсора відносно початку клієнтської області вікна на відміну від поля pt, coдержащего позицію курсора миші щодо меж екрану (малюнок 11)

ГПуск|| ОКН01 | 12:53

Малюнок 11Окно з мінімальним набором елементів управління

Відзначимо, що додаток може обробляти не всі повідомлення, частина з них обробляються самої ОС або до попадання повідомлення в чергу потоку, або після вилучення повідомлення з черги і «усвідомлення», що додаток повідомлення даного типу не цікавить Розглянемо перший з цих випадків Наприклад, якщо клацнути лівою кнопкою миші на пункті меню, то замість повідомлення WMLBUTTONDOWN формується повідомлення WMCOMMAND, параметри якого містять ідентифікатор пункту меню, над яким був курсор миші в момент клацання Це позбавляє додаток від необхідності аналізу положення курсора миші при оцінці, потрапляє Чи курсів в прямокутну область, відповідну пункту меню

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

можна визначити тип змінної Ці символи називаються префіксом Так, префікс sz (String Zero) означає символьну рядок, що закінчується двійковим нулем, з (Char) символ, dw (Double Word) -32 бітна мінлива, lpsz (Long Pointer of String Zero) дальній (насправді ближній) Покажчик на символьний рядок, що закінчується двійковим нулем, h (Handle) дескриптор (описувач) обєкта, що містить інформацію про обєкт

Повідомлення від Windows мають префікс WM_, префікс ВМ_ відповідає повідомленнями від кнопок, префікс ЕМ_ повідомленнями від текстових полів редагування (EditBox), LB_ повідомленнями від списків

Джерело: Сучкова, ЛІ Win32 API: основи програмування: навчальний посібник / ЛІ Сучкова АлтГТУ ім ШІ Ползунова -Барнаул, АлтГТУ, 2010 138 с, іл

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*