Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LAB-1-10.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
747.01 Кб
Скачать

9.2.Требования к программе:

Программа должна связывать или внедрять файлы, созданные другими приложениями и выполнять следующие функции:

  1. Выделять объект с помощью «мыши».

  2. Перемещать объект с помощью «мыши».

  3. Изменять размеры объекта с помощью «мыши».

В качестве внедряемого объекта рекомендуется использовать объект, представляющий растровое изображение (Bitmap Image Object)

Отчет должен содержать: постановку задачи, листинг кода всех модифицированных функций и их назначение, выводы .

9.3. Варианты заданий.

9.4.Контрольные вопросы

  1. Технология OLE.

  2. Приложение-контейнер.

  3. Приложение-сервер.

  4. Технология COM.

  5. Основные шаги создания проекта заготовки приложения-контейнера.

  6. Класс представления внедренного объекта в MFC.

  7. Функция перемещения внедренного объекта.

  8. Функция, определяющая текущее расположение объекта.

  9. Функция, хранящая информацию о размерах и координатах внедренных объектов.

  10. Объект, отображающий вокруг внедренного объекта рамку и изменяющий внешний вид указателя «мыши».

  11. Функция, переопределяющая изменения указателя мыши при позиционировании на внедренном объекте.

  12. Событие, определяющее выполнение OLE–действия, определенного для этого объекта.

  13. Функция удаления объекта.

10. Лабораторная работа № 10 Стили окон.

Цель работы. Изучение различных типов окон, которые может создать приложение Windows.

10.1. Теоретические сведения

Обычно ни одно приложение не ограничивается созданием главного окна приложения. Как правило, внутри главного окна создаются другие окна.

Для создания окна вам необходимо зарегистрировать класс окна. Есть классы окон, зарегистрированные при инициализации Windows. Ваше приложение может создавать окна либо на базе собственных классов (созданных и зарегистрированных приложением), либо на базе готовых классов, созданных и зарегистрированных самой операционной системой Windows.

Рассмотрим только об окнах, созданных приложениями на базе своих собственных классов окон. На базе одного класса окна приложение может создать несколько окон. Все эти окна могут быть сделаны в одном или нескольких стилях. Стиль окна определяет внешний вид окна и его поведение. Для класса окна также определяется понятие стиля - стиль класса определяет внешний вид и поведение всех окон, созданных на базе данного класса.

Стиль класса окна определяется при регистрации класса окна. Во всех предыдущих примерах приложений мы не задавали стиль окна, определяя содержимое соответствующего поля в структуре WNDCLASS следующим образом: wc.style = 0;

Стиль класса окна задается в виде отдельных битов, для которых в файле windows.h определены символические константы (табл.10.1.) с префиксом CS_: Табл.10.1.

Стиль

Описание

CS_BYTEALIGNCLIENT

Внутренняя область окна (client area) должна быть выровнена по границе байта видеопамяти. Иногда используется для ускорения процесса вывода изображения

CS_BYTEALIGNWINDOW

Все окно (не только внутренняя область окна) должно быть выровнено по границе байта видеопамяти

CS_CLASSDC

Необходимо создать единый контекст отображения, который будет использоваться всеми окнами, создаваемыми на базе данного класса

CS_DBLCLKS

Функция окна будет получать сообщения при двойном щелчке клавишей мыши (double click)

CS_GLOBALCLASS

Данный класс является глобальным и доступным другим приложениям. Другие приложения могут создавать окна на базе этого класса

CS_HREDRAW

Внутренняя область окна должна быть перерисована при изменении ширины окна

CS_NOCLOSE

В системном меню окна необходимо запретить выбор функции закрытия окна (строка Close будет отображаться серым цветом, и ее нельзя выбрать)

CS_OWNDC

Для каждого окна, определяемого на базе данного класса, будет создаваться отдельный контекст отображения

CS_PARENTDC

Окно будет пользоваться родительским контекстом отображения, а не своим собственным. Родительский контекст - это контекст окна, создавшего другое окно (см. дальше)

CS_SAVEBITS

Для данного окна Windows должна сохранять изображение в виде битового образа (bitmap). Если такое окно будет перекрыто другим окном, то после уничтожения перекрывшего окна изображение первого окна будет восстановлено Windows на основании сохраненного ранее образа

CS_VREDRAW

Внутренняя область окна должна быть перерисована при изменении высоты окна

Чаще всего используются стили CS_HREDRAW и CS_VREDRAW:

wc.style = CS_HREDRAW | CS_VREDRAW;

Если для класса заданы стили CS_HREDRAW и CS_VREDRAW, при изменении размеров окна функция окна может получить сообщение WM_PAINT. В этом случае функция окна должна перерисовать часть окна или все окно. Разумеется, если вы просто уменьшили размер окна, перерисовывать ничего не надо, и функция окна в этом случае не получит сообщения WM_PAINT.

Стиль CS_DBLCLKS используется при необходимости отслеживать двойные щелчки мышью. При этом в функцию окна посылаются сообщения WM_LBUTTONDBLCLK и WM_RBUTTONDBLCLK. Если этот стиль не будет задан, как бы быстро вы ни щелкали мышью, функция окна получит только идущие парами сообщения о том, что вы нажимаете и отпускаете левую или правую клавишу мыши.

Остальные приведенные выше классы окна используются реже. Мы будем рассказывать о них по мере необходимости.

Стиль окна. Определенный в классе окна стиль класса окна используется при создании на базе этого класса всех окон. Для дальнейшего уточнения внешнего вида и поведения окна используется другая характеристика - стиль окна. Стиль окна указывается при создании окна функцией CreateWindow. В наших примерах основное окно приложения не имело стиля класса окна, но для него был определен стиль окна WS_OVERLAPPEDWINDOW:

hwnd = CreateWindow(

szClassName, // имя класса окна

szWindowTitle, // заголовок окна

WS_OVERLAPPEDWINDOW, // стиль окна

CW_USEDEFAULT, // задаем размеры и расположение

CW_USEDEFAULT, // окна, принятые по умолчанию

CW_USEDEFAULT,

CW_USEDEFAULT,

0, // идентификатор родительского окна

0, // идентификатор меню

hInstance, // идентификатор приложения

NULL); // указатель на дополнительные

// параметры

Для определения стиля окна используются символические константы с префиксом WS_, определенные в файле windows.h. С помощью этих констант можно определить примерно два десятка стилей окна, однако чаще всего используются несколько основных стилей.

Мы рассмотрим три основных стиля окон - перекрывающиеся окна (overlapped window), временные окна (pop-up window) и дочерние окна (child window).

Перекрывающиеся (overlapped) окна обычно используются в качестве главного окна приложения. Такие окна имеют заголовок (title bar), рамку и, разумеется, внутреннюю часть окна (client region). Дополнительно перекрывающиеся окна могут иметь (а могут и не иметь) системное меню, кнопки для максимального увеличения размера окна и для сворачивания окна в пиктограмму, вертикальную и горизонтальную полосу просмотра (scroll bar) и меню.

В первых версиях операционной системы Windows (версии 1.х) окна располагались рядом и назывались tiled window (tile - черепица). Сейчас такие окна не используются, вместо них появились перекрывающиеся окна, способные перекрывать окна других приложений. Перекрывающиеся окна называются также окнами верхнего уровня (top-level window).

Файл windows.h содержит следующее определение стиля перекрывающегося окна:

#define WS_OVERLAPPED 0x00000000L

Для определения стиля перекрывающегося окна необходимо использовать символическую константу WS_OVERLAPPEDWINDOW, определенную как логическое ИЛИ нескольких констант:

#define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED | WS_CAPTION | \

WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | \

WS_MAXIMIZEBOX)

Константа WS_OVERLAPPED определяет базовый стиль окна - перекрывающееся окно. Стиль WS_OVERLAPPEDWINDOW в добавление к базовому указывает, что окно должно иметь заголовок (константа WS_CAPTION ), системное меню (WS_SYSMENU), толстую рамку для изменения размера окна (WS_THICKFRAME), кнопку минимизации размера окна (WS_MINIMIZEBOX) и кнопку для максимального увеличения размера окна (WS_MAXIMIZEBOX). Если окно имеет заголовок, вы можете его перемещать по экрану.

Если в предыдущем примере изменить стиль окна, то создаётся свой собственный с использованием приведенных выше констант.

Приложение Windows может создавать несколько окон, связанных между собой "узами родства" и "отношениями собственности". В частности, при создании перекрывающегося окна при помощи функции CreateWindow в качестве восьмого параметра функции вы можете указать так называемый идентификатор окна-владельца. Окно-владелец уже должно существовать на момент создания второго окна, имеющего владельца.

Таким образом, если созданы несколько перекрывающихся окон, одни окна могут принадлежать другим.

Если окно-хозяин сворачивается в пиктограмму, все окна, которыми оно владеет, становятся невидимыми. Если вы сначала свернули в пиктограмму окно, которым владеет другое окно, а затем и окно-хозяин, пиктограмма первого (подчиненного) окна исчезает.

Если уничтожить окно, автоматически уничтожаются и все принадлежащие ему окна.

Обычное перекрывающееся окно, не имеющее окна-владельца, может располагаться в любом месте экрана и принимать любые размеры. Подчиненные окна располагаются всегда над поверхностью окна-владельца, загораживая его.

Координаты создаваемых функцией CreateWindow перекрывающихся окон указываются по отношению ко всему экрану. Таким образом, если создать перекрывающееся окно с координатами (0, 0), оно будет расположено в верхнем левом углу экрана.

Временные (pop-up) окна. Другим базовым стилем является стиль временных окон, которые обычно используются для вывода информационных сообщений и остаются на экране непродолжительное время. Временные окна имеют стиль WS_POPUP, определенный в файле windows.h следующим образом:

#define WS_POPUP 0x80000000L

Временные окна, в отличие от перекрывающихся, могут не иметь заголовок (title bar). Если для временного окна определен заголовок, оно может иметь и системное меню. Часто для создания временных окон, имеющих рамку, используется стиль WS_POPUPWINDOW, определенный в файле windows.h следующим образом:

#define WS_POPUPWINDOW (WS_POPUP | WS_BORDER | WS_SYSMENU)

Если надо добавить к временному окну системное меню и заголовок, стиль WS_POPUPWINDOW следует использовать в комбинации со стилем WS_CAPTION, добавляющим заголовок.

Временные окна могут иметь окно владельца и могут сами владеть другими окнами. Все замечания, сделанные нами относительно владения перекрывающимися окнами, справедливы и для временных окон.

Начало системы координат, используемой при создании временных окон, находится в левом верхнем углу экрана. Поэтому при создании временных окон используются экранные координаты (так же, как и при создании перекрывающихся окон).

При изменении размеров временного окна (так же, как и дочернего) функция окна получает сообщение WM_PAINT, в параметрах которого указаны новые размеры окна.

В общем случае вы можете рассматривать временные окна как специальный вид перекрывающихся окон.

Дочерние окна чаще всего используются приложениями Windows. Эти окна нужны для создания органов управления, например таких, как кнопки или переключатели. Windows имеет множество классов, на базе которых созданы стандартные органы управления - кнопки, полосы просмотра и т. п. Все эти органы управления представляют собой дочерние окна. Позже вы будете ими активно пользоваться

Базовый стиль дочерних окон определяется при помощи константы WS_CHILD:

#define WS_CHILD 0x40000000L

По аналогии с другими базовыми стилями в файле windows.h определена константа WS_CHILDWINDOW, которая полностью эквивалентна константе WS_CHLD:

#define WS_CHILDWINDOW (WS_CHILD)

В отличие от перекрывающихся и временных окон дочерние окна, как правило, не имеют рамки, заголовка, кнопок минимизации и максимального увеличения размера окна, а также полос просмотра. Дочерние окна сами рисуют все, что в них должно быть изображено.

Особенности дочерних окон.

  1. Само собой разумеется, что дочерние окна должны иметь окно-родителя (окон-сирот не бывает!). Только дочерние окна могут иметь родителей, перекрывающие и временные окна могут иметь окно-хозяина, но не родителя. У дочерних окон могут быть "братья" (или "сестры", кому, что больше нравится).

  2. Дочерние окна всегда располагаются на поверхности окна-родителя. При создании дочернего окна начало системы координат расположено в левом верхнем углу внутренней поверхности окна-родителя (но не в верхнем углу экрана, как это было для перекрывающихся и временных окон).

  3. Так как дочерние окна перекрывают окно-родителя, если вы сделаете щелчок мышью над поверхностью дочернего окна, сообщение от мыши попадет в функцию дочернего, но не родительского окна.

  4. При создании дочернего окна в качестве девятого параметра (вместо идентификатора меню, которого не может быть у дочернего окна) функции CreateWindow необходимо указать созданный вами идентификатор дочернего окна. Таким образом, если для какого-либо окна приложения вы создаете несколько дочерних окон, необходимо для каждого окна указать свой идентификатор (типа int). Этот идентификатор будет использован дочерним окном при отправлении сообщений родительскому окну, поэтому вы должны при создании разных дочерних окон использовать разные идентификаторы, хотя это и не обязательно.

  5. Дочернее окно как бы "прилипает" к поверхности родительского окна и перемещается вместе с ним. Оно никогда не может выйти за пределы родительского окна. Все дочерние окна скрываются при сворачивании окна-родителя в пиктограмму и появляются вновь при восстановлении родительского окна.

  6. При изменении размеров родительского окна дочерние окна, на которых отразилось такое изменение (которые вышли за границу окна и появились вновь), получают сообщение WM_PAINT. При изменении размеров родительского окна дочерние окна не получают сообщение WM_SIZE. Это сообщение попадает только в родительское окно.

Список стилей окна. Полный список возможных стилей окна, определенных в виде символических констант в файле windows.h. Некоторые из стилей приведены в табл.10.2.

Табл. 10.2.

Имя константы

Описание стиля

WS_BORDER

Окно с рамкой

WS_CAPTION

Окно с заголовком. Этот стиль несовместим со стилем WS_DLGFRAME. При использовании стиля WS_CAPTION подразумевается использование стиля WS_BORDER

WS_CHILD

Дочернее окно. Несовместим со стилем WS_POPUP

WS_CHILDWINDOW

То же самое, что и WS_CHILD

WS_CLIPCHILDREN

Этот стиль используется при создании родительского окна. При его использовании родительское окно не перерисовывает свои внутренние области, занятые дочерними окнами

WS_CLIPSIBLINGS

При указании этого стиля дочерние окна не перерисовывают свои области, перекрытые "братьями", то есть другими дочерними окнами, имеющими тех же родителей

WS_DISABLED

Вновь созданное окно сразу становится заблокированным (не получает сообщения от мыши и клавиатуры)

WS_DLGFRAME

Окно с двойной рамкой без заголовка. Несовместим со стилем WS_CAPTION.

WS_GROUP

Определяет первый орган управления в группе органов управления. Используется только в диалоговых панелях

WS_HSCROLL

В окне создается горизонтальная полоса просмотра

WS_ICONIC

То же самое, что и WS_MINIMIZE

WS_MAXIMIZE

Создается окно максимально возможного размера

WS_MAXIMIZEBOX

Окно содержит кнопку для увеличения его размера до максимально возможного. Этот стиль необходимо использовать вместе со стилями WS_OVERLAPPED или WS_CAPTION, в противном случае указанная кнопка не появится

WS_MINIMIZE

Создается окно, уменьшенное до предела (свернутое в пиктограмму). Этот стиль необходимо использовать вместе со стилем WS_OVERLAPPED

WS_MINIMIZEBOX

Окно содержит кнопку для сворачивания окна в пиктограмму (минимизации размеров окна). Этот стиль необходимо использовать вместе со стилем WS_OVERLAPPED или WS_CAPTION, в противном случае указанная кнопка не появится

WS_OVERLAPPED

Создается перекрывающееся окно, имеющее заголовок и рамку

WS_OVERLAPPEDWINDOW

Создается перекрывающееся окно, имеющее заголовок, рамку для изменения размера окна, системное меню, кнопки для изменения размеров окна. Этот стиль является комбинацией стилей WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX и WS_MAXIMIZEBOX

WS_POPUP

Создается временное (pop-up) окно

WS_POPUPWINDOW

Комбинация стилей WS_POPUP, WS_BORDER и WS_SYSMENU. Для того чтобы сделать системное меню доступным, необходимо дополнительно использовать стиль WS_CAPTION

WS_SYSMENU

Окно должно иметь системное меню

WS_TABSTOP

Этот стиль указывает орган управления, на который можно переключиться при помощи клавиши <Tab>. Данный стиль может быть использован только дочерними окнами в диалоговых панелях

WS_THICKFRAME

Окно должно иметь толстую рамку для изменения размера окна

WS_VISIBLE

Создается окно, которое сразу становится видимым. По умолчанию окна создаются невидимыми, и для их отображения требуется вызывать функцию ShowWindow

WS_VSCROLL

В окне создается вертикальная полоса просмотра

WS_TILED

Устаревший стиль, аналогичен WS_OVERLAPPED

WS_SIZEBOX

Устаревший стиль, аналогичен WS_THICKFRAME

WS_TILEDWINDOW

Устаревший стиль, аналогичен WS_OVERLAPPEDWINDOW

MDIS_ALLCHILDSTYLES

Этот стиль используется при создании дочерних MDI-окон и определяет окна, которые могут иметь любые комбинации стилей. По умолчанию дочерние MDI-окна имеют стили WS_MINIMIZE, WS_MAXIMIZE, WS_VSCROLL, WS_HSCROLL

Приведенные выше стили не всегда совместимы друг с другом. Например, перекрывающееся окно не может быть одновременно еще и временным. Пользуясь приведенной ниже таблицей (табл.10.3), вы сможете определить совместимость стилей. В этой таблице символом "+" отмечены стили, которые можно использовать для создания перекрывающихся, временных и дочерних окон.

Табл. 10.3.

Имя константы

Перекрывающееся окно

Временное окно

Дочернее окно

WS_BORDER

+

+

+

WS_CAPTION

+

+

+

WS_CHILD

+

WS_CHILDWINDOW

+

WS_CLIPCHILDREN

+

+

+

WS_CLIPSIBLINGS

+

WS_DISABLED

+

+

+

WS_DLGFRAME

+

+

+

WS_GROUP

+

WS_HSCROLL

+

+

+

WS_ICONIC

+

WS_MAXIMIZE

+

WS_MAXIMIZEBOX

+

+

+

WS_MINIMIZE

+

WS_MINIMIZEBOX

+

+

+

WS_OVERLAPPED

+

WS_OVERLAPPEDWINDOW

+

WS_POPUP

+

WS_POPUPWINDOW

+

WS_SYSMENU

+

+

+

WS_TABSTOP

+

WS_THICKFRAME

+

+

+

WS_VISIBLE

+

+

WS_VSCROLL

+

+

+

WS_TILED

+

WS_SIZEBOX

+

+

+

WS_TILEDWINDOW

+

MDIS_ALLCHILDSTYLES

В дополнение к перечисленным выше стилям, используемым при создании окон функцией CreateWindow, существуют так называемые расширенные стили окна (extended window styles). Окна с расширенными стилями должны создаваться функцией CreateWindowEx. Эта функция имеет следующий прототип:

HWND CreateWindowEx(DWORD dwExStyle,

LPCSTR lpszClassName, LPCSTR lpszWindowName,

DWORD dwStyle,

int x, int y, int nWidth, int nHeight,

HWND hwndParent, HMENU hmenu, HINSTANCE hinst,

void FAR* lpvCreateParams);

Функции CreateWindowEx в качестве первого параметра (dwExStyle) необходимо указать расширенный стиль окна. Остальные параметры в точности соответствуют параметрам функции CreateWindow.

В табл.10.4 приведен список расширенных стилей окна.

Табл. 10.4.

Имя константы

Описание стиля

WS_EX_ACCEPTFILES

Окно способно принимать файлы, перенесенные с использованием технологии drag-drop

WS_EX_DLGMODALFRAME

Окно имеет двойную рамку и дополнительно может иметь стиль WS_CAPTION

WS_EX_NOPARENTNOTIFY

Дочернее окно с этим стилем не будет посылать родительскому окну сообщение WM_PARENTNOTIFY. Обычно, когда дочернее окно создается или уничтожается или когда вы щелкаете мышью над дочерним окном, это сообщение посылается родительскому окну

WS_EX_TOPMOST

Окно будет видно всегда, даже когда оно заблокировано

WS_EX_TRANSPARENT

Этот стиль позволяет создать прозрачное окно. Оно получает сообщение WM_PAINT только после того, как все окна-братья получили сообщение WM_PAINT и обновили свои окна

Табл. 10.5. - таблица совместимости расширенных стилей с перекрывающимися, временными и дочерними окнами.

Табл. 10.5.

Имя константы

Перекрывающееся окно

Временное окно

Дочернее окно

WS_EX_ACCEPTFILES

+

+

+

WS_EX_DLGMODALFRAME

+

+

+

WS_EX_NOPARENTNOTIFY

+

WS_EX_TOPMOST

+

+

WS_EX_TRANSPARENT

+

+

+

10.2.Требования к программе:

Реализовать программу, отображающую окна (минимум пять) различных стилей и содержащую окна различных типов ()минимум три.

Отчет должен содержать: постановку задачи, листинг кода всех модифицированных функций и их назначение, выводы .

10.3. Варианты заданий.

10.4.Контрольные вопросы

  1. Класс окна

  2. Стиль окна

  3. Различные стили окон

  4. Расширенные стили окон

  5. Установка стиля окна

11. Лабораторная работа № 11

Расширения оболочки среды.

Цель работы: Изучение расширений оболочки среды. Использование системного лотка.

11.1.Теоретические сведения.

Об индикаторах на панели задач. На панели задач Microsoft® Windows® выделена область индикаторов, в которой программа может разместить значки сообщающий о статусе какой-либо операции или уведомляющий пользователя о том или ином событии. Например, можно вывести на панель задач значок принтера и тем самым показать, что выполняется задание на печать. Область индикаторов располагается в правой части панели задач (если она находится в горизонтальном положении) или внизу (если она находится в вертикальном положении).

Значок на панели задач можно сопоставить с элементом управления «всплывающая подсказка». Кроме того, система может посылать программе уведомляющие сообщения всякий раз, когда в области прямоугольника, ограничивающего значок, происходят какие-либо события, связанные с мышью.

Передача сообщений. Приложение добавляет, модифицирует или удаляет значки на панели задач, отправляя сообщения. Чтобы послать такое сообщение, используйте функцию Shell_NotifyIcon. В число ее параметров входят идентификатор передаваемого сообщения (например, NIM_ADD) и адрес структуры NOTIFYICONDATA. Элементы этой структуры содержат информацию, необходимую системе для обработки данного сообщения.

Чтобы добавить значок в область индикаторов на панели задач, отправьте сообщение NIM_ADD. При этом структура NOTIFYICONDATA должна содержать описатель и идентификатор значка, а также (если это необходимо) текст всплывающей подсказки для данного значка. Если панель задач отображает часы, система размещает новый значок по левую сторону от часов. В ином случае значок появляется у правой или нижней границы панели задач. Любые существующие значки смещаются левее, чтобы освободить место для нового значка. В Microsoft® Windows® XP поведение системного лотка было изменено: теперь значки добавляются слева, а существующие значки сдвигаются вправо.

Приложение может удалить значок с панели задач, послав сообщение NIM_DELETE. Кроме того, передав сообщение NIM_MODIFY, программа способна модифицировать информацию о каком-либо значке на панели задач, в том числе его описатель, текст всплывающей подсказки и идентификатор ответного сообщения.

Прием ответных сообщений. С каждым значком на панели задач программа может сопоставить ответное сообщение. Если значку присвоено такое сообщение, система передает его в программу всякий раз, когда в границах значка возникают какие-либо события, связанные с мышью. Благодаря этому механизму система способна уведомлять приложение о том, что пользователь щелкнул значок (один раз или дважды) или переместил курсор мыши на прямоугольник, ограничивающий данный значок.

Приложение определяет ответное сообщение для значка в момент его добавления к панели задач. Элемент uCallbackMessage структуры NOTIFYICONDATA, передаваемый с сообщением NIM_ADD, задает идентификатор ответного сообщения. Как только происходит событие, связанное с мышью, система посылает ответное сообщение в окно, указанное в элементе hWnd.

При этом параметр lParam – идентификатор сообщения от мыши, сгенерированного системой в результате «мышиного» события. Например, когда курсор мыши оказывается в пределах значка на панели задач, параметр lParam ответного сообщения содержит идентификатор WM_MOUSEMOVE, а параметр wParam – идентификатор данного значка.

Использование области индикаторов на панели задач. Ниже приведен ряд примеров, демонстрирующих, как добавлять и удалять значки в области индикаторов на панели задач, и как обрабатывать их ответные сообщения.

Добавление и удаление значков. Вы добавляете значок в область индикаторов на панели задач, заполняя структуру NOTIFYICONDATA и передавая ее через сообщение NIM_ADD.

Элементы этой структуры должны определять описатель окна, добавляющего значок, а также описатель и идентификатор значка. Вы можете указать текст всплывающей подсказки для этого значка и – если хотите, чтобы значок принимал сообщения от мыши, - идентификатор ответного сообщения, на основе которого система будет передавать сообщение нужному окну.

Рассмотрим функцию, иллюстрирующую, как добавить значок на панель задач:

// AddIconToSysTray добавляет значок в область индикаторов на панели задач

// hwnd - описатель окна, принимающего сообщения

// uID - идентификатор значка

// hIcon - описатель значка

// lpszTip - текст всплывающей подсказки

// uCallBackMess - сообщение, которое будет при действиях мыши

BOOL AddIconToSysTray(HWND hwnd,UINT uID,HICON hIcon, LPCSTR lpszTip, UINT uCallBackMess) {

BOOL res;

NOTIFYICONDATA tnid;

// Заполняем поля структуры для добавления значка

tnid.cbSize = sizeof(NOTIFYICONDATA);

tnid.hWnd = hwnd;

tnid.uID = uID;

tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;

tnid.uCallbackMessage=uCallBackMess;

tnid.hIcon=hIcon;

if (lpszTip)

lstrcpyn(tnid.szTip,lpszTip,sizeof(tnid.szTip));

else

tnid.szTip[0]='\0';

// Добавляем значок на панель задач

res = Shell_NotifyIcon(NIM_ADD,&tnid);

return res;

}

Чтобы удалить значок из области индикаторов на панели задач, Вы должны заполнить структуру NOTIFYICONDATA и передать ее системе в контексте сообщения NIM_DELETE. При удалении значка достаточно определить только элементы cbSize, hWnd и uID, как показано в следующем примере (функция удаления значка из панели задач):

// DelIconFromSysTray удаляет значок из области индикаторов на панели задач

// hwnd - описатель окна, принимающего сообщения

// uID - идентификатор значка

BOOL DelIconFromSysTray(HWND hwnd,UINT uID) {

BOOL res;

NOTIFYICONDATA tnid;

// Заполняем поля структуры для удаления значка

tnid.cbSize = sizeof(NOTIFYICONDATA);

tnid.hWnd = hwnd;

tnid.uID = uID;

// Удаляем значок

res = Shell_NotifyIcon(NIM_DELETE,&tnid);

return res;

}

Чтобы изменить состояние значка в области индикаторов на панели задач (для изменения всплывающей подсказки или значка, что может индицировать состояние программы), необходимо заполнить структуру NOTIFYICONDATA и передать ее системе в контексте сообщения NIM_MODIFY.

Пример функции приведен ниже.

// ModifyIconInSysTray модифицирует значок в области индикаторов панели задач

// hwnd - описатель окна, принимающего сообщения

// uID - идентификатор значка

// hIcon - описатель значка

// lpszTip - текст всплывающей подсказки

BOOL ModifyIconInSysTray(HWND hwnd,UINT uID,HICON hIcon,

LPCSTR lpszTip,UINT uCallBackMess) {

BOOL res;

NOTIFYICONDATA tnid;

// Заполняем поля структуры для изменения значка

tnid.cbSize = sizeof(NOTIFYICONDATA);

tnid.hWnd = hwnd;

tnid.uID = uID;

tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;

tnid.hIcon=hIcon;

tnid.uCallbackMessage=uCallBackMess;

if (lpszTip)

lstrcpyn(tnid.szTip,lpszTip,sizeof(tnid.szTip));

else

tnid.szTip[0]='\0';

// Изменяем значок

res = Shell_NotifyIcon(NIM_MODIFY,&tnid);

return res;

}

Распознавание событий, связанных с мышью. Если Вы определите идентификатор ответного сообщения для значка на панели задач, система уведомит Вашу программу, когда в ограничивающем значок прямоугольника произойдет какое-либо событие, связанное с мышью. Параметр wParam этого сообщения определяет идентификатор значка на панели задач, а параметр lParam – сообщение от мыши, которое система сгенерировала в ответ на событие.

Ниже приведен пример функции, взятой из программы (написанной без использования библиотеки MFC), которая добавляет на панель задач два значка – аккумулятора и принтера. Программа вызывает эту функцию, получив ответное сообщение. Функция проверяет, щелкнул ли пользователь один из этих значков, и, если действительно щелкнул, вызывает функцию, отвечающую за вывод информации о состоянии соответствующего устройства.

// ON_MYWM_NOTIFYICON обрабатывает ответные сообщения для значков

// на панели задач

// wParam – первый параметр ответного сообщения;

// lParam – второй параметр ответного сообщения.

void ON_MYWM_NOTIFYICON (WPARAM wParam, LPARAM lParam) {

UINT uID;

UINT uMouseMsg;

uID = (UINT) wParam;

uMouseMsg = (UINT) lParam;

if (uMouseMsg == WM_LBUTTONDOWN) {

switch (uID) {

case IDI_MYBATTERYICON:

// Пользователь щелкнул значок аккумулятора

// Сообщаем о состоянии аккумулятора

ShowBatteryStatus();

break;

case IDI_MYPRINTERICON:

// Пользователь щелкнул значок принтера

// Сообщаем о состоянии распечатки задания

ShowJobStatus();

break;

default:

break;

}

}

return;

}

Для добавления обработчика событий значка в системном лотке необходимо проделать следующие шаги.

  1. В блок “Generated message map functions” объявления класса окна добавить прототип обработчика событий вида: afx_msg LRESULT OnTrayIcon(WPARAM wParam, LPARAM lParam).

  2. В карту сообщений класса окна добавить пункт: ON_MESSAGE(SYSTRAY_ICON_MESSAGE, OnTrayIcon).

  3. Добавить в реализацию класса функцию обработчик события: LRESULT CMainDlg::OnTrayIcon(WPARAM wParam, LPARAM lParam) {

}.

Для определения своих сообщений желательно использовать конструкцию вида:

#define SYSTRAY_ICON_MESSAGE WM_USER + 10

Это необходимо для того, чтобы случайно не выбрать в качестве номера своего сообщения номер стандартного сообщения. Добавление к константе WM_USER какого-либо числа гарантирует это, так как номера всех стандартных сообщений находятся в интервале от 1 до WM_USER.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]