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

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

 


 

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

24015. ИСТОРИЯ ОТЕЧЕСТВЕННОЙ ЖУРНАЛИСТИКИ 211.12 KB
  16 декабря этот указ был напечатан а уже 17 декабря появился в свет первый номер новой газеты Ведомости и его следует считать первенцем русской периодики. 27 декабря вышел следующий номер газеты имевший особое название Юрнал или поденная роспись что в мимошедшую осаду под крепостью Нотебурхом чинилось сентября с 26 числа в 1702 году. Очередной номер газеты изданный 2 января 1703 г. Эти лаконичные и разнообразные сообщения первого номера русской газеты полны глубокого смысла и подбор их великолепен.
24016. ИСТОРИЯ ЗАРУБЕЖНОЙ ЖУРНАЛИСТИКИ 139.3 KB
  Подзаголовок газеты: Казуистическая газета . Успех газеты был велик количество писем все росло. Острота вопроса в том что все это были газеты и журналы разных направлений. Ричард Стиль бывший в ту пору редактором официальной газеты решил использовать созданную Свифтом маску для издания нового журнала в 1709 г.
24017. ОБЩАЯ ТЕОРИЯ ЖУРНАЛИСТИКИ 73.5 KB
  Новостные блоки в СМИ и начинаются с сенсаций делая безнадежными поиски смысла в эфире. Общественное мнение и СМИ: диалектика взаимодействия.Индивидуальную картину мира человека создают СМИ. Уклон в развлечение во всех СМИ особенно в ТВ.
24018. ЖУРНАЛИСТИКА В СОВРЕМЕННОМ ИНФОРМАЦИОННОМ ПРОСТРАНСТВЕ 69.31 KB
  В информационном же пространстве разворачивается истинная журналистика не ограниченная правилами и цензурой пример СМИ vs СМК. Последствия информационнопсихологического воздействия СМИ глубокие изменения массового сознания. СМИ и информационное общество.общва поставила вопрос о роли в нем СМИ.
24019. ОРГАНИЗАЦИЯ РАБОТЫ СМИ 128.94 KB
  В других статьях определяется статус редакции учредителя и издателя их права обязанности и взаимоотношения. В Уставе наряду с другими сторонами ее статуса определяются взаимные права и обязанности учредителя редакции и возглавляющего ее главного редактора. Учредитель утверждает устав редакции и или заключает с ней или ее главным редактором договор. В Законе указывается что учредитель также может выступать в качестве редакции издателя распространителя собственника имущества редакции.
24020. РЕКЛАМА И ПИАР В ЖУРНАЛИСТИКЕ 44.71 KB
  Конечно интерес аудитории к СМИ определяется не рекламой хотя ее роль велика. Расцвет рекламы наступил когда к системе СМИ присоединилось телевидение. развитие радио как СМИ. Отношения служб паблик рилейшнз со СМИ.
24021. АВТОРСКОЕ ТВОРЧЕСТВО ЖУРНАЛИСТА 143.68 KB
  ОСОБЕННОСТИ ЖУРНАЛИСТСКОГО ТЕКСТА журналистский текст несет в себе особый вид информации журналистскую информацию актуальность связь конкретной ситуации с назревшей жизненной проблемой Чем глубже понял эту связь журналист и чем новее знание которое он получил в итоге тем актуальнее будет его публикация и тем больший резонанс она вызовет. Лазутина предлагает следующие правила монтажа журналистского текста: 1 соблюдать четкость предъявления текстовых элементов в их собственных границах Каждый текстовый элемент микросущность 2...
24022. Наружная сонная артерия, ее топография, ветви и области, кровоснабжаемые ими 227 KB
  carotis externa является одной из двух конечных ветвей общей сонной артерии. Она отделяется от общей сонной артерии в пределах сонного треугольника на уровне верхнего края щитовидного хряща. Вначале она расположена медиальнее внутренней сонной артерии а затем латеральнее ее. Начальная часть наружной сонной артерии снаружи покрыта грудиноключичнососцевидной мышцей а в области сонного треугольника поверхностной пластинкой шейной фасции и подкожной мышцей шеи.
24023. Поверхностные и глубокие вены нижней конечности, их анатомия, топография, анастомозы 263 KB
  К органам иммунной системы принадлежат костный мозг в котором лимфоидная ткань тесно связана с кроветворной тимус вилочковая железа лимфатические узлы селезенка скопления лимфоидной ткани в стенках полых органов пищеварительной дыхательной систем и. Многочисленные лимфатические узлы лежат на путях следования лимфы от органов и тканей в венозную систему. Лимфатические капилляры тимуса которых больше в корковом веществе образуют в паренхиме органа сети из которых формируются лимфатические сосуды впадающие в передние средостенные...