38217

Робота з повідомленнями Windows

Лекция

Информатика, кибернетика и программирование

Повідомлення - це певне повідомлення про настання деякої події в системі. Кожна подія (рух „миші”, натиснення клавіші на клавіатурі, зміна розмірів вікна, тощо) заставляє ОС генерувати відповідне повідомлення і відправляти їх додаткам. Будь-яке повідомлення представляє собою певний запис, що передається додатку

Украинкский

2014-11-30

49 KB

0 чел.

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

Тема: Робота з повідомленнями Windows;

Теоретична частина.

 Повідомлення  - це певне повідомлення про настання деякої події в системі. Кожна подія (рух „миші”, натиснення клавіші на клавіатурі, зміна розмірів вікна, тощо)  заставляє ОС генерувати відповідне повідомлення і відправляти їх додаткам.  Будь-яке повідомлення  представляє собою певний запис, що передається додатку. Цей запис містить собою інформацію про подію в системі, а також додаткову інформацію, що потребується  при обробці повідомлення.  Наприклад, при натисненні клавіші миші передається повідомлення про натиск кнопки, а також координати вказівника миші.

Структура повідомлення представлена нижче у форматі DELPHI:

 TMsg = record

hWnd:HWND; //вказівник вікна якому передається повідомлення

 message:UINT; // ідентифікатор повідомлення

 WParam:WPARAM;// 32- біти Додаткові параметри

 LParam:LPARAM; // 32- біти Додаткові параметри

 Time:DWORD: // Час виникнення повідомлення

 Pt:TPoint; // Координати „миші” в момент виникнення повідомлення

end;

В інших  засобах розробки можливо і приймається інші назви цієї структури, проте її суть та розміри однакові для всіх. Перший параметр – це 32-бітний вказівник вікна, якому буде передано повідомлення (кожне вікно в ОС при створенні отримує унікальний 32-бітний ідентифікатор). Messageідентифікатор повідомлення, тобто безпосередньо унікальний номер повідомлення (в основному повідомлення представляють у вигляді назв констант, наприклад – константа WM_CHAR рівна значенню $0102 і при використанні даного повідомлення під записом WM_CHAR розуміється число $0102. Звичайно всі значення повідомлень та їх назви зберігаються в ОС.) Наступні параметри служать для передачі додаткової інформації про повідомлення.

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

   RegisterWindowMessage(strMes:string),

де  strMes – це назва повідомлення (константа). Функція повертає унікальний 32-бітний ідентифікатор (можна використати тип Integer) повідомлення. Далі дане значення можна використовувати в роботі. Називати повідомлення рекомендується з префіксом WM_ , використовуючи великі літери (наприклад, WM_MYMESSAGE).

В даній роботі ви будете розробляти додаток, що виносить власний ярлик в області System Tray (це область внизу біля годинника). При створенні даного ярлика необхідно вказати ОС, яке повідомлення відправляти назад додатку при настанні певної події з даним ярликом (натиснення лівої або правої кнопки миші, тощо). В якості такого повідомлення ви можете і вказати своє власне повідомлення, яке відповідно перед цим потрібно зареєструвати в системі. При настанні певної події з ярликом, вашому додатку буде відіслане вказане вами повідомлення з додатковою інформацією, що сталося.

Для винесення ярлика в область System Tray використовується функція  з модуля  ShellAPI.

Shell_NotifyIcon (dwMessage:DWORD,lpData:PNotifyIconData);

 

 де  dwMessage – визначає дію, яку потрібно виконати над іконкою. Може приймати наступні значення: NIM_ADD – добавлення нової іконки, NIM_MODIFY – редагування вже існуючої іконки, NIM_DELETE – знищення іконки.

lpDataце вказівник на структур TNotifyIconData. Дана структура має наступний вигляд:

TNotifyIconData= record

   cbSize: DWORD;

   Wnd: HWND;

   uID: UINT;

   uFlags: UINT;

   uCallbackMessage: UINT;

   hIcon: HICON;

   szTip: array [0..63] of AnsiChar;

 end;

cbSizeрозмірність даної структури. В основному ставлять рівною sizeOf(TNotifyIconData);

Wnd – дескриптор (хандл) вікна, якому буде відправлятись вказане повідомлення. Будь-який компонент має свій унікальний дескриптор, значення якого вказується в властивості HANDLE класу, що відповідає даному компоненту (Form1.HANDLE). Відповідно вказане вікно повинні „вміти” обробляти створене вами повідомлення (про це нижче).

uID -  ідентифікатор іконки. Визначається програмістом. Служить для ідентифікації іконок. При створенні іконки їй записується цей номер. В подальшому використовуючи цей номер можна змінювати та видаляти іконки.

uFlags – флаги, що вказують які поля з даної структури потрібно використовувати функції Shell_NotifyIcon. Приймати три значення, що  можуть компонуватись між собою за допомогою оператора or.

NIF_MESSAGE – буде використовуватись поле  uCallbackMessage;

NIF_ICON – буде використовуватись поле hIcon;

NIF_TIP – буде використовуватись поле  szTip.

В роботі вам потрібно буде використати комбінацію з усіх цих значень, а саме (будемо вважати, що змінна NID – змінна типу TNotifyIconData):

NID.uFlags:= NIF_MESSAGE or NIF_ICON or NIF_TIP;

 Такий запис визначає те, що функція Shell_NotifyIcon буде обробляти всі вказані поля (операція or можна використати і як операцію побітового додавання).

uCallbackMessage – ідентифікатор системного повідомлення, що буде надісланий вікну, дескриптор якого вказується в полі  Wnd. Відповідно вказане вікно і повинно обробляти дане повідомлення. При передачі повідомлення передається і наступна додаткова інформація : lParam – ідентифікатор іконки (поле uID), wParam – повідомлення від „миші”, що буде згенеровано на іконці. Може приймати такі значення:

WM_LBUTTONDOWNнатиснена ліва конка миші на іконціі.

WM_LBUTTONDBLCLK – подвійник „клік” миші на іконціі.

WM_RBUTTONDOWN – натиснена права конка миші на іконціі.

hIconHANDLE іконки, що буде зображене в SYSTEM TRAY.  DELPHI  підтримує тип TIcon, що містить такий вказівник.  TIcon – це є клас, тому перед використанням об’єктів даного класу їх потрібно створити конструктором (наприклад Icon:=TIcon.Create;), а далі використати метод LoadFromFILE, для завантаження зображення з файлу.

szTip - масив символів, що являє собою стрічку підказки, яка зявляється коли курсор миші розміщується над піктограмою.

Якщо у вас NID – змінна типу TNotifyIconData, то функцію створення піктограми можна викликати наступним чином:

Shell_NotifyIcon(NIM_ADD,@NID);

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

Тепер як обробляти повідомлення. Якщо повідомлення системне (тобто не зареєстроване користувачем), то можна скористатись директивою message, при оголошенні методів класу вікна. Дана процедура повинна містити один формальнй параметр типу TMessage . Якщо вікно буде отримувати дане повідомлення, то і відповідно автоматично буде викликатись даний метод. Проте такий підхід можливий тільки у випадку системний повідомлень, а так як у нас використовується повідомлення користувача, то такий підхід не допоможе.

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

procedure <назва процедури>(var Msg:TMessage);

 Наприклад:

Var

  FHWND: HWND;

procedure MessageMng(var Msg:TMessage);

begin

 if  Msg.Msg = <назва повідомлення> then

    begin

{.

 Обробка повідомлення

.}

end else

 begin

  {Якщо це не те повідомлення, то продовжити обробку}

  Msg.Result:= DefWindowProc(FHWND,Msg.Msg,Msg.WParam,Msg.LParam);

 end;

end; 

FHWND:=AllocateHWND(MessageMng)

FHWNDце і є дескриптор невізуального вікна, який потрібно передати у структурі TNotifyIconData

Завдання:

Завдання на 4 бали:

Створити додаток, що поміщує піктограму  в області System Tray, ховає додаток (функція ShowWindow(Application.Handle, sw_Hide) – сховати додаток; ShowWindow(Application.Handle, sw_ShowNormal) – показати додаток). При натиску на піктограму лівої кнопки миші – додаток повинен показатись, якщо права кнопка миші – виникає контекстне меню, в якому повинно бути два пункти – показати додаток та вихід з додатку (можна використати компонент PopupMenu та відображати його у місці де знаходить в даний момент „миша”. Функція GetCursorPos).

Завдання на 5  балів:

Завдання аналогічне попередньому, але користувач може сам задавати іконку, змінювати текст підказки. При чому користувач може додавати іконку, потім її редагувати, або знищити. Дії при натиску на іконку – аналогічні.  

Завдання на 6  балів:

Завдання аналогічне попередньому, але іконка повинна бути анімованою (задається анімованим GIF-файлом).  

Бажаємо успіху.

 


 

А также другие работы, которые могут Вас заинтересовать

31289. Дослідження комбінаційних схем, реалізованих за методом декомпозиції 1.2 MB
  Знайти гарантовано мінімальний вираз для довільної функції можна лише перебравши всі варіанти різних способів групування в процесі мінімізації що реально лише для невеликої кількості аргументів. З точки зору підходів до спрощення логічних виразів функції з якими має справу схемотехнік доцільно розділити на три групи: функції невеликої кількості аргументів €œоб’єктивні€ функції багатьох аргументів €œсуб’єктивні€ функції багатьох аргументів. До першої групи відносять функції трьохп’яти аргументів. Статистичний аналіз реальних схем...
31290. Дослідження схем синхронних та асинхронних цифрових автоматів з пам’яттю в пакеті Electronics Workbench 2.88 MB
  При моделюванні роботи синхронного автомата синхросерію слід подавати з генератора коливань обравши прямокутну форму імпульсів з параметрами близькими до вказаних на рис. Побудування логічних вентилів при синтезі синхронного автомата Якщо потрібно сформувати пам’ять автомата на Ттригерах не слід шукати їх в бібліотеці елементів так як їх фізично не існує необхідно побудувати Т тригер з JK тригера походячи з таблиці переходів. Часові діаграми роботи автомата слід скопіювати через буфер до редактора Paint або іншого графічного...
31291. Вивчення структури контролера КРВМ-2 та його засобів вводу-виводу 677.5 KB
  ЯПВВ - комірка програмованого вводу-виводу. Забезпечує зв’язок з зовнішніми об’єктами за будь-яким напрямком. До складу комірки входить мікросхема КР580ВВ55, порти якої з’єднані із зовнішніми приладами через шинні підсилювачі К589АП16, 2 шинних формувача КР580ВА86, мікросхеми К555ИД4 (здвоєний дешифратор 2 входи – 4 виходи), мікросхеми К155ТМ8 (4 D-тригери), К155ЛА3 (4 елементи 2І-НІ).
31292. Розрахунок генераторів пилкоподібної напруги 408 KB
  широко використовуються генератори пилкоподібної лінійнозмінної напруги. Часову діаграму пилкоподібної напруги наведено на рис.1 Часова діаграма пилкоподібної напруги Основними параметрами такої напруги є: тривалість робочого і зворотного ходу пилкоподібної напруги; період проходження імпульсів ; амплітуда імпульсів ; коефіцієнт нелінійності і коефіцієнт використання напруги джерела живлення .
31293. Розрахунок схем активних фільтрів 778 KB
  Апроксимація характеристик активних фільтрів зводиться до вибору таких коефіцієнтів цих поліномів що забезпечують найкраще в тому чи іншому значенні наближення до бажаних амплітудночастотної АЧХ чи фазочастотної характеристик фільтра.1 де відносна частота; частота зрізу; порядок фільтра. В фільтрі Чебишева апроксимуюча функція вибирається так щоб в смузі пропускання фільтра отримати відхилення його характеристики від ідеальної що не перевищує деякої заданої величини.2 де постійний коефіцієнт що визначає нерівномірність АЧХ...
31294. Мінімізація логічних функцій 449.5 KB
  Основна задача при побудові систем керування дискретними обєктами і процесами на основі логічних функцій: приведення логічних функцій керування до найбільш простого виду при якому система керування буде виконувати свої задачі. Для ручної мінімізації логічних функцій використовуються карти Карно і діаграми Вейча причому останні будують як розгорнення кубів на площині карти Карно.
31295. Тема: Синтез комбінаційних схем на мікросхемах середнього ступеня інтеграції Мета заняття:Закріпити отр. 1.08 MB
  Традиційно ця назва застосовується до вузлів робота яких не описується досить простим алгоритмом а задається таблицею відповідності входів і виходів.1 Якщо декодер має входів виходів і використовує всі можливі набори вхідних змінних то . Число входів і виходів декодера вказують таким чином: декодер 38 читається €œтри на вісім€ 416 410 неповний декодер. Мультиплексор – це функціональний вузол що здійснює підключення комутацію одного з декількох входів даних до виходу.