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

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

 


 

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

77855. Особенности возмещения вреда при повреждении здоровья и причинения смерти гражданину 29 KB
  Однако результатом причиненного здоровью потерпевшего вреда может стать и стойкая или невосстановимая утрата им трудоспособности. Учитывается также грубая неосторожность самого потерпевшего содействовавшая возникновению или увеличению вреда. При этом размер возмещения уменьшается пропорционально степени вины потерпевшего. В случае смерти потерпевшего имущественные потери возникают у близких ему лиц которых он полностью или частично содержал при жизни будучи их кормильцем а также у лиц понесших расходы на его погребение.
77856. Компенсация морального вреда 23.5 KB
  Компенсация морального вреда Моральный вред – физические или нравственные страдания испытываемые гражданином при нарушении его личных неимущественных или иных нематериальных благ. В случае причинения морального вреда по решению суда он подлежит денежной компенсации которая определяется с учетом...
77857. Неосновательное обогащение 30.5 KB
  Фактический состав порождающий обязательства из неосновательного обогащения или сбережения имущества состоит из следующих элементов: а одно лицо приобретает или сберегает имущество за счет другого; Приобретение означает увеличение объема имущества у одного лица и одновременное уменьшение его объема у другого. Это могут быть действия самого потерпевшего уплата чужого долга; действия 3 лиц ошибочная выдача груза железной дорогой не получателю указанному в накладной а другому лицу; действия самого приобретателя имущества...
77858. Неустойка и задаток 27.5 KB
  Законная неустойка подлежит применению в случаях когда условие о неустойке не включено в договор или размер договорной неустойки меньше размера неустойки установленной законом. Стороны не могут своим соглашением уменьшить размер законной неустойки но при отсутствии прямого запрета в законе могут увеличить размер законной неустойки. Зачетная неустойка позволяет кредитору помимо неустойки требовать возмещения убытков в части не покрытой неустойкой то есть с зачетом неустойки. При штрафной неустойке кредитор вправе требовать возмещения в...
77859. Перемена лиц в обязательстве 29.5 KB
  Перемена лиц в обязательстве Договором или законом: в результате универсального правопреемства в правах кредитора; по решению суда о переводе прав кредитора на другое лицо когда возможность такого перевода предусмотрена законом; вследствие исполнения обязательства должника его поручителем или залогодателем не являющимся должником по этому обязательству; при суброгации страховщику прав кредитора к должнику ответственному за наступление страхового случая; в других случаях предусмотренных законом. Перемена кредитора: 1 в порядке...
77860. Понятие гражданского права как частного права 29 KB
  Понятие гражданского права как частного права С позиций учения о частном праве ГП следует определить как основную отрасль права регулирующего частные взаимоотношения граждан а также созданных ими юр. ГК закрепляет основные начала частного права: равенство участников имущ. В советское время после отказа от деления права на П и Ч из ГП в качестве самостоятельных правовых отраслей выделились С и ТП. организаций объединяемые понятиями права компаний или корпоративного права.
77861. Источники гражданского права 32 KB
  Из всех деловых обыкновений законодатель особо выделяет обычаи делового оборота которые применяются в сфере ПД. Указанные правила становятся источником лишь в том случае если они закреплены в каком-либо НА входящем в систему граж.
77862. Понятие, содержание и виды граж. правоотношений 28 KB
  Классификация гражданских правоотношений преследует не только теоретические но и практические цели заключающиеся в правильном уяснении прав и обязанностей сторон определении круга правовых норм подлежащих применению в процессе возникновения реализации и прекращения правоотношения....
77863. Граждане (физические лица) как субъекты 29.5 KB
  Гражданин (физическое лицо) как участник правоотношений обладает рядом признаков и свойств, которые определенным образом индивидуализируют его и влияют на его правовое положение. К таким признакам и свойствам следует отнести: имя, гражданство, возраст, семейное положение, пол, состояние здоровья.