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-файлом).  

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

 


 

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

50233. Вивчення спектральних характеристик фотоелементів 505 KB
  Прилади й обладнання Монохроматор типу УМ2 напівпровідниковий селеновий та вакуумний фотоелементи гальванометр джерело світла Опис установки Експериментальна установка для вивчення спектральних характеристик фотоелементів зібрана на базі монохроматора типу УМ2. 1 схематично вказані основні елементи установки в тому числі які входять і до складу монохроматора вони виділені в окрему групу елементів.1 світло від джерела випромінювання 1 фокусується конденсорною лінзою 3 на вхідній щілині 5 монохроматора і пройшовши через обєктив...
50234. Вивчення серіальних закономірностей в спектрі випромінювання водню і визначення сталої Планка 428.5 KB
  Найбільш вивченим є спектр атома водню. Частоти випромінювання атома водню можна описати узагальненою формулою Бальмера у вигляді 4.4: 1 де частота випромінювання атома водню при його переході з го енергетичного рівня на й енергетичний рівень...
50235. Социально-философский предпосылки становления социологии как науки 18.1 KB
  Сущность современной социальной жизни нельзя понять без сопоставления ее с прошлым. В течение 2,5 тыс. лет мыслители анализировали и описывали общество, накапливая базу социологического знания.
50237. Предмет и объект социологии, основные функции. Структура и уровни социологического знания 17.51 KB
  Социология – один из способов изучения людей. Социологи стремятся выяснить, «почему люди ведут себя определенным образом, почему они образуют группы, почему они поклоняются чему-то, женятся, разводятся, учатся, голосуют»
50238. Социологический проект О. Канта 15.72 KB
  Огюст Конт, давший название науке социологии, в своем творчестве руководствовался идеалами прогресса, политической и экономической свободы, надеждой на то, что с помощью науки и просвещения можно решить все социальные проблемы.
50239. Вивчення явища фотолюмінесценції 600 KB
  Прилади і обладнання Монохроматор УМ2 джерела випромінювання неонова лампочка ртутна лампа конденсорна лінза світлофільтр фотоюмінофор Опис установки Лабораторна установка зібрана на базі монохроматора УМ2 який використовується як спектроскоп.1 виділені оптичні елементи що входять до складу монохроматора. Випромінювання з люмінофора фокусується лінзою 5 на вхідну щілину монохроматора 7 і далі потрапляє на дисперсійну призму 9 через обєктив коліматора 8. За допомогою барабана довжин хвиль монохроматора на якому нанесені відносні...
50240. Г. Спенсер как основатель органической школы в социологии 15 KB
  Герберта Спенсера считают основателем органической школы в социологии. В фундаментальном труде Основы социологии (1877) Спенсер проводил аналогии между биологической и социальной эволюцией, между живым организмом и обществом
50241. Принципы построения бухгалтерского финансового учета 80.5 KB
  Информация, которая формируется в системе бухгалтерского учета хозяйствующих субъектов, должна отвечать требованиям всех заинтересованных пользователей. В зависимости от круга интересов различных групп пользователей информацией в системе бухгалтерского учета можно выделить взаимосвязанные подсистемы