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

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

 


 

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

73713. Теорема о циркуляции вектора индукции магнитного поля 223 KB
  Рассмотрим провод с током выделим в нем прямолинейный участок и выделим в нем замкнутый контур. Выполним такое разбиение для каждого участка контура и просуммируем учтя что индукция магнитного поля созданного длинным проводом равна. Пусть теперь имеется много проводов и они пересекают поверхность натянутую на контур.
73715. Граничные условия для векторов и на границах раздела двух сред 384.5 KB
  Гаусса для вектора. Запишем поток вектора через поверхность. Устремим к нулю тогда где нормальная компонента вектора. получаем граничные условия вектора Выбреем замкнутый контур в виде прямоугольника со сторонами и и запишем теорему о циркуляции для вектора по данному замкнутому контуру.
73716. Парамагнетики. Диамагнетики. Ферромагнетики 164 KB
  Поместим наше тело во внешнее магнитное поле. Поле будем считать однородным. Суммарное поле будет больше. Если поместить атом во внешнее магнитное поле то электронная орбита начнет прецессироватьподробнее в лекции № 18.
73717. Уравнения кинематики манипулятора 1011.5 KB
  Манипулятор состоит из последовательности твердых тел (или звеньев), первое из которых соединено с опорной стойкой, а последнее снабжено рабочим инструментом
73718. Уравнения Ньютона-Эйлера 661 KB
  В предыдущих лекциях с помощью уравнений Лагранжа-Эйлера мы получили систему нелинейных дифференциальных уравнений, описывающих динамику движения манипулятора
73719. Аэрогеодезия, её задачи и назначение 6.79 MB
  В России до середины тридцатых годов комплекс работ по созданию карт по фотоснимкам местности полученным с летательного аппарата называли аэрофотосъёмкой. Понятие аэрофототопография охватывает комплекс процессов по созданию топографических карт по фотоснимкам местности полученным с авиационного летательного аппарата. Аэрогеодезия изучает способы получения и преобразования аэрофотоснимков земной поверхности методы получения по ним широкого спектра информации об объектах съёмки с целью составления топографических и специальных планов и карт...