Титульный

29.01.2018


CheckDlgButton

 Top Previous Next

Изменяет состояние выбора для элемента управления кнопки.

Прототип

BOOL CheckDlgButton(

_In_ HWND hDlg,

_In_ int nIDButton,

_In_ UINT uCheck

);

Параметры

hDlg[in]

Описатель диалогового окна, которому принадлежит кнопка.

nIDButton[in]

Идентификатор кнопки.

uCheck[in]

Новое состояние кнопки. Он принимает одно из значений перечисленных ниже.

BST_CHECKED - переводи кнопку в выбранное состояние.

BST_INDETERMINATE - переводит кнопку в неопределенное состояние. Используйте это значение только если у кнопки установлен стиль BS_3STATE или BS_AUTO3STATE.

BST_UNCHECKED - переводит кнопку в невыбранное состояние.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Функция CheckDlgButton отправляет кнопке сообщение BM_SETCHECK.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


CheckRadioButton

Устанавливает пометку выбора на заданном переключателе (radio button) в группе и удаляет эту пометку с других переключателей в группе.

Прототип

BOOL CheckRadioButton(

_In_ HWND hDlg,

_In_ int nIDFirstButton,

_In_ int nIDLastButton,

_In_ int nIDCheckButton

);

Параметры

hDlg[in]

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

nIDFirstButton[in]

Идентификатор первого переключателя в группе.

nIDLastButton[in]

Идентификатор последнего переключателя в группе.

nIDCheckButton[in]

Идентификатор переключателя, который должен быть выбран.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Функция CheckRadioButton отправляет сообщение BM_SETCHECK каждому переключателю в группе.

Параметры nIDFirstButton и nIDLastButton определяют диапазон идентификаторов кнопок. Положение кнопок в последовательности обхода по клавише Tab не имеет значения. Если кнопка входит в состав группы, но её идентификатор выходит за указанные границы, то функция CheckRadioButton никак на неё не повлияет.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


IsDlgButtonChecked

Определяет в каком из трех состояний находится элемент управления кнопка: выбран, не выбран или неопределенное.

Прототип

UINT IsDlgButtonChecked(

_In_ HWND hDlg,

_In_ int nIDButton

);

Параметры

hDlg[in]

Описатель диалогового окна, которому принадлежит кнопка.

nIDButton[in]

Идентификатор кнопки.

Возвращаемое значение

Допустимые значения возвращаемые для кнопок с установленным стилем BS_AUTOCHECKBOX, BS_AUTORADIOBUTTON, BS_AUTO3STATE, BS_CHECKBOX, BS_RADIOBUTTON или BS_3STATE перечислены ниже.

BST_CHECKED - кнопка выбрана.

BST_INDETERMINATE - кнопка в неопределенном состоянии (применяется только если у кнопки установлен стиль BS_3STATE или BS_AUTO3STATE).

BST_UNCHECKED - конопка не выбрана.

Пример использования

Пример использования приведен здесь.

Примечание

Функция IsDlgButtonChecked отправляет сообщение BM_GETCHECK заданному элементу управления кнопки.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


Сообщения

BCM_FIRST

(0x1600)

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

BCM_GETIDEALSIZE

(BCM_FIRST + 0x0001)

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

wParam не используется. Должно быть равно нулю.

lParam указатель на структуру SIZE, в которую будет записан желательный размер кнопки с учетом заголовка и списка изображений (image list), если он есть. Вызывающее приложение отвечает за выделение памяти под эту структуру. Для получения желательной ширины и высоты установите значения полей cx и cy структуры SIZE равными нулю. Для указания ширины кнопки, установите желаемое значение в поле cx. Система рассчитает идеальную высоту для данной ширины и вернет её в поле cy,

В случае успеха возвращается значение TRUE. В случае ошибки - FALSE.

Если желательная ширина кнопки неизвестна, то вы должны установить значение обоих полей структуры SIZE равным нулю для вычисления и возвращения идеальной ширины и высоты. Если значение поля cx больше нуля, то это значение принимается как желательная ширина кнопки, идеальная высота для кнопки вычисляется для этой ширины и возвращается в поле cy. Возможность вычисления идеальной высоты для заданной ширины кнопки недоступна в Windows XP.

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

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

Для использования этого сообщения вы должны предоставить манифест для Comclt32.dll версии 6.0.

BCM_GETIMAGELIST

(BCM_FIRST + 0x0003)

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

wParam не используется, должен быть равен нулю.

lParam содержит указатель на структуру BUTTON_IMAGELIST, которая содержит информацию о коллекции изображений.

Если сообщение успешно обработано, то возвращается значение TRUE. В противном случае возвращается значение FALSE.

Для использования этого сообщения вы должны предоставить манифест для Comclt32.dll версии 6.0.

BCM_GETNOTE

(BCM_FIRST + 0x000A)

Появилось в Windows Vista. Получает текст примечания (text of the note) командной кнопки (command link button). Вы можете отправить это сообщение непосредственно или использовать макрос Button_GetNote.

wParam содержит размер буфера, на который указывает параметр lParam.

lParam содержит указатель на строковый буфер, в который будет записан запрошенный текст. Буфер должен быть достаточно большим для вмещения завершающего NULL символа.

Если сообщение успешно обработано, то возвращается значение TRUE. В противном случае возвращается значение FALSE.

Сообщение BCM_GETNOTE применимо только для кнопок, у которых установлен стиль BS_COMMANDLINK или BS_DEFCOMMANDLINK.

Функция GetLastError в случае ошибки может возвращать одно из значений, перечисленных ниже:

ERROR_NOT_SUPPORTED - у кнопки не установлен стиль BS_COMMANDLINK или BS_DEFCOMMANDLINK.

ERROR_INSUFFICIENT_BUFFER - буфер lParam слишком мал. в этом случае в параметр wParam будет записан необходимый размер буфера в символах.

Согласно комментариям к соответствующей статье msdn параметр wParam является указателем на переменную типа DWORD.

BCM_GETNOTELENGTH

(BCM_FIRST + 0x000B)

Появилось в Windows Vista. Получает длину текста примечания (note text), которое может быть отображено в описании командной кнопки (command link button). Вы можете отправить это сообщение непосредственно или с помощью макроса Button_GetNoteLength.

wParam должен бытьравен нулю.

lParam должен быть равен нулю.

Оконная процедура возвращает длину текста примечания в символах WCHAR, не включая завершающий NULL, или нуль если примечания нет.

Начиная с библиотеки comctl32.dll версии 6.01, командные кнопки могут иметь примечание.

Сообщение BCM_GETNOTELENHGTH работает только для кнопок, у которых установлен стиль BS_COMMANDLINK или BS_DEFCOMMANDLINK.

BCM_GETSPLITINFO

(BCM_FIRST + 0x0008)

Появилось в Windows Vista. Получает информацию о раскрывающейся кнопке (split button control). Вы можете отправить это сообщение непосредственно или с помощью макроса Button_GetSplitInfo.

wParam должен быть равен нулю.

lParam содержит указатель на структуру BUTTON_SPLITINFO, в которую будет записана информация о кнопке. Вызывающий поток отвечает за выделение памяти под эту структуру. Заполните поле mask данной структуры для указания того какая информация вам нужна.

Если сообщение успешно обработано, то возвращается значение TRUE, в противном случае возвращается значение FALSE.

Данное сообщение используется только для кнопок, у которых установлен стиль BS_SPLITBUTTON или BS_DEFSPLITBUTTON.

BCM_GETTEXTMARGIN

(BCM_FIRST + 0x0005)

Появилось в Windows XP. Получает границы, используемые для отображения текста на кнопке. Вы можете отправить это сообщение непосредственно или использовать макрос Button_GetTextMargin.

wParam не используется. Должен бфть равен нулю.

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

Если сообщение успешно обработано, то возвращается значение TRUE. В противном случае возвращается значение FALSE.

Для использования этого сообщения вы должны предоставить манифест для Comclt32.dll версии 6.0.

BCM_SETDROPDOWNSTATE

(BCM_FIRST + 0x0006)

Появилось в Windows Vista. Устанавливает для кнопки со стилем TBSTYLE_DROPDOWN раскрытое состояние (drop down state). Вы можете отправить это сообщение непосредственно или использовать макрос Button_SetDropDownState.

wParam содержит значение TRUE для состояния BST_DROPDOWNPUSHED, или значение FALSE в противном случае.

lParam должен быть равен нулю.

Если сообщение успешно обработано, то возвращается значение TRUE, в противном случае значение FALSE.

BCM_SETIMAGELIST

(BCM_FIRST + 0x0003)

Появилось в Windows XP. "Прикрепляет" коллекцию изображений к кнопке. Вы можете отправить это сообщение непосредственно или использовать макрос Button_SetImageList.

wParam не используется. Должен быть равен нулю.

lParam содержит указатель на структуру BUTTON_IMAGELIST, которая описывает информацию о коллекции изображений.

Если сообщение успешно обработано, то возвращается значение TRUE. В противном случае возвращается значение FALSE.

Для использования этого сообщения вы должны предоставить манифест для Comclt32.dll версии 6.0.

Коллекция изображений, на которую указывает значение поля himl структуры BUTTON_IMAGELIST должна содержать одно изображение, используемое для всех состояний, или отдельные изображения для каждого состояния. Следующие состояния описаны в заголовочном файле vssym32.h:

enum PUSHBUTTONSTATES {

PBS_NORMAL = 1,

PBS_HOT = 2,

PBS_PRESSED = 3,

PBS_DISABLED = 4,

PBS_DEFAULTED = 5,

PBS_STYLUSHOT = 6,

};

Состояние PBS_STYLUSHOT используется только на планшетных компьютерах (tablet computers).

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

BCM_SETNOTE

(BCM_FIRST + 0x0009)

Появилось в Windows Vista. Устанавливает текст примечания к командной кнопке (command link button). Вы можете отправить это сообщение непосредственно или использовать макрос Button_SetNote.

wParam должен содержать значение нуль.

lParam содержит указатель на строку символов WCHAR, завершающуюся NULL символом, которая содержит устанавливаемый текст примечания.

В случае успеха возвращается значение TRUE, в случае ошибки - FALSE.

Начиная с библиотеки comctl32.dll версии 6.01, командная кнопка может иметь примечание (note).

Сообщение BCM_SETNOTE работает только с кнопками, для которых установлен стиль BS_COMMANDLINK или BS_DEFCOMMANDLINK.

BCM_SETSHIELD

(BCM_FIRST + 0x000C)

Появилось в Windows Vista. Устанавливает требуемое поднятое состояние (elevation required state) для заданной кнопки и командной кнопки (command link) отображая поднятую иконку (elevated icon). Вы можете отправить это сообщение непосредственно, или с помощью макроса Button_SetElevationRequiredState.

wParam должен содержать значение нуль.

lParam должен содержать значение TRUE для отображения поднятой иконки (draw an elevated icon), или значение FALSE в противном случае.

В случае успеха возвращается значение 1. В случае ошибки возвращается код ошибки.

Для использования данной функциональности приложение должно объявить (must be manifested) использование библиотеки comctl32.dll версии 6.

BCM_SETSPLITINFO

(BCM_FIRST + 0x0007)

Появилось в Windows Vista. Устанавливает информацию для раскрывающейся кнопки (split button control). Выможете отправить это сообщение непосредственно или с помощью макроса Button_SetSplitInfo.

wParam долженбыть равен нулю.

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

В случае успеха возвращается значение TRUE, в противном случае возвращается значение FALSE.

Данное сообщение работает только с кнопками, у которых установлен стиль BS_SPLITBUTTON или BS_DEFSPLITBUTTON.

BCM_SETTEXTMARGIN

(BCM_FIRST + 0x0004)

Устанавливает границы отображаемого на кнопке текста.

wParam не используется. Должен быть равен нулю.

lParam содержит указатель на структуру RECT, которая определяет устанавливаемые границы текста.

В случае успеха возвращается значение TRUE, а в случае ошибки - FALSE.

Для использования данной функциональности приложение должно предоставить манифест определяющий (must provide a manifest specifying) библиотеку comctl32.dll версии 6.0.

BM_CLICK

(0x00F5)

Эмулирует щелчок пользователя по кнопке. Данное сообщение приводит к тому, что кнопка последовательно получает сообщения WM_LBUTTONDOWN и WM_LBUTTONUP, а родительское окно кнопки получает уведомление BN_CLICKED.

wParam не используется. Должен быть равен нулю.

lParam не используется. Должен быть равен нулю.

В ответ на сообщение ничего не возвращается.

Если кнопка принадлежит диалоговому окну, которое не активно, то сообщение завершится ошибкой. Для предотвращения этого перед отправкой сообщения BM_CLICK вызовите функцию SetActiveWindow для активации диалогового окна.

BM_GETCHECK

(0x00F0)

Возвращает состояние выбрана или нет для переключателя (radio button) или флажка (check box).Вы можете отправить это сообщение непосредственно или с помощью макроса Button_GetCheck.

wParam не используется. Должен быть равен нулю.

lParam не используется. Должен быть равен нулю.

Возможные возвращаемые значения от кнопок с установленным стилем BS_AUTOCHECKBOX, BS_AUTORADIOBUTTON, BS_AUTO3STATE, BS_CHECKBOX, BS_RADIOBUTTON или BS_3STATE перечислены ниже.

BST_CHECKED - кнопка выбрана (is checked).

BST_INDETERMINATE - кнопка закрашена серым цветом (is grayed). Это говорит о том, что кнопка находится в неопределенном состоянии (indeterminate state) (Применимо только если у кнопки установлен стиль BS_3STATE или BS_AUTO3STATE).

BST_UNCHECKED - кнопка не выбрана (is cleared).

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

Комментарии к статье msdn.

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

BM_GETIMAGE

(0x00F6)

Возвращает описатель изображения (иконки или растрового изображения) ассоциированного с кнопкой.

wParam содержит тип ассоциированного с кнопкой изображения. Он принимает одно из значений перечисленных ниже.

IMAGE_BITMAP - растровое изображение.

IMAGE_ICON - иконка.

lParam не используется.

Возвращается описатель изображения, еси оно есть, или значение NULL если его нет.

BM_GETSTATE

(0x00F2)

Возвращает состояние кнопки или флажка (check box). Вы можете отправить это сообщение непосредственно или использовать макрос Button_GetState.

wParam не используется. Должно быть равно нулю.

lParam не используется. Должно быть равно нулю.

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

BM_SETCHECK

(0x00F1)

Устанавливает выбранное состояние переключателя (radio button) или флажка (check box). Вы можете отправить это сообщение непосредственно или с помощью макроса Button_SetCheck.

wParam содерджит состояние выбора. Данный параметр принимает одно из значений перечисленных ниже.

BST_CHECKED - перевести кнопку в выбранное состояние (to checked).

BST_INDETERMINATE - перевести кнопку в неопредеденное состояние. Используйте это значение только если у кнопки установлен стиль BS_3STATE или BS_AUTO3STATE.

BST_UNCHECKED - перевести кнопку в невыбранное состояние.

lParam не используется.

В ответ на данное сообщение всегда возвращается значение нуль.

Сообщение BM_SETCHECK никак не влияет на нажимные кнопки (push buttons).

BM_SETDONTCLICK

(0x00F8)

Появилось в Windows Vista. Взводит для переключателя (radio button) флаг, который управляет генерацией уведомления BN_CLICKED при получении кнопкой фокуса ввода.

wParam содержит значение TRUE при взведении флага, или значение FALSE при его сбросе.

lParam не используется. Должно быть равно нулю.

В ответ на данное сообщение ничего не возвращается.

BM_SETIMAGE

(0x00F7)

Ассоциирует с кнопкой новое изображение (иконку или растровое изображение).

wParam содержит тип изображения ассоциируемого с кнопкой. Он принимает одно из значений перечисленных ниже.

IMAGE_BITMAP - растровое изображение.

IMAGE_ICON - иконка.

lParam содержит описатель (HICON или HBITMAP) изображения ассоциируемого с кнопкой.

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

Отображение на кнопке текста, иконки, или их обоих зависит от установки стиля BS_ICON или BS_BITMAP и было ли отправлено сообщение BM_SETIMAGE. Возможные результаты перечислены в таблице ниже.

Стиль BS_ICON или BS_BITMAP установлен? | Сообщение BM_SETIMAGE отправлено? | Результат
Да | Да | Только иконка
Нет | Да | Иконка и текст
Да | Нет | Только текст
Нет | Нет | Только текст

BM_SETSTATE

(0x00F3)

Устанавливает состояние подсветки (highlight state) для кнопки. В этом состоянии кнопка подсвечена так, как если бы пользователь нажал на неё. Вы можете отправить это сообщение непосредственно или использовать макрос Button_SetState.

wParam содердит значение TRUE для подсветки кнопки, или значение FALSE для удаления подсветки.

lParam не используется.

В ответ на данное сообщение всегда возвращается значение нуль.

Подсветка влияет только на отображение кнопки. Она не влияет на состояние выбора для переключателей и флажков.

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

BM_SETSTYLE

(0x00F4)

Устанавливает стиль кнопки. Вы можете отправить это сообщение непосредственно или использовать макрос Button_SetStyle.

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

Младшее слово lParam определяет должна ли кнопка быть перерисована. Если его значение равно TRUE, то кнопка перерисовывается.Если его значение равно FALSE, то перерисовывать кнопку не нужно.

В ответ на данное сообщение всегда возвращается значение нуль.

Заголовочный файл: Commctrl.h, winuser.h (включен в windows.h)


Состояния

BST_CHECKED

Кнопка выбрана (is checked).

BST_DROPDOWNPUSHED

Windows Vista. Кнопка находится в раскрытом состоянии (drop-down state). Применимо только если кнопка имеет стиль TBSTYLE_DROPDOWN.

BST_FOCUS

Кнопка владеет фокусом ввода клавиатуры.

BST_HOT

Кнопка разогрета (is hot), то есть курсор мыши находится над ней.

BST_INDETERMINATE

Состояние кнопки является неопределенным. Применяется только если кнопка имеет установленный стиль BS_3STATE или BS_AUTO3STATE.

BST_PUSHED

Кнопка отображается в нажатом состоянии (pushed state).

BST_UNCHECKED

Нет специального состояния. Равно нулю.

Заголовочный файл: winuser.h (включен в windows.h)


Стили

BS_3STATE

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

BS_AUTO3STATE

Аналогично BS_3STATE но, с тем исключением, что элемент управления сам изменяет свое состояние при щелчке мышью.

BS_AUTOCHECKBOX

Аналогично BS_CHECKBOX, но, с тем исключением, что элемент управления сам изменяет свое состояние при щелчке мышью.

BS_AUTORADIOBUTTON

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

BS_BITMAP

Указывает, что на кнопке отображается растровое изображение.

BS_BOTTOM

Выравнивает заголовок по нижнему краю кнопки.

BS_CENTER

Выравнивает заголовок по горизонтали по центру кнопки.

BS_CHECKBOX

Создается простой флажок. По умолчанию заголовок отображается справа от флажка. Для того, чтобы заголовок отображался слева от флажка используйте стиль BS_LEFTTEXT.

BS_COMMANDLINK

Windows Vista: Создается командная кнопка, которая похожа на обычную кнопку, но имеет зеленую стрелку рядом с изображением кнопки.

BS_DEFCOMMANDLINK

Windows Vista: Создается командная кнопка, но с особым назначением. Если кнопка используется в диалоговом окне, то пользователь может выбрать ее нажатием на клавишу ENTER даже тогда, когда данная кнопка не владеет фокусом ввода. Этот стиль полезен для предоставления пользователю возможности максимально быстро выбрать наиболее предпочтительное действие.

BS_DEFPUSHBUTTON

Создается обычная кнопка, но с особым назначением. Если кнопка используется в диалоговом окне, то пользователь может выбрать ее нажатием на клавишу ENTER даже тогда, когда данная кнопка не владеет фокусом ввода. Этот стиль полезен для предоставления пользователю возможности максимально быстро выбрать наиболее предпочтительное действие.

BS_DEFSPLITBUTTON

Windows Vista: создается раскрывающаяся кнопка (split button), но с особым назначением. Если кнопка-разделитель используется в диалоговом окне, то пользователь может выбрать ее нажатием на клавишу ENTER даже тогда, когда данная кнопка не владеет фокусом ввода. Этот стиль полезен для предоставления пользователю возможности максимально быстро выбрать наиболее предпочтительное действие.

BS_FLAT

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

BS_GROUPBOX

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

BS_ICON

Указывает что на кнопке отображается иконка.

BS_LEFT

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

BS_LEFTTEXT

Размещает текст по левому краю флажка или переключателя. Тоже самое что и BS_RIGHTBUTTON.

BS_MULTILINE

Переносит заголовок кнопки на новую строку если он не помещается по ширине.

BS_NOTIFY

Позволяет кнопке отправлять окну-родителю уведомления BN_KILLFOCUS и BN_SETFOCUS. Обратите внимание, что уведомление BN_CLICKED отправляется вне зависимости от данного стиля.

BS_OWNERDRAW

Создается самостоятельно перерисовываемое окно. Владелец окна получает сообщение WM_DRAWITEM каждый раз когда было изменено отображение кнопки. Не используйте этот стиль совместно с другими стилями.

BS_PUSHBOX

(0x0A)

Не документировано

BS_PUSHBUTTON

Созается кнопка, которая при нажатии на нее отправляет окну-владельцу сообщение WM_COMMAND.

BS_PUSHLIKE

Делает флажки и переключатели похожими на обычные кнопки.

BS_RADIOBUTTON

Создается простой переключатель. По умолчанию заголовок переключателя располагается справа от самого переключателя. Для отображения заголовка окна слева от переключателя используйте стиль BS_LEFTTEXT.

BS_RIGHT

Заголовок выравнивается по правому краю кнопки. Если он применен к флажку или переключателю, то заголовок по-прежнему располагается справа от самой кнопки.

BS_RIGHTBUTTON

Тоже самое что и BS_LEFTTEXT.

BS_SPLITBUTTON

В Windows Vista: создает раскрывающуюся кнопку (split button). Родительское окно получает уведомление BCN_DROPDOWN, показывающее, что пользователь нажал на стрелку раскрывающегося списка на кнопке.

BS_TEXT

Указывает, что у кнопки есть текстовый заголовок.

BS_TOP

Выравнивает заголовок конпки по ее верхнему краю.

BS_TYPEMASK

В Windows 2000: Стиль, полученный объединением операцией OR других стилей. Может быть использован для исключения определенных стилей из общего набора. Вы не должны использвать этот стиль.

BS_USERBUTTON

Устарело. Оставлено для совместимости с 16-разрядными приложениями. В настоящее время заменен на стиль BS_OWNERDRAW.

BS_VCENTER

Заголовок выравнивается по центру по вертикали окна.

Заголовочный файл: winuser.h (включен в windows.h)


Уведомления окна Button (B?N_*)

BCN_DROPDOWN

Появилось в Windows Vista. Отправляется когда пользователь щелкает по значку "развернуть" (drop down arrow) на кнопке. Родительское окно получает это уведомление посредством сообщения WM_NOTIFY.

lParam содержит указатель на структуру NMBCDROPDOWN. Поле rcButton это структуры описывает кнопку в развернутом состоянии (drop-down area).

В ответ на это уведомление ничего не возвращается.

Получатель уведомления должен привести тип LPARAM к указателю на структуру NMBCDROPDOWN. wParam содержит идентификатор (ID) элемента управления от которого пришло сообщение. Кнопка должна иметь стиль раскрывающейся кнопки (drop-down button style).

BCN_HOTITEMCHANGE

Появилось в Windows XP. Уведомляет владельца кнопки о том, что курсор мыши покинул клиентскую область кнопки или вошел в неё. Данное уведомление приходит в виде сообщения WM_NOTIFY.

lParam содержит указатель на структуру NMBCHOTITEM.

В ответ на это уведомление ничего не возвращается.

Для использования этого уведомления вы должны предоставить манифест, описывающий библиотеку Comclt32.dll версии 6.0.

BN_CLICKED

Отправляется когда пользователь щелкает по кнопке.

Родительское окно получает это уведомление посредством сообщения WM_COMMAND.

Младшее слово wParam содержит идентификатор кнопки. Старшее слово - код уведомления.

lParam содерджит описатель (handle) кнопки.

Недоступная кнопка не отправляет своему родителю уведомление BN_CLICKED.

BN_DBLCLK

Отправляется когда пользователь дважды щелкает по кнопке. Данное уведомление отправляется автоматически для кнопок с установленным стилем BS_USERBUTTON, BS_RADIOBUTTON или BS_OWNERDRAW. Остальные кнопки отправляют данное уведомление только если у них установлен стиль BS_NOTIFY.

Родительское окно получает это уведомление посредством сообщения WM_COMMAND.

Младшее слово wParam содержит идентификатор кнопки. Старшее слово - код уведомления.

lParam содержит описатель кнопки.

Уведомление BN_DBLCLK аналогично уведомлению BN_DOUBLECLICKED.

BN_DISABLE

Отправляется когда кнопка стала недоступной (is disabled).

Данное уведомление используется только для совместимости с 16-разрядными версиями Windows до версии 3.0. Современные приложения для обработки этой ситуации должны использовать стиль BS_OWNERDRAW и структуру DRAWITEMSTRUCT.

Родительское окно получает это уведомление посредством сообщения WM_COMMAND.

Младшее слово wParam содержит идентификатор кнопки. Старшее слово - код уведомления.

lParam содержит описатель кнопки.

BN_DOUBLECLICKED

Отправляется когда пользователь дважды щелкает по кнопке. Данное уведомление отправляется автоматически для кнопок с установленным стилем BS_USERBUTTON, BS_RADIOBUTTON или BS_OWNERDRAW. Остальные кнопки отправляют данное уведомление только если у них установлен стиль BS_NOTIFY.

Родительское окно получает это уведомление посредством сообщения WM_COMMAND.

Младшее слово wParam содержит идентификатор кнопки. Старшее слово - код уведомления.

lParam содержит описатель кнопки.

Уведомление BN_DOUBLECLICKED аналогично уведомлению BN_DBLCLK.

BN_HILITE

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

Данное уведомление используется только для совместимости с 16-раязрядными версиями Windows до версии 3.0. Современные приложения для обработки этого события должны использовать стиль BS_OWNERDRAW и структуру DRAWITEMSTRUCT.

Родительское окно получает это уведомление посредством сообщения WM_COMMAND.

Младшее слово wParam содержит идентификатор кнопки. Старшее слово - код уведомления.

lParam содержит описатель кнопки.

Данное уведомление аналогично уведомлению BN_PUSHED.

BN_KILLFOCUS

Отправляется когда кнопка теряет фокус ввода клавиатуры. Кнопка отправляет это уведомление только если у нее установлен стиль BS_NOTIFY.

Родительское окно получает это уведомление посредством сообщения WM_COMMAND.

Младшее слово wParam содержит идентификатор кнопки. Старшее слово - код уведомления.

lParam содержит описатель кнопки.

BN_PAINT

Отправляется когда кнопка дожна быть отрисована.

Данное уведомление используется только для совместимости с 16-разрядными версиями Windows до версии 3.0. Современные приложения для обработки этого события должны использовать стиль BS_OWNERDRAW и структуру DRAWITEMSTRUCT.

Родительское окно получает это уведомление посредством сообщения WM_COMMAND.

Младшее слово wParam содержит идентификатор кнопки. Старшее слово - код уведомления.

lParam содержит описатель кнопки.

BN_PUSHED

Отправляется когда кнопка переводится в нажатое состояние.

Данное уведомление используется только для совместимости с 16-разрядными версиями Windows до версии 3.0. Современные приложения для обработки этого события должны использовать стиль BS_OWNERDRAW и структуру DRAWITEMSTRUCT.

Родительское окно получает это уведомление посредством сообщения WM_COMMAND.

Младшее слово wParam содержит идентификатор кнопки. Старшее слово - код уведомления.

lParam содержит описатель кнопки.

Данное уведомление аналогично уведомлению BN_HILITE.

BN_SETFOCUS

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

Родительское окно получает это уведомление посредством сообщения WM_COMMAND.

Младшее слово wParam содержит идентификатор кнопки. Старшее слово - код уведомления.

lParam содержит описатель кнопки.

BN_UNHILITE

Отправляется когда у кнопки удаляется подсветка.

Данное уведомление используется только для совместимости с 16-разрядными версиями Windows до версии 3.0. Современные приложения для обработки этой ситуации должны использовать стиль BS_OWNERDRAW и структуру DRAWITEMSTRUCT.

Родительское окно получает это уведомление посредством сообщения WM_COMMAND.

Младшее слово wParam содержит идентификатор кнопки. Старшее слово - код уведомления.

lParam содержит описатель кнопки.

Данное уведомление аналогично уведомлению BN_UNPUSHED.

BN_UNPUSHED

Отправляется когда состояние кнопки меняется на "ненажатое".

Данное уведомление используется только для совместимости с 16-разрядными версиями Windows до версии 3.0. Современные приложения для обработки этой ситуации должны использовать стиль BS_OWNERDRAW и структуру DRAWITEMSTRUCT.

Родительское окно получает это уведомление посредством сообщения WM_COMMAND.

Младшее слово wParam содержит идентификатор кнопки. Старшее слово - код уведомления.

lParam содержит описатель кнопки.

Данное уведомление аналогично уведомлению BN_UNHILITE.

NM_CUSTOMDRAW

Появилось в Windows XP. Уведомляет родительское окно о готовящейся операции рисования над кнопкой.

Элемент управления кнопки отправляет это уведомление посредством сообщения WM_NOTIFY.

lParam содержит указатель на структуру NMCUSTOMDRAW, которая содержит информацию об операции рисования. Поле dwItemSpec этой структуры содержит индекс элемента (index of the item), который будет перерисован. Поле lItemParam этой структуры содержит значение lParam элемента (item's lParam).

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

CDRF_NOTIFYPOSTERASE - элемент управления уведомит родителя об окончании стирания элемента (item). Данное значение может быть использовано только если значение поля dwDrawStage равно CDDS_PREERASE.

CDRF_NOTIFYPOSTPAINT - элемент управления уведомит родителя об окончании раскраски элемента (painting an item). Данное значение может быть использовано только если значение поля dwDrawStage равно CDDS_PREPAINT.

CDRF_SKIPDEFAULT - приложение вручную отрисует элемент. Элемент управления (control) не будет отрисовывать элемент (item). Данное значение может быть использовано только если значение поля dwDrawStage равно CDDS_PREERASE или CDDS_PREPAINT.

Если кнопка отммечана как перерисовываемая владельцем (BS_OWNERDRAW), то уведомление NM_CUSTOMDRAW не отправляется.

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

WM_CTLCOLORBTN

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

wParam содержит описатель контекста отображения (HDC) кнопки.

lParam содержит описатель кнопки (HWND).

Если приложение обрабатывает это сообщение, то оно должно вернуть описатель кисти. Система использует эту кисть для раскраски фона кнопки.

Если приложение вернуло кисть, которое оно создало (на пример, с помощью функции CreateSolidBrush или CreateBrushIndirect), то приложение должно освободить кисть. Если приложение возвращает системную кисть (полученную, например, с помощью функции GetStockObject или GetSysColorBrush), то приложению не нужно освобождать кисть.

По умолчанию, функция DefWindowProc выбирает для кнопки системные увета по умолчанию. Кнопки с установленными стилями BS_PUSHBUTTON, BS_DEFPUSHBUTTON и BS_PUSHLIKE не используют возвращенную кисть. Кнопки с этими стилями всегда отрисовываются системными цветами по умолчанию. Отрисовывание нажимной кнопки требует нескольких различных кистей - лицевую (face), подсветки (highlight) и теневую (shadow) - а сообщение WM_CTLCOLOBTN всегда возвращает только одну кисть. Для реализации особого отобрпажения нажимной кнопки используйте перерисовываемые владельцем (owner-drawn) кнопки.

Сообщение WM_CTLCOLORBTN никогда не пересылается между потоками. Оно рассылается только в рамках одного потока.

Цвет текста для флажков (check box) и перключателей (radio button) применяется к полю (box) или кнопке, их значку выбора (check mark) и тексту. Прямоугольник фокуса для кнопок по-прежнему использует системный цвет по умолчанию (обычно, черный). Цвет текста группового блока (group box) применяется к тексту, но не к линии, которая определяет блок (line that defines the box). Цвет текста нажимной кнопки применяется только к прямоугольнику фокуса; он не влияет на цвет текса.

Есди диалоговая процедура обрабатывает это сообщение, то она должна привести возвращаемое значение к типу INT_PTR и непосредственно вернуть его. Если диалоговая процедура возвращает значение FALSE, то будет выполнена обработка сообщения по умолчанию. значение DWL_MSGRESULT установленное функцией SetWindowLong игнорируется.

Заголовочный файл: winuser.h (включен в windows.h), Commctrl.h


DlgDirListComboBox

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

Прототип

int DlgDirListComboBox(

_In_ HWND hDlg,

_Inout_ LPTSTR lpPathSpec,

_In_ int nIDComboBox,

_In_ int nIDStaticPath,

_In_ UINT uFiletype

);

Параметры

hDlg[in]

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

lpPathSpec[in,out]

Указатель на завелшающуюся NULL символом строку, содержащую абсолютный путь, относительный путь или имя файла. Абсолютный путь может начинаться с буквы диска (например, d:\)или быть записан в формате UNC (например, \\machinename\sharename).

Функция разбивает строку на наименование каталога и наименование файла. Функция просматривает каталог в поисках имён, которые соответствуют имени файла. Если в строке не указан каталог, то функция просматривает текущий каталог.

Если строка включает имя файла, то оно должно содержать хотя бы один символ подстановки (? или *). Если строка не содержит имя файла, функция ведет себя так же как если бы в качестве имени файла был указан символ подстановки *. В список будут добавлены все наименования файлов, находящихся в заданном каталоге, которые соответствуют имени файла и имеют атрибуты, указанные в параметре uFileType.

nIDComboBox[in]

Идетификатор комбинированного списка в окне hDlg. Если значение этого параметра равно нулю, то функция не будет пытаться заполнить комбинированный список.

nIDStaticPath[in]

Идентификатор статического элемента управления в окне hDlg. Функция DlgDirListComboBox выведет в него текущий диск и какталог. Этот параметр может быть равен нулю, если вы не хотите, чтобы выводилось текущий диск и каталог.

uFileType[in]

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

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Например, если строка lpPathSpec содержит неверный путь, функция завершается ошибкой. Чтобы получить дополнительную информацию об ошибке используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Если lpPathString описывает каталог, то функция DlgDirListComboBox перед заполнением комбинированного списка меняет текущий каталог. В заголовке статического элемента управления nIDStaticPath будет выводиться наименование нового текущего каталога.

Функция DlgDirListComboBox отправляет комбинированному списку сообщения CB_RESETCONTENT и CB_DIR.

Microsoft Windows NT 4.0 и новее: если параметр uFileType содержит флаг DDL_DIRECTORY, а lpPathSpec описывает каталог верхнего уровня, например, C:\TEMP, в список всегда будет добавлена строка "..", описывающая корневой каталог. Это происходит даже если корневой каталог имеет атрибут скрытый или системный, а флаги DDL_HIDDEN и DDL_SYSTEM не указаны. Корневой каталог NTFS тома имеет атрибуты скрытый и системный.

Некорректное использование этой функции может нарушить безопасность вашего приложения. Некорректное использование включает в себя использование lpPathSpec, указывающего на буфер, доступный только для чтения, или на буфер без завершающего NULL символа.

Microsoft Windows NT 4.0 и новее: в списке отображаются длинные имена файлов.

Windows 95 и новее: в списке отображаются короткие имена (в формате 8.3). Вы можете использовать функцию SHGetFileInfo или GetFullPathName для получения длинного имени файла.

Windows 95 и новее: функция DlgDirListComboBoxW поддерживается Microsoft Layer for Unicode (набор библиотек для поддержки Unicode в старых операционных системах Windows).

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | DlgDirListComboBoxA и DlgDirListComboBoxW


DlgDirSelectComboBoxEx

Возвращает текущий выбор из комбинированного списка заполненного функцией DlgDirListComboBox. Выбранная строка интерпретируется как буква диска, наименование файла или каталога.

Прототип

BOOL DlgDirSelectComboBoxEx(

_In_ HWND hDlg,

_Out_ LPTSTR lpString,

_In_ int nCount,

_In_ int nIDComboBox

);

Параметры

hDlg[in]

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

lpString[out]

Указатель на буфер, в который будет записан выбранный путь.

nCout[in]

Размер, в символах, буфера lpString.

nIDComboBox[in]

Идентификатор комбинированного списка.

Возвращаемое значение

Если текущим выбором является наименование каталога, то возвращается ненулевое значение.

Если текущим выбором является наименование не каталога, то возвращается значение нуль.

Для получения дополнительной информации используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Если текущий выбор определяет наименование каталога или букву диска, то функция DlgDirSelectComboBoxEx удаляет обрамляющие квадратные скобки (и дефисы для буквы диска) так, что наименование каталога или буква диска готовы для подстановки в строку с новым путём или именем файла. Если в списке ничего не выбрано, то содержимое буфера lpString не меняется.

Функция DlgDirSelectComboBoxEx не позволяет получать из списка более одного имени файла.

Если вовращаемая строка больше буфера, то буфер будет содержать усеченную строку с завершающим NULL символом.

Функция DlgDirSelectComboBoxEx отправляет комбинированному списку сообщения CBN_GETCURSEL и CBN_GETLBTEXT.

Неправильное использование этой функции может вызвать проблемы у вашего приложения. Например, параметр nCount должен быть корректно установлен для ANSI и Unicode версий. Неправильное его использование может привести к переполнению буфера.

Windows 95 и новее: функция DlgDirSelectComboBoxExW поддерживается Microsoft Layer for Unicode (набор библиотек для поддержки Unicode в старых операционных системах Windows).

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | DlgDirSelectComboBoxExA и DlgDirSelectComboBoxExW


GetComboBoxInfo

Возвращает информацию о заданном комбинированном списке.

Прототип

BOOL GetComboBoxInfo(

_In_ HWND hwndCombo,

_Out_ PCOMBOBOXINFO pcbi

);

Параметры

hwndCombo[in]

Описатель комбинированного списка.

pcbi[out]

Указатель на структуру COMBOBOXINFO, в которую будет записана запрашиваемая информация. Вы должны заполнить поле cbSize этой структуры перед вызовом функции.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Сообщение CB_GETCOMBOBOXINFO эквивалентно данной функции.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


Сообщения

CB_ADDSTRING

Добавляет строку в список окна ComboBox. Если у комбинированного списка не установлен стиль CBS_SORT, то строка добавляется в конец списка. В пртивном случае строка вставляется в список, который затем сортируется.

wParam не используется.

lParam содержит указатель на добавляемую строку с NULL символом в конце. Если вы создали перерисовываемый владельцем комбинированный список без стиля CBS_HASSTRING, то значение параметра lParam сохраняется как данные записи (item data). Вместо строки в них сохраняется указатель на строку. Данные записи могут быть получены или изменены с помощью сообщений CB_GETITEMDATA и CB_SETITEMDATA.

В ответ на сообщение возвращается номер строки в списке. Нумерация ведется с нуля. В случае ошибки возвращается значение CB_ERR. При недостатке памяти для сохранения строки возвращается значение CB_ERRSPACE.

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

Для вставки строки в заданное место списка используйте сообщение CB_INSERTSTRING.

Если вы создали комбинированный список со стилем WS_HSCROLL и добавляете строку, которая больше чем ширина комбинированного списка, то отправьте сообщение LB_SETHOROZONTALEXTENT для включения отображения горизонтальной полосы прокрутки.

Comclt32.dll версии 5.0 и новее: если установлен стиль CBS_LOWERCASE или CBS_UPPERCASE, то Unicode версия сообщения CB_ADDSTRING изменяет строку. При использовании памяти доступной только для чтения, это приведет к ошибке.

CB_DELETESTRING

Удаляет строку из списка.

wParam содержит номер удаляемой строки. нумерация строк ведется с нуля.

lParam не используется.

В ответ на сообщение возвращается количество строк, остающихся в списке. Если параметр wParam содержит слишком большой номер строки, то возвращается значение CB_ERR.

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

CB_DIR

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

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

lParam содержит указатель на завершающую NULL символом строку, которая определяет абсолютный путь, относительный путь или имя файла. Абсолютный путь может начинаться с буквы диска (например, d:\) или иметь UNC имя (например, \\machinename\sharename). Если строка определяет имя файла или каталога, которые имеют атрибуты заданные в параметре wParam, то имя файла или какталога добавляется в список. Если имя файла или каталога содержит знак подстановки (? или *), то все файлы и каталоги, которые соответствуют этому выражению и имеют атрибуты заданные в параметре wParam будут добавлены в список.

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

В случае ошибки возвращается значение CB_ERR. Если ошибка происходит из-за недостатка места для сохранения новой строки, то возвращается значение CB_ERRSPACE.

Windows NT 4.0 и новее: если параметр wParam содержит флаг DDL_DIRECTORY и параметр lParam определяет все подкаталоги каталога первого уровня, например так C:\TEMP\*, список всегда будет содержать строку "..", соответствующую корневому каталогу. Такое поведение будет сохраняться даже если корневой каталог имеет атрибуты "скрытый" или "системный", а флаги DDL_HIDDEN и DDL_SYSTEM не указаны. Корневой каталог NTFS тома имеет атрибуты "скрытый" и "системный".

Windows NT/2000/XP: в списке отображаются длинные имена файлов.

Windows 95/98/Me: в списке отображабтся короткие имена файлов (в формате 8.3). Вы можете использовать функцию SHGetFileInfo или GetFullPathName для получения соответствующего длинного имени файла.

CB_FINDSTRING

Ищет в списке запись, начинающуюся с заданной последовательности символов.

wParam содержит номер записи, предшествующей первой записи в наборе записей для поиска. Нумерация записей начинается с нуля. Первой просматриваемой записью является заись, следующая после записи с номером wParam. Если достигается конец списка, то поиск продолжается с нулевой записи до тех, пор пока номер просматриваемой записи не достигнет значения wParam. Если значение wParam равно -1, то просматривается весь список, начиная с нулевой записи.

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

В ответ на сообщение возвращается номер найденной записи. Нумерация ведется с нуля. Если ничего не найдено, то возвращается значение CB_ERR.

Если вы создали перерисовываемый владельцем комбинированный список (combobox), не имеющий стиля CBS_HASSTRINGS, то обработка сообщения будет зависеть от стиля CBS_SORT. Если стиль CBS_SORT установлен, то владельцу окна будет отправлено сообщение WM_COMPAREITEM, для определения того какая запись соответствует заданной строке. Если стиль CBS_SORT не установлен, то обработчик сообщения CB_FINDSTRING будет искать запись, которая соответствует строке переданной в параметре lParam.

CB_FINDSTRINGEXACT

Находит в комбинированном списке первую строку, которая соответствует строке переданной в параметре lParam.

wParam содержит номер записи, предшествующей первой записи в наборе записей для поиска. Нумерация записей начинается с нуля. Первой просматриваемой записью является заись, следующая после записи с номером wParam. Если достигается конец списка, то поиск продолжается с нулевой записи до тех, пор пока номер просматриваемой записи не достигнет значения wParam. Если значение wParam равно -1, то просматривается весь список, начиная с нулевой записи.

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

В ответ на сообщение возвращается номер найденной записи. Нумерация ведется с нуля. Если ничего не найдено, то возвращается значение CB_ERR.

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

Если вы создали перерисовываемый владельцем комбинированный список (combobox), не имеющий стиля CBS_HASSTRINGS, то обработка сообщения будет зависеть от стиля CBS_SORT. Если стиль CBS_SORT установлен, то владельцу окна будет отправлено сообщение WM_COMPAREITEM, для определения того какая запись соответствует заданной строке. Если стиль CBS_SORT не установлен, то обработчик сообщения CB_FINDSTRINGEXACT будет искать запись, которая соответствует строке переданной в параметре lParam.

CB_GETCOMBOBOXINFO

Появилось в Windows XP. Получает информацию о заданном комбинированном списке.

wParam не используется.

lParam содержит указатель на структуру COMBOBOXINFO, в которую будет записана запрашиваемая информация.

В случае успеха в ответ на сообщение возвращается ненулевое значение.

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

Данное сообщение эквивалентно функции GetComboBoxInfo.

CB_GETCOUNT

Получает количество записей в комбинированном списке.

wParam не используется должен быть равен нулю.

lParam не используется должен быть равен нулю.

В ответ на сообщение возвращается количество записей в списке. В случае ошибки возвращается значение CB_ERR.

Нумерация записей начинается с нуля. Поэтому возвращенное значение будет на единицу больше чем номер последней записи в списке.

CB_GETCUEBANNER

Появилось вWindows Vista. Получает текст подсказки, отображаемый в окне поля ввода. Вы можете оправить это сообщение непосредственно или использовать макрос ComboBox_GetCueBannerText.

wParam содержит указатель на буфер под Unicode строку, в который будет записан запрашиваемый текст. Вызывающее прилложение отвечает за выделение памяти под этот буфер. Размер буфера должен быть равен длине запрашиваемой строки плюс 1 - для завершающего NULL символа (типа WCHAR).

lParam содержит размер буфера lpcwText в символах WCHAR.

В случае успеха в ответ на сообщение возвращается значение 1. В противном случае - возвращается код ошибки.

Если запрашиваемого текста нет, то возвращается значение нуль. Если вызывающее приложение не выделило память, или не установило значение параметра lParam перед отправкой сообщения, то возвращаемое значение может быть неверным (may not be reliable).

CB_GETCURSEL

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

wParam не используется должен быть равен нулю.

lParam не используется должен быть равен нулю.

В ответ на сообщение возвращается номер выбранной записи. Нумерация записей ведется с нуля. Если не выбрана ни одна из записей, то возвращается значение CB_ERR.

CB_GETDROPPEDCONTROLRECT

Приложение отправляет это сообщение для получения экранных координат в его развернутом состоянии (dropped-down state).

wParam не используется.

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

В случае успеха в ответ на сообщение возвращается ненулевое значение.

В случае ошибки в ответ на сообщение возвращается значение нуль.

CB_GETDROPPEDSTATE

Определяет раскрыт ли список.

wParam не используется, должен быть равен нулю.

lParam не используется, должен быть равен нулю.

Если список видим, то в ответ на сообщение возвращается значение TRUE; в протином случае возвращается значение FALSE.

CB_GETDROPPEDWIDTH

Получает минимально допустимую ширину, в пикселях, списка окна ComboBox с установленным стилем CBS_DROPDOWN или CBS_DROPDOWNLIST.

wParam не используется, должен быть равен нулю.

lParam не используется, должен быть равен нулю.

В случае успеха в ответ на сообщение вовзращается ширина, в пикселях.

В случае ошибки в ответ на сообщение возвращается значение CB_ERR.

По умолчанию, минимально допустимая ширина списка равна нулю. Ширина списка равна минимально допустимой ширине списка или ширине окна ComboBox, в зависимости от того какое из этих двух значений больше.

CB_GETEDITSEL

Получает номер первого и последнего символа выделенного текста в поле ввода списка.

wParam содержит указатель на переменную типа DWORD, в которую будет записан номер первого символа в выделенном тексте. Значение данного параметра может быть равно NULL.

lParam содержит указатель на переменную типа DWORD, в которую будет записан номер последнего символа в выделенном тексте. Значение данного параметра может быть равно NULL.

В ответ на сообщение возвращается значение типа DWORD, в младшем слове которого хранится номер первого символа, а в старшем слове - номер последнего символа выделенного текста. Нумерация символов начинается с нуля.

CB_GETEXTENDEDUI

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

wParam не используется, должен быть раве нулю.

lParam не используется, должен быть равен нулю.

Если комбинированный список использует расширенный интерфейс пользователя, то в ответ на сообщение возвращается TRUE, в противном случае возвращается значение FALSE.

По умолчанию клавиша F4 открывает или закрывает список, а клавиша "стрелка вниз" изменяет текущий выбор. В комбинированном списке с расширенным интерфейсом пользователя клавиша F4 недоступна, а клавиша "стрелка вниз" открывает список.

CB_GETHORIZONTALEXTENT

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

wParam не используется, должен быть равен нулю.

lParam не используется, должен быть равен нулю.

В ответ на сообщение возвращается ширина прокрутки (scrollable width), в пикселях.

CB_GETITEMDATA

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

wParam содержит номер записи. Нумерация записей начинается с нуля.

lParam не используется.

В ответ на сообщение возвращается значение, ассоциированное с записью. В случае ошибки, возвращается значение CB_ERR.

Если запись принадлежит перерисовываемому владельцем окну ComboBox, не имеющему стиля CBS_HASSTRINGS, то в ответ на сообщение возвращается значение параметра lParam сообщения CB_ADDSTRING или CB_INSERTSTRING, посредством которого запись была добавлена в список. Если стиль CBS_HASSTRINGS не использовался, то в ответ на сообщение возвращается значение параметра lParam сообщения CB_SETITEMDATA.

CB_GETITEMHEIGHT

Определяет высоту записей списка или поля выбора (selection field) комбинированного списка.

wParam содержит признак компонента комбинированного списка, высоту которого мы определяем. Значение данного параметра должно быть равно -1 для получения высоты поля выбора. Если у комбинированного списка не установлен стиль CBS_OWNERDRAWVARIABLE, то параметр wParam должен содержать значение нуль для получения высоты записей. Если же стиль CBS_OWNERDRAWVARIABLE установлен, то wParam должен содержать номер записи, высоту которой мы хотим определить. Нумерация записей начинается с нуля.

lParam не испозуется.

В ответ на сообщение возвращается высота записи в пикселях. Если список имеет стиль CBS_OWNERDRAWVARIABLE, то возвращается высота определенной в параметре wParam записи. Если значение параметра wParam равно -1, то возвращается высота поля ввода. В случае ошибки возвращается значение CB_ERR.

CB_GETLBTEXT

Получает строку из списка.

wParam содержит номер запрашиваемой строки (записи). Нумерация записей начинается с нуля.

lParam содержит указатель на буфер, в который будет записана строка. буфер должен иметь достаточный размер для строки и завершающего NULL символа. Вы можете использовать сообщение CB_GETLBTEXTLEN перед сообщением CB_GETLBTEXT для получения длины, в символах TCHAR, строки. Если это ANSI строка, то эта длина соответствует количеству байтов, если же это Unicode строка, то длина соответствует количеству символов.

В ответ на сообщение возвращается длина строки, в символах TCHAR, исключая завершающий NULL символ. Если wParam содержит некорректный номер, то в ответ на сообщение возвращается значение CB_ERR.

Некорректное использование этого сообщения может нарушить безопасность вашего приложения. Данное сообщение не предоставлет способа узнать размер буфера. Если в используете сообщение, то сначала используйте сообщение CB_GETLBTEXTLEN для получения необходимого количества символов, а уже потом испольуйте сообщение CB_GETLBTEXT для чтения самой строки.

Если вы создали перерисовываемый владельцем комбинированный список без стиля CBS_HASSTRINGS, то в буфер, на который указывает lParam, будут записаны данные ассоциированные с записью.

CB_GETLBTEXTLEN

Получает длину, в символах, строки в списке.

wParam содержит номер строки. Нумерация начинается с нуля.

lParam не используется.

В ответ на сообщение возвращается длина строки, в символах TCHAR, исключая завершающий NULL символ. Если строка является ANSI строкой, то эта длина соответствует количеству байтов, если же строка является Unicode строкой, то эта длина соответствует количеству символов. При определенных условиях возвращаемое значение может быть больше фактической длины строки.

Если параметр wParam содержит недействительный номер, то в ответ на сообщение возвращается значение CB_ERR.

При определенных условиях возвращаемое значение может быть больше фактичесой длины строки. Это происходит со смесями ANSI и Unicode символов и происходит из-за того, что операционная система допускает существование двухбайтового набора символов (DBCS) внутри текста. Возвращаемое значение, тем не менее, всегда будет не меньше фактической длины текста; таким образом, вы всегда можете его использовать для выделения памяти под буфер. Такое поведение может происходить когда приложение использует ANSI функции и диалоговые окна, которые используют Unicode.

Для получения точной длины текста используйте сообщение WM_GETTEXT, LB_GETTEXT, CB_GETLBTEXT или функцию GetWindowText.

CB_GETLOCALE

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

wParam не используется, должен быть равен нулю.

lParam не используется, должен быть равен нулю.

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

Идентификатор языка состоит из идентификатора диалекта (sublanguage) и идентификатора основного языка. Макрос PRIMARYLANGID извлекает идентификатор основного языка. Макрос SUBLANGID извлекает идентификатор диалекта.

CB_GETMINVISIBLE

Появилось в Windows XP. Получает минимальное количество записей видимых в раскрывающемся списке окна ComboBox.

wParam не используется, должен быть равен нулю.

lParam не используется, должен быть равен нулю.

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

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

Данное сообщениеигнорируется, если комбинированный список имеет стиль CBS_NOINTEGRALHEIGHT.

Для использования сообщения, приложения должны указать в манифесте использование библиотеки comctl32.dll версии 6.

CB_GETTOPINDEX

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

wParam не используется, должен быть равен нулю.

lParam не используется, должен быть равен нулю.

В случае успеха в ответ на сообщение возвращается номер первой видимой записи в списке.

В случае ошибки в овтет на сообщение возвращается значение CB_ERR.

CB_INITSTORAGE

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

wParam содержит количество записей, которые будут добавлены.

lParam содержит количество необходимой памяти, в байтах, для строк.

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

В случае ошибки, в ответ на сообщение возвращается значение CB_ERRSPACE.

Windows NT 4.0: данное сообщение не выделяет заданное количество памяти. В ответ на него всегда возращается значение параметра wParam.

Windows 2000/XP: сообщение выделяет память и возвращает значения описанные выше.

Сообщение CB_INITSTORAGE позволяет ускорить инициализацию комбинированного списка с большим числом записей (большим 100). Оно резервирует заданное количество памяти, благодаря чему последующие сообщения CB_ADDSTRING, CB_INSERTSTRING и CB_DIR обрабатываются быстрее. Вы можете использовать оценочные значения для параметров wParam и lParam. Если вы запросите слишком много, то будет выделена дополнительная память, если запросите слишком мало, то для записей, которые не уместились в выделенный блок памяти, будет использоваться обычное выделение памяти по требованию.

CB_INSERTSTRING

Вставляет строку или данные записи в список. В отличие от сообщения CB_ADDSTRING, сообщение CB_INSERTSTRING не вызывает сортировку списка с установленным стилем CBS_SORT.

wParam содержит номер позиции, в которую вставляется строка. Нумерация начинается с нуля. Если значение этого параметра равно -1, то строка вставляется в конец списка.

lParam содержит указатель на завершающуюся NULL символом вставляемую строку. Если вы создали перерисовываемый владельцем комбинированный список без стиля CBS_HASSTRINGS, то будет сохраняться значение параметра lParam, а не строка, на которую он указывает.

В ответ на сообщение возвращается номер позиции, в которую была вставлена строка. В случае ошибки, возвращается значение CB_ERR. Если для вставки строки недостаточно памяти, то возвращается значение CB_ERRSPACE.

Если комбинированный список имеет стиль WS_HSCROLL и вы вставили строку, которая шире списка, то вы должны отправить сообщение LB_SETHORIZONTALEXTENT для обеспечения появления горизонтальной полосы прокрутки.

CB_LIMITTEXT

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

wParam содержит максимально допустимое крличество символов TCHAR, не включая завершающий NULL символ, которые пользователь может ввести. Если значение этого параметра равно нулю, то дина текста ограничивается значением 0x7FFFFFFE символов.

lParam не используется.

В ответ на сообщение всегда возвращается значение TRUE.

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

Сообщение CB_LIMITTEXT ограничивает только текст, который может ввести пользователь. Оно никак не влияет на текст, который уже введен в поле ввода, и на длину текста копируемого в поле ввода при выборе записи в списке.

По умолчанию, ограничение длины текста, который пользователь может вводить в поле ввода равно 30 000 символам TCHAR.

CB_RESETCONTENT

Удаляет все записи из списка и поля ввода.

wParam не используется, должен быть равен нулю.

lParam не используется, дожен быть равен нулю.

В ответ на данное сообщение всегда возвращается значение CB_OKAY.

Если вы создали перерисовываемый владельцем комбинированый список без стиля CBS_HASSTRINGS, то владелец комбинированного списка будет получать собщение WM_DELETEITEM для каждой записи в списке.

CB_SELECTSTRING

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

wParam содержит номер записи, предшествующей первой записи в области поиска. Нумерация начинается с нуля. Когда поиск достигает последней записи в списке, он возобновляется с первой записи до записи, номер которой хранится в wParam. Если значение wParam равно -1, то поиск ведется по всему списку, начиная с первой записи.

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

Если строка найдена, то в ответ на сообщение возвращается номер найденной записи. Если строка не найдена, то в ответ на сообщение возвращается значение CB_ERR, текущий выбор при этом не изменяется.

Строка выбирается только в том случае, если первые символы строки соответствуют строке в параметре lParam.

Если вы создали перерисовываемый владельцем комбинированный список без стиля CBS_HASSTRING, то обработка сообщения CB_SELECTSTRING зависит от стиля CBS_SORT. Если стиль CBS_SORT установлен, то система отправляет владельцу сообщение WM_COMPAREITEM для определения того соответствует ли запись строке, по которой ведется поиск. Если стиль CBS_SORT не установлен, то обработчик сообщения CB_SELECTSTRING пытается найти соответствие значения DWORD и значения параметра lParam.

CB_SETCUEBANNER

Появилось в Windows Vista. Устанавливает текст подсказки (cue banner text), который отображается в поле ввода.

wParam должен быть равен нулю.

lParam содержит указатель на завершающуюся NULL символом Unicode строку с устанавливаемым текстом.

В случае успеха в ответ на сообщение вовращается значение 1. В случае ошибки вовзращается код ошибки.

Подсказка - это текст, который отображается в поле ввода, когда еще не сделан выбор.

CB_SETCURSEL

Приложение отправляет это сообщение для выбора строки в списке. Если необходимо, список прокручивается так, чтобы выбранная строка была видима. Текст в поле ввода изменяется в соответствии с новым выбором. Предыдущий выбор в списке удаляется.

wParam содержит номер выбираемой строки. Нумерация начинается с нуля. Если значение этого параметра равно -1, то текущий выбор удаляется, а поле ввода очищается.

lParam не используется.

В случае успеха в ответ на сообщение возвращается номер выбранной записи. Если значение wParam больше чем количество записей в списке или он равен -1, то выбор удаляется и в ответ на сообщение возвращается значение CB_ERR.

CB_SETDROPPEDWIDTH

Приложение отправляет это сообщение для установки минимально допустимой ширины, в пикселях, списка с установленными стилем CBS_DROPDOWN или CBS_DROPDOWNLIST.

wParam содержит минимально допустимую ширину списка, в пикселях.

lParam не используется.

В случае успеха в ответ на сообщение возвращается новая ширина списка.

В случае ошибки, в ответ на сообщение возвращается значение CB_ERR.

По умолчанию, минимально допустимая ширина списка равна нулю. Ширина списка равна минимально допустимой ширине списка или ширине окна ComboBox, в зависимости от того какое из этих двух значений больше.

CB_SETEDITSEL

Приложение отправляет это сообщение для выделения символов в поле ввода.

wParam не используется.

Младшее слово lParam определяет начальное положение. Если оно равно -1, то выделение (если оно было) удаляется.

Старшее слово lParam определяет конечное положение. Если оно равно -1, то выделяется текст от начального символа заданного в младшем слове lParam до последнего символа в поле ввода.

В случае успеха в ответ на сообщение вовзращается значение TRUE. Если сообщение было отправлено комбинированному списку со стилем CBS_DROPDOWNLIST, то в ответ на сообщение возвращается значение CB_ERR.

Положение символов отсчитывается с нуля. Первый символ в поле ввода имеет положение 0. Конечном положение определяет положение первого символа после последнего выделенного символа. Например, для выделения первых 4 символов поля ввода, используйте начальное положение 0 и конечное положение 4.

CB_SETEXTENDEDUI

Приложение отправляет это сообщение для указания того, какой пользовательский интерфейс должно использовать окно ComboBox с установленным стилем CBS_DROPDOWN или CBS_DROPDOWNLIST: интерфейс по умолчанию или расширенный интерфейс.

wParam содержит значение типа BOOL, определяющее какой интерфейс нужно использовать: расширенный интерфейс (TRUE), или интерфейс по умолчанию (FALSE).

lParam не используется.

В случае успеха в ответ на сообщение возвращается значение CB_OKAY. В случае ошибки - CB_ERR.

По умолчанию клавиша F4 открывает или закрывает список, а клавиша "стрелка вниз" изменяет текущий выбор. В комбинированном списке с расширенным интерфейсом пользователя клавиша F4 недоступна, а клавиша "стрелка вниз" открывает список. Колёсико мыши, которое обычно прокручивает записи в списке, ничего не делает при установленном расширенном интерфейсе пользователя.

CB_SETHORIZONTALEXTENT

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

wParam содержит новую ширину прокрутки списка, в пикселях.

lParam не используется.

CB_SETITEMDATA

Приложение отправляет это сообщение для установки значения асоциированного с заданной записью в списке.

wParam содержит номер записи. Нумерация записей начинается с нуля.

lParam содержит новое значение, ассоциируемое с записью.

В случае ошибки в ответ на сообщение возвращается значение CB_ERR.

Если заданная запись находится в перерисовываемом владельцем списке без стиля CBS_HASSTRINGS, то данное сообщение замещает значение параметра lParam сообщения CB_ADDSTRING или CB_INSERTSTRING, посредством которых запись была добавлена в список.

CB_SETITEMHEIGHT

Приложение отправляет это сообщение для установки высоты записей списка или поля выбора.

wParam определяет компонент окна ComboBox, высота которого меняется. Он должен быть равен -1 для установки высоты поля выбора (selection field). Он должен быть равен нулю для установки высоты записей списка, если не установлен стиль CBS_OWNERDRAWVARIABLE. Если же этот стиль установлен, то wParam содержит номер записи, высота которой изменяется. Нумерация записей начинается с нуля.

lParam содержит новую высоту, в пикселях.

Если номер записи или высота заданы некорректно, то в ответ на сообщение возвращается значение CB_ERR.

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

CB_SETLOCALE

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

wParam содержит идентификатор локали, которая будет использоваться при сортировке во время добавления строк.

lParam не используется.

В ответ на сообщение вовращается предыдущий идентификатор локали. Если wParam описывает локаль, не установленную в системе, в ответ на сообщение возвращается значение CB_ERR, а текущая локаль комбинированного списка остается неизменной.

Используйте макрос MAKELCID для построения идентификатора локали и макрос MAKELANGID для построения идентификатора языка. Идентификатор языка состоит из основного идентификатора языка и идентификатора диалекта (sublanguage identifier).

CB_SETMINVISIBLE

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

wParam содержит минимальное количество видимых записей.

lParam не используется, он должен быть равен нулю.

В случае успеха в ответ на это сообщение возвращается значение TRUE. В противном случае возвращается значение FALSE.

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

Если у комбинированного списка установлен стиль CBS_NOINTEGRALHEIGHT, то данное сообщение игнорируется.

Для использования сообщения CB_SETMINVISIBLE приложение должно указать в манифесте использование библиотеки comctl32.dll версии 6.

CB_SETTOPINDEX

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

wParam содержит номер заисис списка. Нумерация записей ведется с нуля.

lParam не используется.

В случае успеха в ответ на сообщение возвращается значение нуль.

В случае ошибки в ответ на сообщение возвращается значение CB_ERR.

CB_SHOWDROPDOWN

Приложение отправляет это сообщение для того, чтобы открыть или скрыть список окна с установленным стилем CBS_DROPDOWN, или CBS_DRODOWNLIST.

wParam содержит значение типа BOOL, которое определяет должен ли раскрывающийся список быть открыт, или же он должен быть закрыт. Значение TRUE открывает список, значение FALSE - скрывает его.

lParam не используется.

В ответ на сообщение всегда возвращается значение TRUE.

Данное сообщение никак не воздействует на список с установленным стилем CBS_SIMPLE.

Заголовочный файл: Commctrl.h, winuser.h (включен в windows.h)


Стили

CBS_AUTOHSCROLL

Автоматически прокручивает текст в поле ввода вправо когда пользователь вводит символ, не умещающийся в строке. Если этот стиль не указан, то допускается только текст, умещающийся в поле ввода без горизонтальной прокрутки.

CBS_DISABLENOSCROLL

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

CBS_DROPDOWN

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

CBS_DROPDOWNLIST

Аналогично CBS_DROPDOWN, за исключением того, что поле ввода недоступно для редактирования. В нём отображается текущий выбор в комбинированном списке.

CBS_HASSTRINGS

Указывает на то, что перерисовываемый владельцем комбинированный список содержит элементы состоящие из строк. Комбинированный список поддерживает область памяти для строк, так что приложение может использовать сообщение CB_GETLBTEXT для получения текста конкретного элемента списка.

CBS_LOWERCASE

Весь текст в комбинированном списке приводится к нижнему регистру.

CBS_NOINTEGRALHEIGHT

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

CBS_OEMCONVERT

Текст, введенный в поле ввода комбинированного списка из набора символов Windows перекодируется в набор символов OEM и обратно в набор символов Windows. Это обеспечивает правильное преобразование символов, когда приложение вызывает функцию CharToOem для перекодировки строки в комбинированном списке из кодировки Windows в кодировку OEM. Это стиль наиболее полезен для комбинированных списков, содержащих имена файлов и применяется только для комбинированных списков созданных со стилем CBS_SIMPLE или CBS_DROPDOWN.

CBS_OWNERDRAWFIXED

Указывает, что владелец комбинированного списка отвечает за перерисовку его содержимого и, что все элементы в списке имеют одинаковую высоту. Окно-владелец получает сообщение WM_MEASUREITEM при создании комбинированного списка и WM_DRAWITEM когда комбинированный список нуждается в перерисовке.

CBS_OWNERDRAWVARIABLE

Указывает, что владелец комбинированного списка отвечает за перерисовку его содержимого и, что элементы в списке имеют разную высоту. Окно-владелец получает сообщение WM_MEASUREITEM при создании комбинированного списка и WM_DRAWITEM когда комбинированный список нуждается в перерисовке.

CBS_SIMPLE

Всегда отображает окно списка. Текущий выбор в комбинированном списке отображается в поле ввода.

CBS_SORT

Автоматически сортирует строки, добавляемые в комбинированный список.

CBS_UPPERCASE

Весь текст в комбинированном списке приводится к верхнему регистру.

Заголовочный файл: CommCtrl.h


Уведомления

CBN_CLOSEUP

Отправляется, когда закрывается список. Родительское окно получает это уведомление посредством сообщения WM_COMMAND.

Младшее слово wParam содержит идентификатор комбинированного списка. Старшее слово wParam содержит код уведомления.

lParam содержит описатель комбинированного списка.

Если пользователь меняет текущий выбор, то комбинированный список также отправляет уведомление CBN_SELCHANGE при закрытии списка. В целом, вы не можете предугадать в каком порядке будут получены эти уведомления.В частности, уведомление CBN_SELCHANGE может быть получено до или после уведомления CBN_CLOSEUP.

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

Данное уведомление не отправляется, если у комбинированного списка установлен стиль CBS_SIMPLE.

CBN_DBLCLK

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

Младшее слово wParam содержит идентификатор комбинированного списка. Старшее слово wParam содержит код уведомления.

lParam содержит описатель комбинированного списка.

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

CBN_DROPDOWN

Отправляется, когда становится видимым раскрывающийся список. Родительское окно получает это уведомление посредством сообщения WM_COMMAND.

Младшее слово wParam содержит идентификатор комбинированного списка. Старшее слово wParam содержит код уведомления.

lParam содержит описатель комбинированного списка.

Данное уведомление отправляется только если у комбинированного списка установлен стиль CBS_DROPDOWN или CBS_DROPDOWNLIST.

CBN_EDITCHANGE

Отправляется после того, как пользователь выполнил действия, которые, возможно, изменили текст, отображаемый в поле ввода. В отличие от уведомления CBN_EDITUPDATE, данное уведомление отправляется после того, как система обновила экран. Родительское окно получает это уведомление посредством сообщения WM_COMMAND.

Младшее слово wParam содержит идентификатор комбинированного списка. Старшее слово wParam содержит код уведомления.

lParam содержит описатель комбинированного списка.

Если у комбинированного списка установлен стиль CBS_DROPDOWNLIST, то данное уведомление не отправляется.

CBN_EDITUPDATE

Отправляется, когда поле ввода, входящее в состав комбинированного списка, собирается отобразить измененный текст. данное уведомление отправляется после того, как элемент управления сформирует текст, но до того, как он отобразит этот текст на экране. Родительское окно получает это уведомление посредством сообщения WM_COMMAND.

Младшее слово wParam содержит идентификатор комбинированного списка. Старшее слово wParam содержит код уведомления.

lParam содержит описатель комбинированного списка.

Если у комбинированного списка установлен стиль CBS_DROPDOWNLIST, то данное уведомление не отправляется.

CBN_ERRSPACE

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

Младшее слово wParam содержит идентификатор комбинированного списка. Старшее слово wParam содержит код уведомления.

lParam содержит описатель комбинированного списка.

CBN_KILLFOCUS

Отправляется, когда комбинированный список теряет фокус ввода клавиатуры. Родительское окно получает это уведомление посредством сообщения WM_COMMAND.

Младшее слово wParam содержит идентификатор комбинированного списка. Старшее слово wParam содержит код уведомления.

lParam содержит описатель комбинированного списка.

CBN_SELCHANGE

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

Младшее слово wParam содержит идентификатор комбинированного списка. Старшее слово wParam содержит код уведомления.

lParam содержит описатель комбинированного списка.

Для получения номера выбранной записи используйте сообщение CB_GETCURSEL.

Уведомление CBN_SELCHANGE не отправляется если текущий выбор был изменен посредством сообщения CB_SETCURSEL.

CBN_SELENDCANCEL

Отправляется, когда пользователь выбрал запись, а затем выбрал другой элемент управления или закрыл диалоговое окно. Это означает, что первоначальный выбор должен быть проигнорирован. Родительское окно получает это уведомление посредством сообщения WM_COMMAND.

Младшее слово wParam содержит идентификатор комбинированного списка. Старшее слово wParam содержит код уведомления.

lParam содержит описатель комбинированного списка.

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

CBN_SELENDOK

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

Младшее слово wParam содержит идентификатор комбинированного списка. Старшее слово wParam содержит код уведомления.

lParam содержит описатель комбинированного списка.

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

CBN_SETFOCUS

Отправляется когда комбинированный список получает фокус ввода клавиатуры. Родительское окно получает это уведомление посредством сообщения WM_COMMAND.

Младшее слово wParam содержит идентификатор комбинированного списка. Старшее слово wParam содержит код уведомления.

lParam содержит описатель комбинированного списка.

WM_COMPAREITEM

Отправляется для определения относительного положения новой записи в сортируемом списке перерисовываемом владельцем комьинированном списке. Когда бы приложение не доьавляло новую запись, система отправляет это сообщение воладельцу комбинированного списка, созданного со стилем CBS_SORT или LBS_SORT.

wParam содержит идентификатор элемента управления, от которого пришло сообщение WM_COMPAREITEM.

lParam содержит указатель на структуру COMPAREITEMSTRUCT, которая содержит идентификаторы и определенные приложением данные для двух записей в списке.

Значение, возвращаемое в ответ на это сообщение определяет относительное положение двух записей. Допустимые значения перечислены ниже.

-1 - запись 1 предшествует записи 2 в списке.

0 - записи 1 и 2 эквивалентны.

1 - запись 1 идет после записи 2.

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

Если сообщение обрабатывает диалоговая процедура, то она должна привести возвращаемое значение к типу BOOL и непосредственно вернуть его. Значение DWL_MSGRESULT, установленное функцией SetWindowLong игнорируется.

WM_DRAWITEM

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

Окно получает это сообщение посредством своей оконной процедуры.

wParam содержит идентификатор элемента управления, который отправил сообщение WM_DRAWITEM. Если сообщение было отправлено меню, то значение данного параметра равно нулю.

lParam содержит указатель на структуру DRAWITEMSTRUCT, содержащую информацию об отрисовываемой записи и типе требуемой операции рисования.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение TRUE.

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

Поле itemAction структуры DRAWITEMSTRUCT определяет операцию рисования, которую должно выполнить приложение.

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

WM_MEASUREITEM

Отправляется окну владельцу комбинированного списка, списка, окна ListView или меню при создании элемента управления или меню.

Окно получает это сообщение посредством оконной процедуры.

wParam содержит значение поля CtlID структуры MEASUREITEMSTRUCT, на которую указывает параметр lParam. Это значение идентифицирует элемент управления, от которого пришло сообщение WM_MEASUREITEM. Если значение равно нулю, то сообщение было отправлено меню. Если значение отлично от нуля, то сообщение было отправлено комбинированным списком или списком. Если значение отлично от нуля, а значение поля itemID структуры MEASUREITEMSTRUCT, на которую указывает lParam, равно (UINT)-1, то сообщение было отправлено полем ввода комбинированного списка.

lParam содержит указатель на структуру MEASUREITEMSTRUCT, которая содержит размеры записи перерисововываемого владельцем элемента управления или меню.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение TRUE.

Когда окно-владелец получает сообщение WM_MEASUREITEM, владелец заполняет в структуре MEASUREITEMSTRUCT, на которую указывает lParam и возвращает управление системе. Так система извещается о размерах элемента управления. Если список или комбинированный список были созданы со стилем LBS_OWNERDRAWVARIABLE или CBS_OWNERDRAWVARIABLE, данное сообщение отправляется владельцу для каждой записи в элементе управления; в противном случае, сообщение отправляется единожды.

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

Заголовочный файл: winuser.h (включен в windows.h)


Флаги сообщения CB_DIR (DDL_*)

DDL_ARCHIVE

Включать архивированные файлы.

DDL_DIRECTORY

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

DDL_DRIVES

Добавить в список всех смонтированных дисков (mapped drives). Диски отображаются в виде [-x-], где x - буква диска.

DDL_EXCLUSIVE

Включать только файлы с определенными атрибутами. По умолчанию, файлы доступные и на чтение и на запись попадают в список даже если флаг DDL_READWRITE не указан.

DDL_HIDDEN

Включать скрытые файлы.

DDL_READONLY

Включать файлы доступные только для чтения.

DDL_READWRITE

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

DDL_SYSTEM

Включать системные файлы.

Заголовочный файл: winuser.h (включен в windows.h)


Сообщения

CBEM_DELETEITEM

Удаляет запись из элемента управления ComboBoxEx.

wParam содержит порядковый номер удаляемой записи. Нумерация начинается с нуля.

lParam должен содержать значение нуль.

В ответ на данное сообщение возвращается количество записей, оставшихся в элементе управления. Если параметр wParam содержит недопустимое значение, то в ответ на сообщение возвращается значение CB_ERR.

Данное сообщение преобразуется в сообщение CB_DELETESTRING, адресованное оэлементу управления ComboBox.

CBEM_GETCOMBOCONTROL

Получает описатель дочернего элемента управления ComboBox.

wParam должен содержать значение нуль.

lParam должен содержать значение нуль.

В ответ на сообщение возвращается описатель элемента управления ComboBox, входящего в состав элемента управления ComboBoxEx.

CBEM_GETEDITCONTROL

Получает описатель поля ввода, входящего в состав элемента управления ComboBoxEx. Элемент управления ComboBoxEx использует поле ввода, когда у него установлен стиль CBS_DROPDOWN.

wParam должен содержать значение нуль.

lParam должен содержать значение нуль.

Если у элемента управления установлен стиль CBS_DROPDOWN, то в ответ на сообщение возвращается описатель поля ввода. Если данный стиль не установлен, то в ответ на сообщение возвращается значение NULL.

CBEM_GETEXTENDEDSTYLE

Получает набор расширенных стилей, установленных для элемента управления ComboBoxEx.

wParam должен содержать значение нуль.

lParam должен содержать значение нуль.

В ответ на сообщение возвращается значение типа DWORD, содержащее набор расширенных стилей, установленных для элемента управления. Перечень допустимых расширенных стилей элемента управления ComboBoxEx приведен здесь.

CBEM_GETIMAGELIST

Получает описатель коллекции изображений, связанной с элементом управления ComboBoxEx.

wParam должен содержать значение нуль.

lParam должен содержать значение нуль.

В ответ на сообщение возвращается описатель коллекции изображений, связанной с элементом управления. В случае ошибки в ответ на соообщение возвращается значение NULL.

CBEM_GETITEM

Получает информацию о заданной записи элемента управления ComboBoxEx.

wParam должен содержать значение нуль.

lParam содержит указатель на структуру COMBOBOXEXITEM, в которую записывается информация о записи.

В случае успеха в ответ на сообщение возвращается ненулевое значение, а в случае ошибки - значение нуль.

Поля iItem и mask структуры должны быть заполнены до отправки сообщения. Поле iItem должно содержать номер записи, а поле mask - тип запрашиваемой информации. Другие поля должны устанавливаться в случае необходимости. Например, при запросе текста записи, вы должны установить флаг CBEIF_TEXT и заполнить поле cchTextMax. При указании в поле iItem значения -1 будет возвращена информация о записи, отображаемой в поле ввода.

Если в поле mask структуры COMBOBOXEXITEM установлен флаг CBEIF_TEXT, то элемент управления может изменить значение поля pszText, записав в него новый указатель на текст, а не заполнять текстом полученный буфер. Приложения не должны полагаться на то, что текст записи всегда будет размещен в требуемом буфере.

CBEM_GETUNICODEFORMAT

Получает для элемента управления значение флага Unicode формата.

wParam должен содержать значение нуль.

lParam должен содержать значение нуль.

В ответ на сообщение возвращается значение флага Unicode формата. Если это значение отлично от нуля, то элемент управления использует Unicode символы. Если же возвращаемое значение равно нулю, то элемент управления использует ANSI символы.

CBEM_HASEDITCHANGED

Определяет изменил ли пользователь текст в поле ввода элемента управления ComboBoxEx.

wParam должен содержать значение нуль.

lParam должен содержать значение нуль.

Если текст в поле ввода был изменен, то в ответ на сообщение возвращается значение TRUE. В противном случае, в ответ на сообщение возвращается значение FALSE.

Элемент управления ComboBoxEx использует поле ввода, когда у него установлен стиль CBS_DROPDOWN. Вы можете получить описатель окна поля ввода путем отправки сообщения CBEM_GETEDITCONTROL.

Когда пользователь начинает редактировать текст в поле ввода, приложение получает уведомление CBEN_BEGINEDIT. Когда редактирование завершено, или был потерян фокус ввода, приложение получает уведомление CBEN_ENDEDIT. Сообщение CBEM_HASEDITCHANGED полезно для определения факта изменения текста только в том случае, если оно было отправлено до получения уведомления CBEN_ENDEDIT. Если сообщение было отправлено после получения уведомления, то в ответ на сообщение будет возвращено значение FALSE. Например, допустим, что пользователь начал редактировать текст в поле ввода, но фокус ввода был передан другому окну, в результате чего было отправлено уведомление CBEN_ENDEDIT. Если вы затем отправите сообщение CBEM_HASEDITCHANGED, то в ответ на него будет возвращено значение FALSE, хотя текст был изменен.

Стиль CBS_SIMPLE работает некорректно с сообщением CBEM_HASEDITCHANGED.

CBEM_INSERTITEM

Вставляет новую запись в элемент управления ComboBoxEx.

wParam должен содержать значение нуль.

lParam содержит указатель на структуру COMBOBOXEXITEM, которая содержит информацию о вставляемой записи. Перед отправкой сообщение в поле iItem этой структуры должен быть занесен порядковый номер, по которому будет вставлена запись. Нумерация начинается с нуля. Для вставки записи в конец списка, установите в поле iItem значение -1.

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

CBEM_KILLCOMBOFOCUS

Данное сообщение не реализовано.

CBEM_SETCOMBOFOCUS

Данное сообщение не реализовано.

CBEM_SETEXTENDEDSTYLE

Устанавливает расширенные стили для элемента управления ComboBoxEx.

wParam содержит значение типа DWORD, которое определяет какие стили в параметре lParam будут установлено. Изменены будут только расширенные стили, заданные в lParam. Если значение параметра wParam равно нулю, то будут установлены все стили, заданные в lParam.

lParam содержит значение типа DWORD, которое описывает набор расширенные стилей устанавливаемых для элемента управления. Расширенные стили перечислены здесь.

В ответ на сообщение возвращается значение типа DWORD, содержащее набор расширенных стилей ранее используемый для элемента управления.

Параметр wParam позволяет вам изменять один или несколько стилей элемента управления без получения текущего набора стилей. Например, еси в параметре wParam вы передадите стиль CBES_EX_NOEDITIMAGE и значение нуль в параметре lParam, то стиль CBES_EX_NOEDITIMAGE будет отменен, а все другие стили останутся без изменения.

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

CBEM_SETIMAGELIST

Устанавливает коллекцию изображений для элемента управления ComboBoxEx.

wParam должен содержать значение нуль.

lParam содержит описатель коллекции изображений, устанавливаемой для элемента управления.

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

Изображения в вашей коллекции изображений могут изменить размер элемента управления ComboBoxEx. Рекомендуется, чтобы вы самостоятельно изменяли размер элемента управления после отправки этого сообщения для того, чтобы гарантировать его корректное отображение.

CBEM_SETITEM

Устанавливает атрибуты записи в элементе управления ComboBoxEx.

wParam должен содержать значение нуль.

lParam содержит указатель на структуру COMBOBOXEXITEM, которая содержит устанавливаемую для записи информацию. Перед отправкой сообщения вы должны установить значение поля mask этой структуры, для указания устанавливаемых атрибутов, и поле iItem, содержащее номер обновляемой записи. Нумерация начинается с нуля. Установите в поле iItem значение -1 для изменения записи, отображаемой в поле ввода.

В ответ на сообщение, в случае успеха, возвращается ненулевое значение, а в случае ошибки - значение нуль.

CBEM_SETUNICODEFORMAT

Устанавливает флаг Unicode формата для элемента управления. Это сообщение позволяет вам изменить набор символов используемых в элементе управления без необходимости создания его аналога.

wParam залает набор символов, устанавоиваемый для элемента управления. Если значение параметра отлично от нуля, то элемент управления будет использовать Unicode символы. Если же значение равно нулю, то элемент управления будет использовать ANSI символы.

lParam должен содержать значение нуль.

В ответ на сообщение возвращается предыдущее значение флага Unicode формата.

CBEM_SETWINDOWTHEME

Появилось в Windows XP. Устанавливает стиль отображения элемента управления ComboBoxEx.

wParam должен содержать значение нуль.

lParam содержит указатель на Unicode строку, содержащую устанавливаемый стиль отображения.

В ответ на сообщение ничего не возвращается.

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

Заголовочный файл: Commctrl.h


Стили

Стили перечисленные ниже расширяют стили обычного комбинированного стиля, перечисленные здесь, которые также поддерживаются окном ComboBoxEx.

CBES_EX_CASESENSITIVE

(0x00000010)

Поиск в списке будет вестись с учетом регистра. Поиск ведется в поле ввода и в раскрывающемся списке с помощью сообщения CB_FINDSTRINGEXACT.

CBES_EX_NOEDITIMAGE

(0x00000001)

Поле ввода и раскрывающийся список не отображают изображения элементов списка (item images).

CBES_EX_NOEDITIMAGEINDENT

(0x00000002)

Поле ввода и раскрывающийся список не отображают изображения элементов списка (item images).

CBES_EX_NOSIZELIMIT

(0x00000008)

Позволяет окну ComboBoxEx иметь меньший вертикальный размер, чем содержавшееся внутри него окно ComboBox. Если ComboBoxEx имеет меньший размер, чем ComboBox, то окно ComboBox будет обрезано (clipped).

CBES_EX_PATHWORDBREAKPROC

(0x00000004)

Только Windows NT. Полде ввода будет использовать символы слеша (/), обратного слеша (\) и точку (.) в качестве разделителей слов. Это позволяет эффективно использовать клавишы быстрого вызова для пословного перемещения курсора при работе со строками, содержащими пути и адреса URL.

CBES_EX_TEXTENDELLIPSIS

(0x00000020)

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

Примечание

Устанавливайте и извлекайте расширенные стили окна ComboBox с помощью сообщений CBEM_SETEXTENDEDSTYLE и CBEM_GETEXTENDEDSTYLE.

Если вы пытаетесь установить расширенный стиль для окна ComboBoxEx, созданного со стилем CBS_SIMPLE, то оно может перерисовываться неправильно. Стиль CBS_SIMPLE также работает неправильно с расширенным стилем CBES_EX_PATHWORDBREAKPROC.

Заголовочный файл: CommCtrl.h


Уведомления

CBEN_BEGINEDIT

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

lParam содержит указатель на структуру NMHDR, которая содержит информацию об уведомлении.

Приложение, обрабатывающее это уведомление, должно в ответ на него вернуть значение нуль.

CBEN_DELETEITEM

Отправляется когда была удалена запись. Данное уведомление доставляется посредством сообщения WM_NOTIFY.

lParam содержит указатель на структуру NMCOMBOBOXEX, сдержащую информацию об уведомлении и удаленной записи.

Приложение, обрабатывающее это уведомление, должно в ответ на него вернуть значение нуль.

CBEN_DRAGBEGIN

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

lParam содержит указатель на структуру NMCBEDRAGBEGIN, которая содержит информацию об уведомлении.

Значение, возвращаемое в ответ на уведомление, игнорируется.

Если приложение реализует для элемента управления функциональность drag-and-drop, то оно должно начинать операцию перетаскивания в ответ на это уведомление.

CBEN_ENDEDIT

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

lParam содержит указатель на структуру NMCBEENDEDIT, содержащую информацию о том, как пользователь завершил операцию редактирования.

В ответ на уведомление возвращается значение FALSE, в случае принятия уведомления и разрешения отображения в элементе управления выбранной записи. В противном случае, в ответ на уведомление возвращается значение TRUE.

CBEN_GETDISPINFO

Отправляется для получения информации об отображаемой записи обратного вызова (callback item). Данное уведомление доставляется посредством сообщения WM_NOTIFY.

lParam содержит указатель на структуру NMCOMBOBOXEX, содержащую информацию об уведомлении.

Приложение, обрабатывающее это уведомление, должно вернуть в ответ на него значение нуль.

Структура NMCOMBOBOXEX содержит структуру COMBOBOXEXITEM, поле mask которой определяет запрашиваемую для элемента управления информацию.

Для вовзращения элементу управления запрошенной информацией заполните соответствующие поля полученной структуры. Если в обработчике сообщения в поле mask структуры COMBOBOXEXITEM установлено значение CBEIF_DI_SETITEM, то элемент управления сохранит полученную информацию и больше не будет запрашивать её снова.

CBEN_INSERTITEM

Отправляется когда в элемент управления была добавлена новая запись. Уведомление доставляется посредством сообщения WM_NOTIFY.

lParam содержит указатель на структуру NMCOMBOBOXEX, содержащую информацию об уведомлении и вставленной записи.

Приложение, обрабатывающее это уведомление, должно в ответ на него вернуть значение нуль.

NM_SETCURSOR

Уведомляет окно, являющееся родительским по отношению к элементу управления ComboBoxEx, о том, что элемент управления, в ответ на сообщение WM_SETCURSOR, установил курсор. Данное уведомление доставляется посредством сообщения WM_NOTIFY.

lParam содержит указатель на структуру NMMOUSE, которая содержит дополнительную информацию об этом уведомлении.

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

Заголовочный файл: Commctrl.h


Сообщения

DTM_CLOSEMONTHCAL

(DTM_FIRST + 13)

Появилось в Windows Vista. Закрывает элемент управления Date and Time Picker (DTP). Вы можете отправлять это сообщение напрямую или использовать макрос DateTime_CloseMonthCal.

wParam должен содержать значение нуль.

lParam должен содержать значениенуль.

В ответ на сообщение возвращается значение нуль.

Разрушение элемента управления и отправка родителю уведомления DTN_CLOSEUP противоположно раскрытию элемента управления (отправке уведомления DTN_DROPDOWN).

DTM_FIRST

(0x1000)

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

DTM_GETDATETIMEPICKERINFO

(DTM_FIRST + 14)

Появилось в Windows Vista. Получает информацию об элементе управления Date And Time Picker.

wParam должен содержать значение нуль.

lParam содержит указатель на структуру DATETIMEPICKERINFO, в которую будет записана информация. За выделение памяти под эту структуру отвечает вызывающая процедура. Перед отправкой сообщения вы должны записать значение sizeof(DATETIMEPICKERINFO) в поле cbSize этой структуры .

Значение, возвращаемое в ответ на это сообщение, игнорируется.

DTM_GETIDEALSIZE

(DTM_FIRST + 15)

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

wParam не используется. Должен содержать значение нуль.

lParam содержит указатель на структуру SIZE, в которую будут записаны размеры. Вызывающее приложение должно самостоятельно выделить память под эту структуру.

В ответ на сообщение возвращается значение TRUE.

DTM_GETMCCOLOR

(DTM_FIRST + 7)

Получает цвет заданной части календаря в элементе управления Date and Time Picker. Вы можете отправить это сообщение напрямую или использовать макрос DateTime_GetMonthCalColor.

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

lParam должен содержать значение нуль.

В случае успеха в ответ на сообщение возвращается значение типа COLORREF, задающее цвет установленный для заданной части календаря. В случае же ошибки в ответ на сообщение возвращается значение -1.

DTM_GETMCFONT

(DTM_FIRST + 10)

Получает шрифт, используемый в календаре элемента управления Date and Time Picker. Вы можете отправить это сообщение напрямую или использовать макрос DateTime_GetMonthCalFont.

wParam должен содержать значение нуль.

lParam должен содержать значение нуль.

В ответ на сообщение возвращается значение типа HFONT, содержащее описатель текущего шрифта.

DTM_GETMCSTYLE

(DTM_FIRST + 12)

Появилось в Windows Vista. Получает набор стилей элемента управления Date and Time Picker (точнее, календаря, входящего в состав DTP). Вы можете отправить это сообщение напрямую, или использовать макрос DateTime_GetMonthCalStyle.

wParam должен содержать значение нуль.

lParam должен содержать значение нуль.

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

DTM_GETMONTHCAL

(DTM_FIRST + 8)

Получает описатель календаря, входящего в состав элемента управления Date and Time Picker (DTP). Вы можете отправить это сообщение напрямую или использовать макрос DateTime_GetMonthCal.

wParam должен содержать значение нуль.

lParam должен содержать значение нуль.

В случае успеха в ответ на сообщение возвращается описатель календаря. В случае же ошибки возвращается значение NULL.

Когда пользователь щелкает на раскрывающей календарь стрелке элемент управления DTP создаёт календарь (уведомление DTN_DROPDOWN). Когда календарь больше не нужен, он уничтожается (уведомление DTN_CLOSEUP). Поэтому ваше приложение не должно полагаться на постоянное значение описателя календаря.

DTM_GETRANGE

(DTM_FIRST + 3)

Получает значения текущих минимальных и максимальных доступных моментах времени доступных для выбора в элементе управления DTP. Вы можете отправить это сообщение напрямую или использовать макрос DateTime_GetRange.

wParam должен содержать значение нуль.

lParam содержит указатель на массив из двух структур SYSTEMTIME.

В ответ на сообщение возвращается значение типа DWORD, представляющее собой коминацию флагов GDTR_MIN (1) и GDTR_MAX (2). Если утсановлен флаг GDTR_MIN (1), то первый элемент массива структур SYSTEMTIME содержит минимально допустимый момент времени. Если установлен флаг GDTR_MAX (2), то второй элемент массива структур SYSTEMTIME содержит максимально допустимый момент времени.

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

DTM_GETSYSTEMTIME

(DTM_FIRST + 1)

Получает текущую выбранную дату и время в элементе управления DTP и размещает полученную информацию в структуре SYSTEMTIME. Вы можете отправить это сообщение напрямую или использовать макрос DateTime_GetSystemtime.

wParam должен содержать значение нуль.

lParam содержит указатель на структуру SYSTEMTIME. Если в ответ на сообщение будет возвращено значение GDT_VALID (0), то эта структура будет содержать текущее выбранное время. В противном случае она будет содержать недействительную информацию. Параметр lParam должен содержать корректное значение, он не должен содержать значение NULL.

Если запрошенная информация была успешно размещена в указанной структуре SYSTEMTIME, то в ответ на сообщение возвращается значение GDT_VALID (0). Если у элемента управления DTP установлен стиль DTS_SHOWNONE и флажок не установлен, то в ответ на сообщение будет возвращено значение GDT_NONE (1). Если же произошла ошибка, то в ответ на сообщение будет возвращено значение GDT_ERROR (-1).

DTM_SETFORMAT

(DTM_SETFORMATA = DTM_FIRST + 5

DTM_SETFORMATW = DTM_FIRST + 0x50)

Устанавливает формат отображения даты и времени в элементе управления Date and Time Picker (DTP). Вы можете отправить это сообщение напрямую или использовать макрос DateTime_SetFormat.

wParam должен содержать значение нуль.

lParam содержит указатель на завершающуюся NULL символом форматную строку.Для сброса элемента к формату по умолчанию, установите в параметре lParam значение NULL. Строение форматной строки описано здесь.

В случае успеха в ответ на сообщение возвращается ненулевое значение, а в случае ошибки - значение нуль.

В форматную строку разрешается включать неформатные символы, коорые должны быть заключены в одинарные кавычки. Например, форматная строка "'Сегодня: 'hh':'m':'s' dddd MMM dd', 'yyyy" приведет к отображению даты в виде: "Сегодня: 04:22:31 вторник Мар 23, 1996".

Элемент управления DTP отслеживает изменение локали при использовании форматной строки по умолчанию. Если испольуется пользовательская форматная строка, то он не будет обновлять её при изменении локали.

DTM_SETMCCOLOR

(DTM_FIRST + 6)

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

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

lParam содержит значение типа COLORREF, задающее новый цвет.

В случае успеха, в ответ на сообщение возвращается значение типа COLORREF, задающее предыдущий цвет заданной части календаря. В случае же ошибки, в ответ на сообщение возвращается значение -1.

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

DTM_SETMCFONT

(DTM_FIRST + 9)

Устанавливает шрифт используемый в календаре элемента управления DTP. Вы можете отправить это сообщение напрямую или использовать макрос DateTime_SetMonthCalFont.

wParam содержит описатель устанавливаемого шрифта.

lParam определяет должен ли элемент управления немедленно перерисовать себя после установки шрифта. Установка значения этого параметра равным TRUE приводит к перерисовке элемента управления.

Значение, вовзращаемое в ответ на сообщение не используется.

DTM_SETMCSTYLE

(DTM_FIRST + 11)

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

wParam должен содержать значение нуль.

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

В ответ на сообщение возвращается предыдущий набор стилей.

DTM_SETRANGE

(DTM_FIRST + 4)

Устанавливает минимально и максимально допустимые моменты времени для элемента управления DTP. Вы можете отправить это сообщение напрямую или использовать макрос DateTime_SetRange.

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

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

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

lParam содержит указатель на массив из двух структур SYSTEMTIME. первый элемент этого массива залает минимально допустимый момент времени. Второй элемент - максимально допустимый момент времени. Элемент массива, не указанный в параметре wParam можно не заполнять.

В случае успеха, в ответ на сообщение возвращается ненулевое значение, а в случае ошибки - значение нуль.

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

DTM_SETSYSTEMTIME

(DTM_FIRST + 2)

Устанавливает время в элементе управления DTP. Вы можете отправить это сообщение напрямую или использовать макрос DateTime_SetSystemtime.

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

GDT_VALID (0) - установить время согласно информации, указанной в структуре, на которую указывает параметр lParam.

GDT_NONE (1)- установить элемент управления DTP в состояние "дата не выбрана" и сбросить флажок. Значение параметра lParam игнорируется. Это работает только для элементов управления DTP, у которых установлен стиль DTS_SHOWNONE.

lParam указывает на структуру SYSTEMTIME, содержащую системное время, устанавливаемое в элементеуправление DTP.

В случае успеха, в ответ на сообщение возвращается ненулевое значение, а в случае ошибки - значение нуль.

Заголовочный файл: Commctrl.h


Стили

DTS_APPCANPARSE

Позволяет владельцу элемента управления разбирать пользовательский ввод и выполнять необходимые действия. Это позволяет пользователю редактировать ввод в клиентской области окна при нажатии на клавишу F2. Когда пользователь завершает редактирование элемент управления отправляет уведомление DTN_USERSTRING.

DTS_LONGDATEFORMAT

Дата отображается в длинном формате. Дата записывается в виде "17 февраля 2015 г.". Данный формат описывается константой LOCALE_SLONGDATEFORMAT.

DTS_RIGHTALIGN

Раскрывающийся календарь будет выровнен по правому краю элемента управления, а не по левому, как выравнивается по умолчанию.

DTS_SHORTDATECENTURYFORMAT

Версия 5.80. Аналогично стилю DTS_SHORTDATEFORMAT, с той лишь разницей, что год отображается в виде 4 цифр (17.02.2015). Данный формат основан на формате LOCALE_SSHORTDATE.

DTS_SHORTDATEFORMAT

Дата отображается в коротком формате. Дата записывается в виде "17.02.2015" (согласно msdn в виде "17.02.15", но мои эксперименты это не подтверждают). Данный формат описывается константой LOCALE_SSHORTDATE.

DTS_SHOWNONE

Разрешает отсутствие выбранной даты в элементе управления. Если этот стиль установлен, то в элементе управления будет отображаться флажок (check box), который автоматически устанавливается при выборе или ручном вводе даты. Если впоследствии этот флажок будет сброшен, то приложение не сможет получить дату из элемента управления, так как считается, что в элементе управления дата не выбрана. Состояние флажка может быть изменено с помощью сообщения DTM_SETSYSTEMTIME, или запрошено с помощью сообщения DTM_GETSYSTEMTIME.

DTS_TIMEFORMAT

Отображает время. Оно записывается в виде "21:55:51". Данный формат описывается константой LOCALE_STIMEFORMAT.

DTS_UPDOWN

В правой части элемента управления Date and Time Picker отображается элемент управления up-down. Этот стиль может использоваться вместо раскрывающегося календаря, который используется по умолчанию.

Примечание

Стили DTS_*FORMAT, описывающие формат отображения не могут сочетаться. Для уcтановки формата используйте сообщение DTM_SETFORMAT.

Заголовочный файл: CommCtrl.h


Форматная строка Date and Time Picker

Форматная строка элемента управления Date and Time Picker (DTP) состоит из серии элементов, описывающих отдельные части выводимой информации и то, как их отображать. Элементы будут отображаться в том порядке, в котором они упомянуты в форматной строке.

Элементы даты и времени будут замещены фактическими значенями даты и времени. Они перечислены ниже.

"d" - день, в виде 1 или 2 цифр.

"dd" - день в виде 2 цифр. Если день описывается одной цифрой, то перед ней будет стоять нуль.

"ddd" - день недели в виде трех букв.

"dddd" - полное наименование дня недели.

"h" - час в 12-часовом формате, в виде 1или 2 цифр.

"hh" - час в 12-часовом формате в виде 2 цифр. Если час описывается одной цифрой, то перед ней будет стоять нуль.

"H" - час в 24-часовом формате, в виде 1 или 2 цифр.

"HH" - час в 24-часовом формате, в виде 2 цифр. Если час описывается одной цифрой, то перед ней будет стоять нуль.

"m" - минута в виде 1 или 2 цифр.

"mm" - минута в виде 2 цифр. Если минута описывается одной цифрой, то перед ней будет стоять нуль.

"s" - секунда в виде 1 или 2 цифр.

"ss" - секунда в виде 2 цифр. Если секунда описывается одной цифрой, то перед ней будет стоять нуль.

"M" - номер месяца в виде 1 или 2 цифр.

"MM" - номер месяца в виде двух цифр. Если номер месяца описывается одной цифрой, то перед ней будет стоять нуль.

"MMM" - месяц в виде трех букв.

"MMMM" - полное наименование месяца.

"t" - однобуквенное обозначение AM/PM (до полудня/после полудня) (AM будет отображаться как "A").

"tt" - двухбуквенное обозначение AM/PM (AM будет отображаться как "AM").

"yy" - последние две цифры года (год 1996 будет отображаться как "96").

"yyyy" - год полностью (год 1996 будет отображаться как "1996").

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

Не форматные символы, не заключенные в кавычки, приводят к непредсказуемому отображению даты и времении в элементе управления DTP.

Например, для отображения текущей даты в формате "Сегодня: 04:22:31 вторник Мар 23, 1996", форматна строка должна быть: "'Сегодня: 'hh':'m':'s' dddd MMM dd', 'yyyy". Для включения одинарной кавычки в ваш текст используйте две кавычки идущие подряд.

Дополнительно к станартным форматным символам и свою тексту, вы также можете определять поля обратного вызова (Callback fields). Эти поля используются для запроса информации у пользователя. Для определения такого поля используйте в форматной строке один или несколько символов "X" (ASCII код 88). Вы можете создавать обратные поля ввода, имеющие уникальные идетификаторы, путем повторения символов "X". Так, форматная строка "XX dddd MMM dd', 'yyy XXX" имеет два уникальных поля обратного вызова "XX" и "XXX". Так же как и другие поля элемента управления DTP, поля обратного вызова отображаются слева направо в соответствии с их положением в форматной строке.

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


Цвета календаря (MCSC_*)

MCSC_BACKGROUND

(0)

Цвет фона между месяцами.

MCSC_MONTHBK

(4)

Цвет фона внутри месяца.

MCSC_TEXT

(1)

Цвет текста внутри месяца.

MCSC_TITLEBK

(2)

Цвет фона в заголовке календаря.

MCSC_TITLETEXT

(3)

Цвет текста в заголовке календаря.

MCSC_TRAILINGTEXT

(5)

Цвет текста последующего и предшествующего дней. Последующий и предшествующий дни - это дни из предыдущего и последующего месяцев, которые отображаются в календаре текущего месяца.

Заголовочный файл: CommCtrl.h


Стили

ES_AUTOHSCROLL

Автоматически прокурчивает текст вправо на 10 символов когда пользователь вводит символ в конце строки. Когла пользователь нажимает на кнопку ENTER, элемент управления прокручивает список к началу.

ES_AUTOVSCROLL

Автоматически прокручивает текст на одну страницу когда пользователь на последней строке нажимает на клавишу ENTER.

ES_CENTER

Текст выравнивается по центру.

ES_LEFT

Текст выравнивается по левому краю.

ES_LOWERCASE

Все символы в поле ввода приводятся к нижнему регистру.

ES_MULTILINE

Создается многострочное поле ввода. По умолчанию создается поле ввода с одной строкой.

Если определен стиль ES_AUTOVSCROLL поле ввода старается показать как можно больше строк, и прокруивает их вниз когда пользователь нажимает на клавишу ENTER. Если стиль ES_AUTOVSCROLL не определен и поле ввода не может показать больше строк, то при нажатии на клавишу ENTER будет подаваться звуковой сигнал.

Если определен стиль ES_AUTOHSCROLL, то текст в оле ввода будет автоматически прокурычиваться по горизонтали. Для начала новой строки нужно нажать на клавишу ENTER. Если же стиль ES_AUTOHSCROLL не определен, то поле ввода будет автоматически переносить слова на новую строку. При изменении размеров поля ввода перенос слов будет автоматически перенастраиваться.

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

ES_NOHIDESEL

Отменяет поведение по умолчанию длы поля ввода. По умолчанию поле ввода снимает с текста выделение если поле ввода теряет фокус. Если определен стиль ES_NOHIDESEL, выдуденный текст остается выделенным даже если поле ввода не владеет фокусом.

ES_NUMBER

В поле ввода рахрешено вводить только цифры. Заметьте, что даже если определен этот стиль в поле ввода можно помещать нефифровые символы.

ES_OEMCONVERT

Конвертирует текст, введенный в поле ввода. Рекст конвертируется из набора символов Windows в OEM набор символов. Этот стиль наиболее полезен для полей ввода, в которых указывается имя файла при использовании файовых систем не поддерживающих Unicode.

ES_PASSWORD

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

ES_READONLY

Текст в поле ввода доступен только для чтения.

ES_RIGHT

Текст в поле ввода выравнивается по правому краю.

ES_UPPERCASE

Все символы в поле ввода автоматически приводятся к верхнему регистру.

ES_WANTRETURN

Указывает, что при нажатии на клавишу ENTER во время ввода в многострочное поле ввода происходит возврат каретки. Если этот стиль не определен, то нажатие на клавишу ENTER будет иметь тот же эффект, что и нажатие кнопки по умолчанию. Этот стиль игнорируется при его применении к однострочному полю ввода.

Заголовочный файл: winuser.h (включен в windows.h)


ImageList_Add

Добавляет одно или несколько изображений в коллекцию изображений.

Прототип

int ImageList_Add(

_In_ HIMAGELIST himl,

_In_ HBITMAP hbmImage,

_In_opt_ HBITMAP hbmMask

);

Параметры

himl[in]

Описатель коллекции изображений.

hbmImage[in]

Описатель битовой карты (bitmap), которая содержит одно или несколько изображений. Количество изображений определяется по ширине битовой карты (bitmap).

hbmMask[in,opt]

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

Возвращаемое значение

Порядковый номер первого добавленного изображения в коллекции изображений. Нумерация ведется с нуля.

Возвращаемое значение в случае ошибки

-1.

Пример использования

#include <windows.h>

#include <commctrl.h>

//Прототип функции ImageList_Create

_stdcall typedef HIMAGELIST (*IMAGELIST_CREATE)(int,int,UINT,int,int);

IMAGELIST_CREATE lpfIL_Create;

//Прототип функции ImageList_Destroy

_stdcall typedef BOOL (*IMAGELIST_DESTROY)(HIMAGELIST);

IMAGELIST_DESTROY lpfIL_Destroy;

//Прототип функции ImageList_Add

_stdcall typedef int (*IMAGELIST_ADD)(HIMAGELIST,HBITMAP,HBITMAP);

IMAGELIST_ADD lpfIL_Add;

//Прототип функции DeleteObject

_stdcall typedef BOOL (*DELETEOBJECT)(HGDIOBJ);

DELETEOBJECT lpfDeleteObject;

//Получает адреса функций из библиотек Comctl32.dll и gdi32.dll

void GetFunctions(void){

HINSTANCE hComctl32;

hComctl32 = LoadLibrary("Comctl32.dll");

lpfIL_Create = (IMAGELIST_CREATE)GetProcAddress(hComctl32,"ImageList_Create");

lpfIL_Destroy = (IMAGELIST_DESTROY)GetProcAddress(hComctl32,"ImageList_Destroy");

lpfIL_Add = (IMAGELIST_ADD)GetProcAddress(hComctl32,"ImageList_Add");

//Находим адрес функции DeleteObject

HINSTANCE hgdi32;

hgdi32 = LoadLibrary("gdi32.dll");

lpfDeleteObject = (DELETEOBJECT)GetProcAddress(hgdi32,"DeleteObject");

}

int main()

{

//Получаем адреса функций

GetFunctions();

//Создаем коллекцию изображений

HIMAGELIST hIL;

hIL = lpfIL_Create(48,48,ILC_COLOR32,3,0);

//Загружаем первое растровое изображение

HBITMAP hBitmap;

hBitmap = LoadImage(NULL,"pict_2.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

//Добавляем изображение в коллекцию

int index;

index = lpfIL_Add(hIL,hBitmap,NULL);

printf("%d\n",index);

//Освобождаем ресурсы

lpfDeleteObject(hBitmap);

//Загружаем второе растровое изображение

hBitmap = LoadImage(NULL,"pict_1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

//Добавляем изображение в коллекцию

index = lpfIL_Add(hIL,hBitmap,NULL);

printf("%d\n",index);

//Освобождаем ресурсы

lpfDeleteObject(hBitmap);

//Уничтожаем коллекцию

lpfIL_Destroy(hIL);

getchar();

return 0;

}

В данном примере мы создаём коллекцию изображений и добавляем в неё два изображения (из файлов "pict_1.bmp" и "pict_2.bmp"). Если всё сделано правильно, то на экран будут выведены порядковые номера этих изображений (соответственно 0 и 1).

Примечание

Функция ImageList_Add копирует битовую карту во внутреннюю структуру данных. Поэтому вы можете использовать функцию DeleteObject для удаления объектов hbmImage и hbmMask после возврата из функции.

Заголовочный файл | Commctrl.h
Экспортирующая библиотека | Comctl32.dll


ImageList_AddMasked

Добавляет одно или несколько изображений в коллекцию изображений, создавая маску из заданной битовой карты (bitmap).

Прототип

int ImageList_AddMasked(

HIMAGELIST himl,

HBITMAP hbmImage,

COLORREF crMask

);

Параметры

himl

Описатель коллекции изображений.

hbmImage

Описатель битовой карты (bitmap), которая содержит одно или несколько изображений. Количество изображений определяется по ширине битовоц карты.

crMask

Цвет, используемый для создания маски. Каждый пиксель этого цвета в заданной битовой карте будет заменен на черный, а соответствующий бит в маске установлен в значение 1.

Возвращаемое значение

Порядковый номер первого добавленного изображения в коллекции изображений. Нумерация ведется с нуля.

Возвращаемое значение в случае ошибки

-1.

Пример использования

#include <windows.h>

#include <commctrl.h>

//Прототип функции ImageList_Create

_stdcall typedef HIMAGELIST (*IMAGELIST_CREATE)(int,int,UINT,int,int);

IMAGELIST_CREATE lpfIL_Create;

//Прототип функции ImageList_Destroy

_stdcall typedef BOOL (*IMAGELIST_DESTROY)(HIMAGELIST);

IMAGELIST_DESTROY lpfIL_Destroy;

//Прототип функции ImageList_AddMasked

_stdcall typedef int (*IMAGELIST_ADDMASKED)(HIMAGELIST,HBITMAP,COLORREF);

IMAGELIST_ADDMASKED lpfIL_AddMasked;

//Прототип функции DeleteObject

_stdcall typedef BOOL (*DELETEOBJECT)(HGDIOBJ);

DELETEOBJECT lpfDeleteObject;

//Получает адреса функций из библиотек Comctl32.dll и gdi32.dll

void GetFunctions(void){

HINSTANCE hComctl32;

hComctl32 = LoadLibrary("Comctl32.dll");

lpfIL_Create = (IMAGELIST_CREATE)GetProcAddress(hComctl32,"ImageList_Create");

lpfIL_Destroy = (IMAGELIST_DESTROY)GetProcAddress(hComctl32,"ImageList_Destroy");

lpfIL_AddMasked = (IMAGELIST_ADDMASKED)GetProcAddress(hComctl32,"ImageList_AddMasked");

//Находим адрес функции DeleteObject

HINSTANCE hgdi32;

hgdi32 = LoadLibrary("gdi32.dll");

lpfDeleteObject = (DELETEOBJECT)GetProcAddress(hgdi32,"DeleteObject");

}

int main()

{

//Получаем адреса функций

GetFunctions();

//Создаем коллекцию изображений

HIMAGELIST hIL;

hIL = lpfIL_Create(48,48,ILC_COLOR32,3,0);

//Загружаем первое растровое изображение

HBITMAP hBitmap;

hBitmap = LoadImage(NULL,"pict_2.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

//Добавляем изображение в коллекцию

int index;

index = lpfIL_AddMasked(hIL,hBitmap,RGB(0x100,0,0));

printf("%d\n",index);

//Освобождаем ресурсы

lpfDeleteObject(hBitmap);

//Загружаем второе растровое изображение

hBitmap = LoadImage(NULL,"pict_1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

//Добавляем изображение в коллекцию

index = lpfIL_AddMasked(hIL,hBitmap,RGB(0,0x100,0));

printf("%d\n",index);

//Освобождаем ресурсы

lpfDeleteObject(hBitmap);

//Уничтожаем коллекцию

lpfIL_Destroy(hIL);

getchar();

return 0;

}

Данный пример аналогичен примеру, привлимому в описании функции ImageList_Add с той лишь разницей, что здесь вместо функции ImageList_Add мы используем функцию ImageList_AddMasked. Для создания цвета используется макрос RGB.

Примечание

Функция ImageList_AddMasked копирует битовую карту во внутреннюю структуру данных. Поэтому вы можете использовать функцию DeleteObject для удаления объекта hbmImage после возврата из функции.

Заголовочный файл | Commctrl.h
Экспортирующая библиотека | Comctl32.dll


ImageList_BeginDrag

Начинает операцию перетаскивания изображения.

Прототип

BOOL ImageList_BeginDrag(

HIMAGELIST himlTrack,

int iTrack,

int dxHotspot,

int dyHotspot

);

Параметры

himlTrack

Описатель коллекции изображений.

iTrack

Порядковый номер перетаскиваемого изображения.

dxHotspot

Координата по горизонтали точки перетаскивания относительно левого верхнего угла изображения.

dyHotspot

Координата по вертикали точки перетаскивания относительно левого верхнего угла изображения.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Данная функция создает временную коллекцию изображений, которая используется для операции перетаскивания. В ответ на последующие сообщения WM_MOUSEMOVE, приложение может перемещать изображение во время операции перетаскивания с помощью функции ImageList_DragMove. Для завершения операции перетаскивания вы можете использовать функцию ImageList_EndDrag.

Заголовочный файл | Commctrl.h
Экспортирующая библиотека | Comctl32.dll


ImageList_Copy

Копирует изображения внутри заданной коллекции изображений.

Прототип

BOOL ImageList_Copy(

HIMAGELIST himlDst,

int iDst,

HIMAGELIST himlSrc,

int iSrc,

UINT uFlags

);

Параметры

himlDst

Описатель коллекции изображеий, в которой осуществляется операция копирования. В текущих версиях Windows описатели himlDst и himlSrc должны совпадать.

iDst

Номер, по которому будет записано копируемое изображение. Нумерация ведется с нуля.

himlSrc

Описатель коллекции изображеий, в которой осуществляется операция копирования. В текущих версиях Windows описатели himlDst и himlSrc должны совпадать.

iSrc

Номер копируемого изображения в коллекции. Нумерация ведется с нуля.

uFlags

Тип выполняемой операции копирования. Принимает одно из значений перечисленных ниже.

ILCF_MOVE - исходное изображение копируется по указанному номеру. Эта операция приводит к созданию нескольких копий одного и того же изображения.

ILCF_SWAP - изображения iSrc и iDst меняются местами внутри коллекции.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль.

Пример использования

#include <windows.h>

#include <commctrl.h>

//Прототип функции ImageList_Create

_stdcall typedef HIMAGELIST (*IMAGELIST_CREATE)(int,int,UINT,int,int);

IMAGELIST_CREATE lpfIL_Create;

//Прототип функции ImageList_Destroy

_stdcall typedef BOOL (*IMAGELIST_DESTROY)(HIMAGELIST);

IMAGELIST_DESTROY lpfIL_Destroy;

//Прототип функции ImageList_Add

_stdcall typedef int (*IMAGELIST_ADD)(HIMAGELIST,HBITMAP,HBITMAP);

IMAGELIST_ADD lpfIL_Add;

//Прототип функции ImageList_Copy

_stdcall typedef int (*IMAGELIST_COPY)(HIMAGELIST,int,HIMAGELIST,int,UINT);

IMAGELIST_COPY lpfIL_Copy;

//Прототип функции DeleteObject

_stdcall typedef BOOL (*DELETEOBJECT)(HGDIOBJ);

DELETEOBJECT lpfDeleteObject;

//Получает адреса функций из библиотек Comctl32.dll и gdi32.dll

void GetFunctions(void){

HINSTANCE hComctl32;

hComctl32 = LoadLibrary("Comctl32.dll");

lpfIL_Create = (IMAGELIST_CREATE)GetProcAddress(hComctl32,"ImageList_Create");

lpfIL_Destroy = (IMAGELIST_DESTROY)GetProcAddress(hComctl32,"ImageList_Destroy");

lpfIL_Add = (IMAGELIST_ADD)GetProcAddress(hComctl32,"ImageList_Add");

lpfIL_Copy = (IMAGELIST_COPY)GetProcAddress(hComctl32,"ImageList_Copy");

//Находим адрес функции DeleteObject

HINSTANCE hgdi32;

hgdi32 = LoadLibrary("gdi32.dll");

lpfDeleteObject = (DELETEOBJECT)GetProcAddress(hgdi32,"DeleteObject");

}

int main()

{

//Получаем адреса функций

GetFunctions();

//Создаем коллекцию изображений

HIMAGELIST hIL;

hIL = lpfIL_Create(48,48,ILC_COLOR32,3,0);

//Загружаем первое растровое изображение

HBITMAP hBitmap;

hBitmap = LoadImage(NULL,"pict_1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

//Добавляем изображение в коллекцию

lpfIL_Add(hIL,hBitmap,NULL);

//Освобождаем ресурсы

lpfDeleteObject(hBitmap);

//Загружаем второе растровое изображение

hBitmap = LoadImage(NULL,"pict_2.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

//Добавляем изображение в коллекцию

lpfIL_Add(hIL,hBitmap,NULL);

//Освобождаем ресурсы

lpfDeleteObject(hBitmap);

int res;

//Меняем изображения местами

res = lpfIL_Copy(hIL,1,hIL,0,ILCF_SWAP);

//Выводим количество изображений в коллекции

printf("%d\n",res);

//Уничтожаем коллекцию

lpfIL_Destroy(hIL);

getchar();

return 0;

}

В данном примере мы создаём коллекцию изображений, добавляем в неё два изображения, а потом, с помощью функции ImageList_Copy меняем эти изображения местами.

Заголовочный файл | Commctrl.h
Экспортирующая библиотека | Comctl32.dll


ImageList_Create

Создаёт новую коллекцию изображений.

Прототип

HIMAGELIST ImageList_Create(

int cx,

int cy,

UINT flags,

int cInitial,

int cGrow

);

Параметры

cx

Ширина каждого изображения, в пикселях.

cy

Высота каждого изображения, в пикселях.

flags

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

cInitial

Количество изображений, первоначально имеющихся в коллекции.

cGrow

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

Возвращаемое значение

Описатель коллекции изображений.

Возвращаемое значение в случае ошибки

NULL.

Пример использования

#include <windows.h>

#include <commctrl.h>

//Прототип функции ImageList_Create

_stdcall typedef HIMAGELIST (*IMAGELIST_CREATE)(int,int,UINT,int,int);

IMAGELIST_CREATE lpfIL_Create;

//Прототип функции ImageList_Destroy

_stdcall typedef BOOL (*IMAGELIST_DESTROY)(HIMAGELIST);

IMAGELIST_DESTROY lpfIL_Destroy;

//Получает адреса функций из библиотеки Comctl32.dll

void GetFunctions(void){

HINSTANCE hComctl32;

hComctl32 = LoadLibrary("Comctl32.dll");

lpfIL_Create = (IMAGELIST_CREATE)GetProcAddress(hComctl32,"ImageList_Create");

lpfIL_Destroy = (IMAGELIST_DESTROY)GetProcAddress(hComctl32,"ImageList_Destroy");

}

int main()

{

//Получаем адреса фукций

GetFunctions();

//Создаем коллекцию изображений

HIMAGELIST hIL;

hIL = lpfIL_Create(48,48,0,0,1);

//Выводим описатель на экран

printf("%x\n",hIL);

//Уничтожаем коллекцию

lpfIL_Destroy(hIL);

getchar();

return 0;

}

В данном примере мы создаём пустую коллекцию изображений, выводим её описатель на экран и уничтожаем её.

Примечание

Когда вы завершили работу с коллекцией изображений, вы должны уничтожить её вызовом функции ImageList_Destroy.

Библиотека Comctl32.dll версии 6 не является свободно распространяемой, но она включена в состав Windows XP и более новых версий операционной системы. Для использования библиотеки Comctl32.dll версии 6 вы должны указать её в манифесте.

Заголовочный файл | Commctrl.h
Экспортирующая библиотека | Comctl32.dll


ImageList_Destroy

Разрушает коллекцию изображений.

Прототип

BOOL ImageList_Destroy(

_In_opt_ HIMAGELIST himl

);

Параметры

himl[in,opt]

Описатель разрушаемой коллекции изображений.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль.

Пример использования

Пример использования приведен в описании функции ImageList_Create.

Заголовочный файл | Commctrl.h
Экспортирующая библиотека | Comctl32.dll


ImageList_DragEnter

Отображает перетаскиваемое изображение в заданном положении внутри окна.

Прототип

BOOL ImageList_DragEnter(

HWND hwndLock,

int x,

int y

);

Параметры

hwndLock

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

x

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

y

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

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Для начала операции перетаскивания используйте функцию ImageList_BeginDrag.

Заголовочный файл | Commctrl.h
Экспортирующая библиотека | Comctl32.dll


ImageList_DragLeave

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

Прототип

BOOL ImageList_DragLeave(

HWND hwndLock

);

Параметры

hwndLock

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

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль.

Пример использования

Честно говоря, я так и не смог понять как использовать эту функцию. Я реализовал перетаскивание изображения (см. здесь) без этой функции.

Заголовочный файл | Commctrl.h
Экспортирующая библиотека | Comctl32.dll


ImageList_DragMove

Перемещает изображение во время операции перетаскивания. Обычно эту функцию вызывают во время обработки сообщения WM_MOUSEMOVE.

Прототип

BOOL ImageList_DragMove(

int x,

int y

);

Параметры

x

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

y

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

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Для начала операции перетаскивания используйте функцию ImageList_BeginDrag.

Заголовочный файл | Commctrl.h
Экспортирующая библиотека | Comctl32.dll


ImageList_DragShowNolock

Показывает или скрывает перетаскиваемое изображение.

Прототип

BOOL ImageList_DragShowNolock(

BOOL fShow

);

Параметры

fShow

Значение, определяющее показывать или скрывать перетаскивамое изображение. Если значение этого параметра равно TRUE, то изображение показывается, если же значение этого параметра FALSE, то изображение скрывается.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль.

Пример использования

Пример использования приведен здесь.

Заголовочный файл | Commctrl.h
Экспортирующая библиотека | Comctl32.dll


ImageList_Draw

Отрисовывает элемент коллекции изображений в заданном контексте устройства.

Прототип

BOOL ImageList_Draw(

HIMAGELIST himl,

int i,

HDC hdcDst,

int x,

int y,

UINT fStyle

);

Параметры

himl

Описатель коллекции изображений.

i

Номер отрисовываемого изображения. Нумерация ведется с нуля.

hdcDst

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

x

Координата по горизонтали в заданном контексте устройства.

y

Координата по вертикали в заданном контексте устройства.

fStyle

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

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Перекрывающее изображение - это прозрачное изображение отрисовываемое поверх основного изображения, задаваемого в параметре i. Для указания перекрывающего изображения в параметре fStyle, используйте макрос INDEXTOOVERLAYMASK, в который передайте номер перекрывающего изображения. Нумерация начинается с единицы. Используйте логическую операцию OR для объединения возвращенного макросом значения с флагами рисования, заданными в параметре fStyle. Первоначально вы должны задать перекрывающее изображение с помощью функции ImageList_SetOverlayImage.

Заголовочный файл | Commctrl.h
Экспортирующая библиотека | Comctl32.dll


ImageList_DrawEx

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

Прототип

BOOL ImageList_DrawEx(

HIMAGELIST himl,

int i,

HDC hdcDst,

int x,

int y,

int dx,

int dy,

COLORREF rgbBk,

COLORREF rgbFg,

UINT fStyle

);

Параметры

himl

Описатель коллекции изображении.

i

Номер отрисовываемого изображения.

hdcDst

Описатель целевого контекста устройства.

x

Координата по горизонтали внутри контекста устройства.

y

Координата по вертикали внутри контекста устройства.

dx

Ширина отрисовываемой части изображения от левого верхнего угла изображения. Если значения параметров dx и dy равны нулю, то функция отрисовывает всё изображение. Функция не гарантирует корректность этого параметра.

dy

Высота отрисовываемой части изображения от левого верхнего угла изображения. Если значения параметров dx и dy равны нулю, то функция отрисовывает всё изображение. Функция не гарантирует корректность этого параметра.

rgbBk

Цвет фона изображения. Данный параметр может содержать определенный приложением цвет в формате RGB, или одно из значений перечисленных ниже.

CLR_NONE - нет цвета фона. Изображение делается прозрачным.

CLR_DEFAULT - цвет фона по умолчанию. Изображение отрисовывается с использованием цвета фона коллекции изображений.

rgbFg

Цвет переднего плана изображения (foreground color). Данный параметр может содержать опредеденный приложением цвет в формате RGB, или одно из значений перечисленых ниже.

CLR_NONE - нет цвета смешивания. Изображение смешивается (blended) с цветом целевого контекста устройства.

CLR_DEFAULT - цвет переднего плана по умолчанию. Изображение отрисовывается с использованием системного цвета подсветки в качестве цвета переднего плана (foreground color).

fStyle

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

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Перекрывающее изображение - это прозрачное изображение отрисовываемое поверх основного изображения, задаваемого в параметре i. Для указания перекрывающего изображения в параметре fStyle, используйте макрос INDEXTOOVERLAYMASK, в который передайте номер перекрывающего изображения. Нумерация начинается с единицы. Используйте логическую операцию OR для объединения возвращенного макросом значения с флагами рисования, заданными в параметре fStyle. Первоначально вы должны задать перекрывающее изображение с помощью функции ImageList_SetOverlayImage.

Заголовочный файл | Commctrl.h
Экспортирующая библиотека | Comctl32.dll


ImageList_DrawIndirect

Отрисовывает изображение из коллекции изображений на основе структуры IMAGELISTDRAWPARAMS.

Прототип

BOOL ImageList_DrawIndirect(

IMAGELISTDRAWPARAMS *pimldp

);

Параметры

pimldp

Указатель на структуру IMAGELISTDRAWPARAMS, которая содержит информацию об операции рисования.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль.

Пример использования

Пример использования приведен здесь.

Заголовочный файл | Commctrl.h
Экспортирующая библиотека | Comctl32.dll(версии 4.70 и выше)


ImageList_Duplicate

Создает копию существующей коллекции изображений.

Прототип

HIMAGELIST ImageList_Duplicate(

HIMAGELIST himl

);

Параметры

himl

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

Возвращаемое значение

Описатель новой коллекции изображений.

Возвращаемое значение в случае ошибки

NULL.

Пример использования

В примере ниже мы создаем коллекцию изображений, добавляем в неё два изображения и копируем коллекцию.

#include <windows.h>

#include <commctrl.h>

//Прототип функции ImageList_Create

_stdcall typedef HIMAGELIST (*IMAGELIST_CREATE)(int,int,UINT,int,int);

IMAGELIST_CREATE lpfIL_Create;

//Прототип функции ImageList_Destroy

_stdcall typedef BOOL (*IMAGELIST_DESTROY)(HIMAGELIST);

IMAGELIST_DESTROY lpfIL_Destroy;

//Прототип функции ImageList_Add

_stdcall typedef int (*IMAGELIST_ADD)(HIMAGELIST,HBITMAP,HBITMAP);

IMAGELIST_ADD lpfIL_Add;

//Прототип функции ImageList_Duplicate

_stdcall typedef HIMAGELIST (*IMAGELIST_DUPLICATE)(HIMAGELIST);

IMAGELIST_DUPLICATE lpfIL_Duplicate;

//Прототип функции ImageList_GetImageCount

_stdcall typedef int (*IMAGELIST_GETIMAGECOUNT)(HIMAGELIST);

IMAGELIST_GETIMAGECOUNT lpfIL_GetImageCount;

//Прототип функции DeleteObject

_stdcall typedef BOOL (*DELETEOBJECT)(HGDIOBJ);

DELETEOBJECT lpfDeleteObject;

//Получает адреса функций из библиотек Comctl32.dll и gdi32.dll

void GetFunctions(void){

HINSTANCE hComctl32;

hComctl32 = LoadLibrary("Comctl32.dll");

lpfIL_Create = (IMAGELIST_CREATE)GetProcAddress(hComctl32,"ImageList_Create");

lpfIL_Destroy = (IMAGELIST_DESTROY)GetProcAddress(hComctl32,"ImageList_Destroy");

lpfIL_Add = (IMAGELIST_ADD)GetProcAddress(hComctl32,"ImageList_Add");

lpfIL_Duplicate = (IMAGELIST_DUPLICATE)GetProcAddress(hComctl32,"ImageList_Duplicate");

lpfIL_GetImageCount = (IMAGELIST_GETIMAGECOUNT)GetProcAddress(hComctl32,"ImageList_GetImageCount");

//Находим адрес функции DeleteObject

HINSTANCE hgdi32;

hgdi32 = LoadLibrary("gdi32.dll");

lpfDeleteObject = (DELETEOBJECT)GetProcAddress(hgdi32,"DeleteObject");

}

int main()

{

//Получаем адреса функций

GetFunctions();

//Создаем коллекцию изображений

HIMAGELIST hIL;

hIL = lpfIL_Create(48,48,ILC_COLOR32,3,0);

//Загружаем первое растровое изображение

HBITMAP hBitmap;

hBitmap = LoadImage(NULL,"pict_1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

//Добавляем изображение в коллекцию

lpfIL_Add(hIL,hBitmap,NULL);

//Освобождаем ресурсы

lpfDeleteObject(hBitmap);

//Загружаем второе растровое изображение

hBitmap = LoadImage(NULL,"pict_2.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

//Добавляем изображение в коллекцию

lpfIL_Add(hIL,hBitmap,NULL);

//Освобождаем ресурсы

lpfDeleteObject(hBitmap);

//Диблируем коллекцию изображений

HIMAGELIST hIL2;

hIL2 = lpfIL_Duplicate(hIL);

//Выводим количество изображений в новой коллекции

printf("%d\n",lpfIL_GetImageCount(hIL2));

//Уничтожаем коллекции

lpfIL_Destroy(hIL);

lpfIL_Destroy(hIL2);

getchar();

return 0;

}

Заголовочный файл | Commctrl.h
Экспортирующая библиотека | Comctl32.dll(версии 4.71 и выше)


ImageList_EndDrag

Завершает операцию перетаскивания.

Прототип

VOID ImageList_EndDrag(void);

Параметры

Данная функция не имеет параметров.

Возвращаемое значение

Функция ничего не взвращает.

Пример использования

Пример использования приведен здесь.

Примечание

При вызове функции ImageList_EndDrag уничтожается временная коллекция изображений. Для начала операции перетаскивания используйте функцию ImageList_BeginDrag.

Заголовочный файл | Commctrl.h
Экспортирующая библиотека | Comctl32.dll


ImageList_GetBkColor

Возвращает текущий цвет фона коллекции изображений.

Прототип

COLORREF ImageList_GetBkColor(

_In_ HIMAGELIST himl

);

Параметры

himl[in]

Описатель коллекции изображений.

Возвращаемое значение

Цвет фона.

Пример использования

В примере ниже создаётся коллекция изображений, в неё добавляется одно изображение, получается цвет фона, который выводится на экран. Для извлечения компонентов красного, зеленого и синего цветов извлекаются с помощью макросов GetRValue, GetGValue и GetBValue соответственно.

#include <windows.h>

#include <commctrl.h>

//Прототип функции ImageList_Create

_stdcall typedef HIMAGELIST (*IMAGELIST_CREATE)(int,int,UINT,int,int);

IMAGELIST_CREATE lpfIL_Create;

//Прототип функции ImageList_Destroy

_stdcall typedef BOOL (*IMAGELIST_DESTROY)(HIMAGELIST);

IMAGELIST_DESTROY lpfIL_Destroy;

//Прототип функции ImageList_Add

_stdcall typedef int (*IMAGELIST_ADD)(HIMAGELIST,HBITMAP,HBITMAP);

IMAGELIST_ADD lpfIL_Add;

_stdcall typedef COLORREF (*IMAGELIST_GETBKCOLOR)(HIMAGELIST);

IMAGELIST_GETBKCOLOR lpfIL_GetBkColor;

//Прототип функции DeleteObject

_stdcall typedef BOOL (*DELETEOBJECT)(HGDIOBJ);

DELETEOBJECT lpfDeleteObject;

//Получает адреса функций из библиотек Comctl32.dll и gdi32.dll

void GetFunctions(void){

HINSTANCE hComctl32;

hComctl32 = LoadLibrary("Comctl32.dll");

lpfIL_Create = (IMAGELIST_CREATE)GetProcAddress(hComctl32,"ImageList_Create");

lpfIL_Destroy = (IMAGELIST_DESTROY)GetProcAddress(hComctl32,"ImageList_Destroy");

lpfIL_Add = (IMAGELIST_ADD)GetProcAddress(hComctl32,"ImageList_Add");

lpfIL_GetBkColor = (IMAGELIST_GETBKCOLOR)GetProcAddress(hComctl32,"ImageList_GetBkColor");

//Находим адрес функции DeleteObject

HINSTANCE hgdi32;

hgdi32 = LoadLibrary("gdi32.dll");

lpfDeleteObject = (DELETEOBJECT)GetProcAddress(hgdi32,"DeleteObject");

}

int main()

{

//Получаем адреса функций

GetFunctions();

//Создаем коллекцию изображений

HIMAGELIST hIL;

hIL = lpfIL_Create(48,48,ILC_COLOR32,3,0);

//Загружаем первое растровое изображение

HBITMAP hBitmap;

hBitmap = LoadImage(NULL,"pict_1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

//Добавляем изображение в коллекцию

lpfIL_Add(hIL,hBitmap,NULL);

//Освобождаем ресурсы

lpfDeleteObject(hBitmap);

COLORREF color;

color = lpfIL_GetBkColor(hIL);

//Выводим количество изображений в новой коллекции

printf("(%d;%d;%d)\n",GetRValue(color),GetGValue(color),GetBValue(color));

//Уничтожаем коллекции

lpfIL_Destroy(hIL);

getchar();

return 0;

}

Заголовочный файл | Commctrl.h
Экспортирующая библиотека | Comctl32.dll


ImageList_GetIcon

Создает иконку из изображения и маски в коллекции изображений.

Прототип

HICON ImageList_GetIcon(

HIMAGELIST himl,

int i,

UINT flags

);

Параметры

himl

Описатель коллекции изображений.

i

Номер изображения.

flags

Комбинация флагов, которая определяет стиль рисования. Перечень флагов приведен здесь.

Возвращаемое значение

Описатель иконки.

Возвращаемое значение в случае ошибки

NULL.

Пример использования

#include <windows.h>

#include <commctrl.h>

//Прототип функции ImageList_Create

_stdcall typedef HIMAGELIST (*IMAGELIST_CREATE)(int,int,UINT,int,int);

IMAGELIST_CREATE lpfIL_Create;

//Прототип функции ImageList_Destroy

_stdcall typedef BOOL (*IMAGELIST_DESTROY)(HIMAGELIST);

IMAGELIST_DESTROY lpfIL_Destroy;

//Прототип функции ImageList_Add

_stdcall typedef int (*IMAGELIST_ADD)(HIMAGELIST,HBITMAP,HBITMAP);

IMAGELIST_ADD lpfIL_Add;

//Прототип функции ImageList_GetIcon

_stdcall typedef HICON (*IMAGELIST_GETICON)(HIMAGELIST,int,UINT);

IMAGELIST_GETICON lpfIL_GetIcon;

//Прототип функции DeleteObject

_stdcall typedef BOOL (*DELETEOBJECT)(HGDIOBJ);

DELETEOBJECT lpfDeleteObject;

//Получает адреса функций из библиотек Comctl32.dll и gdi32.dll

void GetFunctions(void){

HINSTANCE hComctl32;

hComctl32 = LoadLibrary("Comctl32.dll");

lpfIL_Create = (IMAGELIST_CREATE)GetProcAddress(hComctl32,"ImageList_Create");

lpfIL_Destroy = (IMAGELIST_DESTROY)GetProcAddress(hComctl32,"ImageList_Destroy");

lpfIL_Add = (IMAGELIST_ADD)GetProcAddress(hComctl32,"ImageList_Add");

lpfIL_GetIcon = (IMAGELIST_GETICON)GetProcAddress(hComctl32,"ImageList_GetIcon");

//Находим адрес функции DeleteObject

HINSTANCE hgdi32;

hgdi32 = LoadLibrary("gdi32.dll");

lpfDeleteObject = (DELETEOBJECT)GetProcAddress(hgdi32,"DeleteObject");

}

int main()

{

//Получаем адреса функций

GetFunctions();

//Создаем коллекцию изображений

HIMAGELIST hIL;

hIL = lpfIL_Create(48,48,ILC_COLOR32,3,0);

//Загружаем первое растровое изображение

HBITMAP hBitmap;

hBitmap = LoadImage(NULL,"pict_1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

//Добавляем изображение в коллекцию

lpfIL_Add(hIL,hBitmap,NULL);

//Освобождаем ресурсы

lpfDeleteObject(hBitmap);

//Создаём иконку

HICON hicon;

hicon = lpfIL_GetIcon(hIL,0,0);

//Выводим описатель иконки

printf("%X\n",hicon);

//Уничтожаем коллекцию

lpfIL_Destroy(hIL);

//Уничтожаем иконку

DestroyIcon(hicon);

getchar();

return 0;

}

Примечание

Вызывающее приложение должно уничтожить возвращенную иконку с помощью функции DestroyIcon.

Заголовочный файл | Commctrl.h
Экспортирующая библиотека | Comctl32.dll


ImageList_GetIconSize

Возвращает размеры изображений в коллекции изображений. Все изображения в коллекции имеют одинаковые размеры.

Прототип

BOOL ImageList_GetIconSize(

HIMAGELIST himl,

int *cx,

int *cy

);

Параметры

himl

Описатель коллекции изображений.

cx

Указатель на переменную типа int, в которую будет записана ширина изображений в пикселях.

cy

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

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

#include <windows.h>

#include <commctrl.h>

//Прототип функции ImageList_Create

_stdcall typedef HIMAGELIST (*IMAGELIST_CREATE)(int,int,UINT,int,int);

IMAGELIST_CREATE lpfIL_Create;

//Прототип функции ImageList_Destroy

_stdcall typedef BOOL (*IMAGELIST_DESTROY)(HIMAGELIST);

IMAGELIST_DESTROY lpfIL_Destroy;

//Прототип функции ImageList_Add

_stdcall typedef int (*IMAGELIST_ADD)(HIMAGELIST,HBITMAP,HBITMAP);

IMAGELIST_ADD lpfIL_Add;

//Прототип функции ImageList_GetIconSize

_stdcall typedef BOOL (*IMAGELIST_GETICONSIZE)(HIMAGELIST,int*,int*);

IMAGELIST_GETICONSIZE lpfIL_GetIconSize;

//Прототип функции DeleteObject

_stdcall typedef BOOL (*DELETEOBJECT)(HGDIOBJ);

DELETEOBJECT lpfDeleteObject;

//Получает адреса функций из библиотек Comctl32.dll и gdi32.dll

void GetFunctions(void){

HINSTANCE hComctl32;

hComctl32 = LoadLibrary("Comctl32.dll");

lpfIL_Create = (IMAGELIST_CREATE)GetProcAddress(hComctl32,"ImageList_Create");

lpfIL_Destroy = (IMAGELIST_DESTROY)GetProcAddress(hComctl32,"ImageList_Destroy");

lpfIL_Add = (IMAGELIST_ADD)GetProcAddress(hComctl32,"ImageList_Add");

lpfIL_GetIconSize = (IMAGELIST_GETICONSIZE)GetProcAddress(hComctl32,"ImageList_GetIconSize");

//Находим адрес функции DeleteObject

HINSTANCE hgdi32;

hgdi32 = LoadLibrary("gdi32.dll");

lpfDeleteObject = (DELETEOBJECT)GetProcAddress(hgdi32,"DeleteObject");

}

int main()

{

//Получаем адреса функций

GetFunctions();

//Создаем коллекцию изображений

HIMAGELIST hIL;

hIL = lpfIL_Create(48,48,ILC_COLOR32,3,0);

//Загружаем первое растровое изображение

HBITMAP hBitmap;

hBitmap = LoadImage(NULL,"pict_1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

//Добавляем изображение в коллекцию

lpfIL_Add(hIL,hBitmap,NULL);

//Освобождаем ресурсы

lpfDeleteObject(hBitmap);

//Получаем размер изображений

int x, y;

lpfIL_GetIconSize(hIL,&x,&y);

//Выводим размер изображений

printf("(%d;%d)\n",x,y);

//Уничтожаем коллекцию

lpfIL_Destroy(hIL);

getchar();

return 0;

}

Заголовочный файл | Commctrl.h
Экспортирующая библиотека | Comctl32.dll


ImageList_GetImageCount

Возвращает количество изображений в коллекции изображений.

Прототип

int ImageList_GetImageCount(

_In_ HIMAGELIST himl

);

Параметры

himl[in]

Описатель коллекции изображений.

Возвращаемое значение

Количество изображений в коллекции.

Пример использования

#include <windows.h>

#include <commctrl.h>

//Прототип функции ImageList_Create

_stdcall typedef HIMAGELIST (*IMAGELIST_CREATE)(int,int,UINT,int,int);

IMAGELIST_CREATE lpfIL_Create;

//Прототип функции ImageList_Destroy

_stdcall typedef BOOL (*IMAGELIST_DESTROY)(HIMAGELIST);

IMAGELIST_DESTROY lpfIL_Destroy;

//Прототип функции ImageList_Add

_stdcall typedef int (*IMAGELIST_ADD)(HIMAGELIST,HBITMAP,HBITMAP);

IMAGELIST_ADD lpfIL_Add;

//Прототип функции ImageList_GetImageCount

_stdcall typedef int (*IMAGELISTGETIMAGECOUNT)(HIMAGELIST);

IMAGELISTGETIMAGECOUNT lpfIL_GIC;

//Прототип функции DeleteObject

_stdcall typedef BOOL (*DELETEOBJECT)(HGDIOBJ);

DELETEOBJECT lpfDeleteObject;

//Получает адреса функций из библиотек Comctl32.dll и gdi32.dll

void GetFunctions(void){

HINSTANCE hComctl32;

hComctl32 = LoadLibrary("Comctl32.dll");

lpfIL_Create = (IMAGELIST_CREATE)GetProcAddress(hComctl32,"ImageList_Create");

lpfIL_Destroy = (IMAGELIST_DESTROY)GetProcAddress(hComctl32,"ImageList_Destroy");

lpfIL_Add = (IMAGELIST_ADD)GetProcAddress(hComctl32,"ImageList_Add");

lpfIL_GIC = (IMAGELISTGETIMAGECOUNT)GetProcAddress(hComctl32,"ImageList_GetImageCount");

//Находим адрес функции DeleteObject

HINSTANCE hgdi32;

hgdi32 = LoadLibrary("gdi32.dll");

lpfDeleteObject = (DELETEOBJECT)GetProcAddress(hgdi32,"DeleteObject");

}

int main()

{

//Получаем адреса функций

GetFunctions();

//Создаем коллекцию изображений

HIMAGELIST hIL;

hIL = lpfIL_Create(48,48,ILC_COLOR32,3,0);

//Загружаем первое растровое изображение

HBITMAP hBitmap;

hBitmap = LoadImage(NULL,"pict_1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

//Добавляем изображение в коллекцию

lpfIL_Add(hIL,hBitmap,NULL);

//Освобождаем ресурсы

lpfDeleteObject(hBitmap);

//Загружаем второе растровое изображение

hBitmap = LoadImage(NULL,"pict_2.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

//Добавляем изображение в коллекцию

lpfIL_Add(hIL,hBitmap,NULL);

//Освобождаем ресурсы

lpfDeleteObject(hBitmap);

//Выводим количество изображений в коллекции

printf("%d\n",lpfIL_GIC(hIL));

//Уничтожаем коллекцию

lpfIL_Destroy(hIL);

getchar();

return 0;

}

В данном примере мы создаём коллекцию изображений, добавляем в неё два изображения и выводим на экран количество изображений в коллекции.

Заголовочный файл | Commctrl.h
Экспортирующая библиотека | Comctl32.dll


ImageList_GetImageInfo

Возвращает иформацию об изображении.

Прототип

BOOL ImageList_GetImageInfo(

HIMAGELIST himl,

int i,

IMAGEINFO *pImageInfo

);

Параметры

himl

Описатель коллекции изображений.

i

Порядковый номер изображения. Нумерация ведется с нуля.

pImageInfo

Указатель на структуру IMAGEINFO, в которую записывается информация об изображении. Информация в этой структуре может быть использована для управления битовыми картами (bitmaps) изображения.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль.

Пример использования

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

#include <windows.h>

#include <commctrl.h>

//Прототип функции ImageList_Create

_stdcall typedef HIMAGELIST (*IMAGELIST_CREATE)(int,int,UINT,int,int);

IMAGELIST_CREATE lpfIL_Create;

//Прототип функции ImageList_Destroy

_stdcall typedef BOOL (*IMAGELIST_DESTROY)(HIMAGELIST);

IMAGELIST_DESTROY lpfIL_Destroy;

//Прототип функции ImageList_Add

_stdcall typedef int (*IMAGELIST_ADD)(HIMAGELIST,HBITMAP,HBITMAP);

IMAGELIST_ADD lpfIL_Add;

//Прототип функции ImageList_GetImageInfo

_stdcall typedef BOOL (*IMAGELIST_GETIMAGEINFO)(HIMAGELIST,int,IMAGEINFO*);

IMAGELIST_GETIMAGEINFO lpfIL_GetImageInfo;

//Прототип функции DeleteObject

_stdcall typedef BOOL (*DELETEOBJECT)(HGDIOBJ);

DELETEOBJECT lpfDeleteObject;

//Получает адреса функций из библиотек Comctl32.dll и gdi32.dll

void GetFunctions(void){

HINSTANCE hComctl32;

hComctl32 = LoadLibrary("Comctl32.dll");

lpfIL_Create = (IMAGELIST_CREATE)GetProcAddress(hComctl32,"ImageList_Create");

lpfIL_Destroy = (IMAGELIST_DESTROY)GetProcAddress(hComctl32,"ImageList_Destroy");

lpfIL_Add = (IMAGELIST_ADD)GetProcAddress(hComctl32,"ImageList_Add");

lpfIL_GetImageInfo = (IMAGELIST_GETIMAGEINFO)GetProcAddress(hComctl32,"ImageList_GetImageInfo");

//Находим адрес функции DeleteObject

HINSTANCE hgdi32;

hgdi32 = LoadLibrary("gdi32.dll");

lpfDeleteObject = (DELETEOBJECT)GetProcAddress(hgdi32,"DeleteObject");

}

int main()

{

//Получаем адреса функций

GetFunctions();

//Создаем коллекцию изображений

HIMAGELIST hIL;

hIL = lpfIL_Create(48,48,ILC_COLOR32,2,0);

//Загружаем первое растровое изображение

HBITMAP hBitmap;

hBitmap = LoadImage(NULL,"pict_1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

//Добавляем изображение в коллекцию

lpfIL_Add(hIL,hBitmap,NULL);

//Освобождаем ресурсы

lpfDeleteObject(hBitmap);

//Загружаем второе изображение

hBitmap = LoadImage(NULL,"pict_2.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

//Добавляем изображение в коллекцию

lpfIL_Add(hIL,hBitmap,NULL);

//Освобождаем ресурсы

lpfDeleteObject(hBitmap);

//Получаем информацию об изображении

IMAGEINFO ii;

lpfIL_GetImageInfo(hIL,0,&ii);

//Выводим описатель битовой карты

printf("%X\n",ii.hbmImage);

//Уничтожаем коллекцию

lpfIL_Destroy(hIL);

getchar();

return 0;

}

Примечание

Приложение не должно вызывать функцию DeleteObject для уничтожения битовых карт, возвращенных функцией ImageList_GetImageInfo. Система сама уничтожает битовые карты, когда приложение вызывает функцию ImageList_Destroy.

Заголовочный файл | Commctrl.h
Экспортирующая библиотека | Comctl32.dll


ImageList_LoadImage

Создает коллекцию изображений из заданной битовой карты (bitmap).

Прототип

HIMAGELIST ImageList_LoadImage(

HINSTANCE hi,

LPCTSTR lpbmp,

int cx,

int cGrow,

COLORREF crMask,

UINT uType,

UINT uFlags

);

Параметры

hi

Описатель экземпляра (instance), содержащего ресурс. Если вы хотите загрузить изображение из файла или OEM ресурса, то значение данного параметра может быть равно NULL.

lpbmp

Загружаемое изображение. Unicode строки поддерживаются в Microsoft Windows NT 4.0, Windows 2000, и более новых версиях, но они не поддерживаются в Windows 95 и Windows 98.

Если параметр uFlags содержит флаг LR_LOADFROMFILE, то параметр lpbmp содержит указатель на завершающуюся NULL символом строку, содержащую наименование файла с загружаемым изображением.

Если значение параметра hi отлично от NULL и не задан флаг LR_LOADFROMFILE, то параметр lpbmp содержит указатель на завершающуюся NULL символом строку, содержащую наименование ресурса изображения в модуле hi.

Если значение параметра hi равно NULL и не задан флаг LR_LOADFROMFILE, то младшее слово параметра lpbmp должно содержать идентификатор загружаемого OEM изображения. Для создания этого значения используйте макрос MAKEINTRESOURCE с одним из идентификаторов OEM изображений, представленных в Winuser.h. Эти идентификаторы имеют префиксы:

OBM_ - растровые изображения (bitmaps);

OIC_ - иконки;

OCR_ - курсоры.

cx

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

cGrow

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

crMask

Цвет используемый для создания маски. Каждый пиксель этого цвета в заданном растровом изображении, курсоре или иконке изменяется на черный, а соответствующий бит в маске устанавливается в единицу. Если значение этого параметра равно CLR_NONE, то маска не создается. Если значение этого параметра равно CLR_DEFAULT, то в качестве цвета маски используется цвет пикселя левого верхнего угла изображения.

uType

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

Функция ImageList_LoadImage используется только для растровых изображений (bitmap). Другие типы изображений не поддерживаются.

uFlags

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

Возвращаемое значение

Описатель коллекции изображений.

Возвращаемое значение в случае ошибки

NULL.

Пример использования

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

#include <windows.h>

#include <commctrl.h>

//Прототип функции ImageList_Destroy

_stdcall typedef BOOL (*IMAGELIST_DESTROY)(HIMAGELIST);

IMAGELIST_DESTROY lpfIL_Destroy;

//Прототип функции ImageList_LoadImage

_stdcall typedef HIMAGELIST (*IMAGELIST_LOADIMAGE)(HINSTANCE,LPCTSTR,int,int,COLORREF,UINT,UINT);

IMAGELIST_LOADIMAGE lpfIL_LoadImage;

//Получает адреса функций из библиотек Comctl32.dll и gdi32.dll

void GetFunctions(void){

HINSTANCE hComctl32;

hComctl32 = LoadLibrary("Comctl32.dll");

lpfIL_Destroy = (IMAGELIST_DESTROY)GetProcAddress(hComctl32,"ImageList_Destroy");

lpfIL_LoadImage = (IMAGELIST_LOADIMAGE)GetProcAddress(hComctl32,"ImageList_LoadImage");

}

int main()

{

//Получаем адреса функций

GetFunctions();

//Создаем коллекцию изображений

HIMAGELIST hIL;

hIL = lpfIL_LoadImage(NULL,"pict_1.bmp",48,5,CLR_NONE,IMAGE_BITMAP,LR_LOADFROMFILE);

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

printf("%X\n",hIL);

//Уничтожаем коллекцию

lpfIL_Destroy(hIL);

getchar();

return 0;

}

Примечание

Флаг LR_LOADTRANSPARENT не загружает прозрачное изображение. Он создает непрозрачную коллекцию изображений, которая кажется прозрачной, благодаря тому, что цвет всех пикселей фона изменен на COLOR_WINDOW. Если изображение отрисовано на фоне, цвет которого отличен от COLOR_WINDOW, то изображение отрисовывается неправильно. Также флаги LR_LOADTRANSPARENT и LR_LOADMAP3DCOLORS используют системные цвета, которые были актуальны в момент вызова функции ImageList_LoadImage. Если системные цвета впоследствии изменяются, то приложение должно перезагрузить изображение для перераспределения цветов.

Заголовочный файл | Commctrl.h
Экспортирующая библиотека | Comctl32.dll
ANSI и Unicode наименования | ImageList_LoadImageA и ImageList_LoadImageW


ImageList_Merge

Создает новое изображение путем объединения двух существующих изображений. Функция также создает новую коллекцию изображений, в которой сохраняется изображение.

Прототип

HIMAGELIST ImageList_Merge(

HIMAGELIST himl1,

int i1,

HIMAGELIST himl2,

int i2,

int dx,

int dy

);

Параметры

himl1

Описатель первой коллекции изображений.

i1

Порядковый номер первого существующего изображения. Нумерация ведется с нуля.

himl2

Описатель второй колекции изображений.

i2

Порядковый номер второго существующего изображения. Нумерация ведется с нуля.

dx

Смещение по горизонтали второго изображения относительно первого изображения.

dy

Смещение по вертикали второго изображения относительно первого изображения.

Возвращаемое значение

Описатель новой коллекции изображений.

Возвращаемое значение в случае ошибки

NULL.

Пример использования

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

#include <windows.h>

#include <commctrl.h>

//Прототип функции ImageList_Destroy

_stdcall typedef BOOL (*IMAGELIST_DESTROY)(HIMAGELIST);

IMAGELIST_DESTROY lpfIL_Destroy;

//Прототип функции ImageList_LoadImage

_stdcall typedef HIMAGELIST (*IMAGELIST_LOADIMAGE)(HINSTANCE,LPCTSTR,int,int,COLORREF,UINT,UINT);

IMAGELIST_LOADIMAGE lpfIL_LoadImage;

//Прототип функции ImageList_Merge

_stdcall typedef HIMAGELIST (*IMAGELIST_MERGE)(HIMAGELIST,int,HIMAGELIST,int,int,int);

IMAGELIST_MERGE lpfIL_Merge;

//Получает адреса функций из библиотек Comctl32.dll и gdi32.dll

void GetFunctions(void){

HINSTANCE hComctl32;

hComctl32 = LoadLibrary("Comctl32.dll");

lpfIL_Destroy = (IMAGELIST_DESTROY)GetProcAddress(hComctl32,"ImageList_Destroy");

lpfIL_LoadImage = (IMAGELIST_LOADIMAGE)GetProcAddress(hComctl32,"ImageList_LoadImage");

lpfIL_Merge = (IMAGELIST_MERGE)GetProcAddress(hComctl32,"ImageList_Merge");

}

int main()

{

//Получаем адреса функций

GetFunctions();

//Создаем первую коллекцию изображений

HIMAGELIST hIL1;

hIL1 = lpfIL_LoadImage(NULL,"pict_1.bmp",48,5,CLR_NONE,IMAGE_BITMAP,LR_LOADFROMFILE);

//Создаем вторую коллекцию изображений

HIMAGELIST hIL2;

hIL2 = lpfIL_LoadImage(NULL,"pict_1.bmp",48,5,CLR_NONE,IMAGE_BITMAP,LR_LOADFROMFILE);

//Создаем коллекцию изображений

HIMAGELIST hIL;

hIL = lpfIL_Merge(hIL1,0,hIL2,0,0,0);

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

printf("%X\n",hIL);

//Уничтожаем коллекции

lpfIL_Destroy(hIL1);

lpfIL_Destroy(hIL2);

lpfIL_Destroy(hIL);

getchar();

return 0;

}

Примечание

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

Заголовочный файл | Commctrl.h
Экспортирующая библиотека | Comctl32.dll


ImageList_Remove

Удаляет изображение из коллекции изображений.

Прототип

BOOL ImageList_Remove(

HIMAGELIST himl,

int i

);

Параметры

himl

Описатель коллекции изображений.

i

Номер удаляемого изображения. Нумерация ведется с нуля. Если значение этого параметра равно -1, то функция удаляет все изображения.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль.

Пример использования

В примере ниже создаётся коллекция изображений, состоящая из двух изображений. После чего из колекции удаляется первое изображение.

#include <windows.h>

#include <commctrl.h>

//Прототип функции ImageList_Create

_stdcall typedef HIMAGELIST (*IMAGELIST_CREATE)(int,int,UINT,int,int);

IMAGELIST_CREATE lpfIL_Create;

//Прототип функции ImageList_Destroy

_stdcall typedef BOOL (*IMAGELIST_DESTROY)(HIMAGELIST);

IMAGELIST_DESTROY lpfIL_Destroy;

//Прототип функции ImageList_Add

_stdcall typedef int (*IMAGELIST_ADD)(HIMAGELIST,HBITMAP,HBITMAP);

IMAGELIST_ADD lpfIL_Add;

//Прототип функции ImageList_GetImageCount

_stdcall typedef BOOL (*IMAGELIST_GETIMAGECOUNT)(HIMAGELIST);

IMAGELIST_GETIMAGECOUNT lpfIL_GetImageCount;

//Прототип функции ImageList_Remove

_stdcall typedef BOOL (*IMAGELIST_REMOVE)(HIMAGELIST,int);

IMAGELIST_REMOVE lpfIL_Remove;

//Прототип функции DeleteObject

_stdcall typedef BOOL (*DELETEOBJECT)(HGDIOBJ);

DELETEOBJECT lpfDeleteObject;

//Получает адреса функций из библиотек Comctl32.dll и gdi32.dll

void GetFunctions(void){

HINSTANCE hComctl32;

hComctl32 = LoadLibrary("Comctl32.dll");

lpfIL_Create = (IMAGELIST_CREATE)GetProcAddress(hComctl32,"ImageList_Create");

lpfIL_Destroy = (IMAGELIST_DESTROY)GetProcAddress(hComctl32,"ImageList_Destroy");

lpfIL_Add = (IMAGELIST_ADD)GetProcAddress(hComctl32,"ImageList_Add");

lpfIL_GetImageCount = (IMAGELIST_GETIMAGECOUNT)GetProcAddress(hComctl32,"ImageList_GetImageCount");

lpfIL_Remove = (IMAGELIST_REMOVE)GetProcAddress(hComctl32,"ImageList_Remove");

//Находим адрес функции DeleteObject

HINSTANCE hgdi32;

hgdi32 = LoadLibrary("gdi32.dll");

lpfDeleteObject = (DELETEOBJECT)GetProcAddress(hgdi32,"DeleteObject");

}

int main()

{

//Получаем адреса функций

GetFunctions();

//Создаем коллекцию изображений

HIMAGELIST hIL;

hIL = lpfIL_Create(48,48,ILC_COLOR32,1,0);

//Загружаем первое растровое изображение

HBITMAP hBitmap;

hBitmap = LoadImage(NULL,"pict_1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

//Добавляем изображение в коллекцию

lpfIL_Add(hIL,hBitmap,NULL);

//Освобождаем ресурсы

lpfDeleteObject(hBitmap);

//Загружаем второе изображение

hBitmap = LoadImage(NULL,"pict_2.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

//Добавляем изображение в коллекцию

lpfIL_Add(hIL,hBitmap,NULL);

//Освобождаем ресурсы

lpfDeleteObject(hBitmap);

//Удаляем из коллекции изображение

lpfIL_Remove(hIL,0);

//Выводим количество изображений в коллекции

printf("%d\n",lpfIL_GetImageCount(hIL));

//Уничтожаем коллекцию

lpfIL_Destroy(hIL);

getchar();

return 0;

}

Примечание

При удалении изображения номера оставшихся в коллекции изображений корректируются так, чтобы номера изображений всегда находились в интервале от нуля до количества изображений в коллекции минус один. Например, если вы удаляете изображение с номером 0, то изображение 1 станет изображением 0, изображение 2 станет изображением 1 и так далее.

Заголовочный файл | Commctrl.h
Экспортирующая библиотека | Comctl32.dll


ImageList_Replace

Замещает изображение в коллекции изображений новым изображением.

Прототип

BOOL ImageList_Replace(

HIMAGELIST himl,

int i,

HBITMAP hbmImage,

HBITMAP hbmMask

);

Параметры

himl

Описатель колекции изображений.

i

Порядковый номер замещаемого изображения. Нумерация ведется с нуля.

hbmImage

Описатель битовой карты (bitmap), содержащей новое изображение.

hbmMask

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

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль.

Пример использования

В примере ниже мы создаём коллекцию изображений из одного изображения, увеличиваем размер коллекции и записываем изображение в новую позицию.

#include <windows.h>

#include <commctrl.h>

//Прототип функции ImageList_Create

_stdcall typedef HIMAGELIST (*IMAGELIST_CREATE)(int,int,UINT,int,int);

IMAGELIST_CREATE lpfIL_Create;

//Прототип функции ImageList_Destroy

_stdcall typedef BOOL (*IMAGELIST_DESTROY)(HIMAGELIST);

IMAGELIST_DESTROY lpfIL_Destroy;

//Прототип функции ImageList_Add

_stdcall typedef int (*IMAGELIST_ADD)(HIMAGELIST,HBITMAP,HBITMAP);

IMAGELIST_ADD lpfIL_Add;

//Прототип функции ImageList_GetImageCount

_stdcall typedef BOOL (*IMAGELIST_GETIMAGECOUNT)(HIMAGELIST);

IMAGELIST_GETIMAGECOUNT lpfIL_GetImageCount;

//Прототип функции ImageList_SetImageCount

_stdcall typedef BOOL (*IMAGELIST_SETIMAGECOUNT)(HIMAGELIST,UINT);

IMAGELIST_SETIMAGECOUNT lpfIL_SetImageCount;

//Прототип функции ImageList_Replace

_stdcall typedef BOOL (*IMAGELIST_REPLACE)(HIMAGELIST,int,HBITMAP,HBITMAP);

IMAGELIST_REPLACE lpfIL_Replace;

//Прототип функции DeleteObject

_stdcall typedef BOOL (*DELETEOBJECT)(HGDIOBJ);

DELETEOBJECT lpfDeleteObject;

//Получает адреса функций из библиотек Comctl32.dll и gdi32.dll

void GetFunctions(void){

HINSTANCE hComctl32;

hComctl32 = LoadLibrary("Comctl32.dll");

lpfIL_Create = (IMAGELIST_CREATE)GetProcAddress(hComctl32,"ImageList_Create");

lpfIL_Destroy = (IMAGELIST_DESTROY)GetProcAddress(hComctl32,"ImageList_Destroy");

lpfIL_Add = (IMAGELIST_ADD)GetProcAddress(hComctl32,"ImageList_Add");

lpfIL_GetImageCount = (IMAGELIST_GETIMAGECOUNT)GetProcAddress(hComctl32,"ImageList_GetImageCount");

lpfIL_SetImageCount = (IMAGELIST_SETIMAGECOUNT)GetProcAddress(hComctl32,"ImageList_SetImageCount");

lpfIL_Replace = (IMAGELIST_REPLACE)GetProcAddress(hComctl32,"ImageList_Replace");

//Находим адрес функции DeleteObject

HINSTANCE hgdi32;

hgdi32 = LoadLibrary("gdi32.dll");

lpfDeleteObject = (DELETEOBJECT)GetProcAddress(hgdi32,"DeleteObject");

}

int main()

{

//Получаем адреса функций

GetFunctions();

//Создаем коллекцию изображений

HIMAGELIST hIL;

hIL = lpfIL_Create(48,48,ILC_COLOR32,1,0);

//Загружаем первое растровое изображение

HBITMAP hBitmap;

hBitmap = LoadImage(NULL,"pict_1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

//Добавляем изображение в коллекцию

lpfIL_Add(hIL,hBitmap,NULL);

//Освобождаем ресурсы

lpfDeleteObject(hBitmap);

//Загружаем второе изображение

hBitmap = LoadImage(NULL,"pict_2.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

//Изменяем количество изображений в коллекции

lpfIL_SetImageCount(hIL,2);

//Заносим изображение в новую позицию

lpfIL_Replace(hIL,1,hBitmap,NULL);

//Освобождаем ресурсы

lpfDeleteObject(hBitmap);

//Выводим количество изображений в коллекции

printf("%d\n",lpfIL_GetImageCount(hIL));

//Уничтожаем коллекцию

lpfIL_Destroy(hIL);

getchar();

return 0;

}

Примечание

Данная функция копирует битовую карту во внутреннюю структуру данных. Поэтому вы можете использовать функцию DeleteObject для удаления hbmImage и hbmMask после возврата из функции.

Заголовочный файл | Commctrl.h
Экспортирующая библиотека | Comctl32.dll


ImageList_ReplaceIcon

Замещает изображение в коллекции иконкой или курсором.

Прототип

int ImageList_ReplaceIcon(

_In_ HIMAGELIST himl,

_In_ int i,

_In_ HICON hicon

);

Параметры

himl[in]

Описатель колекции изображений.

i[in]

Порядковый номер замещаемого изображения. Нумерация ведется с нуля. Если значение этого параметра равно -1, то функция добавляет изображение в конец коллекции.

hicon

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

Возвращаемое значение

Порядковый номер изображения. Нумерация ведется с нуля.

Возвращаемое значение в случае ошибки

-1.

Пример использования

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

#include <windows.h>

#include <commctrl.h>

#include "Constants.h"

//Прототип функции ImageList_Destroy

_stdcall typedef BOOL (*IMAGELIST_DESTROY)(HIMAGELIST);

IMAGELIST_DESTROY lpfIL_Destroy;

//Прототип функции ImageList_LoadImage

_stdcall typedef HIMAGELIST (*IMAGELIST_LOADIMAGE)(HINSTANCE,LPCTSTR,int,int,COLORREF,UINT,UINT);

IMAGELIST_LOADIMAGE lpfIL_LoadImage;

//Прототип функции ImageList_ReplaceIcon

_stdcall typedef int (*IMAGELIST_REPLACEICON)(HIMAGELIST,int,HICON);

IMAGELIST_REPLACEICON lpfIL_ReplaceIcon;

//Прототип функции ImageList_GetImageCount

_stdcall typedef int (*IMAGELIST_GETIMAGECOUNT)(HIMAGELIST);

IMAGELIST_GETIMAGECOUNT lpfIL_GetImageCount;

//Получает адреса функций из библиотек Comctl32.dll и gdi32.dll

void GetFunctions(void){

HINSTANCE hComctl32;

hComctl32 = LoadLibrary("Comctl32.dll");

lpfIL_Destroy = (IMAGELIST_DESTROY)GetProcAddress(hComctl32,"ImageList_Destroy");

lpfIL_LoadImage = (IMAGELIST_LOADIMAGE)GetProcAddress(hComctl32,"ImageList_LoadImage");

lpfIL_ReplaceIcon = (IMAGELIST_REPLACEICON)GetProcAddress(hComctl32,"ImageList_ReplaceIcon");

lpfIL_GetImageCount = (IMAGELIST_GETIMAGECOUNT)GetProcAddress(hComctl32,"ImageList_GetImageCount");

}

int main()

{

//Получаем адреса функций

GetFunctions();

//Создаем коллекцию изображений

HIMAGELIST hIL;

hIL = lpfIL_LoadImage(NULL,"pict_1.bmp",48,5,CLR_NONE,IMAGE_BITMAP,LR_LOADFROMFILE);

//Загружаем иконку

HICON hicon;

hicon = LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(ID_ICON));

//Добавляем иконку в коллекцию

lpfIL_ReplaceIcon(hIL,-1,hicon);

//Выводим количество изображений в коллекции

printf("%X\n",lpfIL_GetImageCount(hIL));

//Уничтожаем коллекцию

lpfIL_Destroy(hIL);

getchar();

return 0;

}

Примечание

Так как система не сохраняет иконку hicon, то если иконка или курсор были созданы функцией CreateIcon вы можете уничтожить её после возврата управления из функции. Вам не нужно уничтожать иконку hicon, если она была загружена функцией LoadIcon; система автоматически освободит ресурсы иконки, когда они будут больше не нужны.

Заголовочный файл | Commctrl.h
Экспортирующая библиотека | Comctl32.dll


ImageList_SetBkColor

Устанавливает цвет фона коллекции изображений. Эта функция работает только в том случае, если вы добавили иконку или использовали функцию ImageList_AddMasked с чернобелым растровым изображением. Без маски отрисовывается всё изображение; из-за этого цвет фона невидим.

Прототип

COLORREF ImageList_SetBkColor(

_In_ HIMAGELIST himl,

_In_ COLORREF clrBk

);

Параметры

himl[in]

Описатель коллекции изображений.

clrBk[in]

Новый цвет фона. Значение данного параметра может быть равно CLR_NONE. В этом случае с использованием маски отрисовывается прозрачное изображение.

Возвращаемое значение

Предыдущий цвет фона.

Возвращаемое значение в случае ошибки

CLR_NONE

Пример использования

В примере ниже мы устанавливаем новый цвет фона (синий), а затем извлекаем его с помощью функции ImageList_GetBkColor.

#include <windows.h>

#include <commctrl.h>

//Прототип функции ImageList_Create

_stdcall typedef HIMAGELIST (*IMAGELIST_CREATE)(int,int,UINT,int,int);

IMAGELIST_CREATE lpfIL_Create;

//Прототип функции ImageList_Destroy

_stdcall typedef BOOL (*IMAGELIST_DESTROY)(HIMAGELIST);

IMAGELIST_DESTROY lpfIL_Destroy;

//Прототип функции ImageList_Add

_stdcall typedef int (*IMAGELIST_ADD)(HIMAGELIST,HBITMAP,HBITMAP);

IMAGELIST_ADD lpfIL_Add;

//Прототип функции ImageList_GetBkColor

_stdcall typedef COLORREF (*IMAGELIST_GETBKCOLOR)(HIMAGELIST);

IMAGELIST_GETBKCOLOR lpfIL_GetBkColor;

//Прототип функции ImageList_SetBkColor

_stdcall typedef COLORREF (*IMAGELIST_SETBKCOLOR)(HIMAGELIST,COLORREF);

IMAGELIST_SETBKCOLOR lpfIL_SetBkColor;

//Прототип функции DeleteObject

_stdcall typedef BOOL (*DELETEOBJECT)(HGDIOBJ);

DELETEOBJECT lpfDeleteObject;

//Получает адреса функций из библиотек Comctl32.dll и gdi32.dll

void GetFunctions(void){

HINSTANCE hComctl32;

hComctl32 = LoadLibrary("Comctl32.dll");

lpfIL_Create = (IMAGELIST_CREATE)GetProcAddress(hComctl32,"ImageList_Create");

lpfIL_Destroy = (IMAGELIST_DESTROY)GetProcAddress(hComctl32,"ImageList_Destroy");

lpfIL_Add = (IMAGELIST_ADD)GetProcAddress(hComctl32,"ImageList_Add");

lpfIL_GetBkColor = (IMAGELIST_GETBKCOLOR)GetProcAddress(hComctl32,"ImageList_GetBkColor");

lpfIL_SetBkColor = (IMAGELIST_SETBKCOLOR)GetProcAddress(hComctl32,"ImageList_SetBkColor");

//Находим адрес функции DeleteObject

HINSTANCE hgdi32;

hgdi32 = LoadLibrary("gdi32.dll");

lpfDeleteObject = (DELETEOBJECT)GetProcAddress(hgdi32,"DeleteObject");

}

int main()

{

//Получаем адреса функций

GetFunctions();

//Создаем коллекцию изображений

HIMAGELIST hIL;

hIL = lpfIL_Create(48,48,ILC_COLOR32,3,0);

//Загружаем первое растровое изображение

HBITMAP hBitmap;

hBitmap = LoadImage(NULL,"pict_1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

//Добавляем изображение в коллекцию

lpfIL_Add(hIL,hBitmap,NULL);

//Освобождаем ресурсы

lpfDeleteObject(hBitmap);

//Устанавливаем новый цвет фона

lpfIL_SetBkColor(hIL,RGB(00,0xFF,00));

//Получаем цвет фона

COLORREF color;

color = lpfIL_GetBkColor(hIL);

//Выводим количество изображений в новой коллекции

printf("(%d;%d;%d)\n",GetRValue(color),GetGValue(color),GetBValue(color));

//Уничтожаем коллекции

lpfIL_Destroy(hIL);

getchar();

return 0;

}

Заголовочный файл | Commctrl.h
Экспортирующая библиотека | Comctl32.dll


ImageList_SetIconSize

Устанавливает размеры изображений в коллекции изображений и удаляет все изображения из коллекции.

Прототип

BOOL ImageList_SetIconSize(

HIMAGELIST himl,

int cx,

int cy

);

Параметры

himl

Описатель коллекции изображений.

cx

Новая ширина изображений в коллекции, в пикселях. Все изображения в коллекции имеют одинаковый размер.

cy

Новая высота изображений в коллекции, в пикселях. Все изображения в коллекции имеют одинаковый размер.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль.

Пример использования

В примере ниже мы создаем коллекцию изображений, с размером изображений 48 на 48 пикселей и добавляем в неё два изображения. Затем мы изменяем размер изображений в коллекции (20 на 20 пикселей), при этом коллекция очищается. Поэтому на экран выводится значение нуль.

#include <windows.h>

#include <commctrl.h>

//Прототип функции ImageList_Create

_stdcall typedef HIMAGELIST (*IMAGELIST_CREATE)(int,int,UINT,int,int);

IMAGELIST_CREATE lpfIL_Create;

//Прототип функции ImageList_Destroy

_stdcall typedef BOOL (*IMAGELIST_DESTROY)(HIMAGELIST);

IMAGELIST_DESTROY lpfIL_Destroy;

//Прототип функции ImageList_Add

_stdcall typedef int (*IMAGELIST_ADD)(HIMAGELIST,HBITMAP,HBITMAP);

IMAGELIST_ADD lpfIL_Add;

//Прототип функции ImageList_GetImageCount

_stdcall typedef BOOL (*IMAGELIST_GETIMAGECOUNT)(HIMAGELIST);

IMAGELIST_GETIMAGECOUNT lpfIL_GetImageCount;

//Прототип функции ImageList_SetIconSize

_stdcall typedef BOOL (*IMAGELIST_SETICONSIZE)(HIMAGELIST,int,int);

IMAGELIST_SETICONSIZE lpfIL_SetIconSize;

//Прототип функции DeleteObject

_stdcall typedef BOOL (*DELETEOBJECT)(HGDIOBJ);

DELETEOBJECT lpfDeleteObject;

//Получает адреса функций из библиотек Comctl32.dll и gdi32.dll

void GetFunctions(void){

HINSTANCE hComctl32;

hComctl32 = LoadLibrary("Comctl32.dll");

lpfIL_Create = (IMAGELIST_CREATE)GetProcAddress(hComctl32,"ImageList_Create");

lpfIL_Destroy = (IMAGELIST_DESTROY)GetProcAddress(hComctl32,"ImageList_Destroy");

lpfIL_Add = (IMAGELIST_ADD)GetProcAddress(hComctl32,"ImageList_Add");

lpfIL_GetImageCount = (IMAGELIST_GETIMAGECOUNT)GetProcAddress(hComctl32,"ImageList_GetImageCount");

lpfIL_SetIconSize = (IMAGELIST_SETICONSIZE)GetProcAddress(hComctl32,"ImageList_SetIconSize");

//Находим адрес функции DeleteObject

HINSTANCE hgdi32;

hgdi32 = LoadLibrary("gdi32.dll");

lpfDeleteObject = (DELETEOBJECT)GetProcAddress(hgdi32,"DeleteObject");

}

int main()

{

//Получаем адреса функций

GetFunctions();

//Создаем коллекцию изображений

HIMAGELIST hIL;

hIL = lpfIL_Create(48,48,ILC_COLOR32,3,0);

//Загружаем первое растровое изображение

HBITMAP hBitmap;

hBitmap = LoadImage(NULL,"pict_1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

//Добавляем изображение в коллекцию

lpfIL_Add(hIL,hBitmap,NULL);

//Освобождаем ресурсы

lpfDeleteObject(hBitmap);

//Создаём иконку

lpfIL_SetIconSize(hIL,20,20);

//Выводим описатель иконки

printf("%d\n",lpfIL_GetImageCount(hIL));

//Уничтожаем коллекцию

lpfIL_Destroy(hIL);

getchar();

return 0;

}

Заголовочный файл | Commctrl.h
Экспортирующая библиотека | Comctl32.dll


ImageList_SetImageCount

Изменяет размер существующей коллекции изображений.

Прототип

BOOL ImageList_SetImageCount(

_In_ HIMAGELIST himl,

_In_ UINT uNewCount

);

Параметры

himl[in]

Описатель коллекции изображений, размер которой изменяется.

uNewCount[in]

Новый размер коллекции изображений.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль.

Пример использования

В примере ниже мы создаем коллекцию изображению, а затем изменяем её размер. Хотя в коллекции всего одно изображение, функция ImageList_GetImageCount вовзращает значение 3.

#include <windows.h>

#include <commctrl.h>

//Прототип функции ImageList_Create

_stdcall typedef HIMAGELIST (*IMAGELIST_CREATE)(int,int,UINT,int,int);

IMAGELIST_CREATE lpfIL_Create;

//Прототип функции ImageList_Destroy

_stdcall typedef BOOL (*IMAGELIST_DESTROY)(HIMAGELIST);

IMAGELIST_DESTROY lpfIL_Destroy;

//Прототип функции ImageList_Add

_stdcall typedef int (*IMAGELIST_ADD)(HIMAGELIST,HBITMAP,HBITMAP);

IMAGELIST_ADD lpfIL_Add;

//Прототип функции ImageList_GetImageCount

_stdcall typedef BOOL (*IMAGELIST_GETIMAGECOUNT)(HIMAGELIST);

IMAGELIST_GETIMAGECOUNT lpfIL_GetImageCount;

//Прототип функции ImageList_SetImageCount

_stdcall typedef BOOL (*IMAGELIST_SETIMAGECOUNT)(HIMAGELIST,UINT);

IMAGELIST_SETIMAGECOUNT lpfIL_SetImageCount;

//Прототип функции DeleteObject

_stdcall typedef BOOL (*DELETEOBJECT)(HGDIOBJ);

DELETEOBJECT lpfDeleteObject;

//Получает адреса функций из библиотек Comctl32.dll и gdi32.dll

void GetFunctions(void){

HINSTANCE hComctl32;

hComctl32 = LoadLibrary("Comctl32.dll");

lpfIL_Create = (IMAGELIST_CREATE)GetProcAddress(hComctl32,"ImageList_Create");

lpfIL_Destroy = (IMAGELIST_DESTROY)GetProcAddress(hComctl32,"ImageList_Destroy");

lpfIL_Add = (IMAGELIST_ADD)GetProcAddress(hComctl32,"ImageList_Add");

lpfIL_GetImageCount = (IMAGELIST_GETIMAGECOUNT)GetProcAddress(hComctl32,"ImageList_GetImageCount");

lpfIL_SetImageCount = (IMAGELIST_SETIMAGECOUNT)GetProcAddress(hComctl32,"ImageList_SetImageCount");

//Находим адрес функции DeleteObject

HINSTANCE hgdi32;

hgdi32 = LoadLibrary("gdi32.dll");

lpfDeleteObject = (DELETEOBJECT)GetProcAddress(hgdi32,"DeleteObject");

}

int main()

{

//Получаем адреса функций

GetFunctions();

//Создаем коллекцию изображений

HIMAGELIST hIL;

hIL = lpfIL_Create(48,48,ILC_COLOR32,1,0);

//Загружаем первое растровое изображение

HBITMAP hBitmap;

hBitmap = LoadImage(NULL,"pict_1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

//Добавляем изображение в коллекцию

lpfIL_Add(hIL,hBitmap,NULL);

//Освобождаем ресурсы

lpfDeleteObject(hBitmap);

//Изменяем количество изображений в коллекции

lpfIL_SetImageCount(hIL,3);

//Выводим количество изображений в коллекции

printf("%d\n",lpfIL_GetImageCount(hIL));

//Уничтожаем коллекцию

lpfIL_Destroy(hIL);

getchar();

return 0;

}

Примечание

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

Если вы уменьшаете размер коллекции изображений, то "отрезанные" изображения освобождаются.

Заголовочный файл | Commctrl.h
Экспортирующая библиотека | Comctl32.dll


ImageList_SetOverlayImage

Добавляет в коллекцию изображений заданное изображение, которое используется как перекрывающая маска. Коллекция изображений может иметь до 4 перкрывающих масок в версии 4.70 и до 15 в версии 4.71. Функция присваивает заданному изображению номер перекрывающей маски.

Прототип

BOOL ImageList_SetOverlayImage(

_In_ HIMAGELIST himl,

_In_ int iImage,

_In_ int iOverlay

);

Параметры

himl[in]

Описатель коллекции изображений.

iImage[in]

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

iOverlay[in]

Номер перекрывающей маски.Нумерация ведется с нуля.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль.

Пример использования

#include <windows.h>

#include <commctrl.h>

//Прототип функции ImageList_Create

_stdcall typedef HIMAGELIST (*IMAGELIST_CREATE)(int,int,UINT,int,int);

IMAGELIST_CREATE lpfIL_Create;

//Прототип функции ImageList_Destroy

_stdcall typedef BOOL (*IMAGELIST_DESTROY)(HIMAGELIST);

IMAGELIST_DESTROY lpfIL_Destroy;

//Прототип функции ImageList_Add

_stdcall typedef int (*IMAGELIST_ADD)(HIMAGELIST,HBITMAP,HBITMAP);

IMAGELIST_ADD lpfIL_Add;

//Прототип функции ImageList_Copy

_stdcall typedef int (*IMAGELIST_COPY)(HIMAGELIST,int,HIMAGELIST,int,UINT);

IMAGELIST_COPY lpfIL_Copy;

//Прототип функции ImageList_SetOverlayImage

_stdcall typedef int (*IMAGELIST_SETOVERLAYIMAGE)(HIMAGELIST,int,int);

IMAGELIST_SETOVERLAYIMAGE lpfIL_SetOverlayImage;

//Прототип функции DeleteObject

_stdcall typedef BOOL (*DELETEOBJECT)(HGDIOBJ);

DELETEOBJECT lpfDeleteObject;

//Получает адреса функций из библиотек Comctl32.dll и gdi32.dll

void GetFunctions(void){

HINSTANCE hComctl32;

hComctl32 = LoadLibrary("Comctl32.dll");

lpfIL_Create = (IMAGELIST_CREATE)GetProcAddress(hComctl32,"ImageList_Create");

lpfIL_Destroy = (IMAGELIST_DESTROY)GetProcAddress(hComctl32,"ImageList_Destroy");

lpfIL_Add = (IMAGELIST_ADD)GetProcAddress(hComctl32,"ImageList_Add");

lpfIL_Copy = (IMAGELIST_COPY)GetProcAddress(hComctl32,"ImageList_Copy");

lpfIL_SetOverlayImage = (IMAGELIST_SETOVERLAYIMAGE)GetProcAddress(hComctl32,"ImageList_SetOverlayImage");

//Находим адрес функции DeleteObject

HINSTANCE hgdi32;

hgdi32 = LoadLibrary("gdi32.dll");

lpfDeleteObject = (DELETEOBJECT)GetProcAddress(hgdi32,"DeleteObject");

}

int main()

{

//Получаем адреса функций

GetFunctions();

//Создаем коллекцию изображений

HIMAGELIST hIL;

hIL = lpfIL_Create(48,48,ILC_COLOR32,3,0);

//Загружаем первое растровое изображение

HBITMAP hBitmap;

hBitmap = LoadImage(NULL,"pict_1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

//Добавляем изображение в коллекцию

lpfIL_Add(hIL,hBitmap,NULL);

//Освобождаем ресурсы

lpfDeleteObject(hBitmap);

//Загружаем второе растровое изображение

hBitmap = LoadImage(NULL,"pict_2.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

//Добавляем изображение в коллекцию

lpfIL_Add(hIL,hBitmap,NULL);

//Освобождаем ресурсы

lpfDeleteObject(hBitmap);

int res;

//Устанавливаем перекрывающее изображение

res = lpfIL_SetOverlayImage(hIL,0,2);

printf("%d\n",res);

//Уничтожаем коллекцию

lpfIL_Destroy(hIL);

getchar();

return 0;

}

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

Примечание

Перекрывающая маска - это прощрачное изображение, отрисовываемое поверх другого изображения. Для отрисовки перекрывающей маски поверх изображения используйте функцию ImageList_Draw или ImageList_DrawEx. Значение параметра fStyle этих функций может задаваться с помощью макроса INDEXTOOVERLAYMASK, который задает номер перекрывающей маски.

Вызов данной функции завершаетя ошибкой и функция возвращает значение E_INVALIDARG, если коллекция изображений создавалась без использования маски.

Заголовочный файл | Commctrl.h
Экспортирующая библиотека | Comctl32.dll


Состояния коллекции изображений (ILS_*)

ILS_ALPHA

0x00000008

Альфа смешивание иконки. Альфа смешивание управляет уровнем прозрачности иконки в соответствии со значением её альфа канала. Значение альфа канала может находиться в интервале от нуля до 255, где значение нуль соответствует полностью прозрачному пикселю, а значение 255 полностью непрозрачному.

ILS_GLOW

0x00000001

Не поддерживается.

ILS_NORMAL

0x00000000

Состояние изображения не изменено.

ILS_SATURATE

0x00000004

Уменьшает насыщенность цвета иконки по шкале полутонов. Это влияет только на изображения с глубиной цвета 32bpp.

ILS_SHADOW

0x00000002

Не поддерживается.

Заголовочный файл: Commctrl.h


Флаги структуры IMAGELISTDRAWPARAMS

BLACKNESS

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

DSTINVERT

Инвертирует целевой прямоугольник.

MERGECOPY

Объединяет цвета исходного прямоугольника с заданным шаблоном посредством логической операции AND.

MERGEPAINT

Объединяет инвертированные цвета исходного прямоугольника с цветами целевого прямоугольника посредством логической операции OR.

NOTSRCCOPY

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

NOTSRCERASE

Объединяет цвета исходного и целевого прямоугольников посредством логической операции OR. Инвертирует результирующий цвет.

PATCOPY

Записывает в целевое растровое изображение (bitmap) заданный шаблон.

PATINVERT

Объединяет цвета заданного шаблона с цветами целевого прямоугольника посредством логической операции XOR.

PATPAINT

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

SRCAND

Объединяет цвета исходного и целевого прямоугольников посредством логической операции AND.

SRCCOPY

Копирует исходный прямоугольник непосредственно в целевой прямоугольник.

SRCERASE

Объединяет инвертированные цвета целевого прямоугольника с цветами исходного прямоугольника посредсвомлогической операции AND.

SRCINVERT

Объединяет цвета исходного и целевого прямоугольников посредством логической операции XOR.

SRCPAINT

Объединяет цвета исходного и целевого прямоугольников посредсвом логической операции OR.

WHITENESS

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

Заголовочный файл: Commctrl.h


Флаги функции ImageList_Create (ILC_*)

Появились в Windows XP.

ILC_MASK

(0x00000001)

Использовать маску. Коллекция изображений состоит из двух изображений, одно из которых является монохромным изображением, используемым в качестве маски. Если этот флаг не установлен, то колекция изображений содержит только одно изображение.

ILC_COLOR

(0x00000000)

Используется по умолчанию, если не заланы друге флаги ILLC_COLOR*. Обычно, по умолчанию используется ILC_COLOR4, но для старых драйверов дисплея (display drivers) по умолчанию используется ILC_COLORDDB.

ILC_COLOR4

(0x00000004)

Использовать 4-битный (16 цветов) раздел независимого от устройства растрового изображения (4-bit DIB section) в качестве растрового изображения в коллекции изображений.

ILC_COLOR8

(0x00000008)

Использовать 8-битный раздел (8-bit DIB section). Цвета, используемые в таблице цветов, используются так же в полутоновой палитре (halftone palette).

ILC_COLOR16

(0x00000010)

Использовать 16 битный (32/64k цветов) раздел независимого от устройства изображения.

ILC_COLOR24

(0x00000018)

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

ILC_COLOR32

(0x00000020)

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

ILC_COLORDDB

(0x000000FE)

Использовать зависимое от устройства растровое изображение (device-dependent bitmap).

ILC_HIGHQUALITYSCALE

(0x00020000)

Windows Vista и новее: зарезервировано.

ILC_MIRROR

(0x00002000)

Зеркалировать имеющиеся иконки, если процесс зеркалирован.

ILC_ORIGINALSIZE

(0x00010000)

Windows Vista и новее: коллекция изображений должна принимать изображения меньшие, чем имеющиеся в наборе и применять оригинальный размер на основе добавленного изображения.

ILC_PALETTE

(0x00000080)

Не реализовано.

ILC_PERITEMMIRROR

(0x00008000)

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

Заголовочный файл: Shlobj.h


Флаги функции ImageList_Draw (ILD_*)

ILD_BLEND

0x00000004

То же самое что ILD_BLEND50.

ILD_BLEND25

0x00000002

Отрисовывает изображение, смешивая 25 процентов с системным цветом подсветки. В случае функции ImageList_DrawEx изображение смешивается с цветом заданным в параметре rgbFg. Данный флаг никак не влияет на изображения, не имеющие маски.

ILD_BLEND50

0x00000004

Отрисовывает изображение, смешивая 50 процентов с системным цветом подсветки. В случае функции ImageList_DrawEx изображение смешивается с цветом заданным в параметре rgbFg. Данный флаг никак не влияет на изображения, не имеющие маски.

ILD_FOCUS

0x00000002

То же самое что ILD_BLEND25.

ILD_IMAGE

0x00000020

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

ILD_MASK

0x00000010

Отрисовывает маску.

ILD_NORMAL

0x00000000

Отрисовывает изображение, используя цвет фона для коллекции изображений. Если цвет фона - CLR_NONE, то изображение с использованием маски отрисовывается как прозрачное.

ILD_SELECTED

0x00000004

То же самое что ILD_BLEND50.

ILD_TRANSPARENT

0x00000001

Отрисовывает прозрачное изображение с использованием маски, вне зависимости от цвета фона. Данное значение никак не влияет на изображения, не имеющие маски.

Дополнительные значения для структуры IMAGELISTDRAWPARAMS:

ILD_ASYNC

0x00008000

Windows Vista и новее: отрисовывает иображение только если оно доступно в кеше. Данный флаг предотвращает блокировку текущего потока. Это особенно важно если функция рисования вызывается из потока пользовательского интерфейса.

ILD_DPISCALE

0x00004000

Масштабирует изображение до текущего разрешения (to the current dpi) экрана.

ILD_OVERLAYMASK

0x00000F00

Извлекает перекрывающее изображение из значения поля fStyle, используя для этого операцию AND для объединения значения поля fStyle со значение ILD_OVERLAYMASK.

ILD_PRESERVEALPHA

0x00001000

Сохраняет альфа канал места назначения (alpha channel in the destination).

ILD_ROP

0x00000040

Отрисовывает изображение, используя растровую операцию, заданную в поле dwRop.

ILD_SCALE

0x00002000

Масштабирует изображение до размеров cx и cy, вместо его отсечения.

Заголовочный файл: Commctrl.h


Флаги функции LoadImage (LR_*)

LR_CREATEDIBSECTION

(0x00002000)

Когда значение параметра uType равно IMAGE_BITMAP, функция возвращает растровое изображение раздела независимого от устройства растрового изображения (a DIB section bitmap), а не совместимое растровое изображение. данный флаг используется для загрузки растрового изображения без его проецирования на цвета устройства вывода.

LR_DEFAULTCOLOR

(0x00000000)

Флаг по усолчанию. Он ничего не делает. Всё, что он означает, так это отрицание флага LR_MONOCHROME.

LR_DEFAULTSIZE

(0x00000040)

Если значение cxDesired или cyDesired равны нулю, то использовать значения системных метрик установленных для ширины и высоты курсоров и иконок. Если это флаг не установлен и значения параметров cxDesired и cyDesired равны нулю, то функция использует фактический размер ресурса. Если ресурс содержит несколько изображений, то функция использует размер первого изображения.

LR_LOADFROMFILE

(0x00000010)

Загружает изображение из самостоятельного файла, наименование которого указано в параметре lpszName (файл иконки, курсора или растрового изображения).

LR_LOADMAP3DCOLORS

(0x00001000)

Ищет цветовую таблицу для изображения и замещает следующие оттенки серого соответствующими 3D цветами:

тёмносерый RGB(128,128,128) на COLOR_3DSHADOW;

серый RGB(192,192,192) на COLOR_3DFACE;

светло-серый RGB(223,223,223) на COLOR_3DLIGHT.

Не используйте этот флаг, если вы загружаете растровое изображение с глубиной цвета больше чем 8 бит на пиксель (bpp).

LR_LOADTRANSPARENT

(0x00000020)

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

Не используйте этот флаг, если вы загружаете растровое изображение с глубиной цвета больше чем 8 бит на пиксель.

Если параметр fuLoad включает оба флага: и LR_LOADTRANSPARENCE, и LR_LOADMAP3DCOLORS, флаг LR_LOADTRANSPARENCE имеет больший приоритет. Однако запись в таблице цветов меняется в соответствии с флагом COLOR_3DFACE, а не на цвет COLOR_WINDOW.

LR_MONOCHROME

(0x00000001)

Загружает черно-белое изображение.

LR_SHARED

(0x00008000)

Разделяет (shares) описатель изображения, если оно заружается несколько раз. Если данный флаг не указан, то второй вызов функции LoadImage для ого же ресурса снова загрузит изображение и вернет новый описатель.

Когда вы используете этот флаг, система уничтожит ресурс когда он больше не будет нужен.

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

При загрузке системной иконки или курсора, вы должны использовать флаг LR_SHARED, в противном случае функция завершится ошибкой.

Функция найдет первое изображение в кэше с требуемым наименованием ресурса, независимо от требуемого размера.

LR_VGACOLOR

(0x00000080)

Использовать настоящие цвета VGA.

Заголовочный файл: winuser.h (включен в windows.h)


Стили

MCS_DAYSTATE

(1)

Версия 4.70. Календарь отправляет уведомление MCN_GETDAYSTATE для запроса информации о том, какие дни должны быть отображены полужирным шрифтом.

MCS_SHORTDAYSOFWEEK

(0x0080)

Windows Vista. Дата в заголовке календаря отображается в коротком формате.

MCS_MULTISELECT

(2)

Версия 4.70. Календарь позволяет пользователю выбрать дипапазон дат. По умолчанию максимальный диапазон равен одной неделе. Вы можете именить максимальный диапазон путем отправки сообщения MCM_SETMAXSELCOUNT.

MCS_NOSELCHANGEONNAV

(0x0100)

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

MCS_NOTODAY

(#if (_WIN32_IE >= 0x0400)

#define MCS_NOTODAY 0x0010

#else

#define MCS_NOTODAY 0x0008)

Версия 4.70. Календарь не отображает в нижней части сегодняшную дату.

MCS_NOTODAYCIRCLE

(#if (_WIN32_IE >= 0x0400)

#define MCS_NOTODAYCIRCLE 0x0008)

Версия 4.70. Календарь не отрисовывает окружность вокруг сегодняшней даты.

MCS_NOTRAILINGDATES

(0x0040)

Windows Vista. Даты из предыдущего и следующего месяцев не отображаются в текущем календаре.

MCS_WEEKNUMBERS

(4)

Версия 4.70. Календарь отображает номера недель (1-52) в левой части каждой строки с днями. Первая неделя определена как первая неделя в году, содержащая хотя бы 4 дня.

Заголовочный файл: CommCtrl.h


Стили

LBS_COMBOBOX

Указывает, что элемент управления ListBox является частью комбинированного списка. Это позволяет скоорлинировать два элемента управления так, чтобы представляли единый интерфейс пользователя. Колмбинированный список самостоятельно должен устанавливать этот стиль. Если этот стиль установит окно отличное от комбинированного списка, то список (ListBox) не сможет правильно работать.

LBS_DISABLENOSCROLL

Отображает недоступную горизонтальную или вертикальную полосу прокрутки, когда список содержит недостаточное для прокрутки количество элементов. Если этот стиль не определен, то полоса прокрутки не видна до тех пор пока в списке не появится достаточное для прокрутки количество элементов. Этот стиль должен использоваться совместно со стилем WS_VSCROLL и/или WS_HSCROLL.

LBS_EXTENDEDSEL

Разрешает множественный выбор из списка с помощью клавишы SHIFT и мыши или специальной комбинации клавиш.

LBS_HASSTRINGS

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

Для самостоятельно перерисовываемых списков без этого стиля сообщение LB_GETTEXT возвращает значение, ассоциированное с элементом списка.

LBS_MULTICOLUMN

Указывает список с несколькими колонками, который прокручивается по горизонтали. Элемент управления ListBox автоматически вычисляет ширину колонок. Приложение может самостоятельно устанавливать ширину колонок с помощью сообщения LB_SETCOLUMNWIDTH. Если элемент управления ListBox имеет стиль LBS_OWNERDRAWFIXED, то приложение может установить ширину колонок когда элемент управления ListBox отправляет сообщение WM_MEASUREITEM.

Элемент управления ListBox с установленным стилем LBS_MULTICOLUMN не может прокручиваться по вертикали. Он игнорирует все сообщения WM_VSCROLL.

Стили LBS_MULTICOLUMN и LBS_OWNERDRAWVARIABLE не могут сочетаться друг с другом. Если они указаны совместно, то стиль LBS_OWNERDRAWVARIABLE игнорируется.

LBS_MILTIPLESEL

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

LBS_NODATA

Определяет список, не содержащий данных. Указывайте этот стиль когда количество элементов в списке превышает тысячу. Такие списки должны также иметь стиль LBS_OWNERDRAWFIXED но не должны иметь стиля LBS_SORT или LBS_HASSTRINGS.

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

Система отправляет владельцу окна сообщение WM_DRAWITEM когда элемент списка должен быть отрисован. Поле itemID структуры DRAWITEMSTRUCT, передаваемой с сообщением WM_DRAWITEM содержит номер элемента списка, который должен быть отрисован.

Список, не содержащий данных, не отправляет сообщения WM_DELETEITEM.

LBS_NOINTEGRALHEIGHT

Указывает, что размер элемента управления ListBox должен точно соответствовать размеру, указанному приложением при создании элемента управления ListBox. Обычно, система изменяет размер списка так, чтобы он отображал целое число элементов.

Для списков с установленным стилем LBS_OWNERDRAWVARIABLE, стиль LBS_NOINTEGRALHEIGHT всегда установлен.

LBS_NOREDRAW

Указывает, что внешний вид элемента управления ListBox не обновляется при внесении изменений. Для изменения состояния перерисовки элемента управления используйте сообщение WM_SETREDRAW.

LBS_NOSEL

Указывает, что список ListBox содержит элементы, которые могут быть отображены на экране, но не могут быть выбраны.

LBS_NOTIFY

В перечисленных ниже случаях элемент управления ListBox отправляет своему владельцу уведомление: щелчок пользователя по элементу списка (LBN_SELCHANGE), двойной щелчок на элементе списка (LBN_DBLCLK) и отмена выбора (LBN_SELCANCEL).

LBS_OWNERDRAWFIXED

Указывает, что владелец списка ListBox отвечает за отрисовку его содержимого и что элементы списка имеют одинаковую высоту. Окно владельца получает сообщение WM_MEASUREITEM при создании списка ListBox и сообщение WM_DRAWITEM когда список нуждается в перерисовке.

LBS_OWNERDRAWVARIABLE

Указывает, что владелец списка ListBox отвечает за отрисовку его содержимого и что элементы списка имеют различную высоту. Окно владельца получает сообщение WM_MEASUREITEM при создании списка ListBox для каждого элемента списка и сообщение WM_DRAWITEM когда список нуждается в перерисовке.

Этот стиль подразумевает установку стиля LBS_NOINTEGRALHEIGHT.

Если стиль LBS_OWNERDRAWVARIABLE используется совместно со стилем LBS_MULTICOLUMN, то стиль LBS_OWNERDRAWVARIABLE игнорируется.

LBS_SORT

Строки в списке автоматически сортируются в алфавитном порядке.

LBS_STANDARD

Строки в списке сортируются в алфавитном порядке. Родительское окно плучает уведомления когда пользователь щелкает на элементе списка, дважды щелкает на элементе списка или отменяет ранее сделанный выбор. Список ListBox имеет вертикальную полосу прокрутки и границы по всем сторонам. Данныц стиль представляет собой объединение стилей LBS_NOTIFY, LBS_SORT, WS_VSCROLL и WS_BORDER.

LBS_USETABSTOPS

Позволяет списку распознавать и расширять символы табуляции при отрисовке строк. Вы можете использовать сообщение LB_SETTABSTOPS для определения позиций табуляции. По умолчанию табуляция осуществляется с шагом 32 шаблонные единицы. Шаблонные единицы это независимые от устройства единицы используемые при описании шаблонов диалоговых окон. Для пересчета размеров из шаблонных единиц в единицы экрана (пиксели) используйте функцию MapDialogRect.

LBS_WANTKEYBOARDINPUT

Указывает, что владелец элемента управления ListBox получает сообщение WM_VKEYTOITEM, когда пользователь нажимает на клавишу и фокус ввода принадлежит элементу управления ListBox. Это позволяет приложению выполнять особую обработку клавиатурного ввода.

Заголовочный файл: winuser.h (включен в windows.h)


Стили

SS_BITMAP

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

SS_BLACKFRAME

Статический элемент управления имеет рамку того же цвета, что и оконные рамки. В стандартной цветовой схеме это черный цвет.

SS_BLACKRECT

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

SS_CENTER

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

SS_CENTERIMAGE

Изображение располагается по центру статического элемента управления. Элемент управления не изменяет своего размера. Изображение, которое не помещается в нем будет обрезано. Если статический элемент управления содержит одну текстовую строку, текст выравнивается по центру вертикали в клиентской области элемента управления.

SS_EDITCONTROL

Статический элемент управления повторяет свойства отображения текста многострокового поля ввода.

SS_ENDELLIPSIS

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

SS_ENHMETAFILE

В статическом элементе управления отображается расширенный метафайл. Заголовок представляет собой наименование метафайла. Такой статический элемент управления имеет фиксированный размер. Метафайл масштабируется для полного заполнения клиентской области статического элемента управления.

SS_ETCHEDFRAME

Вокруг статического элемента управления отображается вдаваленная рамка.

SS_ETCHEDHORZ

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

SS_ETCHEDVERT

Левая и правая границы рамки вокруг статического элемента управления отображаются вдавленными.

SS_GRAYFRAME

Статический элемент управления имеет рамку того же цвета, что и фон рабочего стола. В стандартной цветовой схеме это серый цвет.

SS_GRAYRECT

Прямоугольник статического элемента управления будет закрашен текущим цветом фона экрана. В стандартной цветовой схеме это серый цвет.

SS_ICON

В статическом элементе управления будет отображена иконка. Если элемент управления создан как часть диалогового окна, то заголовок представляет собой наименование иконки (не файла иконки) в файле ресурсов. Если элемент управления был создан функцией CreateWindow или похожей, то заголовок представляет собой наименование иконки (не файла) в файле ресурсов ассоциированным с модулем указанным в качестве параметра hInstance функции CreateWindow.

Иконка может являться анимированным курсором.

Статический элемент управления автоматически изменяет свой размер, подстраиваясь под размер иконки.

SS_LEFT

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

SS_LEFTNOWORDWRAP

Текст в статическом элементе управления выравнивается по левому краю. Слова не переносятся. Текст, который выходит за пределы статического элемента управления орезается.

SS_NOPREFIX

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

SS_NOTIFY

Посылать окну-владельцу уведомления, когда пользователь кликнул мышью по статическому элементу управления.

SS_OWNERDRAW

Окно-владелец статического элемента управления отвечает за его перерисовку. Окно-владелец получает сообщение WM_DRAWITEM когда элемент управления нуждается в перерисовке.

SS_PATHELLIPSIS

Замещает символы в середине строки многоточием так, чтобы строка полностью уместилась в статическом элементе управления. Если строка содержит символы бекслеша (\), то система старается отобразить как можно больше символов после последнего символа бекслеша.

SS_REALSIZECONTROL

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

SS_REALSIZEIMAGE

Указывает, что используется реальная ширина ресурса (изображения или иконки).

SS_RIGHT

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

SS_RIGHTJUST

Правый нижний угол статического элемента управления с установленными стилями SS_BITMAP или SS_ICON остается неизменным при иземенении размеров статического элемента управления. Изменяется положение только верхней и левой границ в соответствии с размерами изображения или иконки.

SS_SIMPLE

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

SS_SUNKEN

Вокруг статического элемента управления рисуется вдавленная рамка.

SS_TYPEMASK

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

SS_WHITEFRAME

Статический элемент управления имеет рамку такого же цвета, что и фон окна. В стандартной цветовой схеме это белый цвет.

SS_WHITERECT

Прямоугольник статического элемента управления закрашивается цветом фона окна. В стандартной цветовой схеме это белый цвет.

SS_WORDELLIPSIS

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

Заголовочный файл: winuser.h (включен в windows.h)


DeleteObject

Удаляет логическое перо, кисть, шрифт, растровое изображение, регион или палитру, освобождая тем самым все ресурсы связанные с удаляемым объектом. После того, как объект удален, соответствующий ему описатель больше не действителен.

Прототип

BOOL DeleteObject(

_In_ HGDIOBJ hObject

);

Параметры

hObject[in]

Описатель логического пера, кисти, шрифта, растрового изображения, региона или палитры.

Возвращаемое значение

Ненулевое значение

Возвращаемое значение в случае ошибки

Если указанный описатель является недействительным описателем, или он выбран в контексте устройства (selected into a DC), то возвращается значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Не удаляйте объект рисования (перо или кисть) пока он выбран в контексте устройства.

Когда удаляется шаблонная кисть (pattern brush), растровое изображение, ассоциированное с кистью не удаляется. Оно должно быть удалено отдельно.

Заголовочный файл | Wingdi.h (включен в Windows.h)
Экспортирующая библиотека | gdi32.dll


GetLastError

Возвращает код последней ошибки

Прототип

DWORD WINAPI GetLastError(void);

Возвращаемое значение

Код последней ошибки.

Пример использования

#include <windows.h>

#include <conio.h>

#include <stdio.h>

int main()

{

HMODULE hmodule;

int ErrorCode;

//Вызываем ошибку

hmodule = GetModuleHandle("dsfsdfawf.dll");

//Получаем код ошибки

ErrorCode = GetLastError();

printf("%x\n", ErrorCode);

getch();

return 0;

}

В данном примере мы сначала вызываем функцию GetModuleHandle с неверным параметром. Мы просим ее найти описатель модуля, которого нет. Это приводит к ошибке. Её-то мы и определяем вызовом функции GetLastError. Она возвращает код 0x7E, который соответствует ошибке ERROR_MOD_NOT_FOUND (модуль не найден).

Заголовочный файл | winbase.h (включен в windows.h)
Экспортирующая библиотека | kernel32.dll


InitCommonControls

Регистрирует и инициализирует определенные оконные классы элементов управления. Данная функция устарела. Новые приложения должны использовать функцию InitCommonControlsEx.

Прототип

void InitCommonControls(void);

Параметры

Функция не имеет параметров.

Возвращаемое значение

Функция ничего не возвращает.

Пример использования

Ниже приводится пример вызова этой функции.

#include <windows.h>

//Прототип функции InitCommonControls

_stdcall typedef void (*INITCOMMCONTROLS)(void);

INITCOMMCONTROLS lpfICC;

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Находим адрес функции InitCommonControls

HMODULE hcomctrl;

hcomctrl = LoadLibrary("Comctl32.dll");

lpfICC = (INITCOMMCONTROLS)GetProcAddress(hcomctrl,"InitCommonControls");

//Вызываем функцию InitCommonControls

if(lpfICC)

lpfICC();

return 0;

}

Примечание

В библиотеке Comctl32.dll версии 5 посредством этой функции могут быть зарегистрированы только классы Windows 95 (ICC_WIN95_CLASSES). Программы, которым нужны дополнительные классы элементов управления должны использовать функцию InitCommonControlsEx.

В библиотеке Comctl32.dll версии 6.0 и новее, функция InitCommonControls ничего не делает. Приложения должны зарегистрировать все элементы управления посредством функции initCommonControlsEx.

Заголовочный файл | Commctrl.h
Экспортирующая библиотека | Comctl32.dll


InitCommonControlsEx

Обеспечивает загрузку библиотеки элементов управления (Comctl32.dll) и регистрирует заданные классы элементов управления из библиотеки. Приложение должно вызывать эту функцию перед созданием элемента управления.

Прототип

BOOL InitCommonControlsEx(

_In_ const LPINITCOMMONCONTROLSEX lpInitCtrls

);

Параметры

lpInitCtrls[in]

Указатель на структуру INITCOMMONCONTROLSEX, которая содержит информацию о том, какие классы элементов управления нужно зарегистрировать.

Возвращаемое значение

TRUE.

Возвращаемое значение в случае ошибки

FALSE.

Пример использования

#define _WIN32_IE 0x0300

#include <windows.h>

#include <commctrl.h>

//Прототип функции InitCommonControlsEx

_stdcall typedef BOOL (*FINITCOMMCONTROLSEX)(const LPINITCOMMONCONTROLSEX);

FINITCOMMCONTROLSEX lpfICCE;

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Находим адрес функции InitCommonControlsEx

HMODULE hcomctrl;

hcomctrl = LoadLibrary("Comctl32.dll");

lpfICCE = (FINITCOMMCONTROLSEX)GetProcAddress(hcomctrl,"InitCommonControlsEx");

//Подготавливаем структуру INITCOMMONCONTROLSEX

INITCOMMONCONTROLSEX icce;

icce.dwSize = sizeof(INITCOMMONCONTROLSEX);

icce.dwICC = ICC_USEREX_CLASSES;

//Вызываем функцию InitCommonControlsEx

if(lpfICCE)

lpfICCE(&icce);

return 0;

}

Примечание

Эффект каждого вызова функции InitCommonControlsEx является накапливаемым. Например, если первоначально функция InitCommonControlsEx вызывалась с флагом ICC_UPDOWN_CLASS, а потом еще раз с флагом ICC_HOTKEY_CLASS, то в результате будут зарегистрированы и доступны для приложений классы "up-down" и "hot key".

Заголовочный файл | Commctrl.h
Экспортирующая библиотека | Comctl32.dll (версии 4.70 и выше)


Константы RF (CDRF_*)

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

CDRF_DODEFAULT

(0x00000000)

Элемент управления перерисует сам себя. Это отменяет отправку дополнительных уведомлений NM_CUSTOMDRAW во время данного цикла раскрашивания (this paint cycle). Это происходит когда значение поля dwDrawStage структуры NMCUSTOMDRAW равно CDDS_PREPAINT.

CDRF_DOERASE

(0x00000008)

Windows Vista и новее: элемент управления перерисует фон (background).

CDRF_NEWFONT

(0x00000002)

Приложение задало новый шрифт, его будет использовать элемент управления.Это происходит когда значение поля dwDrawStage структуры NMCUSTOMDRAW равно CDDS_ITEMPREPAINT.

CDRF_NOTIFYITEMDRAW

(0x00000020)

Элемент управления будет уведомлять родителя о любой операции рисования связанной с элементом (any item-related drawing operations). Это приведет к отправке уведомления NM_CUSTOMDRAW перед и после каждой отрисовки элемента. Это происходит когда значение поля dwDrawStage структуры NMCUSTOMDRAW равно CDDS_PREPAINT.

CDRF_NOTIFYPOSTERASE

(0x00000040)

Элемент управления (The control) будет уведомлять родителя по окончании стирания элемента (after erasing an item). Это происходит когда значение поля dwDrawStage структуры NMCUSTOMDRAW равно CDDS_PREPAINT.

CDRF_NOTIFYPOSTPAINT

(0x00000010)

Элемент управления известит родителя по окончании раскраски элемента (after painting an item). Это происходит когда значение поля dwDrawStage структуры NMCUSTOMDRAW равно CDDS_PREPAINT.

CDRF_NOTIFYSUBITEMDRAW

(0x00000020)

Internet Explorer 4.0 и новее: Элемент управления будет уведомлять родителя о любой операции рисования связанной с элементом (any item-related drawing operations). Это приведет к отправке уведомления NM_CUSTOMDRAW перед и после каждой отрисовки элемента. Это происходит когда значение поля dwDrawStage структуры NMCUSTOMDRAW равно CDDS_PREPAINT. Данный флаг аналогичен флагу CDRF_NOTIFYITEMDRAW и его использование зависит от контекста.

CDRF_SKIPDEFAULT

(0x00000004)

Приложение вручную перерисовало элемент (item). Элемент управления (The control) не будет его отрисовывать. Это происходит когда значение поля dwDrawStage структуры NMCUSTOMDRAW равно CDDS_ITEMPREPAINT.

CDRF_SKIPPOSTPAINT

(0x00000100)

Windows Vista и позднее: Элемент управления не будет отрисовывать прямоугольник фокуса (the focus rectangle).

Заголовочный файл: Commctrl.h


Состояния элемента

CDIS_CHECKED

Элемент выбран.

CDIS_DEFAULT

Элемент находится в состоянии по умолчанию.

CDIS_DISABLED

Элемент недоступен.

CDIS_DROPHILITED

Элемент еще не отпущен при операции перетаскивания.

CDIS_FOCUS

Элемент находится в фокусе (is in focus).

CDIS_GRAYED

Элемент закрашен серым цветом (is grayed).

CDIS_HOT

Элемент расположен под курсором мыши.

CDIS_INDETERMINATE

Элемент находится в неопределенном состоянии (indeterminate state).

CDIS_MARKED

Элемент помечен маркером. Значение этого состояния зависит от реализации.

CDIS_NEARHOT

Элемент (item) является частью элемента управления (control), который расположен под курсором мыши, но сам элемент (item) при этом под ним не расположен. Значение этого состояния зависит от реализации.

CDIS_OTHERSIDEHOT

Элемент является частью раскрывающейся кнопки (splitbutton), которая расположена под курсором мыши, но сам элемент (item) при этом под курсором мыши не расположен. Значение этого состояния зависит от реализации.

CDIS_SELECTED

Элемент выбран.

Данный флаг работает некорректно для перерисовываемых владельцем (owner-drawn) элементов управления ListView, у которых установлен стиль LVS_SHOWSELALWAYS. Для таких элементов управления (controls) вы можете определить выбранный элемент (item) с помощью сообщения LVM_GETITEMSTATE и проверкой флага LVIS_SELECTED.

CDIS_SHOWKEYBOARDCUES

Версия 6.0. Элемент отображает сигналы клавиатуры (its keyboard cues).

Библиотека Comctl32 версии 6 н является свободно распространяемой, но она входит в состав Windows XP и более новых версий операционной системы. Для использования библиотеки Comctl32.dll версии 6, укажите её в манифесте (in the manifest).

Заголовочный файл: Commctrl.h


Флаги структуры INITCOMMONCONTROLSEX (ICC_*)

ICC_ANIMATE_CLASS

Загружает класс "animate".

ICC_BAR_CLASSES

Загружает классы "toolbar", "status bar", "trackbar", и "tooltip".

ICC_COOL_CLASSES

Загружает класс "rebar".

ICC_DATE_CLASSES

Загружает класс "date and time picker".

ICC_HOTKEY_CLASS

Загружает класс "hot key".

ICC_INTERNET_CLASSES

Загружает класс "IP address".

ICC_LINK_CLASS

Загружает класс "hyperlink".

ICC_LISTVIEW_CLASSES

Загружает классы "list-view" и "header".

ICC_NATIVEFNTCTL_CLASS

Загружает класс "native font".

ICC_PAGESCROLLER_CLASS

Загружает класс "pager".

ICC_PROGRESS_CLASS

Загружает класс "progress bar".

ICC_STANDARD_CLASSES

Загружает один из внутренних классов User32. Пользовательские элементы управления включают в себя: кнопку (button), поле ввода (edit), статический элемент управления (static), список (listbox), комбинированный список (combobox) и полосу прокрутки (scroll bar).

ICC_TAB_CLASSES

Загружает классы "tab" и "tooltip".

ICC_TREEVIEW_CLASSES

Загружает классы "tree-view" и "tooltip".

ICC_UPDOWN_CLASS

Загружает класс "up-down".

ICC_USEREX_CLASSES

Загружает класс "ComboBoxEx".

ICC_WIN95_CLASSES

Загружает классы: "animate", "header", "hot key", "list view", "progress bar", "status bar", "tab", "tooltip", "toolbar", "trackbar", "tree-view" и "up-down".

Заголовочный файл: Commctrl.h


Этапы отрисовки

Глобальные значения

CDDS_POSTERASE

После завершения цикла стирания (erasing cycle).

CDDS_POSTPAINT

После завершения цикла раскраски (painting cycle).

CDDS_PREERASE

Перед началом цикла стирания.

CDDS_PREPAINT

Перед началом цикла раскраски.

Значения специфичные для элемента (Item-specific values)

CDDS_ITEM

Указывает что поля dwItemSpec, uItemState и lItemlParam структуры NMCUSTOMDRAW содержат корректные значения.

CDDS_ITEMPOSTERASE

После того как элемент (item) быт стерт (erased).

CDDS_ITEMPOSTPAINT

После того как элемент был отрисован (drawn).

CDDS_ITEMPREERASE

Перед тем как элемент будет стерт.

CDDS_ITEMPREPAINT

Перед тем как элемент будет отрисован.

CDDS_SUBITEM

Версия 4.71. Данный флаг комбинируется с флагами CDDS_ITEMPREAPINT и CDDS_ITEMPOSTPAINT если осуществляется отрисовка подэлемента (subitem). Он устанавливается только когда при обработке уведомления с фагом CDDS_PREPAINT было возвращено значение CDRF_NOTIFYITEMDRAW.

Заголовочный файл: Commctrl.h


CallWindowProc

Вызывает оконную (диалоговую) процедуру заданного окна.

Прототип

LRESULT WINAPI CallWindowProc(

_In_ WNDPROC lpPrevWndFunc,

_In_ HWND hWnd,

_In_ UINT Msg,

_In_ WPARAM wParam,

_In_ LPARAM lParam

);

Параметры

lpPrevWndFunc[in]

Уникальный внутренний идентификатор вызываемой оконной (диалоговой) процедуры, полученный с помощью функции GetWindowLong.

hWnd[in]

Описатель окна, оконную (диалоговую) процедуру которого мы вызываем.

Msg[in]

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

wParam[in]

Дополнительный параметр оконного сообщения. Зависит от номера оконного сообщения.

lParam[in]

Дополнительный параметр оконного сообщения. Зависит от номера оконного сообщения.

Возвращаемое значение

Функция возвращает то значение, которое вернула вызываемая оконная (диалоговая) процедура.

Пример использования

#include <windows.h>

#include "Resource.h"

LONG oldwndproc=0;

//Прототип "родной" диалоговой процедуры

INT_PTR WINAPI Dlg_Proc(HWND, UINT, WPARAM, LPARAM);

//Прототип подставной диалоговой процедуры - фильтра

INT_PTR WINAPI Dlg_Proc_Hook(HWND, UINT, WPARAM,LPARAM);

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int hFunsterStil)

{

//Создаем диалоговое окно

DialogBoxParam(hThisInstance, MAKEINTRESOURCE(ID_DIALOG), HWND_DESKTOP, Dlg_Proc, 0);

return 0;

}

//"Родная" диалоговая процедура

INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

switch(uMsg){

case WM_INITDIALOG:

//Устанавливаем диалоговую процедуру - фильтр

oldwndproc = SetWindowLong(hwnd,DWL_DLGPROC,(LONG)Dlg_Proc_Hook);

break;

case WM_CLOSE:

//Закрываем окно

EndDialog(hwnd,0);

}

return 0;

}

//Подставная диалоговая процедура - фильтр

INT_PTR WINAPI Dlg_Proc_Hook(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

if(uMsg==WM_CLOSE){

MessageBox(hwnd,"I hooked this message","Dlg_Proc_Hook",MB_OK);

}

//Вызываем "родную" диалоговую процедуру

return CallWindowProc((WNDPROC)oldwndproc,hwnd,uMsg,wParam,lParam);

}

В данном примере создается диалоговое окно. При обработке оконного сообщения WM_INITDIALOG с помощью функции SetWindowLong устанавливается новая диалоговая процедура этого окна Dlg_Proc_Hook. Эта процедура с помощью функции CallWindowProc вызывает первоначальную диалоговую процедуру окна Dlg_Proc.

Для того, чтобы доказать факт подмены диалоговой процедуры, Dlg_Proc_Hook при получении сообщения WM_CLOSE (закрытие окна) отображает текстовое сообщение.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | CallWindowProcA и CallWindowProcW


CreateWindow

Создает окно.

Прототип

HWND WINAPI CreateWindow(

_In_opt_ LPCTSTR lpClassName,

_In_opt_ LPCTSTR lpWindowName,

_In_ DWORD dwStyle,

_In_ int x,

_In_ int y,

_In_ int nWidth,

_In_ int nHeight,

_In_opt_ HWND hWndParent,

_In_opt_ HMENU hMenu,

_In_opt_ HINSTANCE hInstance,

_In_opt_ LPVOID lpParam

);

Параметры

lpClassName[in, opt]

Строка с наименованием зарегистрированного оконного класса.

lpWindowName[in, opt]

Строка с заголовком создаваемого окна. Если создается статический элемент управления с установленным стилем SS_ICON данный параметр определяет наименование иконки.

dwStyle[in]

Сочетание стилей окна.

x[in]

Начальная горизонтальная координата окна. Для дочернего окна - в системе координат родительского окна, для остальных - в экранных координатах.

Если этот параметр установлен как CW_USEDEFAULT, система выбирает заданную по умолчанию позицию для левого верхнего угла окна и игнорирует параметр y. Параметр CW_USEDEFAULT допустим только для перекрывающих окон; если он определен для выскакивающего (popup) или дочернего окна, x и y параметры устанавливаются в нуль.

y[in]

Определяет начальную вертикальную позицию окна. Для перекрывающего или выскакивающего окна, параметр y - начальная y-координата левого верхнего угла окна, в экранных координатах. Для дочернего окна, y - начальная y-координата левого верхнего угла в клиентских координатах родительского окна. Если перекрывающее окно создано с установленным стилем WS_VISIBLE, а x параметр установлен как CW_USEDEFAULT, система игнорирует параметр y.

nWidth[in]

Ширина окна в единицах измерения для устройства. Для перекрывающих окон, nWidth является, или шириной окна в экранных координатах, или параметром CW_USEDEFAULT. Если nWidth - CW_USEDEFAULT, система выбирает заданную по умолчанию ширину и высоту для окна.Значение CW_USEDEFAULT допустимо только для перекрывающих окон; если оно определено для выскакивающего или дочернего окна, nWidth и nHeight устанавливаются в нуль.

nHeight[in]

Определяет высоту окна в единицах измерения устройства. Для перекрывающих окон, nHeight - высота окна, в экранных координатах. Если параметр nWidth установлен как CW_USEDEFAULT, система игнорирует nHeight.

hWndParent[in, opt]

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

hMenu[in, opt]

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

hInstance[in,opt]

Дескриптор модуля, ассоциированного с создаваемым окном.

lpParam [in, opt]

Указывает на значение, передаваемое окну через структуру CREATESTRUCT, переданную в параметре lParam сообщения WM_CREATE. Если прикладная программа вызывает CreateWindow, чтобы создать рабочее окно многодокументального интерфейса (MDI), lpParam должен указывать на структуру CLIENTCREATESTRUCT.

Возвращаемое значение

Описатель созданного окна.

Возвращаемое значение в случае ошибки

NULL. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

Смотри в примере оконного приложения.

Примечание

Перед возвратом значения, функция CreateWindow отправляет сообщение WM_CREATE оконной процедуре. Для перекрывающих, выскакивающих и дочерних окон CreateWindow отправляет окну сообщения WM_CREATE, WM_GETMINMAXINFO и WM_NCCREATE. Параметр lParam сообщения WM_CREATE содержит указатель на структуру CREATESTRUCT. Если определен стиль WS_VISIBLE, CreateWindow отправляет окну все сообщения, требующиеся, чтобы активизировать и показать окно.

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

BUTTON - кнопка.

COMBOBOX - комбинированный список.

EDIT - поле ввода.

LISTBOX - список.

MDICLIENT - рабочее окно многодокументального интерфейса (MDI).

RICHEDIT - элемент управления Microsoft Rich Edit 1.0. Это окно позволяет пользователю просматривать и редактировать текст, форматируя символы и параграфы, и может включать внедренные COM объекты.

RICHEDIT_CLASS - Элемент управления Rich Edit 2.0.

SCROLLBAR - полоса прокрутки.

STATIC - статический элемент управления.

Функция CreatWindow представляет собой обёртку вокруг функции CreateWindowEx.

Заголовочный файл | winuser.h (подключен в windows.h)
ANSI и Unicode наименования | CreateWindowA и CreateWindowW


CreateWindowEx

Создает окно.

Прототип

HWND WINAPI CreateWindowEx(

_In_ DWORD dwExStyle,

_In_opt_ LPCTSTR lpClassName,

_In_opt_ LPCTSTR lpWindowName,

_In_ DWORD dwStyle,

_In_ int x,

_In_ int y,

_In_ int nWidth,

_In_ int nHeight,

_In_opt_ HWND hWndParent,

_In_opt_ HMENU hMenu,

_In_opt_ HINSTANCE hInstance,

_In_opt_ LPVOID lpParam

);

Параметры

dwExStyle[in]

Сочетание расширенных стилей окна.

lpClassName[in, opt]

Строка с наименованием зарегистрированного оконного класса.

lpWindowName[in, opt]

Строка с заголовком создаваемого окна. Если создается статический элемент управления с установленным стилем SS_ICON данный параметр определяет наименование иконки.

dwStyle[in]

Сочетание стилей окна.

x[in]

Начальная горизонтальная координата окна. Для дочернего окна - в системе координат родительского окна, для остальных - в экранных координатах.

Если этот параметр установлен как CW_USEDEFAULT, система выбирает заданную по умолчанию позицию для левого верхнего угла окна и игнорирует параметр y. Параметр CW_USEDEFAULT допустим только для перекрывающих окон; ечсли он определен для выскакивающего (popup) или дочернего окна, x и y параметры устанавливаются в нуль.

y[in]

Определяет начальную вертикальную позицию окна. Для перекрывающего или выскакивающего окна, параметр y - начальная y-координата левого верхнего угла окна, в экранных координатах. Для дочернего окна, y - начальная y-координата левого верхнего угла в клиентских координатах родительского окна. Если перекрывающее окно создано с установленным стилем WS_VISIBLE, а x параметр установлен как CW_USEDEFAULT, система игнорирует параметр y.

nWidth[in]

Ширина окна в единицах измерения для устройства. Для перекрывающих окон, nWidth является, или шириной окна в экранных координатах, или параметром CW_USEDEFAULT. Если nWidth - CW_USEDEFAULT, система выбирает заданную по умолчанию ширину и высоту для окна.Значение CW_USEDEFAULT допустимо только для перекрывающих окон; если оно определено для выскакивающего или дочернего окна, nWidth и nHeight устанавливаются в нуль.

nHeight[in]

Определяет высоту окна в единицах измерения устройства. Для перекрывающих окон, nHeight - высота окна, в экранных координатах. Если параметр nWidth установлен как CW_USEDEFAULT, система игнорирует nHeight.

hWndParent[in, opt]

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

hMenu[in, opt]

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

hInstance[in,opt]

Описатель модуля, ассоциированного с создаваемым окном.

lpParam [in, opt]

Указывает на значение, передаваемое окну через структуру CREATESTRUCT, переданную в параметре lParam сообщения WM_CREATE. Если прикладная программа вызывает CreateWindow, чтобы создать рабочее окно многодокументального интерфейса (MDI), lpParam должен указывать на структуру CLIENTCREATESTRUCT.

Возвращаемое значение

Описатель созданного окна.

Возвращаемое значение в случае ошибки

NULL. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

Смотри в примере оконного приложения 2.

Примечание

Перед возвратом значения, функция CreateWindowEx отправляет сообщение WM_CREATE оконной процедуре. Для перекрывающих, выскакивающих и дочерних окон CreateWindowEx отправляет окну сообщения WM_CREATE, WM_GETMINMAXINFO и WM_NCCREATE. Параметр lParam сообщения WM_CREATE содержит указатель на структуру CREATESTRUCT. Если определен стиль WS_VISIBLE, CreateWindowEx отправляет окну все сообщения, требующиеся, чтобы активизировать и показать окно.

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

BUTTON - кнопка.

COMBOBOX - комбинированный список.

EDIT - поле ввода.

LISTBOX - список.

MDICLIENT - рабочее окно многодокументального интерфейса (MDI).

RICHEDIT - элемент управления Microsoft Rich Edit 1.0. Это окно позволяет пользователю просматривать и редактировать текст, форматируя символы и параграфы, и может включать внедренные COM объекты.

RICHEDIT_CLASS - Элемент управления Rich Edit 2.0.

SCROLLBAR - полоса прокрутки.

STATIC - статический элемент управления.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | CreateWindowExA и CreateWindowExW


DefWindowProc

Осуществляет обработку оконного сообщения системой по умолчанию.

Прототип

LRESULT WINAPI DefWindowProc(

_In_ HWND hWnd,

_In_ UINT Msg,

_In_ WPARAM wParam,

_In_ LPARAM lParam

);

Параметры

hwnd[in]

Описатель окна, которому адресовано оконное сообщение

Msg[in]

код сообщения. Возможные коды сообщений смотри здесь.

wParam[in]

Параметр сообщения. Зависит от его кода

lParam[in]

Параметр сообщения. Зависит от его кода

Возвращаемое значение

Зависит от обрабатываемого сообщения

Пример использования

Смотри в примере оконного приложения.

Примечание

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

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | DefWindowProcA и DefWindowProcW


DestroyWindow

Разрушает (уничтожает) заданное окно.

Прототип

BOOL WINAPI DestroyWindow(

_In_ HWND hWnd

);

Параметры

hWnd[in]

Описатель окна, которое нужно разрушить (уничтожить).

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

Смотри в примере оконного приложения.

Примечание

Поток не может использовать эту функцию для разрушения окон созданных другим потоком.

Если разрушается дочернее окно, у которого не установлен стиль WS_EX_NOPARENTNOTIFY, родительскому окну отправляется сообщение WM_PARENTNOTIFY.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


DispatchMessage

Пересылает оконное сообщение в соответствующую оконную процедуру.

Прототип

LRESULT WINAPI DispatchMessage(

_In_ const MSG *lpmsg

);

Параметры

lpmsg[in]

Адрес структуры MSG, описывающей пересылаемое оконное сообщение

Возвращаемое значение

Данная функция возвращает то, что вернула оконная процедура при обработке пересланного ей сообщения. Хотя это значение зависит от пересылаемого сообщения, обычно оно игнорируется.

Пример использования

Смотри в примере оконного приложения.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | DispatchMessageA и DispatchMessageW


EnableWindow

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

Прототип

BOOL WINAPI EnableWindow(

_In_ HWND hWnd,

_In_ BOOL bEnable

);

Параметры

hWnd [in]

Описатель окна, доступность которого мы изменяем.

bEnable [in]

Устанавливает заблокировать или разблокировать окно мы хотим. Если этот пераметр TRUE, окно делается доступным. Если же этот параметр FALSE, то оно делается недоступным.

Возвращаемое значение

Если на момент вызова данной функции окно было заблокировано возвращается ненулевое значение.

Если на момент вызова данной функции окно не было заблокировано возвращается нуль.

Пример использования

#include <windows.h>

WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

HWND hwnd;

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

hwnd=FindWindow(NULL, "Диспетчер задач Windows");

//Если его нет, то выходим

if(!hwnd) return 0;

//Делаем окно недоступным

EnableWindow(hwnd, FALSE);

//Ждем 5 секунд

Sleep(5000);

//Делаем окно доступным

EnableWindow(hwnd, TRUE);

return 0;

}

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

Примечание

Если окно блокируется, система отправляет сообщение WM_CANCELMODE. Если включенное состояние окна изменяется, система, после сообщения WM_CANCELMODE, отправляет сообщение WM_ENABLE. (Эти сообщения отправляются, перед возвратом из функции EnableWindow). Если окно уже заблокровано, его дочерние окна также неявно блокируются, хотя им и не отправляется сообщение WM_ENABLE.

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

По умолчанию, окно включается тогда, когда оно создается.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetMessage

Извлекает сообщение из очереди сообщений вызывающего потока.

Прототип

BOOL WINAPI GetMessage(

_Out_ LPMSG lpMsg,

_In_opt_ HWND hWnd,

_In_ UINT wMsgFilterMin,

_In_ UINT wMsgFilterMax

);

Параметры

lpMsg[out]

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

hWnd[in,opt]

Описатель окна-адресата извлекаемых сообщений. Окно должно принадлежать текущему потоку.

Если значение параметра hWnd равно NULL, то извлекаются сообщения, адресованные всем окнам, принадлежащим текущему потоку. А также сообщения, находящиеся в очереди сообщений текущего потока, параметр hwnd которых равен NULL (см. описание структуры MSG). Вследствие этого обрабатываются сообщения, адресованные как окну, так и потоку.

Если значение параметра hWnd равно -1, то функция GetMessage извлекает только сообщения, находящиеся в очереди сообщений потока, и имеющие параметр hwnd равный NULL (см. описание структуры MSG).

wMsgFilterMin[in]

Целочисленное значение, содержащее минимальный код извлекаемого сообщения. Иcпользуйте значение WM_KEYFIRST для определения минимального кода сообщения от клавиатуры. Используйте значение WM_MOUSEFIRST для определения минимального кода сообщения от мыши.

Используйте значение WM_INPUT в значении параметров wMsgFilterMin и wMsgFilterMax для выборки только сообщения WM_INPUT.

Если значения параметров wMsgFilterMin и wMsgFilterMax одновременно равны нулю, то функция GetMessage извлекает все доступные сообщения.

wMsgFilterMax[in]

Целочисленное значение, содержащее максимальный код извлекаемого сообщения. Иcпользуйте значение WM_KEYLAST для определения максимального кода сообщения от клавиатуры. Используйте значение WM_MOUSELAST для определения максимального кода сообщения от мыши.

Используйте значение WM_INPUT в значении параметров wMsgFilterMin и wMsgFilterMax для выборки только сообщения WM_INPUT.

Если значения параметров wMsgFilterMin и wMsgFilterMax одновременно равны нулю, то функция GetMessage извлекает все доступные сообщения.

Возвращаемое значение

Если функция извлекает сообщение отличное от WM_QUIT, возвращается ненулевое значение.

Если функция извлекает сообщение WM_QUIT, то возвращается значение нуль.

Возвращаемое значение в случае ошибки

-1 (минус единица). Например, функция завершается с ошибкой если hWnd представляет собой неверный описатель окна, или если lpMsg является ошибочным указателем. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

Смотри в примере оконного приложения.

Примечание

Функция GetMessage извлекает сообщения, адресованные окну hWnd или его дочерним окнам, удовлетворяющие условиям фильтрации извлекаемых сообщений, задаваемых с помощью параметров wMsgFilterMin и wMsgFilterMax.

Приложения могут использовать только младшие слова в wMsgFilterMin и wMsgFilterMax. Старшие слова зарезервированы для системы.

Функция GetMessage всегда извлекает сообщение WM_QUIT вне зависимости от значений параметров wMsgFilterMin и wMsgFilterMax.

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

1) Сообщение, отправленное функцией SendMessage или аналогичной ей.

2) Сообщение, отправленное функцией PostMessage или аналогичной ей.

3) Сообщение аппаратного ввода или внутреннее сообщение от системы.

4) Сообщение WM_PAINT.

5) Сообщение WM_TIMER.

Для изменения такого порядка используйте параметры wMsgFilterMin и wMsgFilterMax.

Функция GetMessage не удаляет сообщения WM_PAINT из очереди сообщений. Данные сообщения остаются в очереди до окончания их обработки.

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

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | GetMessageA и GetMessageW


GetWindowText

Возвращает заголовок заданного окна.

Прототип

int WINAPI GetWindowText(

_In_ HWND hWnd,

_Out_ LPTSTR lpString,

_In_ int nMaxCount

);

Параметры

hWnd [in]

Описатель окна, заголовок которого мы хотим определить.

lpString[out]

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

nMaxCount[in]

Максимальное количество символов, размещаемых в буфере lpString, включая завершающий NULL символ. Если длина заголовка окна превышает этот предел, то заголовок будет обрезан.

Возвращаемое значение

Количество символов скопированных в буфер lpString, включая завершающий NULL символ,

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

int main(int argc, char *argv[])

{

HWND hwnd=NULL;

//Ищем главное окно TotalCommanderа

hwnd = FindWindow("TTOTAL_CMD", NULL);

if(!hwnd){

printf("Window not found\n");

getch();

return 0;

}

//Определяем длину заголовка окна

int length=0;

length = GetWindowTextLength(hwnd);

if(!length) return 0;

//Выделяем память под заголовок окна

char* s=NULL;

length++;

s = (char*) malloc(length);

if(!s) return 0;

//Получаем сам заголовок окна

GetWindowText(hwnd, s, length);

printf("Title of TotalCommander is: %s\n", s);

//Освобождаем память

free(s);

getch();

return 0;

}

Примечание

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

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | GetWindowTextA и GetWindowTextW


PostMessage

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

Прототип

BOOL WINAPI PostMessage(

_In_opt_ HWND hWnd,

_In_ UINT Msg,

_In_ WPARAM wParam,

_In_ LPARAM lParam

);

Параметры

hWnd[in]

Описатель окна, которому отправляется данное сообщение. Следующие значения имеют специальное значение.

HWND_BROADCAST (-1) - сообщение отправляется всем окнам верхнего уровня, включая недоступные или невидимые окна, перекрывающиеся окна и выскакивающие окна. Сообщение не отправляется дочерним окнам.

NULL - сообщение отправляется текущему потоку-отправителю.

Msg[in]

Код отправляемого сообщения.

wParam[in]

Дополнительный параметр сообщения. Зависит от значения параметра Msg.

lParam[in]

Дополнительный параметр сообщения. Зависит от значения параметра Msg.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError. Если превышено ограничение (limit), то функция GetLastError возвращает значение ERROR_NOT_ENOUGH_QUOTA.

Пример использования

#include <windows.h>

int main()

{

HWND hwnd = NULL;

//Находим главное окно калькулятора

hwnd = FindWindow("SciCalc",NULL);

if(!hwnd) return -1;

//Посылаем ему сообщение

PostMessage(hwnd,WM_CLOSE,0,0);

return 0;

}

Примечание

Если сообщение заблокировано системой UIPI (см. ChangeWindowMessageFilter), то функция GetLastError вернет значение 5 (нарушение доуступа).

Сообщения, находящиеся в очереди сообщений извлекаются функциями GetMessage и PeekMessage.

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

Система маршалирует только системные сообщения (коды которых находятся в интервале между нулем и (WM_USER-1)). При отправке других сообщений (код которых больше или равен WM_USER) другому процессу вы должны самостоятельно их маршалировать.

Если вы отправляете сообщение, код которого меньше чем WM_USER в асинхронном режиме (с помощью функции PostMessage, SendNotifyMessage или SendMessageCallback), то параметры этого сообщения не должны содержать указателей. В противном случае произойдет ошибка. Функция вернет управление до того, как поток-получатель сможет обработать это сообщение, из-за этого поток-отправитель освободит память до того как она будет использована.

Не ставьте в очередь сообщение WM_QUIT. Используйте для него функцию PostQuitMesage.

Некоторые приложения (accessibility application) могут использовать функцию PostMessage для отправки сообщения WM_APPCOMMAND оболочке (to the shell) для запуска приложений. Данная функциональность не гарантируется на других типах приложений.

Существует ограничение в 10000 сообщений в очереди сообщений. Данное ограничение должно быть достаточно большим. Если ваше приложение превышает это ограничение, то оно должно быть переработано, чтоба избежать потребления такого большого объема системных ресурсов. Для изменения этого ограничения, измените значение, хранящееся в ключе "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\USERPostMessageLimit" реестра. Минимально допустимое значение 4000.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | PostMessageA и PostMessageW


PostQuitMessage

Извещает систему о том, что поток сделал запрос на завершение. Обычно это используется при обработке сообщения WM_DESTROY.

Прототип

VOID WINAPI PostQuitMessage(

_In_ int nExitCode

);

Параметры

nExitCode[in]

Код завершения приложения. Это значение используется как значение параметра wparam сообщения WM_QUIT.

Пример использования

Смотри в примере оконного приложения.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


RegisterClass

Осуществляет регистрацию оконного класса.

Прототип

ATOM WINAPI RegisterClass(

_In_ const WNDCLASS *lpWndClass

);

Параметры

lpWndClass[in]

Адрес структуры WNDCLASS, описывающей регистрируемый класс окна.

Возвращаемое значение

Ненулевое значение

Возвращаемое значение в случае ошибки

Нуль. Получить дополнительную информацию об ошибке можно с помощью функции GetLastError.

Пример использования

Смотри в примере оконного приложения.

Заголовочный файл | Winuser.h (включен в Windows.h)
Экспортирующая библиотека | User32.dll
ANSI и Unicode наименования | RegisterClassA и RegisterClassW


RegisterClassEx

Осуществляет регистрацию оконного класса.

Прототип

ATOM WINAPI RegisterClassEx(

_In_ const WNDCLASSEX *lpwcx

);

Параметры

lpwcx[in]

Адрес структуры WNDCLASSEX, описывающей регистрируемый класс.

Возвращаемое значение

Ненулевое значение

Возвращаемое значение в случае ошибки

Нуль. Получить дополнительную информацию об ошибке можно с помощью функции GetLastError.

Пример использования

Смотри в примере оконного приложения 2.

Заголовочный файл | Winuser.h (включен в Windows.h)
Экспортирующая библиотека | User32.dll
ANSI и Unicode наименования | RegisterClassExA и RegisterClassExW


SendMessage

Посылает заданное оконное сообщение окну или окнам. Данная функция вызывает оконную процедуру заданного окна и не возвращает управления до тех пор пока оконная процедура не обработает это сообщение.

Прототип

LRESULT WINAPI SendMessage(

_In_ HWND hWnd,

_In_ UINT Msg,

_In_ WPARAM wParam,

_In_ LPARAM lParam

);

Параметры

hwnd[in]

Описатель окна, которому передается данное сообщение. Если значение этого параметра равно HWND_BROADCAST (-1), сообщение отправляется всем окнам верхнего уровня, включая недоступные и невидимые окна, перекрывающиеся окна, и выскакивающие окна. Но данное сообщение не отправляется дочерним окнам.

Msg[in]

Код отправляемого сообщения. Системные сообщения перечислены здесь.

wParam[in]

Дополнительный параметр сообщения. Зависит от значения параметра Msg.

lParam[in]

Дополнительный параметр сообщения. Зависит от значения параметра Msg.

Возвращаемое значение

Возвращаемое значение представляет собой результат обработки сообщения. Он зависит от отправляемого сообщения.

Пример использования

#include <windows.h>

int main()

{

HWND hwnd = NULL;

//Находим главное окно калькулятора

hwnd = FindWindow("SciCalc",NULL);

if(!hwnd) return -1;

//Посылаем ему сообщение, требующее его закрытия

SendMessage(hwnd,WM_CLOSE,0,0);

return 0;

}

Примечание

Если сообщение заблокировано системой UIPI (см. описание функции ChangeWindowMessageFilter), то функция GetLastError вернет значение 5 (ошибка доступа).

Приложения которым необходимо взаимодействовать посредством HWND_BROADCAST должны использовать функцию RegisterWindowMessage для получения уникального кода сообщения.

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

Если заданное окно было создано вызывающим потоком, то оконная процедура вызывается немедленно. Если же заданное окно было создано другим потоком, система переключается на этот поток и вызывает соответствующую оконную процедуру. Сообщения отправляемые между потоками обрабатываются только тогда когда принимающий поток вызывает какую-либо функцию получения сообщения. Отправляющий поток блокируется на всё время пока принимающий поток обрабатывает сообщение. Тем не менее, поток-отправитель будет обрабатывать входящие внеочередные (non queued) сообщения во время ожидания обработки отправленного сообщения. Для изменения такого поведения используйте функцию SendMessageTimeout с флагом SMTO_BLOCK.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | SendMessageA и SendMessageW


SetActiveWindow

Активизирует заданное окно. Окно должно быть связано с очередью сообщения текущего (вызывающего) потока.

Прототип

HWND WINAPI SetActiveWindow(

_In_ HWND hWnd

);

Параметры

hWnd [in]

Описатель окна верхнего уровня, которое нужно активизировать.

Возвращаемое значение

Описатель окна, которое было активным.

Возвращаемое значение в случае ошибки

NULL. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#include <windows.h>

#include "Resource.h"

#define ID_TIMER 0x1

//Прототип диалоговой процедуры

INT_PTR WINAPI Dlg_Proc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int hFunsterStil)

{

//Создаем диалоговое окно

DialogBoxParam(hThisInstance, MAKEINTRESOURCE(ID_DIALOG), HWND_DESKTOP, Dlg_Proc, 0);

return 0;

}

//Диалоговая процедура

INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

switch(uMsg){

case WM_INITDIALOG:

//Устанавливаем таймер

SetTimer(hwnd,ID_TIMER,500,NULL);

break;

case WM_TIMER:

//Активируем окно

SetActiveWindow(hwnd);

break;

case WM_CLOSE:

//"Убиваем" таймер

KillTimer(hwnd,ID_TIMER);

//Закрываем окно

EndDialog(hwnd,0);

}

return 0;

}

В данном примере мы по событию таймера активируем главное окно приложения.

Примечание

Функция SetActiveWindow активизирует окно, но только если приложение, создавшее это окно, не находится в фоновом режиме. Окно будет перемещено на вершину Z-последовательности, если приложение, вызвавшее SetActiveWindow было активным.

Если окно hWnd было создано другим потоком, функция возвращает значение NULL.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll


ShowWindow

Изменяет видимость заданного окна.

Прототип

BOOL WINAPI ShowWindow(

_In_ HWND hWnd,

_In_ int nCmdShow

);

Параметры

hWnd[in]

Описатель окна.

nCmdShow[in]

Задает новое состояние видимости окна. Принимает одно из допустимых значений, перечисленных здесь.

Возвращаемое значение

Если окно было видимым, то возвращается ненулевое значение.

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

Пример использования

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

int main(int argc, char *argv[])

{

HWND hwnd=NULL;

//Ищем главное окно калькулятора

hwnd = FindWindow("SciCalc", NULL);

//Сворачиваем главное окно калькулятора

ShowWindow(hwnd,SW_MINIMIZE);

return 0;

}

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


TranslateMessage

Осуществляет перевод сообщения формата виртуальных клавиш в собщение формата символов.

Прототип

BOOL WINAPI TranslateMessage(

_In_ const MSG *lpMsg

);

Параметры

lpMsg[in]

Адрес структуры MSG, описывающей сообщение, которое нужно перевести из одного формата в другой.

Возвращаемое значение

Если сообщение переведено, то есть в очередь сообщений потока отправлено символьное сообщение, функция возвращает ненулевое значение.

Если переводимое сообщение является сообщением WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN или WM_SYSKEYUP, то она возвращает ненулевое значение, вне зависимости от (не)успешности его перевода.

Если сообщение не переведено, то есть в очередь сообщений потока не отправлено символьное сообщение, функция возвращает нуль.

Пример использования

Смотри в примере оконного приложения.

Примечание

Данная функция не изменяет сообщение, преданное ей в параметре lpMsg.

Сочетание сообщений WM_KEYDOWN и WM_KEYUP приводят к созданию сообщения WM_CHAR или WM_DEADCHAR. Сочетание сообщений WM_SYSKEYDOWN и WM_SYSKEYUP приводят к созданию сообщения WM_SYSCHAR или WM_SYSDEADCHAR.

Функция TranslateMessage создает сообщение WM_CHAR только для клавиш, которые могут быть преобразованы драйвером клавиатуры в ASCII символы.

Если приложения обрабатывают сообщения формата виртуальных клавиш, они не должны вызывать функцию FormatMessage(A/W).

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | TranslateMessageA и TranslateMessageW


Оконная процедура

Это функция обратного вызова, осуществляющая обработку оконных сообщений.

Прототип

LRESULT CALLBACK WndProc(

HWND hwnd,

UINT uMsg,

WPARAM wParam,

LPARAM lParam)

Параметры

hwnd

Описатель окна, которому адресовано оконное сообщение.

uMsg

Код сообщения. Возможные коды сообщений перечислены здесь.

wParam

Параметр сообщения. Зависит от его кода.

lParam

Параметр сообщения. Зависит от его кода.

Возвращаемое значение

Зависит от обрабатываемого сообщения

Пример использования

Смотри в примере оконного приложения.

Примечание

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


Виртуальные клавишы

VK_0 (0x30)

Цифра 0.

VK_1 (0x31)

Цифра 1.

VK_2 (0x32)

Цифра 2.

VK_3 (0x33)

Цифра 3.

VK_4 (0x34)

Цифра 4.

VK_5 (0x35)

Цифра 5.

VK_6 (0x36)

Цифра 6.

VK_7 (0x37)

Цифра 7.

VK_8 (0x38)

Цифра 8.

VK_9 (0x39)

Цифра 9.

VK_A (0x41)

Кнопка "A". (латинская)

VK_ACCEPT

Зарезервировано для системы письменности Кандзи.

VK_ADD

Кнопка "+".

VK_APPS

Кнопка "Appskey".

VK_ATTN

Используется для внутренних целей.

VK_B (0x42)

Кнопка "B" (латинская).

VK_BACK

Кнопка Backspace.

VK_BROWSER_BACK

Windows 2000/XP: кнопка "Browser Back" (просмотр назад) на дополнительных клавишах клавиатуры.

VK_BROWSER_FAVORITES

Windows 2000/XP: кнопка "Browser Favorites" (Избранное) на дополнительных клавишах клавишах клавиатуры.

VK_BROWSER_FORWARD

Windows 2000/XP: кнопка "Browser Forward" (просмотр вперед) на дополнительных клавишах клавиатуры.

VK_BROWSER_HOME

Windows 2000/XP: кнопка "Browser Start and Home" (на домашнюю страницу) на дополнительных клавишах клавиатуры.

VK_BROWSER_REFRESH

Windows 2000/XP: кнопка "Browser Refresh" (обновить просмотр) на дополнительных клавишах клавиатуры.

VK_BROWSER_SEARCH

Windows 2000/XP: кнопка "Browser Search" на дополнительных клавишах клавиатуры.

VK_BROWSER_STOP

Windows 2000/XP: кнопка "Browser Stop" (остановить просмотр) на дополнительных клавишах клавиатуры.

VK_C (0x43)

Кнопка "C" (латинская).

VK_CANCEL

Сочетание клавиш Ctrl+Break.

VK_CAPITAL

Кнопка "Caps Lock".

VK_CLEAR

Кнопка Clear. Цифра 5 на цифровой клавиатуре при выключенном NumLock.

VK_CONTROL

Кнопка Ctrl.

VK_CONVERT

Зарезервировано для системы письменности Кандзи.

VK_CRSEL

Не используется.

VK_D (0x44)

Кнопка "D".

VK_DECIMAL

Символ точки на цифровой клавиатуре.

VK_DIVIDE

Кнопка "/" на цифровой клавиатуре.

VK_DOWN

Стрелка вниз.

VK_E (0x45)

Кнопка "E" (латинская)

VK_END

Кнопка End.

VK_EREOF

Не используется.

VK_ESCAPE

Кнопка Escape.

VK_EXECUTE

Не используется.

VK_EXSEL

Не используется.

VK_F (0x46)

Кнопка "F".

VK_F1

Кнопка "F1".

VK_F2

Кнопка "F2".

VK_F3

Кнопка "F3".

VK_F4

Кнопка "F4".

VK_F5

Кнопка "F5".

VK_F6

Кнопка "F6".

VK_F7

Кнопка "F7".

VK_F8

Кнопка "F8".

VK_F9

Кнопка "F9".

VK_F10

Кнопка "F10".

VK_F11

Кнопка "F11".

VK_F12

Кнопка "F12".

VK_F13

Кнопка "F13" (для будущего использования).

VK_F14

Кнопка "F14" (для будущего использования).

VK_F15

Кнопка "F15" (для будущего использования).

VK_F16

Кнопка "F16" (для будущего использования).

VK_F17

Кнопка "F17" (для будущего использования).

VK_F18

Кнопка "F18" (для будущего использования).

VK_F19

Кнопка "F19" (для будущего использования).

VK_F20

Кнопка "F20" (для будущего использования).

VK_F21

Кнопка "F21" (для будущего использования).

VK_F22

Кнопка "F22" (для будущего использования).

VK_F23

Кнопка "F23" (для будущего использования).

VK_F24

Кнопка "F24" (для будущего использования).

VK_FINAL

Кнопка включения/выключения режима завершения ввода.

VK_G (0x47)

Кнопка "G".

VK_H (0x48)

Кнопка "H".

VK_HANGUEL

Кнопка включения/выключения режима ввода Хангыль. Испоьзуется при вводе текста на корейском языке. Поддерживается в целях совместимости со старыми приложениями, заменена на VK_HANGUL.

VK_HANGUL

Кнопка включения/выключения режима ввода Хангыль. Используется при вводе текста на корейском языке.

VK_HANJA

Кнопка включения/выключения режима ввода Ханджа. Ханджа - это написание корейского имени китайскими иероглифами.

VK_HELP

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

VK_HOME

Кнопка Home.

VK_I (0x49)

Кнопка "I".

VK_INSERT

Кнопка "Insert".

VK_J (0x4A)

Кнопка "J"

VK_JUNJA

Кнопка включения/выключения режима ввода Джунджа.

VK_K (0x4B)

Кнопка "K" (латинская)

VK_KANA

Кнопка включения/выключения режима ввода каны. Используется при вводе текста на японском языке.

VK_KANJI

Кнопка включения/выключения режима ввода кандзи. Кандзи - это китайские иероглифы, используемые в современной японской письменности.

VK_L (0x4C)

Кнопка "L".

VK_LAUNCH_APP1

Windows 2000/XP: кнопка "запустить приложение 1" на дополнительных клавишах клавиатуры.

VK_LAUNCH_APP2

Windows 2000/XP: кнопка "запустить приложение 2" на дополнительных клавишах клавиатуры.

VK_LAUNCH_MAIL

Windows 2000/XP: кнопка "запустить почтовый клиент" на дополнительных клавишах клавиатуры.

VK_LAUNCH_MEDIA_SELECT

Windows 2000/XP: кнопка выбора медиа на дополнительных клавишах клавиатуры.

VK_LBUTTON

Левая кнопка мыши.

VK_LCONTROL

Левая кнопка "Ctrl".

VK_LEFT

Стрелка влево.

VK_LMENU

Левая кнопка "Alt".

VK_LSHIFT

Левая кнопка "Shift".

VK_LWIN

Левая кнопка Windows.

VK_M (0x4D)

Кнопка "M" (латинская).

VK_MBUTTON

Средняя кнопка мыши (на трехкнопочных мышках).

VK_MEDIA_NEXT_TRACK

Windows 2000/XP: кнопка "следующий трек" на дополнительных клавишах клавиатуры.

VK_MEDIA_PLAY_PAUSE

Windows 2000/XP: кнопка "пауза" на дополнительных клавишах клавиатуры.

VK_MEDIA_PREV_TRACK

Windows 2000/XP: кнопка "предыдущий трек" на дополнительных клавишах клавиатуры.

VK_MEDIA_STOP

Windows 2000/XP: кнопка "остановить воспроизведение" на дополнительных клавишах клавиатуры.

VK_MENU

Кнопка Alt.

VK_MODECHANGE

Зарезервировано для системы письменности Кандзи.

VK_MULTIPLY

Кнопка "*".

VK_N (0x4E)

Кнопка "N".

VK_NEXT

Кнопка PageDown.

VK_NONAME

Зарезервировано.

VK_NONCONVERT

Зарезервировано для системы письменности Кандзи.

VK_NUMLOCK

Кнопка "Num Lock".

VK_NUMPAD0

Цифра 0 на цифровой клавиатуре.

VK_NUMPAD1

Цифра 1 на цифровой клавиатуре.

VK_NUMPAD2

Цифра 2 на цифровой клавиатуре.

VK_NUMPAD3

Цифра 3 на цифровой клавиатуре.

VK_NUMPAD4

Цифра 4 на цифровой клавиатуре.

VK_NUMPAD5

Цифра 5 на цифровой клавиатуре.

VK_NUMPAD6

Цифра 6 на цифровой клавиатуре.

VK_NUMPAD7

Цифра 7 на цифровой клавиатуре.

VK_NUMPAD8

Цифра 8 на цифровой клавиатуре.

VK_NUMPAD9

Цифра 9 на цифровой клавиатуре.

VK_O (0x4F)

Кнопка "O" (латинская).

VK_OEM_1

Используется для различных клавиш и различается на разных клавиатурах. На стандартной кириллической клавиатуре обозначает кнопку с буквой "ж".

VK_OEM_2

Используется для различных клавиш и различается на разных клавиатурах. На стандартной кириллической клавиатуре обозначает кнопку со знаками "?" и "/".

VK_OEM_3

Используется для различных клавиш и различается на разных клавиатурах. На стандартной кириллической клавиатуре обозначает кнопку с буквой "ё".

VK_OEM_4

Используется для различных клавиш и различается на разных клавиатурах. На стандартной кириллической клавиатуре обозначает кнопку с буквой "Х" (кириллица).

VK_OEM_5

Используется для различных клавиш и различается на разных клавиатурах. На стандартной кириллической клавиатуре обозначает кнопку со знаками "|" и "\".

VK_OEM_6

Используется для различных клавиш и различается на разных клавиатурах. На стандартной кириллической клавиатуре обозначает кнопку с буквой "Ъ".

VK_OEM_7

Используется для различных клавиш и различается на разных клавиатурах. На стандартной кириллической клавиатуре обозначает кнопку с буквой "Э".

VK_OEM_8
Используется для различных клавиш и различается на разных клавиатурах. Каким конкретно символам соответствует не указано.

VK_OEM_102

Или символ угловой скобки, или симво обратного слеша на 102-клавишной RT-клавиатуре.

VK_OEM_CLEAR

Кнопка очистки. На клавиатуре ее нет. Для чего нужна я так и не понял.

VK_OEM_COMMA

На стандартной кириллической клавиатуре кнопка "Б".

VK_OEM_MINUS

Кнопка "-" в ряду цифр над буквами.

VK_OEM_PERIOD

На стандартной кириллической клавиатуре кнопка "Ю".

VK_OEM_PLUS

Кнопка "+" в ряду цифр над буквами.

VK_P (0x50)

Кнопка "P" (латинская).

VK_PA1

Клавиша PA1. Используется при управлении мейнфреймами фирмы IBM.

VK_PACKET

Используется для посылки Unicode-символов как последовательности нажатий клавиш. Применяется при бесклавиатурном способе ввода

VK_PAUSE

Кнопка Pause.

VK_PLAY

Кнопка "Play" на дополнительных клавишах клавиатуры.

VK_PRINT

Кнопка Print. Эта кнопка существовала на старых клавиатурах IBM XT и IBM AT и была объединена с символом "*" на цифровой части клавиатуры. Сейчас не используется.

VK_PRIOR

Кнопка PageUp.

VK_PROCESSKEY

Клавиша команды редактору метода ввода (Input Method Editor - IME). Используется при вводе сложных символов, состоящих из ряда других символов (например, японских иероглифов).

VK_Q (0x51)

Кнопка "Q".

VK_R (0x52)

Кнопка "R".

VK_RBUTTON

Правая кнопка мыши.

VK_RCONTROL

Правая кнопка "Ctrl".

VK_RETURN

Кнопка Enter.

VK_RIGHT

Стрелка вправо.

VK_RMENU

Правая кнопка "Alt".

VK_RSHIFT

Правая кнопка "Shift".

VK_RWIN

Правая кнопка Windows.

VK_S (0x53)

Кнопка "S".

VK_SCROLL

Кнопка "Scroll Lock".

VK_SELECT

Кнопка Select. Присутствует на MIDI-клавиатурах и используется для пошагового выбора MIDI-каналов.

VK_SEPARATOR

Кнопка "Enter" на цифровой клавиатуре. Однако получить его не удалось.

VK_SHIFT

Кнопка Shift.

VK_SLEEP

Кнопка перевод компьютер в спящий режим.

VK_SNAPSHOT

Кнопка "Print Screen".

VK_SPACE

Кнопка "Пробел".

VK_SUBTRACT

Кнопка "-" на цифровой клавиатуре.

VK_T (0x54)

Кнопка "T" (латинская).

VK_TAB

Кнопка табуляции (Tab).

VK_U (0x55)

Кнопка "U".

VK_UP

Стрелка вверх.

VK_V (0x56)

Кнопка "V".

VK_VOLUME_DOWN

Windows 2000/XP: кнопка уменьшения громкости на дополнительных клавишах клавиатуры.

VK_VOLUME_MUTE

Windows 2000/XP: кнопка включения/выключения звука на дополнительных клавишах клавиатуры.

VK_VOLUME_UP

Windows 2000/XP: кнопка увеличения громкости на допольнительных клавишах клавиатуры.

VK_W (0x57)

Кнопка "W".

VK_X (0x58)

Кнопка "X" (латинская).

VK_XBUTTON1

Первая дополнительная кнопка на мыши.

VK_XBUTTON2

Вторая дополнительная кнопка на мыши.

VK_Y (0x59)

Кнопка "Y".

VK_Z (0x5A)

Кнопка "Z".

VK_ZOOM

Клавиша увеличения/уменьшения. На клавиатуре ее нет.

Заголовочный файл: winuser.h (включен в windows.h)


Виртуальные клавишы мыши

MK_CONTROL

Нажата клавиша Ctrl.

MK_LBUTTON

Нажата левая кнопка мыши.

MK_MBUTTON

Нажата средняя кнопка мыши.

MK_RBUTTON

Нажата правая кнопка мыши.

MK_SHIFT

Нажата клавиша Shift.

MK_XBUTTON1

Нажата первая дополнительная кнопка мыши.

MK_XBUTTON2

Нажата вторая дополнительная кнопка мыши.

Заголовочный файл: winuser.h (включен в windows.h)


Запрос пользователя на прокрутку

По горизонтали

SB_ENDSCROLL

Завершение прокрутки.

SB_LEFT

Прокрутка в левый верхний угол.

SB_LINELEFT

Прокрутка влево на одну единицу.

SB_LINERIGHT

Прокрутка вправо на одну единицу.

SB_PAGELEFT

Прокрутка влево на ширину окна.

SB_PAGERIGHT

Прокрутка вправо на ширину окна.

SB_RIGHT

Прокрутка в правый нижний угол.

SB_THUMBPOSITION

Пользователь перетащил ползунок полосы прокрутки и отпустил кнопку мыши.

SB_THUMBTRACK

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

По вертикали

SB_BOTTOM

Прокрутка в правый нижний угол.

SB_ENDSCROLL

Завершение прокрутки.

SB_LINEDOWN

Прокрутка на одну линию вниз.

SB_LINEUP

Прокрутка на одну линию вверх.

SB_PAGEDOWN

Прокрутка на одну страницу вниз.

SB_PAGEUP

Прокрутка на одну страницу вверх.

SB_THUMBPOSITION

см. выше.

SB_THUMBTRACK

см. выше.

SB_TOP

Прокрутка в левый верхний угол.

Заголовочный файл: winuser.h (включен в windows.h)


Расширенные стили

WS_EX_ACCEPTFILES

Окно способно принимать перетаскиваемые на него файлы по тенологии Drag-and-Drop.

WS_EX_APPWINDOW

Активизирует окно верхнего уровня на панели задач, когда окно видимо.

WS_EX_CLIENTEDGE

Окно имеет рамку с "утопленной" клиентской частью.

WS_EX_COMPOSITED

Отрисовывает все дочерние окна с использованием двойной буферизации. Этот стиль не может быть применен для окна, оконный класс которого имеет стиль CS_OWNDC или CS_CLASSDC.

WS_EX_CONTEXTHELP

Включает кнопку помощи (знак вопроса) в заголовок окна.

WS_EX_CONTROLPARENT

Включает возможность навигации пользователя по элементам формы с использованием клавишы TAB.

WS_EX_DLGMODALFRAME

Окно с двойной рамкой может сочетаться с WS_CAPTION.

WS_EX_LAYERED

Создается многослойное окно. Этот стиль не может быть применен для окна, оконный класс которого имеет стиль CS_OWNDC или CS_CLASSDC.

WS_EX_LAYOUTRTL

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

WS_EX_LEFT

Окно имеет общеупотребительное свойство "выравнивания по левой границе".

WS_EX_LEFTSCROLLBAR

Размещает вертикальную полосу прокрутки (scrollbar) в левой части окна.

WS_EX_LTRREADING

Текст окна отображается, используя свойство порядка чтения Слева-Направо.

WS_EX_MDICHILD

Определяет дочернее MDI-окно.

WS_EX_NOACTIVATE

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

WS_EX_NOINHERITLAYOUT

Окно не сообщает свое расположение своим дочерним окнам.

WS_EX_NOPARENTNOTIFY

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

WS_EX_NOREDIRECTIONBITMAP

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

WS_EX_OVERLAPPEDWINDOW

WS_EX_CLIENTEDGE | WS_EX_WINDOWEDGE

WS_EX_PALETTEWINDOW

WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW | WS_EX_TOPMOST

WS_EX_RIGHT

Окно имеет общеупотребительное свойство "выравнивание по правому краю".

WS_EX_RIGHTSCROLLBAR

Вертикальная полоса прокрутки (scrollbar) в правой части окна.

WS_EX_RTLREADING

Текст окна отображается, используя свойство порядка чтения Справа-Налево.

WS_EX_STATICEDGE

Окно с трехмерным стилем рамки

WS_EX_TOOLWINDOW

Окно с тонким заголовком

WS_EX_TOPMOST

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

WS_EX_TRANSPARENT

Прозрачное окно

WS_EX_WINDOWEDGE

Окно имеет рамку с выпуклым краем.

Заголовочный файл: winuser.h (включен в windows.h)


Системные цвета

COLOR_3DDKSHADOW

Тёмная тень для трехмерных элементов.

COLOR_3DFACE

Лицевая сторона трехмерных элементов и фон диалоговых окон.

COLOR_3DHIGHLIGHT

Цвет подсветки для трехмерных элементов.

COLOR_3DHILIGHT

Цвет подсветки для трехмерных элементов.

COLOR_3DLIGHT

Цвет подсветки для трехмерных элементов.

COLOR_3DSHADOW

Цвет тени для трехмерных элементов.

COLOR_ACTIVEBORDER

Граница активного окна

COLOR_ACTIVECAPTION

Заголовок активного окна.

Определяет левую границу цвета в цветовом градиенте заголовка активного окна, если используется эффект градиента.

COLOR_APPWORKSPACE

Цвет фона для приложений многодокументального интерфейса (MDI).

COLOR_BACKGROUND

Рабочий стол.

COLOR_BTNFACE

Лицевая сторона трехмерных элементов и фона диалоговых окон.

COLOR_BTNHIGHLIGHT

Цвет подсветки для трехмерных элементов.

COLOR_BTNHILIGHT

Цвет подсветки для трехмерных элементов.

COLOR_BTNSHADOW

Цвет тени для трехмерных элементов.

COLOR_BTNTEXT

Текст на нажимных кнопках (push buttons).

COLOR_CAPTIONTEXT

Текст в заголовке

COLOR_DESKTOP

Рабочий стол.

COLOR_GRADIENTACTIVECAPTION

Правая граница в градиенте цвета области заголовка активного окна. COLOR_ACTIVECAPTION задает левую границу цвета. Используйте SPI_GETGRADIENTCAPTIONS с функцией SystemParametersInfo для определения того включен или нет эффект градиента (gradient effect).

COLOR_GRADIENTINACTIVECAPTION

Правая граница цвета в градиенте цвета области заголовка неактивного окна. COLOR_INACTIVECAPTION определяет левую границу цвета.

COLOR_GRAYTEXT

Недоступный текст. Этот цвет устанавливается в нуль, если текущий драйвер монитора не поддерживает чистый серый цвет (solid gray color).

COLOR_HIGHLIGHT

Выбранная запись в элементе управления.

COLOR_HIGHLIGHTTEXT

Текст выбранной записи в элементе управления.

COLOR_HOTLIGHT

Цвет для гиперссылки (hyperlink) или горячей записи (hot-tracked item).

COLOR_INACTIVEBORDER

Граница неактивного окна.

COLOR_INACTIVECAPTION

Заголовок неактивного окна.

Определяет левую границу цвета в градиенте цвета заголовка неактивного окна, если используется градиент цвета.

COLOR_INACTIVECAPTIONTEXT

Цвет текста в неактивном заголовке.

COLOR_INFOBK

Цвет фона для всплывающих подсказок (tooltip controls).

COLOR_INFOTEXT

Цвет текста всплывающих подсказок.

COLOR_MENU

Фон меню

COLOR_MENUBAR

Цвет фона для полосы меню (menu bar) когда меню отображается как плоское меню (flat menu). Тем не менее, COLOR_MENU по-прежнему определяет цвет фона всплывающего меню.

Windows 2000: данное значение не поддерживается.

COLOR_MENUHILIGHT

Цвет используемый подсвеченными пунктами меню когда меню отображается как плоское меню (flat menu). Подсвеченные пункты меню обрисовываются COLOR_HIGHLIGHT.

Windows 2000: данное значение не поддерживается.

COLOR_MENUTEXT

Текст в меню.

COLOR_SCROLLBAR

Серая область полосы прокрутки.

COLOR_WINDOW

Фон окна

COLOR_WINDOWFRAME

Рамка окна.

COLOR_WINDOWTEXT

Текст в окнах.

Заголовочный файл: winuser.h (включен в windows.h)


Стили

WS_BORDER

Окно имеет рамку из тонких линий.

WS_CAPTION

Окно имеет область заголовка (включает в себя стиль WS_BORDER)

WS_CHILD

Окно является дочерним окном. Окно с этим стилем не может иметь меню. Этот стиль не может быть использован совместно со стилем WS_POPUP,

WS_CHILDWINDOW

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

WS_CLIPCHILDREN

Исключает область, занятую дочерними окнами при прорисовке внутри родительского окна. Используйте этот стиль при создании родительского окна.

WS_CLIPSIBLINGS

Закрепляет дочерние окна относительно друг друга; то есть когда отдельное дочернее окно принимает сообщение WM_PAINT, стиль WS_CLIPSIBLINGS вырезает все другие перекрывающие дочерние окна вне области дочернего окна, которое нужно модифицирвать. Если стиль WS_CLIPSIBLINGS не определен, и дочерние окна перекрываются, то, возможно, что при прорисовке внутри рабочей области в одном из дочерних окон, произойдет прорисовка внутри рабочей области другого соседнего дочернего окна.

WS_DISABLED

Создает окно, которое первоначально заблокировано. Заблокированное окно не может принимать вводимую информацию от пользователя. Чтобы разблокировать окно в процессе работы приложения нужно вызвать функцию EnableWindow.

WS_DLGFRAME

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

WS_GROUP

Устанавливает первый элемент управления группы элементов управления. Группа состоит их этого первого элемента управления и всех заданных элементов управления после него, до следующего элемента управления со стилем WS_GROUP. Первый элемент управления в каждой группе обычно имеет стиль WS_TABSTOP так, чтобы пользователь мог перемещаться от группы к группе. Пользователь может впоследствии перевести фокус ввода от одного элемента управления в группе к следующему элементу управления в группе, при помощи клавиши tab.

WS_HSCROLL

Создает окно, которое имеет горизонтальную полосу прокрутки.

WS_ICONIC

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

WS_MAXIMIZE

Создает окно, которое первоначально развернуто.

WS_MAXIMIZEBOX

Создает окно, которое имеет кнопку развертывания окна. Стиль не может быть объединен со стилем WS_EX_CONTEXTHELP. Стиль WS_SYSMENU должен также быть определен.

WS_MINIMIZE

Создает окно, которое первоначально свернуто.

WS_MINIMIZEBOX

Создает окно, которое имеет кнопку свертывания окна. Стиль не может быть объединен со стилем WS_EX_CONTEXTHELP. Стиль WS_SYSMENU должен также быть определен.

WS_OVERLAPPED

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

WS_OVERLAPPEDWINDOW

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

WS_POPUP

Создает выскакивающее окно. Этот стиль не может быть использоваться со стилем WS_CHILD.

WS_POPUPWINDOW

Создает выскакивающее окно со стилями WS_BORDER, WS_POPUP и WS_SYSMENU. Стили WS_CAPTION и WS_POPUPWINDOW должны объединяться, чтобы сделать меню окна видимым.

WS_SIZEBOX

Создает окно, которое имеет рамку изменения размеров.

WS_SYSMENU

Создает окно, которое имеет меню окна в своей строке заголовка. Должен быть также определен стиль WS_CAPTION.

WS_TABSTOP

Устанавливает элемент управления, который может получать фокус клавиатуры, когда пользователь нажимает клавишу TAB. Нажатие клавишы TAB переводит фокус клавиатуры в следующий элемент управления со стилем WS_TABSTOP,

WS_THICKFRAME

То же самое что и WS_SIZEBOX

WS_TILED

То же самое что и WS_OVERLAPPED

WS_TILEDWINDOW

То же самое что и WS_OVERLAPPEDWINDOW

WS_VISIBLE

Создает окно, которое первоначально видимо.

WS_VSCROLL

Создает окно, которое имеет вертикальную полосу прокрутки.

Заголовочный файл: winuser.h (включен в windows.h)


Сообщения

MN_GETHMENU (0x01E1)

Возвращает дескриптор меню для заданного окна.

wparam не используется.

lparam не используется.

Оконная процедура возвращает запрошенный дескриптор меню или NULL в случае ошибки.

WM_ACTIVATE

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

Младшее слово wparam содержит одно из перечисленных ниже значений.

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

WA_CLICKACTIVE - окно становится активным вследствии щелчка мышью.

WA_INACTIVE - окно становится неактивным.

Если старшее слово wparam отлично от нуля, значит окно свернуто.

Если младшее слово wparam равно WA_INACTIVE, то lparam содержит дескриптор окна, которое становится активным. Если же младшее слово wparam равно WA_ACTIVE или WA_CLICKACTIVE, то lparam содержит дескриптор окна, которое становится не активным. Этот дескриптор может иметь значение NULL.

Если оконная процедура обрабатывает это сообщение, она должна вернуть значение нуль.

WM_ACTIVATEAPP

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

Если wparam равен TRUE, то окно становится активным. В этом случае lparam содержит идентификатор потока, окно которого стало не активным.

Если же wparam равен FALSE, то окно становится не активным. В этом случае lparam содержит идентификатор потока, окно которого становится активным.

WM_AFXFIRST

Сообщением не является. Константы WM_AFXFIRST и WM_AFXLAST определяют интервал кодов сообщений, используемых библиотекой MFC.

WM_AFXLAST

См. описание константы WM_AFXFIRST.

WM_APP

Константа используется для определения закрытых сообщений (private messages), обычно имеющих вид WM_APP+X, где X - целое число.

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

Более подробно смотри в описании константы WM_USER.

WM_APPCOMMAND

Уведомляет окно о том, что пользователь сгенерировал командное событие для приложения (application command event), путём нажатия мышкой на командную кнопку (command button), или определенную приложением командную клавишу (command key) клавиатуры.

wparam содержит дескриптор окна, на котором пользователь щелкнул мышью или нажал клавишу клавиатуры. Это может быть дочернее окно или окно, получающее данное сообщение.

Используйте следующий код, для извлечения информации, хранящейся в параметре lparam.

cmd = GET_APPCOMMAND_LPARAM(lparam);

uDevice = GET_DEVICE_LPARAM(lparam);

dwKeys = GET_KEYSTATE_LPARAM(lparam);

Команда содержится в переменной cmd.

В переменной uDevice содержится информация о том, какое устройство ввода сгенерировало событие. Её допустимые значения перечислены ниже (в скобках указаны фактические значения констант).

FAPPCOMMAND_KEY (0) - клавиатура.

FAPPCOMMAND_MOUSE (0x8000) - мышь.

FAPPCOMMAND_OEM (0x1000) - источник определить не удалось. Это может быть либо клавиатура, либо мышь.

В переменной dwKeys содержится информация о том, какие виртуальные клавишы находились в нажатом состоянии.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение TRUE.

Функция DefWindowProc генерирует сообщение WM_APPCOMMAND при обработке сообщения WM_XBUTTONUP или WM_NCXBUTTONUP, или когда пользователь нажимает на командную клавишу приложения.

Если дочернее окно не обрабатывает это сообщение и вызывает DefWindowProc, то функция DefWindowProc перенаправляет это сообщение родительскому окну. Если окно верхнего уровня так же не обрабатывает сообщение и вызывает DefWindowProc, то DefWindowProc вызывает перехватчик с кодом HSHELL_APPCOMMAND.

WM_ASKCBFORMATNAME

Отправляется владельцу буфера обмена окном просмотрщика буфера обмена для получения имени формата буфера обмена CF_OWNERDISPALY.

Окно получает это сообщение с помощью своей оконной процедуры WindowProc.

wparam содержит размер, в символах, буфера, на который указывает параметр lparam.

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

Если приложение обрабатывает это сообщение, то оно должно вернуть знаяение нуль.

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

Окно просмотрщика буфера обмена посылает это сообщение владельцу буфера обмена для определения имени формата CF_OWNERDISPALY - например, при инициализации списка доступных форматов.

WM_CANCELJOURNAL

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

wparam и lparam не используются.

Сообщение ничего не возвращает. Оно, как предполагается, будет обрабатываться внутри главного цикла сообщений программы, а не в оконной процедуре.

WM_CANCELMODE

Отправляется окну для того, чтобы отменить некоторые режимы, такие как захват курсора мыши. Например, система отправляет это сообщение активному окну когда отображается диалоговое окно или окно сообщений. Функция EnableWindow отправляет это сообщение окну когда оно делается недоступным.

wparam и lparam не используются.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

Когда сообщение WM_CANCELMODE обрабатывается, функция DefWindowProc отменяет внутреннюю обработку стандартного ввода от полосы прокрутки, отменяет внтреннюю обработку меню, и освобождает курсор мыши.

WM_CAPTURECHANGED

Отправляется окну, которое потеряло захваченную ранее мышь.

Приложение получает это сообщение посредством своей оконной процедуры WindowProc.

wparam не используется.

lparam содержит дескриптор окна, которое теперь захватывает мышь.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

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

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

WM_CHANGECBCHAIN

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

Окно получает это сообщение с помощью своей оконной процедуры WindowProc.

wparam содержит дескриптор окна, которое было удалено из последовательности просмотрщиков буфера обмена.

lparam содержит дескриптор окна, следующего за удалённым окном в последовательности окон просмотрщиков буфера обмена. Если значение этого параметра равно NULL, то удаленное окно было последним окном в последовательности просмотрщиков буфера обмена.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

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

Когда окно просмотрщика буфера обмена получает сообщение WM_CHANGECBCHAIN, то оно должно с помощью функции SendMessage преслать это сообщение следующему окну в последовательности, за исключением того случая, когда следующее окно было удалено из последовательности. В этом случае, просмотрщик буфера обмена должен сохранить дескриптор, переданный в параметре lparam как дескриптор следующего окна в последовательности.

WM_CHAR

Отправляется окну, владеющему фокусом ввода клавиатуры когда сообщение WM_KEYDOWN обрабатывается функцией TranslateMessage. Сообщение WM_CHAR содержит код символа нажатой клавишы.

wparam содержит код символа клавишы.

lparam содержит количество повторений, скан код, флаг дополнительной клавишы, код контекста, флаг предыдущего состояния клавишы и флаг переходного состояния. Эта информация представлена в следующем формате.

Биты 0-15 содержат количество повторений для текущего сообщения. Данное значение представляет собой количество автоматических повторений нажатий клавишы в результате удержания пользователем данной клавишы в нажатом состоянии. Если нажатие длится достаточно долго, то происходит отправка нескольких сообщений. Однако, количество повторений не является накопительным.

Биты 16-23 содержать скан-код. Он зависит от устройства.

Бит 24 указывает является ли нажатая клавиша дополнительной клавишей, как например, правая Alt и Ctrl, которые появились на усовершенствованных 101- и 102- клавишных клавиатурах. Значение этого бита равное 1 указывает на то, что это дополнительная клавиша. В противном случае значение этого бита равно нулю.

Биты 25-28 зарезервированы и не используются.

Бит 29 содержит код контекста. Его значение равно единице, если в момент нажатия клавишы, клавиша Alt была нажата. Или нуль, если это не так.

Бит 30 содержит предыдущее состояние клавишы. Он равен 1 если перед отправкой сообщений клавиша была нажата, и нуль, если она была отпущена.

Бит 31 содержит состояние перехода. Он равен 1 если клавиша отпускается, и нуль, если клавиша нажимается.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

Сообщение WM_CHAR использует формат UTF-16.

Информация в старшем слове lparam обычно не представляет интереса для приложений. Эта информаци используется при обработке сообщения WM_KEYDOWN, которое предшествует отправку соообщения WM_CHAR.

Для усовершенствованных 101- и 102- клавишных клавиатур к дополнительным клавишам отностся: правые Alt и Ctrl в основной части клавиатуры; клавишы Insert, Delete, Home, End, Page Up,Page Downи другие клавишы в группе клавиш слева от цифровой клавиатуры;а также клавишы деления (/) и Enter на цифровой клавиатуре. Некоторые клавиатуры могут поддерживать бит расширенной клавишы в параметре lparam.

Сообщение WM_UNICHAR аналогично сообщению WM_CHAR, но использует формат UTF-32. Оно добавлено для возможности отправки Unicode символов в ANSI-окна и может работать с Unicode символами дополнительного набора.

WM_CHARTOITEM

Данное сообщение отправляется окну-владельцу списка с установленным стилем LBS_WANTKEYBOARDINPUT при получении этим списком сообщения WM_CHAR.

Младшее слово wparam определяет код символа клавишы, которую нажал пользователь. Старшее слово wparam определяет текущее положение каретки.

lparam содержит дескриптор списка.

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

Функция DefWindowProc возвращает значение -1.

WM_CHILDACTIVATE

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

wparam и lparam не используются.

Если приложение обрабатывает это сообщение, оно должно вернуть значение нуль.

WM_CLEAR

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

wparam не используется и должен быть равен нулю.

lparam не используется и должен быть равен нулю.

Оконная процедура не возвращает никакого значения.

Удаление, выполняемое сообщением WM_CLEAR может отменено путем отправки поль ввода сообщения EM_UNDO.

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

Когда сообщение WM_CLEAR отправляется комбинированному списку, то оно обрабатывается полем ввода, принадлежащим этому списку. Если сообщение отправляется комьинированному списку с установленным стилем CBS_DROPDOWNLIST, то сообщение никак не влияет на комбинированный список.

WM_CLOSE

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

wparam и lparam не используются.

Если оконная процедура обрабатывает это сообщение, то она должна вернуть нуль.

WM_COALESCE_FIRST

Недокументировано.

WM_COALESCE_LAST

Недокументировано

WM_COMMAND

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

Если сообщение поступило от меню, то значение lparam и старшего слова wparam равно нулю. Младшее слово wparam содержит идентификатор выбранного пункта меню.

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

Если меню создано со стилем MNS_NOTIFYBYPOS, то вместо сообщения WM_COMMAND будет отправлено сообщение WM_MENUCOMMAND.

Если сообщение поступило от клавишы быстрого доступа, то значение lparam равно нулю. Значение старшего слова wparam равно единице. Младшее слово wparam содержит идентификатор выбранной командной клавишы (accelerator).

Команды быстрого доступа, которые выбираются из системного меню окна передаются в виде сообщения WM_SYSCOMMAND.

Если клавиша быстрого доступа, соответствующая пункту меню, была выбрана тогда, когда окно, владеющее этим меню, было свернуто, то сообщение WM_COMMAND не отправляется. Однако если была выбрана клавиша быстрого доступа, не соответствующая никакому пункту меню, то сообщение WM_COMMAND отправляется даже если окно свернуто.

Если сообщение поступило от элемента управления, то lparam содержит дескриптор окна элемента управления. Старшее слово wparam содержит код уведомления. Он зависит от типа элемента управления и произошедшего события. Младшее слово wparam содержит идентификатор элемента управления.

WM_COMPACTING

Рассылается всем окнам верхнего уровня, когда система обнаруживает, что более 12,5% каждого 30-,60- секундного интервала тратится на уплотнение памяти. Это указывает на то, что системная память на исходе.

wparam содержит отношение времени, затрачиваемого процессором на уплотнение памяти, ко времени затрачиваемого процессором на выполнение других операций. Например, значение 0x8000 говорит о том, что 50% времени процессор тратит на уплотнение памяти.

lparam не используется.

Если приложение обрабатывает это сообщение, оно должно вернуть значение нуль.

WM_COMPAREITEM

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

wparam содержит идентификатор элемента управления, который отправил данное сообщение.

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

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

-1 - первая запись предшествует второй.

0 - записи эквивалентны друг другу.

1 - первая запись следует за второй записью.

Обычно система отправляет это сообщение несколько раз при определении положения добавляемой записи.

WM_CONTEXTMENU

Уведомляет окно о том, что пользователь щелкнул правой кнопкой мыши в окне.

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

Младшее слово lparam определяет горизонтальную позицию курсора мыши, в экранной системе координат, во время щелчка. Старшее слово lparam определяет вертикальную позицию курсора мыши, в экранной системе координат, во время щелчка.

Оконная процедура ничего не возвращает.

WM_COPY

Приложение отправляет данное сообщение полю ввода или комьинированному списку для копирования выделеннного в нем текста в буфер обмена в формате CF_TEXT.

wparam не используется и должен быть равен нулю.

lparam не используется и должен быть равен нулю.

Оконная процедура не возвращает никакого знчаения.

Когда данное сообщение отправляется комбинированному списку, то оно обрабатывается полем ввода этого списка. Если комбинированный список имеет стиль CBS_DROPDOWNLIST, то данное сообщение никак не воздействует на комбинированный список.

WM_COPYDATA

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

wparam содержит дескриптор окна, отправляющего данные.

lparam содержит указатель на структуру COPYDATASTRUCT, которая содержит пересылаемые данные.

Если принимающее приложение обрабатывает это сообщение, то оно должно вернуть значение TRUE, в противном случае, оно должно вернуть значение FALSE.

Отправлять данное сообщение можно только с помощью функции SendMessage.

Пересылаемые данные не должны содержать указателей или других ссылок на какие-либо объекты.

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

Отправляемые данные долдны быть доступны только для чтения. Значение параметра lparam действительно только на время обработки сообщения. Принимающее приложение не должно освобождать память, на которую указывает lparam. Если отправляющее приложение хочет иметь доступ к отправляемым данным после вызова SendMessage, оно должно скопировать отправляемые данные в локальный буфер.

WM_CREATE

Посылается тогда, когда программа запрашивает, вызовом какой функции CreateWindow или CreateWindowEx должно быть создано окно. Оконная процедура нового окна принимает это сообщение после того, как оно создано, но до того, как окно становится видимым. Сообщение посылается перед возвращением значения функцией CreateWindow или CreateWindowEx,

Параметр lparam указывает на структуру CREATESTRUCT.

Если оконная процедура, получив это сообщение, возвращает значение 0, то создание окна продолжается. Если же она возвращает значение -1, то окно разрушается, и функция CreateWindow или CreateWindowEx возвращает значение NULL.

WM_CTLCOLOR

Используется в 16-разрядных версиях Windows для изменения цветовой схемы списков, комбинированных списков, окон сообщений, кнопок, полей ввода, статических элементов управления и диалоговых окон.

wparam содержит контекст устройства (DC).

lparam содержит дескриптор дочернего окна.

Если приложение обрабатывает это сообщение, оно возвращает дескриптор кисти. Система использует эту кисть для отрисовки фона элемента управления.

WM_CTLCOLORBTN

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

wparam содержит дескриптор контекста устройства кнопки.

lparam содержит дескриптор окна кнопки.

Если приложение обрабатывает это сообщение, то оно должно вернуть дескриптор кисти. Система использует кисть для отрисовки фона кнопки.

Если приложение возвращает созданную им кисть, то оно должно освободить эту кисть. Если приложение возвращает дескриптор системной кисти, то оно не должно освобождать ее.

Функция DefWindowProc выбирает системные цвета по умолчанию для кнопки. Кнопки с установленными стилями BS_PUSHBUTTON, BS_DEFPUSHBUTTON или BS_PUSHLIKE не используют возвращенную кисть. Кнопки с этими стилями всегда отрисовываются с системными цветами по умолчанию. Отрисовка нажимных кнопок требует нескольких различных кистей (обычная, выделенная, затененная), но сообщение WM_CTLCOLORBTN возвращает только ону кисть. Чтобы предоставить кнопке уникальный внешний вид вы должны самостоятельно ее перерисовывать.

Данное сообщение никогда не пересылается между потоками. Оно посылается только одному потоку.

WM_CTLCOLORDLG

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

wparam содержит дескриптор контекста устройства диалогового окна.

lparam содержит дескриптор элемента управления диалогового окна.

Если приложение обрабатывает это сообщение, то оно должно вернуть дескриптор кисти. Система использует эту кисть для отрисовки фона диалогового окна.

Функция DefWindowProc выбирает системные цвета по умолчанию для диалогового окна.

Система не разрушает кисть автоматически. Приложение само должно уничтожать кисть, когда она станет больше не нужна.

Данное сообщение никогда не пересылается между потоками. Оно посылается только одному потоку.

Сообщение WM_CTLCOLODLG отправляется самому диалоовому окну тогда как другие WM_CTLCOLOR* сообщения отправляются окну-владельцу элемента управления.

WM_CTLCOLOREDIT

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

wparam содержит дескриптор контекста устройства элемента управления поля ввода.

lparam содержит дескриптор элемента управления поля ввода.

Если приложение обрабатывает это сообщение, то оно должно вернуть дескриптор кисти. Система использует эту кисть для отрисовки фона элемента управления поля ввода.

Если приложение возвращает созданную им кисть, то оно должно освободить эту кисть. Если приложение возвращает дескриптор системной кисти, то оно не должно освобождать ее.

Функция DefWindowProc выбирает системные цвета по умолчанию для поля ввода.

Недоступные поля ввода и поля ввода только для чтения не посылают сообщения WM_CTLCOLOREDIT. Вместо него они посылают сообщение WM_CTLCOLORSTATIC.

Данное сообщение никогда не пересылается между потоками. Оно посылается только одному потоку.

Для расширенных полей ввода (rich edit) данное сообщение не поддерживается.

WM_CTLCOLORLISTBOX

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

wparam содержит дескриптор контекста устройства списка.

lparam содержит дескриптор окна списка.

Если приложение обрабатывает это сообщение, то оно должно вернуть дескриптор кисти. Система использует кисть для отрисовки фона списка.

Функция DefWindowProc выбирает системные цвета по умолчанию для списка.

Данное сообщение никогда не пересылается между потоками. Оно посылается только одному потоку.

WM_CTLCOLORMSGBOX

Отправляется окну-владельцу окна сообщений (message box) перед тем как система отобразит это окно сообщений. Обрабатывая это сообщение приложение может установить цвета фона и текста окна сообщений, используя для этого полученный дескриптор контекста устройства.

wparam содержит дескриптор контекста устройства окна сообщений.

lparam содержит дескриптор окна сообщений (message box).

Если приложение обрабатывает это сообщение, то оно должно вернуть дескриптор кисти. Система использует кисть для отрисовки фона окна сообщений.

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

Данное сообщение никогда не пересылается между потоками. Оно посылается только одному потоку.

WM_CTLCOLORSCROLLBAR

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

wparam содержит дескриптор контекста устройства элемента управления полосы прокрутки.

lparam содержит дескриптор окна элемента управления полосы прокрутки.

Если приложение обрабатывает это сообщение, то оно должно вернуть дескриптор кисти. Система использует кисть для отрисовки фона окна элемента управления полосы прокрутки.

Если приложение возвращает созданную им кисть, то оно должно освободить эту кисть. Если приложение возвращает дескриптор системной кисти, то оно не должно освобождать ее.

Функция DefWindowProc выбирает системные цвета по умолчанию для окна элемента управления полосы прокрутки.

Данное сообщение никогда не пересылается между потоками. Оно посылается только одному потоку.

Данное сообщение используется только дочерними элементами упправления полосы прокрутки. Полосы прокрутки присоединенные к окну (WS_HSCROLL и WS_VSCROLL) не создают такого сообщения.

WM_CTLCOLORSTATIC

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

wparam содержит дескриптор контекста устройства статического элемента управления.

lparam содержит дескриптор окна статического элемента управления.

Если приложение обрабатывает это сообщение, то оно должно вернуть дескриптор кисти. Система использует кисть для отрисовки фона окна статическоэлемента управления.

Если приложение возвращает созданную им кисть, то оно должно освободить эту кисть. Если приложение возвращает дескриптор системной кисти, то оно не должно освобождать ее.

Функция DefWindowProc выбирает системные цвета по умолчанию для окна статического элемента управления.

Вы можете имзенить цвет текста недоступного элемента управления, но вы не можете изменить цвет текста переднего плана. Система всегда использует COLOR_GRAYTEXT.

Элементы управления поля ввода доступные для редактирования не отправляют сообщения WM_CTLCOLORSTATIC. Вместо него они отправляют сообщение WM_CTLCOLOREDIT.

Сообщение WM_CTLCOLORSTATIC никогда не пересылается между потоками. Оно посылается только одному потоку.

WM_CUT

Приложение отправляет данное сообщение полю ввода или комбинированному списку с полем ввода для удаления выделенного текста и размещения удаленного текста в буфере обмена в формате CF_TEXT.

wparam не используется и должен быть равен нулю.

lparam не используется и должен быть равен нулю.

Данное сообщение не возвращает никакого значения.

Удаление текста выполняемое сообщением WM_CUT может быть отменено посылкой элементу управления поля ввода сообщения EM_UNDO.

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

Когда сообщение WM_CUT отправляется комбинированному списку оно обрабатывается полем ввода этого списка. Если у комбинированного списка установлен стиль CBS_DROPDOWNLIST, то данное сообщение никак не влияет на комбинированный список.

WM_DEADCHAR

Отправляется окну, владеющему фокусом ввода клавиатуры, когда функция TranslateMessage обрабатывает сообщение WM_KEYUP. Сообщение WM_DEADCHAR определяет код символа сгенерированного слепой клавишей. Слепая клавиша - это клавиша, которая создает символ, такой как умлаут (две точки над знаком), объединяющийся с другим символом, чтобы сформировать составной символ.

wparam содержит код символа, созданного слепой клавишей.

lparam хранит ту же информация и в таком же формате, что и в случае сообщения WM_CHAR.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

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

Иформация в старшем слове lparam обычно не представляет интереса для приложений. Она обрабатывается при получении сообщения WM_KEYDOWN, которое предшествует сообщению WM_DEADCHAR.

WM_DELETEITEM

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

wparam содержит идентификатор элемента управления, который послал сообщение.

lparam содержит указатель на структуру DELETEITEMSTRUCT, которая содержит информацию об удаляемой записи.

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

В Windows 95 данное сообщение посылается для всех удаляемых непустых записей.

WM_DESTROY

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

wparam и lparam не используются.

Если оконная процедура обрабатывает это сообщение, она возвращает нуль.

WM_DESTROYCLIPBOARD

Отправляется владельцу буфера обмена когда функция EmptyClipboard освобождает буфер обмена.

Приложение получает это сообщение с помощью оконной процедуры WindowProc.

wparam не используется и должен быть равен нулю.

lparam не используется и должен быть равен нулю.

Если приложение орабатывает это сообщение, то оно должно вернуть значение нуль.

WM_DEVICECHANGE

Уведомляет приложение о том, что произошло изменение в конфигурации устройств компьютера.

Приложение получает это сообщение посредством своей оконной процедуры WindowProc.

wparam содержит тип произошедшего события.

Значение lparam зависит от значение wparam.

Приложение должно вернуть значение TRUE, если оно разрешает запрос, или значение BROADCAST_QUERY_DENY, если приложение отклоняет запрос.

Данное сообщение появилось в Windows XP и Windows Server 2003.

WM_DEVMODECHANGE

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

wparam не используется.

Значение lparam указывает на строку, которая определяет имя устройства.

Если приложение обрабатывает это сообщение, оно должно вернуть значение нуль.

WM_DISPLAYCHANGE

Отправляется всем окнам когда изменяется разрешение экрана.

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

Младшее слово lparam содержит новое разрешение экрана по горизонтали.

Старшее слово lparam содержит новое разрешение экрана по вертикали.

WM_DRAWCLIPBOARD

Отправляется первому окну в последовательности просмотрщиков буфера обмена когда содержимое буфера обмена изменилось. Это позволяет окну просмотрщика буфера обмена отобразить новое содержимое буфера обмена.

Окно получает это сообщение с помощью оконной процедуры WindowProc.

wparam не используется и должен быть равен нулю.

lparam не используется и должен быть равен нулю.

Данное сообщение получают только окна просморщиков буфера обмена. Эти окна добавляются в последовательность просмотрщиков буфера обмена с помощью функции SetClipboardViewer.

Каждое окно, которое получает сообщение WM_DRAWCLIPBOARD должно вызывать функцию SendMessage для передачи сообщения следующему окну в последовательности просмотрщиков буфера обмена. Дескриптор следующего окна в последовательности просмотрщиков буфера обмена возвращается функцией SetClipboardViewer, и может изменится при обработке сообщения WM_CHANGECBCHAIN.

WM_DRAWITEM

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

wparam содержит идентификатор элемента управления, который отправил это сообщение. Если сообщение было послано меню, значение wparam равно нулю.

lparam указывает на структуру DRAWITEMSTRUCT, содержащую информацию о перерисовываемом элементе управления и типе запроса на перерисовку.

Если приложение обрабатывает это сообщение оно должно вернуть значение TRUE.

WM_DROPFILES

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

wparam содержит описатель внутренней структуры данных, описывающей перетащенные файлы. Для получения информации о перетащенных файлах, передайте этот описатель в функцию DragFinish, DragQueryFile или DragQueryPoint.

lparam должен быть равен нулю.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

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

WM_DWMCOMPOSITIONCHANGED

Появилось в Windows Vista. Уведомляет все окна верхнего уровня о том, что отрисовывание окон посредством диспетчера рабочего стола (Desktop Window Manager composition - DWM composition) было включено или выключено.

В Windows 8 отрисовывание окон посредством DWM всегда включено, поэтому данное сообщение не отправляется.

wparam не используется.

lparam не используется.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

Приложение получает это сообщение посредством своей оконной процедуры.

Для определения текущего состояния отрисовывания окон посредством DWM может быть использована функция DwmIsCompositionEnabled.

WM_ENABLE

Отправляется окну когда изменяется его доступность. Это сообщение посылается до возврата из функции EnableWindow, но до того, как будет установлен стиль WS_DISABLED.

wparam определяет характер изменения доступности окна. Если его значение стало равно TRUE, то окно стало доступно, если же его значение равно FALSE, то окно стало недоступным.

lparam не используется.

Если приложение обрабатывает это сообщение, оно должно вернуть значение нуль.

WM_ENDSESSION

Это сообщение отправляется после того, как система обработает результаты сообщения WM_QUERYENDSESSION. Сообщение WM_ENDSESSION извещает приложение о завершении сеанса.

Если сеанс завершается, то wparam содержит значение TRUE. В противном случае wparam содержит значение FALSE (например, в случае закрытия приложения, один из используемых файлов которого заменяется).

Значение lparam аналогично значению lparam в случае сообщения WM_QUERYENDSESSION.

Если приложение обрабатывает это сообщение, оно должно вернуть значение нуль.

WM_ENTERIDLE

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

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

MSGF_DIALOGBOX - на экране отображено диалоговое окно.

MSGF_MENU - на экране отображено меню.

lparam содержит дескриптор диалогового окна (если wparam равен MSGF_DIALOGBOX) или окна, содержащего отображенное меню (если wparam равен MSGF_MENU).

Оконная процедура возращает нуль, если она обрабатывает это сообщение.

WM_ENTERMENULOOP

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

Если вход в этот режим был осуществлен с помощью функции TrackPopupMenu, то значение параметра wparam равно TRUE. Если же вход в этот ржим был осуществлен каким-то иным образом, то значение параметра wparam равно FALSE.

lparam не используется.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

Функция DefWindowProc возвращает значение нуль.

WM_ENTERSIZEMOVE

Отправляется один раз после входа окна в режим перемещения или изменения размера окна. Окно входит в данный режим когда пользователь щелкает мышью по заголовку или по границе окна, или когда окно передает в функцию DefWindowProc сообщение WM_SYSCOMMAND, параметр wparam которого принимает значение SC_MOVE или SC_SIZE.

Система отправляет это сообщение вне зависимости от того, включено перетаскивание полных окон или нет.

Приложение получает это сообщение посредством оконной процедуры WindowProc.

wparam не используется.

lparam не используется.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

WM_ERASEBKGND

Отправляется когда фон окна должен быть очищен.

wparam содержит дескриптор контекста устройства.

lparam не используется.

Оконная процедура должна вернуть ненулевое значение, если она очистила фон. В противном случае (если фон не очищен) она возвращает нуль.

WM_EXITMENULOOP

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

Если модальный цикл меню применялся к контекстному меню, то значение wparam равно TRUE. В противном случае значение wparam равно FALSE.

lparam не используется.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

Функция DefWindowProc возвращает значение нуль.

WM_EXITSIZEMOVE

Отправляется один раз после выхода окна из режима перемещения или изменения размера окна. Окно входит в данный режим когда пользователь щелкает мышью по заголовку или по границе окна, или когда окно передает в функцию DefWindowProc сообщение WM_SYSCOMMAND, параметр wparam которого принимает значение SC_MOVE или SC_SIZE.

Приложение получает это сообщение посредством оконной процедуры WindowProc.

wparam не используется.

lparam не используется.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

WM_FONTCHANGE

Приложение рассылает это сообщение всем окнам верхнего уровня после изменения области ресурсов шрифта.

wparam и lparam не используются.

WM_GETDLGCODE

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

wparam содержит код виртуальной клавишы, на которую нажал пользователь. Обработчик может выборочно обрабатывать эти клавишы. Например, обработчик может обрабатывать нажатие на клавишу VK_RETURN, но не обрабатывать нажатие на клавишу VK_TAB.

lparam содержит указатель на структуру MSG (или NULL, если система выполняет запрос).

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

Хотя функция DefWindowProc всегда возвращает значение нуль, в ответ на сообщение WM_GETDLGCODE, оконная процедура для предопреленного оконного класса возвращает значение, предопределенное для каждого класса.

Сообщение WM_GETDLGCODE и возвращаемые в ответ на него значения полезны только для определенных пользователем элементов управления диалоговых окон, или для стандартных элементов управления, логика работы которых изменена посредством субклассинга (см. функцию CallWindowProc).

WM_GETFONT

Посылается для запроса шрифта, которым отрисовывается заголовок окна. wparam и lparam не используются и равны нулю.

Оконная процедура возвращает дескриптор шрифта или NULL, если использовался системный шрифт.

WM_GETHOTKEY

Отправляется для того,чтобы определить горячую клавишу, с которой ассоциировано окно.

wparam и lparam не используются и должны быть равны нулю.

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

HOTKEYF_ALT - клавиша Alt.

HOTKEYF_CONTROL - клавиша Ctrl.

HOTKEYF_EXT - дополнительная клавиша.

HOTKEYF_SHIFT - клавиша Shift.

Если возвращаемое значение равно NULL, то с окном не ассоциировано ни одной горячей клавишы.

WM_GETICON

Отправляется окну для получения дескриптора большой или маленькой иконки, ассоциированной с окном. Система отображает большую иконку в окне выбора окна по Alt+Tab. Маленькая иконка отображается в заголовке окна.

wparam содержит тип запрашиваемой иконки. Он принимает одно из значени перечисленных ниже.

ICON_BIG - запрашивается большая иконка окна.

ICON_SMALL - запрашивается маленькая иконка окна.

ICON_SMALL2 - запрашиваетс маленькая иконка предоставляемая приложением. Если приложение не предоставляет иконку, то система использует иконку по умолчанию, созданную системой для этого окна.

lparam не используется.

Возвращаемое значение представляет собой дескриптор большой или маленькой иконки в зависимости от значения параметра wparam. Когда приложение получает это сообщение, оно может вернуть дескриптор иконки, или пересдать данное сообщение в функцию DefWindowProc.

WM_GETMINMAXINFO

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

wparam не используется.

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

Если приложение обрабатывает это сообщение оно должно вернуть значение нуль.

WM_GETTEXT

Посылается для запроса заголовка окна.

wparam содержит максимальное число копируемых символов, включая завершающий null символ.

lparam содержит адрес буфера, в котором следует разместить требуемый заголовок.

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

WM_GETTEXTLENGTH

Посылается для запроса длины заголовка окна.

wparam и lparam не используются и должны быть равны нулю.

Оконная процедура возвращает длину заголовка окна в символах, не включая завершающий Null символ.

WM_HANDHELDFIRST

Недокументировано.

WM_HANDHELDLAST

Недокументировано.

WM_HELP

Указывает на то, что пользователь нажал на клавишу F1. Если клавиша F1 была нажата при активном меню, данное сообщение отправляется окну ассоциированному с активным меню, в противном случае сообщение передается окну, которое владело фокусом ввода. Если фокус ввода не приналежал ни одному окну, то сообщение передается текущему активному окну.

wparam должен равняться нулю.

lparam адрес структуры HELPINFO, которая содержит информацию о пункте меню, элементе управления, диалоговом окне, или окне, для которого запрашивается помощь.

Оконная процедура возвращает значение TRUE.

Функция DefWindowProc пересылает данное сообщение родительскому окну для дочернего окна или окну-владельцу для окна верхнего уровня.

WM_HOTKEY

Отправляется когда пользователь нажимает на горячую клавишу, зарегистрированую функцией RegisterHotKey. Сообщение помещается на вершину очереди сообщений, ассоциированной с потоком, который зарегистрировал горячую клавишу.

wparam содержит идентификатор горячей клавишы, которая сгенерировала сообщение. Если сообщение было сгенерировано системной горячей клавишей, то данный параметр принимает одно из значений, перечисленных ниже.

IDHOT_SNAPDESKTOP - была нажата горячая клавиша снимка рабочего стола.

IDHOT_SNAPWINDOW - была нажата горячая клавиша снимка окна.

Младшее слово lparam определяет клавишы, которые были нажаты совместно с клавишей, указанной в старшем слове lparam и сгенерировавшей сообщение WM_HOTKEY.

Допустимые значения младшего слова lparam перечислены ниже.

MOD_ALT - клавиша ALT.

MOD_CONTROL - клавиша Ctrl.

MOD_SHIFT - клавиша Shift.

MOD_WIN - клавиша WINDOWS. Горячие клавишы, которые включают в себя клавишу WINDOWS зарезервированы для использования операционной системой.

Сообщение WM_HOTKEY не связано с сообщениями WM_GETHOTKEY и WM_SETHOTKEY. Сообщение WM_HOTKEY связано с общими горячими клавишами, а сообщения WM_GETHOTKEY и WM_SETHOTKEY относятся к горячим клавишам активации окна.

WM_HSCROLL

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

Если младшее слово wparam содержит значение SB_THUMBPOSITION или SB_THUMBTRACK, то старшее слово wparam содержит текущее положение полосы прокрутки. В противном случае значение старшего слова wparam не используется.

Младшее слово wparam содержит значение, которое указывает запрос пользователя на прокрутку в горизонтальном направлении. Перечень допустимых значений представлен здесь.

Если сообщение пришло от элемента управления, то lparam содержит дескриптор элемента управления горизонтальной полосы прокрутки. Если сообщение пришло от стандартной полосы прокрутки, то lparam содержит значение NULL.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

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

WM_HSCROLLCLIPBOARD

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

wparam содержит дескриптор окна просмотрщика буфера обмена.

Младшее слово lparam содержит код запроса на прокрутку. Допустимые значения кодов запросов на горизонтальную прокрутку перечислены здесь.

Если значение младшего слова lparam равно SB_THUMBPOSITION, то старшее слово lparam содержит текущую позицию полосы прокрутки. Если же значение младшего слова lparam отлично от SB_THUMBPOSITION, то старшее слово lparam не используется.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

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

WM_ICONERASEBKGND

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

wparam содержит дескриптор контекста устройства.

lparam не используется.

Если оконная процедура обрабатывает это сообщение, она возвращает ненулевое значение.

WM_IME_CHAR

Отправляется приложению когда IME получает символ. Окно получает это сообщение посредством функции WindowProc.

В случае двухбайтовых строк (DBCS) wparam содержит однобайтовое или двухбайтовое значение символа. Для двухбайтового символа, значение (BYTE)(wparam>>8) содержит старший байт. Обратите внимание, что в данном выражении скобки необходимы, так как операция приведения типов имеет более высокий приоритет, чем операция сдвига.

В случае Unicode строк wparam содержит значение Unicode символа.

lparam содержит такую информацию, как: количество поворений, флаг дополнительной клавишы, код контекста, флаг предыдущего состояния клавишы и флаг переходного состояния. Эта информация представлена в следующем формате.

Биты 0-15 содержат количество повторений. Поскольку первый и второй байт передаются непрерывно, то количество повторений всегда равно единице.

Биты 16-23 содержат скан-код полного азиатского символа.

Бит 24 содержит информацию о дополнительной клавише.

Биты 25-28 не используются.

Бит 29 содержит код контекста.

Бит 30 содержит информацию о предыдущем состоянии клавишы.

Бит 31 содержит информацию о переходном состоянии.

В отличие от сообщения WM_CHAR данное сообщение для не Unicode окон может включать двухбайтовые и однобайтовые коды символов. Для Unicode окон данное сообщение аналогично сообщению WM_CHAR.

Для не Unicode окон, если сообщение WM_IME_CHAR содержит двухбайтовый символ и приложение передает это сообщение в функцию DefWindowProc, то система IME конвертирует данное сообщение в два сообщения WM_CHAR, каждое из которых содержит один байт двухбайтового символа.

WM_IME_COMPOSITION

Посылается приложению когда в результате нажатия набора клавиш изменяется состояние составной строки IME. Окно получает это сообщение посредством функции WindowProc.

wparam содержит двухбайтный DBCS символ отображающий последнее изменение в составной строке.

lparam содержит значение, которое указывает на то, как изменилась составная строка или символ.

Параметр lparam также может принимать одно из значений перечислвенных ниже (или их комбинацию).

CS_INSERTCHAR - Вставить символ,хранящийся в wparam в текущее положение вставки. Приложение должно отобразить составной символ, если оно обрабатывает это сообщение.

CS_NOMOVECARET - не перемещать каретку при обработке сообщения. Например, если получена комбинация CS_INSERTCHAR и CS_NOMOVECARET, то приложение должно вставить заданный символ на текущее положение каретки, но не должно перемещать каретку. Последующее сообщение WM_IME_COMPOSITION с параметром GCS_RESULTSTR заменит этот символ.

Данное сообщение не возвращает никакого значения.

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

Функция DefWindowProc обрабатывает это сообщение путем пересылки его системному IME окну по умолчанию. IME окно обрабатывает это сообщение путем обновления своего внешнего вида.

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

WM_IME_COMPOSITIONFULL

Отправляется приложению когда окно IME не может найти свободного пространства для расширения композитного окна. Приложение получает это сообщение посредством оконной процедуры WindowProc.

wparam и lparam не используются.

Данное сообщение не возвращает никаких значений.

Для указания того, как следует отображать композитное окно, приложение должно использовать команду IMC_SETCOMPOSITIONWINDOW (отправляется с сообщением WM_IME_CONTROL).

IME окно, вместо IME, отправляет это сообщение с помощью функции SendMessage.

WM_IME_CONTROL

Отправляется приложением окну IME (редактор метода ввода) для выполнения какой-либо команды. Приложение использует это сообщение для управления IME окном, которое оно создало. Для передачи сообщения приложение использует функцию SendMessage.

wparam содержит код команды.

Значение lparam зависит от отдаваемой команды.

Возвращаемое значение зависит от отдаваемой команды.

WM_IME_ENDCOMPOSITION

Отправляется приложению когда IME (редактор метода ввода) завершает сбор строки. Окно получает это сообщение посредством функции WindowProc.

Данное сообщение не имеет параметров.

Данное сообщение не возвращает никакого значения.

Приложение должно обрабатывать это сообщение если оно самостоятельно отображает объединяемые символы.

Если приложение создало IME окно, то оно должно передать данное сообщение этому окну. Функция DefWindowProc обрабатывает это сообщение путем пересылки его системному IME окну по умолчанию.

WM_IME_KEYDOWN

Отправляется системой IME для того, чтобы уведомить приложение о нажатии клавишы. Окно получает это сообщение посредством функции WindowProc.

wparam содержит виртуальный код нажатой клавишы. Перечень существующих виртуальных кодов клавиш представлен здесь.

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

Биты 0-15 содержат количество повторений.

Биты 16-23 содержат скан-код нажатой клавишы.

Бит 24 содержит признак дополнительной клавишы. Если нажата дополнительная клавиша, то данный бит взведен. Если же дополнительная клавиша не нажата, то данный бит сброшен.

Биты 25-28 не используются.

Бит 29 содержит код контекста. Его значение всегда равно нулю.

Бит 30 содержит предыдущее состояние клавишы. Если клавиша была нажата, то его значение равно 1. Если же клавиша была отпущена, то его значение равно нулю.

Бит 31 содержит состояние перехода. Его значение всегда равно нулю.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

Приложение может самостоятельно обработать это сообщение, или передать его в функцию DefWindowProc, которая на его основе сгенерирует сообщение WM_KEYDOWN.

WM_IME_KEYLAST

То же самое что и WM_IME_COMPOSITION.

WM_IME_KEYUP

Отправляется системой IME для того, чтобы уведомить приложение о том, что клавиша была отпущена. Окно получает это сообщение посредством функции WindowProc.

wparam содержит виртуальный код нажатой клавишы. Перечень существующих виртуальных кодов клавиш представлен здесь.

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

Биты 0-15 содержат количество повторений. Его значение всегда равно единице.

Биты 16-23 содержат скан-код отпущенной клавишы.

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

Биты 25-28 не используются.

Бит 29 содержит код контекста. Его значение всегда равно нулю.

Бит 30 содержит предыдущее состояние клавишы. Его значение всегда равно единице.

Бит 31 содержит состояние перехода. Его значение всегда равно единице.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

Приложение может самостоятельно обработать это сообщение, или передать его в функцию DefWindowProc, которая на его основе сгенерирует сообщение WM_KEYUP.

WM_IME_NOTIFY

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

wparam содержит код произошедшего события.

Значение lparam зависит от значения wparam.

Возвращаемое значение зависит от значения wparam.

Приложение обрабатывает это сообщение если только, оно ответственно за управление IME окном.

WM_IME_SELECT

Отправляется приложению когда операционная система собирается изменить текущий IME (редактор метода ввода). Приложение получает это сообщение посредством своей оконной процедуры WindowProc.

wparam содержит индикатор выбора. Он принимает значение TRUE, если данный IME выбран.А значение FALSE он принимае когда данный IME был заменен другим.

lparam содержит идентификатор локали ввода, ассоциированной с IME.

Данное сообщение не возвращает никаких значений.

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

Функция DefWindowProc обрабатывает это сообщение путём его пересылки окну IME по умолчанию.

WM_IME_SETCONTEXT

Отправляется приложению при активации IME окна.Приложение получает это сообщение посредством своей оконной процедуры WindowProc.

Если окно активно, то wparam содержит значение TRUE. Если же окно не активно, то wparam содержит значение FALSE.

lparam содержит параметры отображения окон.

Возвращаемое оконной процедурой значение соответствует значению, возвращаемому функцией DefWindowProc или ImmIsUIMessage.

Если приложение создало своё IME окно, то оно должно вызвать функцию ImmIsUIMessage. В противном случае приложение должно передать это сообщение в функцию DefWindowProc.

Если приложение отображает своё собственное композитное IME окно, то стандартная система IME не будет отображать это окно. В этом случае, приложение должно очищать флаг ISC_SHOWUICOMPOSITIONWINDOW в значении lparam перед передачей сообщения в функцию DefWindowProc или ImmIsUIMessage. для отображения своих уникальных окон, приложения должны удалять соответствующие им флаги в значении lparam.

WM_IME_STARTCOMPOSITION

Посылается перед тем как IME (редактор метода ввода) соберет строку полученную в результате последовательности нажатий клавиш. Окно получает это сообщение посредством функции WindowProc.

Данное сообщение не имеет параметров.

Данное сообщение не возвращает никакого значения.

Данное сообщение является уведомлением окну IME открыть свое окно. Приложение должно обрабатывать это сообщение если оно самостоятельно отображает набор символов.

Если приложение создало свое IME окно, то оно должно передать данное сообщение этому окну. Функция DefWindowProc обрабатывает это сообщение путем пересылки его системному IME окну по умолчанию.

WM_INITDIALOG

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

wparam содержит дескриптор элемента управления, который получит фокус ввода. Система передаст ему фокус ввода клавиатуры только если диалоговая процедура вернет значение TRUE.

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

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

По умолчанию фокус ввода клавиатуры достается первому видимому и доступному элементу управления диалогового окна, который имеет установленный стиль WS_TABSTOP. Когда диалоговая процедура возвращает значение TRUE, система проверяет элементы управления, чтобы убедиться, что диалоговая процедура не скрыла и не сделала их недоступными. Если состояние элемента управления изменилось (он стал невидимым и/или недоступным), то система передает фокус ввода следующему элементу управления.

Приложение может вернть значение FALSE только если оно самостоятельно передает фокус ввода клавиатуры тому или иному элементу управления.

WM_INITMENU

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

wparam содержит дескриптор активируемого меню.

Оконная процедура возвращает нуль, если она обрабатывает это сообщение.

WM_INITMENUPOPUP

Отправляется тогда, когда "выскакивающее" (pop-up) меню или подменю собирается стать активным. Это позволяет прикладной программе изменить меню до того, как оно покажется на экране.

wparam содержит дескриптор "выскакивающего" меню или подменю.

Младшее слово lparam устанавливает отсчитываемую с нуля относительную позицию пункта меню, который открывает "выскакивающее" меню или подменю.

Старшее слово lparam устанавливает, является ли "выскакивающее" меню оконным меню. Если "выскакивающее" меню - это оконное меню, то значение этого параметра TRUE, в противном случае, значение этого параметра - FALSE.

Оконная процедура возвращает нуль, если она обрабатывает это сообщение.

WM_INPUT

Отправяется окну, которое принимает сырой ввод.

wparam содержит код ввода. Он принимает одно из значений перечисленных ниже.

RIM_INPUT - ввод произошел когда приложение располагалось на переднем плане. Приложение должно вызвать DefWindowProc, чтобы могла выполнить очистку.

RIM_INPUTSINK - ввод произошел когда приложение не располагалось на переднем плане. Приложение должно вызвать DefWindowProc, чтобы могла выполнить очистку.

lparam содержит дескриптор структуры RAWINPUT, которая содержит сырой ввод от устройства.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

Для получения значения wparam используйте макрос GET_RAWINPUT_CODE_WPARAM.

lparam содержит дескриптор структуры RAWINPUT, но не указатель на нее. Для получения сырых данных этот дескриптор в функции GetRawInputData.

Сырой ввод доступен только тогда когда приложение вызывает функцию RegisterRawInputDevices с действительными описаниями устройств.

WM_INPUT_DEVICE_CHANGE

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

wparam принимает одно из значений перечисленных ниже.

GIDC_ARRIVAL - в систему было добавлено новое устройство.

GIDC_REMOVAL - из системы было удалено устройство.

lparam содержит дескриптор устройства сырого ввода. Для получения дополнительной информации об устройстве используйте функцию GetRawInputDeviceInfo.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

Появилось в Windows Vista и Windows Server 2008.

WM_INPUTLANGCHANGE

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

wparam содержит набор символов новой локали.

lparam содержит идентификатор новой локали.

Приложение должно вернуть ненулевое значение, если оно обрабатывает это сообщение.

WM_INPUTLANGCHANGEREQUEST

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

wparam содержит комбинацию флагов, перечсленных ниже.

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

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

INPUTLANGCHANGE_SYSCHARSET - новая раскладка клавиатуры бы выбрана из системного набора.

lparam содержит идентификатор локали ввода.

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

Когда DefWindowProc получает это сообщение, они активирует новую локаль ввода и уведомляет приложение об изменении путем отправки ему сообщения WM_INPUTLANGCHANGE.

WM_KEYDOWN

Отправляется окну, которому принадлежит фокус ввода клавиатуры, во время нажатия на несистемную клавишу. Несистемная клавиша - это клавиша, которая нажимается при отпущенной клавише Alt.

wparam содержит код виртуальной несистемной клавишы. Перечень этих кодов смотри здесь.

lparam содержит количество повторений, флаг расширенной клавишы, код контекста, флаг предыдущего состояния клавишы, и флаг переходного состояния клавишы. Формат представления этой информации представлен ниже.

Биты 0-15 содержат количество повторений для текущего сообщения. Данное значение представляет собой количество автоматических повторений нажатий клавишы в результате удержания пользователем данной клавишы в нажатом состоянии. Если нажатие длится достаточно долго, то происходит отправка нескольких сообщений. Однако, количество повторений не является накопительным.

Биты 16-23 содержат скан-код. Зависит от устройства.

Бит 24 указывает является ли нажатая клавиша дополнительной клавишей, как например, правая Alt и Ctrl, которые появились на усовершенствованных 101- и 102- клавишных клавиатурах. Значение этого бита равное 1 указывает на то, что это дополнительная клавиша. В противном случае значение этого бита равно нулю.

Биты 25-28 зарезервированы и не используются.

Бит 29 содержит код контекста. Для сообщения WM_KEYDOWN его значение всегда равно нулю.

Бит 30 содержит предыдущее состояние клавишы. Его значение равно 1 если клавиша была нажата перед отправкой сообщения, или нуль, еси клавиша была отпущена.

Бит 31 хранит состояние переходаю Для сообщения WM_KEYDOWN его значение всегда равно нулю.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

Если клавиша F10 нажата, то функция DefWindowProc взводит внутренний флаг. Когда DefWindowProc получает сообщение WM_KEYUP, она проверяет этот внутренний флаг и, если он установлен, то окну верхнего уровня посылает сообщение WM_SYSCOMMAND. Параметр wparam этого сообщения содержит значение SC_KEYMENU.

Так как из-за повторения перед сообщением WM_KEYUP может быть послано несколько сообщений WM_KEYDOWN. Предыдущее состояние клавишы (бит 30) может быть использовано для определения того, является ли это первым нажатием клавишы, или же это повторение.

Для усовершенствованных 101- и 102- клавишных клавиатур к дополнительным клавишам отностся: правые Alt и Ctrl в основной части клавиатуры; клавишы Insert, Delete, Home, End, Page Up,Page Downи другие клавишы в группе клавиш слева от цифровой клавиатуры;а также клавишы деления (/) и Enter на цифровой клавиатуре. Некоторые клавиатуры могут поддерживать бит расширенной клавишы в параметре lparam.

Приложения должны передавать параметр wparam в функцию TranslateMessage без изменения в нем чего-либо.

WM_KEYFIRST

Сообщением не является. Данная константа используется для отбора сообщений, соответствующих клавиатурному вводу. Подробнее смотри в описании функции GetMessage.

WM_KEYLAST

Сообщением не является. Данная константа используется для отбора сообщений, соответствующих клавиатурному вводу. Подробнее смотри в описании функции GetMessage.

WM_KEYUP

Отправляется окну, владеющему фокусом ввода клавиатуры, когда отпускается несистемная клавиша. Несистемными клавишами являются клавишы, нажимаемые при отпущенной клавише Alt.

wparam содержит виртуальный код нажатой клавишы. Перечень доступных виртуальных кодов клавиш смотри здесь.

lparam содержит количество повторений, флаг расширенной клавишы, код контекста, флаг предыдущего состояния клавишы и флаг переходного состояния. Эта информация представляется в следующем формате.

Биты 0-15 содержат количество повторений для текущего сообщения. Данное значение представляет собой количество автоматических повторений нажатий клавишы в результате удержания пользователем данной клавишы в нажатом состоянии. Для сообщения WM_KEYUP данное значение всегда равно единице.

Биты 16-23 содержат скан код. Зависит от устройства.

Бит 24 указывает является ли отпущенная клавиша дополнительной клавишей, как например, правая Alt и Ctrl, которые появились на усовершенствованных 101- и 102- клавишных клавиатурах. Значение этого бита равное 1 указывает на то, что это дополнительная клавиша. В противном случае значение этого бита равно нулю.

Биты 25-28 зарезервированы и не используются.

Бит 29 хранит код контекста. Для сообщения WM_KEYUP он всегда равен нулю.

Бит 30 хранит предыдущее состояние клавишы. Для сообщения WM_KEYUP он всегда равен единице.

Бит 31 хранит состояние перехода. Для сообщения WM_KEYUP он всегда равен единице.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

Если были отпущена клавиша F10 или Alt, то функция DefWindowProc отправляет окну верхнего уровня сообщение WM_SYSCOMMAND. Параметр wparam отправляемого сообщения содержит значение SC_KEYMENU.

Для усовершенствованных 101- и 102- клавишных клавиатур к дополнительным клавишам отностся: правые Alt и Ctrl в основной части клавиатуры; клавишы Insert, Delete, Home, End, Page Up,Page Downи другие клавишы в группе клавиш слева от цифровой клавиатуры;а также клавишы деления (/) и Enter на цифровой клавиатуре. Некоторые клавиатуры могут поддерживать бит расширенной клавишы в параметре lparam.

Приложения должны передавать параметр wparam в функцию TranslateMessage без изменения в нем чего-либо.

WM_KILLFOCUS

Посылается окну перед тем как оно потеряет фокус ввода.

wparam содержит дескриптор окна, которое захватывает фокус ввода. Значение этого может быть равно NULL.

lparam не используется.

Если приложение обрабатывает это сообщение, оно должно вернуть значение нуль.

WM_LBUTTONDBLCLK

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

Окно получает это сообщение посредством оконной процедуры.

wparam указывает какие дополнительные клавишы были нажаты. Перечень доступных значений этого параметра представлен здесь. Параметр wparam принимает одно из этих значений или их комбинацию.

Младшее слово lparam содержит горизонтальную координату курсора мыши в клиентской системе координат.

Старшее слово lparam содержит вертикальную координату курсора мыши в клиентской системе координат.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

Не используйте макросы LOWORD и HIWORD, так как эти макросы возвращают неверные результаты в случае систем с несколькими мониторами. Такие системы могут иметь отрицательные значения координат курсора мыши. А макросы LOWORD и HIWORD интерпретируют их как беззнаковые значения.

Данное сообщение могут получать только те окна, у оконного класса которых установлен стиль CS_DBLCLKS.

Двойной щелчок левой кнопкой мыши в действительности приводит к генерации последовательности 4 сообщений: WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBLCLK и WM_LBUTTONUP.

WM_LBUTTONDOWN

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

wparam указывает какие дополнительные клавишы были нажаты. Перечень доступных значений этого параметра представлен здесь. Параметр wparam принимает одно из этих значений или их комбинацию.

Младшее слово lparam содержит горизонтальную координату курсора мыши в клиентской системе координат.

Старшее слово lparam содержит вертикальную координату курсора мыши в клиентской системе координат.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

Не используйте макросы LOWORD и HIWORD, так как эти макросы возвращают неверные результаты в случае систем с несколькими мониторами. Такие системы могут иметь отрицательные значения координат курсора мыши. А макросы LOWORD и HIWORD интерпретируют их как беззнаковые значения.

WM_LBUTTONUP

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

Окно получает это сообщение посредством оконной процедуры.

wparam указывает какие дополнительные клавишы были нажаты. Перечень доступных значений этого параметра представлен здесь. Параметр wparam принимает одно из этих значений или их комбинацию.

Младшее слово lparam содержит горизонтальную координату курсора мыши в клиентской системе координат.

Старшее слово lparam содержит вертикальную координату курсора мыши в клиентской системе координат.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

Не используйте макросы LOWORD и HIWORD, так как эти макросы возвращают неверные результаты в случае систем с несколькими мониторами. Такие системы могут иметь отрицательные значения координат курсора мыши. А макросы LOWORD и HIWORD интерпретируют их как беззнаковые значения.

WM_MBUTTONDBLCLK

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

Окно получает это сообщение посредством оконной процедуры.

wparam указывает какие дополнительные клавишы были нажаты. Перечень доступных значений этого параметра представлен здесь. Параметр wparam принимает одно из этих значений или их комбинацию.

Младшее слово lparam содержит горизонтальную координату курсора мыши в клиентской системе координат.

Старшее слово lparam содержит вертикальную координату курсора мыши в клиентской системе координат.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

Не используйте макросы LOWORD и HIWORD, так как эти макросы возвращают неверные результаты в случае систем с несколькими мониторами. Такие системы могут иметь отрицательные значения координат курсора мыши. А макросы LOWORD и HIWORD интерпретируют их как беззнаковые значения.

Данное сообщение могут получать только те окна, у оконного класса которых установлен стиль CS_DBLCLKS.

Двойной щелчок средней кнопкой мыши в действительности приводит к генерации последовательности 4 сообщений: WM_MBUTTONDOWN, WM_MBUTTONUP, WM_MBUTTONDBLCLK и WM_MBUTTONUP.

WM_MBUTTONDOWN

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

Окно получает это сообщение посредством оконной процедуры.

wparam указывает какие дополнительные клавишы были нажаты. Перечень доступных значений этого параметра представлен здесь. Параметр wparam принимает одно из этих значений или их комбинацию.

Младшее слово lparam содержит горизонтальную координату курсора мыши в клиентской системе координат.

Старшее слово lparam содержит вертикальную координату курсора мыши в клиентской системе координат.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

Не используйте макросы LOWORD и HIWORD, так как эти макросы возвращают неверные результаты в случае систем с несколькими мониторами. Такие системы могут иметь отрицательные значения координат курсора мыши. А макросы LOWORD и HIWORD интерпретируют их как беззнаковые значения.

WM_MBUTTONUP

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

Окно получает это сообщение посредством оконной процедуры.

wparam указывает какие дополнительные клавишы были нажаты. Перечень доступных значений этого параметра представлен здесь. Параметр wparam принимает одно из этих значений или их комбинацию.

Младшее слово lparam содержит горизонтальную координату курсора мыши в клиентской системе координат.

Старшее слово lparam содержит вертикальную координату курсора мыши в клиентской системе координат.

Когда на экране отображается контекстное меню положение курсора мыши описывается в экранных координатах.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

Не используйте макросы LOWORD и HIWORD, так как эти макросы возвращают неверные результаты в случае систем с несколькими мониторами. Такие системы могут иметь отрицательные значения координат курсора мыши. А макросы LOWORD и HIWORD интерпретируют их как беззнаковые значения.

WM_MDIACTIVATE

Приложение отправляет это сообщение клиентскому окну многодокументального интерфейса (MDI) для того чтобы сделать активным то или иное дочернее MDI окно.

wparam содержит дескриптор дочернего MDI окна, которое должно стать активным.

lparam не используется.

Если это сообщение отправляет клиентскому MDI окну, то оно всегда возвращает значение нуль.

Когда клиентское MDI окно обрабатывает это сообщение, то оно отправляет два сообщения WM_MDIACTIVATE: дочернему MDI окну, которое перестает быть активным и дочернему MDI окну, которое становится активным. Эти сообщения имеют следующие параметры.

wparam содержит дескриптор дочернего MDI окна, которое перестает быть активным.

lparam содержит дескриптор довернего MDI окна, которое становится активным.

Если дочернее MDI окно обрабатывает сообщение WM_MDIACTIVATE, то оно должно вернуть значение нуль.

Дочерние MDI окна активируются независимо от фреймового MDI окна. Когда фреймовое MDI окно становится активным, то дочернее MDI окно, активируемое сообщением WM_MDIACTIVATE получает сообщение WM_NCACTIVATE, требующее перерисовать рамку окна и заголовок. В этом случае сообщение WM_MDIACTIVATE дочернему MDI окну не отправляется.

WM_MDICASCADE

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

wparam содержит одно из значений перечисленных ниже, или их комбинацию.

MDITILE_SKIPDISABLED - предотвращает отображение недоступных дочерних MDI окон в каскаде окон.

MDITILE_ZORDER - размещает окна в соответствии с их порядком в Z последовательности.

lparam не используется.

Если сообщение успешно обработано, то возвращается значение TRUE.

Если же обработать сообщение не удалось, то возвращается значение FALSE.

WM_MDICREATE

Приложение отправляет это сообщение клиентскому окну многодокументального интерфейса (MDI) для создания дочернего MDI окна.

wparam не используется.

lparam содержит указатель на структуру MDICREATESTRUCT, содержащей информацию, которую система использует при создании дочернего MDI окна.

Если сообщение успешно обработано, то возвращается дескриптор созданного дочернего окна.

Если же сообщение обработать не удалось, то возвращается значение NULL.

Дочернее MDI окно создается со стилями WS_CHILD, WS_CLIPSIBLINGS, WS_CLIPCHILDREN, WS_SYSMENU, WS_CAPTION, WS_THICKFRAME, WS_MINIMIZEBOX и WS_MAXIMIZEBOX, плюс дополнительне стили указанные в структуре MDICREATESTRUCT. Система добавляет заголовок нового дочернего окна в меню фреймового окна. Приложение должно использовать это сообщение для создания всех дочерних MDI окон.

Когда дочернее MDI окно создано, ситема отправляет окну сообщение WM_CREATE. Параметр lparam этого сообщения содержит указатель на структуру CREATESTRUCT. Поле lpCreateParams этой структуры содержит указатель на структуру MDICREATESTRUCT, которая была передана с сообщением WM_MDICREATE, создавшем данное окно.

Приложения не должны отправлять новые сообщения WM_MDICREATE пока не будет обработано текущее сообщение.

WM_MDIDESTROY

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

wparam содержит дескриптор закрываемого дочернего MDI окна.

lparam не используется.

Данное сообщение всегда возвращает значение нуль.

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

Если закрывается активное развернутое окно, то система после его закрытия активирует и разворачивает на весь экран новое активное окно.

WM_MDIGETACTIVE

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

wparam не используется.

Если значение lparam не равно NULL, то он содержит указатель на значение, характеризующее состояние окна. Если оно равно TRUE, то активное окно развернуто. Если же оно равно FALSE, то активное окно не развернуто. Если значение lparam равно NULL, то он игнорируется.

В ответ на сообщение возвращается дескриптор активного дочернего MDI окна.

WM_MDIICONARRANGE

Приложение отправляет это сообщение клиентскому окну многодокументального интерфейса (MDI) для того, чтобы упорядочить все свернутые дочерние MDI окна. Данное сообщение никак не влияет на не свернутые дочерние MDI окна.

wparam не используется. Его значение должно быть равно нулю.

lparam не используется. Его значение должно быть равно нулю.

WM_MDIMAXIMIZE

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

wparam содержит дескриптор дочернего MDI окна, которое нужно развернуть.

lparam не используется.

Возвращаемое значение всегда равно нулю.

WM_MDINEXT

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

wparam содержит дескриптор дочернего MDI окна. Система активирует дочернее MDI окно, являющееся предыдущим или следующим по отношению к окну, заданному в параметре wparam. Если значение wparam равно NULL, то система активирует дочернее MDI окно, являющееся предыдущим или следующим по отношению к текущему активному окну.

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

Возвращаемое значение всегда равно нулю.

Если данное сообщение поступило в тот момент, когда текущее активное окно было развернуто, то система восстанавливает исходный размер этого окна, активирует и разворачивает новое активное окно.

WM_MDIREFRESHMENU

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

wparam не используется и должен быть равен нулю.

lparam не используется и должен быть равен нулю.

Если сообщение успешно обработано, то возвращается дескриптор меню фреймового окна.

Если же произошла ошибка, то возвращается значение NULL.

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

WM_MDIRESTORE

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

wparam содержит дескриптор дочернего MDI окна, которое нужно восстановить.

lparam не используется.

Возвращаемое значение всегда равно нулю.

WM_MDISETMENU

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

wparam содержит дескриптор нового меню фреймового MDI окна. Если значение этого параметра NULL, то меню фреймового MDI окна не изменяется.

lparam содержит дескриптор нового системного меню. Если значение этого параметра NULL, то системное меню не изменяется.

Если сообщение успешно обработано, то возвращается дескриптор старого меню фреймового MDI окна.

Если же обработать сообщение не удалось, то возвращается значение нуль.

После отправки сообщения приложение должно вызвать функцию DrawMenuBar для обновления меню.

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

WM_MDITILE

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

wparam содержит ориентацию мозаики. Он содержит одно из занчений перечисленных ниже, которое может сочетаться с флагом MDITILE_SKIPDISABLED, которое предотвращает отображение в мозаике недоступных дочерних MDI окон.

MDITILE_HORIZONTAL - мозаика ориентируется по горизонтали.

MDITILE_VERTICAL - мозаика ориентируется по вертикали.

lparam не используется.

Если сообщение успешно обработано, то возвращается значение TRUE. Если же при обработке сообщения произошла ошибка, то возвращается значение FALSE.

WM_MEASUREITEM

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

wparam содержит значение поля CtlID структуры MEASUREITEMSTRUCT, на которую указывает lparam. Это значение идентифицирует элемент управления, который послал сообщение. Если значение равно нулю, то сообщение пришло от меню. Если значение отлично от нуля, то сообщение было послано спиксом или комбинированным списком. Если значение отлично от нуля, и значение поля itemID структуры MEASUREITEMSTRUCT равно -1, то сообщение было послано полем ввода комбинированного списка.

lparam содержит указатель на структуру MEASUREITEMSTRUCT, которая описывает размеры элемента управления или пункта меню.

Если приложение обрабатывает это сообщение, оно должно вернуть значение TRUE.

Система посылает это сообщение окну-владльцу списка или комбинированного списка с установленным стилем OWNERDRAWFIXED перед отправкой сообщения WM_INITDIALOG. В результате когда окно-владелец получает это сообщение, система еще не определила высоту и ширину шрифта, используемого в элементе управления.

WM_MENUCHAR

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

Младшее слово wparam содержит код символа, ассоциированного с нажатой пользователем клавишей.

Старшее слово wparam определяет тип активного меню. Он принимает одно из значений представленных ниже.

MF_POPUP - выскакивающее меню, подменю или контекстное меню.

MF_SYSMENU - системное оконное меню.

lparam содержит дескриптор активного меню.

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

MNC_CLOSE - указывает системе на то, что она должна закрыть активное меню.

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

MNC_IGNORE - указывает системе на то, что она должна проигнорировать клавишу, на которую нажал пользователь, и подать короткий звуковой сигнал на системный динамик.

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

Если старшее слово возвращаемого значения равно MNC_CLOSE или MNC_IGNORE, то младшее слово возвращаемого значения игнорируется.

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

WM_MENUSELECT

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

Младшее слово wparam определяет индекс пункта меню или подменю. Если выбранный пункт меню является командным пунктом, то младшее слово wparam содержит идентификатор пункта меню. Если выбранный пункт открывает выскакивающее меню или подменю, то данный параметр содержит индекс открываемого меню в основном меню, а lparam содержит дескриптор основного меню. Для получения дескриптора подменю используйте функцию GetSubMenu.

Старшее слово wparam содержит один или несколько флагов меню.

lparam содержит дескриптор меню, пункт которого был выбран.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

Если старшее слово wparam равно 0xFFFF и lparam содержит значение NULL, то это значит, что система закрыла меню.

Не используйте значение -1 для старшего слова wparam, так как данное значение интерпретируется как беззнаковое целое. То есть значение 0xFFFF интерпретируется как 0x0000FFFF, а не -1.

WM_MOUSEACTIVATE

Сообщение отправляется тогда, когда курсор мыши находится над неактивным окном и пользователь нажимает на кнопку мыши. Родительское окно получает это сообщение, только в том случае, если дочернее окно передает его в функцию DefWindowProc.

wparam содержит дескриптор родительского окна верхнего уровня, которое становится активным.

Младшее слово lparam содержит позицию курсора, возвращенную функцией DefWindowProc при обработке сообщения WM_NCHITTEST.

Старшее слово lparam определяет идентификатор сообщения, созданный системой при отправке сообщения. Сообщение мыши или сбрасывается, или посылается в окно, в зависимости от возвращаемого оконной процедурой значения.

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

MA_ACTIVATE - активизировать окно и не сбрасывать сообщение мыши.

MA_ACTIVATEANDEAT - активизировать окно и сбросить сообщение мыши.

MA_NOACTIVATE - не активизировать окно и не сбрасывать сообщение мыши.

MA_NOACTIVATEANDEAT - не активизировать окно и сбросить сообщение мыши.

WM_MOUSEFIRST

Сообщением не является. Данная константа используется для отбора сообщений, соответствующих событиям мыши. Подробнее смотри в описании функции GetMessage.

WM_MOUSEHOVER

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

Окно получает это сообщение с помощью функции WindowProc.

wparam содержит информацию о том, какие клавишы находятся в нажатом состоянии. Перечень доступных клавиш представлен здесь. wparam содержит одно или несколько значений из этого перечня.

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

Старшее слово lparam содержит вертикальную координату положения курсора мыши в клиентской системе координат.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

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

Используйте следующий код для получения горизонтальной и вертикальной координат.

xPos = GET_X_LPARAM(lParam);

yPos = GET_Y_LPARAM(lParam);

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

Не используйте макросы LOWORD и HIGHWORD, так как эти макросы возвращают неверные результаты в случае систем с несколькими мониторами.

WM_MOUSELAST

Сообщением не является. Данная константа используется для отбора сообщений, соответствующих событиям мыши. Подробнее смотри в описании функции GetMessage.

WM_MOUSELEAVE

Отправляется окну когда курсор мыши покидает клиентскую область окна, заданного в предыдущем вызове функции TrackMouseEvent.

Окно получает это сообщение с помощью оконной процедуры WindowProc.

wparam и lparam не используются и должны быть равны нулю.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

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

WM_MOUSEMOVE

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

Значение wparam указывает на то, какие клавишы были нажаты. Допустимые значения клавиш представлены здесь. Параметр wparam принимает одно из этих значений или их комбинацию.

Младшее слово lparam содержит горизонтальную координату курсора мыши в клиентской системе координат.

Старшее слово lparam содержит вертикальную координату курсора мыши в клиентской системе координат.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

Для получения значений координат используйте макросы GET_X_LPARAM и GET_Y_LPARAM.

Не используйте макросы LOWORD и HIWORD, так как эти макросы возвращают неверные результаты в случае систем с несколькими мониторами. Такие системы могут иметь отрицательные значения координат курсора мыши. А макросы LOWORD и HIWORD интерпретируют их как беззнаковые значения.

WM_MOUSEWHEEL

Посылается окну, владеющему фокусом ввода при вращении колёсика мыши. Функция DefWindowProc пересылает это сообщение родительским окнам вверх по дереву родства до тех пор пока не найдется окно, которое обработает это сообщение.

Окно получает это сообщение посредством оконной процедуры.

Старшее слово wparam содержит величину на которую было повернуто колёсико, кратную или дробную по отношению к WHEEL_DELTA, равной 120. Положительное значение перемещения соответствует повороту колёсика по направлению от пользователя. Отрицательное значение перемещения соответсвует повороту колёсика по направлению к пользователю.

Младшее слово wparam указывает какие дополнительные клавишы были нажаты. Перечень доступных значений этого параметра представлен здесь. Младшее слово wparam принимает одно из этих значений или их комбинацию.

Младшее слово lparam содержит горизонтальную координату курсора мыши в экранной системе координат.

Старшее слово lparam содержит вертикальную координату курсора мыши в экранной системе координат.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

Не используйте макросы LOWORD и HIWORD, так как эти макросы возвращают неверные результаты в случае систем с несколькими мониторами. Такие системы могут иметь отрицательные значения координат курсора мыши. А макросы LOWORD и HIWORD интерпретируют их как беззнаковые значения.

Колёсико поворачивается на величину кратную WHEEL_DELTA. Это шаг, с которым происходит поворот колёсика мыши.

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

WM_MOVE

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

wparam не используется.

Старшее слово lparam содержит y-координату левого верхнего угла клиентской области окна. Младшее слово lparam содержит x-координату левого верхнего угла клиентской области окна.

Для дочерних окон координаты передаются в клиентской системе координат родительского окна. Для всех остальных окон - в экранной системе координат.

WM_MOVING

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

Приложение получает это сообщение посредством своей оконной процедуры WindowProc.

wparam не используется.

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

Если приложение обрабатывает это сообщение, то оно должно вернуть значение TRUE.

WM_NCACTIVATE

Сообщение посылается тогда, когда неклиентская область окна должна быть изменена. Сообщение посылается, чтобы установить активное или неактивное состояние изменяемой области.

Если перерисовывается активный заголовок или иконка, то значение параметра wparam равно TRUE. Если перерисовывается неактивный заголовок или иконка, то значение параметра wparam равно FALSE.

Если для окна активирован визуальный стиль параметр lparam не используется.

Если для окна визуальный стиль не активирован параметр lparam содержит дескриптор дополнительного региона обновления для неклиентской области окна. Если значение этого параметра равно -1, DefWindowProc не перерисовывает неклиентскую область окна.

Если значение wparam равно FALSE приложение должно вернуть значение TRUE, когда система должна обработать его по умолчанию, значение FALSE, чтобы предотвратить изменение.

Если значение wparam равно TRUE, возвращаемое значение игнорируется.

WM_NCCALCSIZE

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

wparam содержит логическое значение. Если оно равно TRUE, то определяется, что оконная процедура должна указать, какая часть клиентской области окна содержит допустимую информацию. Операционная система копирует правильную информацию в указанный район внутри новой клиентской области.

Если значение wparam равно FALSE, оконная процедура не должна указывать какая часть клиентской области окна является верной.

Если значение wparam равно TRUE, то lparam указывает на структуру NCCALCSIZE_PARAMS, которая содержит информацию, которую приложение может использовать для вычисления нового размера и позиции клиентской области.

Если значение wparam равно FALSE, то lparam указывает на структуру RECT, которая содержит новые координаты окна, размеры или положение которого были изменены.

Если значение wparam равно FALSE, то оконная процедура должна вернуть нуль.

Если значение wparam равно TRUE, то оконная процедура должна вернуть или нуль (в этом случае старая клиентская область сохраняется и выравнивается по левому верхнему углу новой клиентской области), или комбинацию флагов.

WM_NCCREATE

Отправляется перед сообщением WM_CREATE во время создания окна.

wparam не используется.

lparam содержит указатель на структуру CREATESTRUCT, которая содержит информацию о создаваемом окне. Поля структуры CREATESTRUCT идентичны параметрам функции CreateWindowEx.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение TRUE, чтобы продолжить процесс создания окна. Если приложение в ответ на это сообщение вернет значение FALSE, то функции CreateWindow или CreateWindowEx вернут значение NULL.

WM_NCDESTROY

Информирует окно, что его клиентская область разрушается. Функция DestroyWindow посылает окну это сообщение после сообщения WM_DESTROY.

wparam и lparam не используются.

Если оконная процедура обрабатывает это сообщение, она возвращает нуль.

WM_NCHITTEST

Запрашивает какой части окна соответствует точка с определенными экранными координатами. Данное сообщение отправляется при перемещении курсора мыши, нажатии или отпускании кнопки мыши. Если мышь не захвачена сообщение отправляется окну находящемуся под курсором мыши. В противном случае (если мышь захвачена) сообщение отправляется окну, которое захватило мышь.

wparam не используется.

Младшее слово lparam определяет горизонтальную координату курсора мыши. Старшее слово lparam определяет вертикальную координату курсора мыши. Все координаты передаются в экранной системе координат.

Оконная процедура возвращает одно из значений, характеризующее текущее положение курсора мыши.

WM_NCLBUTTONDBLCLK

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

wparam содержит положение курсора мыши, возвращенное функцией DefWindowProc в результате обработки сообщения WM_NCHITTEST.

lparam содержит структуру POINTS, содержащую экранные координаты положения курсора мыши.

Если приложение обрабатывает это сообщение, оно должно вернуть значение нуль.

WM_NCLBUTTONDOWN

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

wparam содержит положение курсора мыши, возвращенное функцией DefWindowProc в результате обработки сообщения WM_NCHITTEST.

lparam содержит структуру POINTS, содержащую экранные координаты положения курсора мыши.

Если приложение обрабатывает это сообщение, оно должно вернуть значение нуль.

WM_NCLBUTTONUP

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

wparam содержит положение курсора мыши, возвращенное функцией DefWindowProc в результате обработки сообщения WM_NCHITTEST.

lparam содержит структуру POINTS, содержащую экранные координаты положения курсора мыши.

Если приложение обрабатывает это сообщение, оно должно вернуть значение нуль.

WM_NCMBUTTONDBLCLK

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

wparam содержит положение курсора мыши, возвращенное функцией DefWindowProc в результате обработки сообщения WM_NCHITTEST.

lparam содержит структуру POINTS, содержащую экранные координаты положения курсора мыши.

Если приложение обрабатывает это сообщение, оно должно вернуть значение нуль.

WM_NCMBUTTONDOWN

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

wparam содержит положение курсора мыши, возвращенное функцией DefWindowProc в результате обработки сообщения WM_NCHITTEST.

lparam содержит структуру POINTS, содержащую экранные координаты положения курсора мыши.

Если приложение обрабатывает это сообщение, оно должно вернуть значение нуль.

WM_NCMBUTTONUP

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

wparam содержит положение курсора мыши, возвращенное функцией DefWindowProc в результате обработки сообщения WM_NCHITTEST.

lparam содержит структуру POINTS, содержащую экранные координаты положения курсора мыши.

Если приложение обрабатывает это сообщение, оно должно вернуть значение нуль.

WM_NCMOUSELEAVE

Отправляется окну когда курсор мыши покидает неклиентскую область окна, заданного в предыдущем вызове функции TrackMouseEvent.

Окно получает это сообщение посредством оконной процедуры WindowProc.

wparam и lparam не используются и должны быть равны нулю.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

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

WM_NCMOUSEMOVE

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

wparam содержит положение курсора мыши, возвращенное функцией DefWindowProc в результате обработки сообщения WM_NCHITTEST.

lparam содержит структуру POINTS, содержащую экранные координаты положения курсора мыши.

Если приложение обрабатывает это сообщение, оно должно вернуть значение нуль.

WM_NCPAINT

Отправляется окну тогда, когда должна отрисоваться его рамка.

wparam содержит дескриптор обновляемого региона окна. Обновляемый регион окна ограничен рамкой окна.

lparam не используется.

Если оконная процедура обрабатывает это сообщение, она возвращает нуль.

WM_NCRBUTTONDBLCLK

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

wparam содержит положение курсора мыши, возвращенное функцией DefWindowProc в результате обработки сообщения WM_NCHITTEST.

lparam содержит структуру POINTS, содержащую экранные координаты положения курсора мыши.

Если приложение обрабатывает это сообщение, оно должно вернуть значение нуль.

WM_NCRBUTTONDOWN

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

wparam содержит положение курсора мыши, возвращенное функцией DefWindowProc в результате обработки сообщения WM_NCHITTEST.

lparam содержит структуру POINTS, содержащую экранные координаты положения курсора мыши.

Если приложение обрабатывает это сообщение, оно должно вернуть значение нуль.

WM_NCRBUTTONUP

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

wparam содержит положение курсора мыши, возвращенное функцией DefWindowProc в результате обработки сообщения WM_NCHITTEST.

lparam содержит структуру POINTS, содержащую экранные координаты положения курсора мыши.

Если приложение обрабатывает это сообщение, оно должно вернуть значение нуль.

WM_NCXBUTTONDBLCLK

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

Окно получает это сообщение посредством своей оконной процедуры WindowProc.

Младшее слово wparam содержит положение курсора мыши, возвращенное функцией DefWindowProc в результате обработки сообщения WM_NCHITTEST.

Старшее слово wparam содержит информацию о том, какой дополнительной кнопкой был произведен двойной щелчок. Допустимые значения перечислены ниже (в скобках указаны фактические значения констант).

XBUTTON1 (0x0001) - первая дополнительная кнопка.

XBUTTON2 (0x0002) - вторая дополнительная кнопка.

lparam содержит указатель на структуру POINTS, которая содержит координаты курсора мыши в экранной системе координат.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение TRUE.

Используйте следующий код для извлечения информации, содержащейся в wparam.

nHittest = GET_NCHITTEST_WPARAM(wparam);

fwButton = GET_XBUTTON_WPARAM(wparam);

WM_NCXBUTTONDOWN

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

Окно получает это сообщение посредством своей оконной процедуры WindowProc.

Младшее слово wparam содержит положение курсора мыши, возвращенное функцией DefWindowProc в результате обработки сообщения WM_NCHITTEST.

Старшее слово wparam содержит информацию о том, какая дополнительная кнопка была нажата. Допустимые значения перечислены ниже (в скобках указаны фактические значения констант).

XBUTTON1 (0x0001) - первая дополнительная кнопка.

XBUTTON2 (0x0002) - вторая дополнительная кнопка.

lparam содержит указатель на структуру POINTS, которая содержит координаты курсора мыши в экранной системе координат.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение TRUE.

Используйте следующий код для извлечения информации, содержащейся в wparam.

nHittest = GET_NCHITTEST_WPARAM(wparam);

fwButton = GET_XBUTTON_WPARAM(wparam);

WM_NCXBUTTONUP

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

Окно получает это сообщение посредством своей оконной процедуры WindowProc.

Младшее слово wparam содержит положение курсора мыши, возвращенное функцией DefWindowProc в результате обработки сообщения WM_NCHITTEST.

Старшее слово wparam содержит информацию о том, какая дополнительная кнопка была отпущена. Допустимые значения перечислены ниже (в скобках указаны фактические значения констант).

XBUTTON1 (0x0001) - первая дополнительная кнопка.

XBUTTON2 (0x0002) - вторая дополнительная кнопка.

lparam содержит указатель на структуру POINTS, которая содержит координаты курсора мыши в экранной системе координат.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение TRUE.

Используйте следующий код для извлечения информации, содержащейся в wparam.

nHittest = GET_NCHITTEST_WPARAM(wparam);

fwButton = GET_XBUTTON_WPARAM(wparam);

WM_NEXTDLGCTL

Отправляется в диалоговую процедуру, чтобы установить фокус ввода клавиатуры в другой элемент управления диалогового окна.

Если lparam принимает значение TRUE, то wparam идентифицирует элемент управления, который получает фокус ввода. Если lparam принимает значение FALSE, то wparam идентифицирует следующий или предыдущий элемент управления с установленным стилем WS_TABSTOP, который получает фокус ввода. Если значение wparam равно нулю, то фокус ввода передается следующему элементу управления; в противном случае, фокус ввода передается предыдущему элементу управления с установленным стилем WS_TABSTOP.

Младшее слово lparam указывает на то, как следует интерпретировать wparam. Если значение младшего слова lparam равно TRUE, то wparam содержит дескриптор окна элемента управления, который получает фокус ввода. В противном случае, wparam представляет собой флаг, который указывает какой элемент управления (предыдущий или следующий) с установленным стилем WS_TABSTOP получает фокус ввода.

Если приложение обрабатывает это сообщение, оно должно вернуть значение нуль.

WM_NEXTMENU

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

wparam содержит виртуальный код нажатой клавишы. Перечень виртуальных кодов клавиш смотрите здесь.

lparam содержит указатель на структуру MDINEXTMENU, которая содержит информацию об активируемом меню.

При обработке этого сообщения приложение должно заполнить поля hmenuNext и hwndNext структуры MDINEXTMENU. По умолчанию эти поля инициализируются значениями NULL.

WM_NOTIFY

Отправляется элементом управления своему родительскому окну когда происходит какое-либо событие или элемент управления запрашивает какую-либо информацию.

wparam содержит идентификатор элемента управления, отправившего сообщение. Уникальность этого идентификатора не гарантируется. Для идентификации элемента управления приложения должны использовать поля hwndFrom или idFrom структуры NMHDR, на которую указывает lparam.

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

Для большинства сообщений возвращаемое значение игнорируется.

WM_NOTIFYFORMAT

Позволяет определить какой формат структур (ANSI или UNICODE) принимает окно в сообщении WM_NOTIFY. Сообщение WM_NOTIFYFORMAT посылается от элемента управления к родительскому окну и от родительского окна к элементу управления.

wparam содержит дескриптор окна, которое отправило сообщение WM_NOTIFYFORMAT. Если значение lparam равно NF_QUERY, то wparam содержит дескриптор элемента управления. Если же значение lparam равно NF_REQUERY, то wparam содержит дескриптор окна, являющегося родительским по отношению к элементу управления.

lparam содержит значение из перечисленных ниже.

NF_QUERY - сообщение представляет собой запрос на определение типа структуры (ANSI или UNICODE) используемой в сообщении WM_NOTIFY. Эта команда передается от элемента управления родительскому окну во время создания элемента управления в ответ на команду NF_REQUERY.

NF_REQUERY - сообщение представляет собой команду элементу управления послать команду NF_QUERY своему родительскому окну. Команда NF_REQUERY передается от родительского окна. Родительское окно запрашивает у элемента управления информацию о том, какой тип структур элемент управления использует в сообщении WM_NOTIFY. Если значение lparam равно NF_REQUERY то возвращаемое значение является результатом выполнения запроса.

Возвращается одно из значений, перечисленных ниже.

NFR_ANSI - в сообщениях WM_NOTIFY должны использоваться ANSI варианты структур.

NFR_UNICODE - в сообщениях WM_NOTIFY должны использоваться UNICODE варианты структур.

0 - произошла ошибка.

WM_NULL

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

Окно принимает это сообщение посредством своей оконной процедуры WindowProc.

wparam не используется.

lparam не используется.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

Например если приложение установило хук WH_GETMESSAGE и хочет предотвратить обработку какого-либо сообщения, то функция обратного вызова GetMsgProc может имзенять номер соообщения на WM_NULL, в результате этого окно, принимающее сообщение будет игнорировать его.

Другой пример, приложение может проверить отвечает ли окно на сообщения или нет, путем отправки сообщения WM_NULL с помощью функции SendMessageTimeout.

WM_PAINT

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

wparam и lparam не используются.

Оконная процедура возвращает нуль, если она обрабатывает это сообщение.

WM_PAINTCLIPBOARD

Отправляется владельцу буфера обмена окном просмотрщика буфера обмена когда буфер обмена содержит данные в формате CF_OWNERDISPLAY и клиентская область окна просмотрщика буфера обмена нуждается в перерисовке.

wparam содержит дескриптор окна просмотрщика буфера обмена.

lparam содержит дескриптор глобального объекта памяти (global memory object), который содержит структуру PAINTSTRUCT. Эта структура описывает часть клиентской области окна, которая нуждается в перерисовке.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

Для определения того, нуждается ли в перерисовке вся клиентская область окна или только ее часть, владелец буфера обмена должен сравнить размеры перерисовываемой области, переданные в поле rcPaint структуры PAINTSTRUCT, с размерами, переданными в последнем сообщении WM_SIZECLIPBOARD.

Владелец буфера обмена должен использовать функцию GlobalLock для блокирования памяти, содержащей структуру PAINTSTRUCT. Перед возращением управления, владелец буфера обмена должен разблокировать память с помощью функции GlobalUnlock.

WM_PAINTICON

Отправляется в окно, когда должна быть отрисована иконка, но только в том случае, если приложение написано для Windows 3.x. Окно получает это сообщение, только в том случае, если для окна определена иконка оконного класса. В противном случае вместо этого сообщения посылается сообщение WM_PAINT.

wparam и lparam не используются.

Оконная процедура возвращает нуль, если она обрабатывает это сообщение.

WM_PALETTECHANGED

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

Окно получает это сообщение посредством своей оконной процедуры WindowProc.

wparam содержит дескриптор окна, которое изменило системную палитру.

lparam не используется.

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

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

WM_PALETTEISCHANGING

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

Приложение получает это сообщение посредством своей оконной процедуры WindowProc.

wparam содержит дескриптор окна, которое собирается реализовать свою собственную логическую палитру.

lparam не используется.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

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

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

WM_PASTE

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

wparam не используется и должен быть равен нулю.

lparam не используется и должен быть равен нулю.

Оконная процедура не возвращает никакого значения.

Когда это сообщение отправляется комбинированному списку, то оно обрабатывается полем ввода этого списка. Если комбинированный список имеет стиль CBS_DROPDOWNLIST, то данное сообщение никак не влияет на список.

WM_PENWINFIRST

Недокументировано.

WM_PENWINLAST

Недокументировано.

WM_POWER

Уведомляет приложение о том, что система готовится к переходу в спящий режим. Данное сообщение является устаревшим, используется только для совместимости с 16-разрядными приложениями. Современные приложения должны использовать сообщение WM_POWERBROADCAST.

wparam содержит одно из значений представленных ниже.

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

PWR_SUSPENDREQUEST - указывает на то, что система готовится к переходу в спящий режим.

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

lparam не используется.

Возвращаемое значение зависит от значения параметра wparam. Если значение wparam равно PWR_SUSPENDREQUEST, то возвращаемое значение PWR_FAIL предотвращает переход системы в спящий режим. Если же возвращаемое значение равно PWR_OK, то система может переходить в спящий режим. Если же значение wparam равно PWR_SUSPENDRESUME или PWR_CRITICALRESUME, то возвращаемое значение равно нулю.

WM_POWERBROADCAST

Уведомляет приложение о том, что произошло событие управления питанием.

wparam содержит значение, определяющее произошедшее событие питания.

Для большинства событий значение lparam зарезервировано и не используется.

Если значение wparam равно PBT_POWERSETTINGCHANGE, lparam содержит указатель на структуру POWERBROADCAST_SETTING.

Если приложение обрабатывает это сообщение, оно должно вернуть значение TRUE.

WM_PRINT

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

wparam содержит дескриптор контекста устройства, в котором окно должно быть отрисовано.

lparam определяет параметр отрисовки.

WM_PRINTCLIENT

То же самое что WM_PRINT но, в отличие от него не обрабатывается DefWindowProc.

WM_QUERYDRAGICON

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

wparam и lparam не используются.

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

WM_QUERYENDSESSION

Отправляется тогда, когда пользователь выбирает завершение сеанса или когда какое-лтбо приложение вызывает одну из функций перезагрузки системы. Если какое-либо приложение возвращает значение нуль сеанс не завершается. Система прекращает рассылку сообщений WM_QUERYENDSESSION как только какое-либо из приложений вернет значение нуль.

После обработки этого сообщения система рассылает сообщения WM_ENDSESSION со значением wparam равным результату обработки сообщения WM_QUERYENDSESSION.

wparam зарезервирован для будущего использования.

Если значение lparam равно нулю, то система завершает свою работу или перезагружается.

Так же значение lparam может принимать одно из значений представленных ниже или их комбинацию.

ENDSESSION_CLOSEAPP - приложение использует файл, который должен быть заменен, система будет обслуживаться или исчерпались системные ресурсы.

ENDSESSION_CRITICAL - приложение вынуждено закрыться.

ENDSESSION_LOGOFF - пользователь завершает сеанс.

WM_QUERYNEWPALETTE

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

Окно получает это сообщение посредством своей оконной процедуры WindowProc.

wparam не используется.

lparam не используется

Если окно реализовывает свою логическую палитру, то оно должно вернуть значение TRUE. В противном случае оно должно вернуть значение FALSE.

WM_QUERYOPEN

Отправляется иконке когда пользователь запрашивает восстановить окно в его предыдущем размере и положении.

wparam и lparam не используются.

Если иконка может быть открыта, приложение, которое обрабатывает это сообщение должно вернуть значение TRUE. В противном случае (чтобы предотвратить открвтие иконки) приложение должно вернуть значение FALSE.

WM_QUEUESYNC

Посылается прикладной программой машинной подготовки (CBT), чтобы отделить сообщения пользовательского ввода от других сообщений, передаваемых через процедуру WH_JOURNALPLAYBACK.

wparam и lparam не используются.

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

Когда CBT приложение использует процедуру WH_JOURNALPLAYBACK первое и последнее сообщения являются сообщениями WM_QUEUESYNC.Это позволяет CBT приложениям прерывать и проверять инициированные пользователем сообщения без прерывания и обработки тех событий, которые вызывают эти сообщения.

WM_QUIT

Извещает о запросе завершить работу приложения. Отправляется когда приложение вызывает функцию PostQuitMessage.

wparam содержит код выхода, переланный в функцию PostQuitMessage.

lparam не используется.

Оконная процедура не возвращает никакого значения, так как цикл обработки сообщений прерывается до того, как это сообщение будет передано оконной процедуре.

WM_RBUTTONDBLCLK

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

Окно получает это сообщение посредством оконной процедуры.

wparam указывает какие дополнительные клавишы были нажаты. Перечень доступных значений этого параметра представлен здесь. Параметр wparam принимает одно из этих значений или их комбинацию.

Младшее слово lparam содержит горизонтальную координату курсора мыши в клиентской системе координат.

Старшее слово lparam содержит вертикальную координату курсора мыши в клиентской системе координат.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

Не используйте макросы LOWORD и HIWORD, так как эти макросы возвращают неверные результаты в случае систем с несколькими мониторами. Такие системы могут иметь отрицательные значения координат курсора мыши. А макросы LOWORD и HIWORD интерпретируют их как беззнаковые значения.

Данное сообщение могут получать только те окна, у оконного класса которых установлен стиль CS_DBLCLKS.

Двойной щелчок правой кнопкой мыши в действительности приводит к генерации последовательности 4 сообщений: WM_RBUTTONDOWN, WM_RBUTTONUP, WM_RBUTTONDBLCLK и WM_RBUTTONUP.

WM_RBUTTONDOWN

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

Окно получает это сообщение посредством оконной процедуры.

wparam указывает какие дополнительные клавишы были нажаты. Перечень доступных значений этого параметра представлен здесь. Параметр wparam принимает одно из этих значений или их комбинацию.

Младшее слово lparam содержит горизонтальную координату курсора мыши в клиентской системе координат.

Старшее слово lparam содержит вертикальную координату курсора мыши в клиентской системе координат.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

Не используйте макросы LOWORD и HIWORD, так как эти макросы возвращают неверные результаты в случае систем с несколькими мониторами. Такие системы могут иметь отрицательные значения координат курсора мыши. А макросы LOWORD и HIWORD интерпретируют их как беззнаковые значения.

WM_RBUTTONUP

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

Окно получает это сообщение посредством оконной процедуры.

wparam указывает какие дополнительные клавишы были нажаты. Перечень доступных значений этого параметра представлен здесь. Параметр wparam принимает одно из этих значений или их комбинацию.

Младшее слово lparam содержит горизонтальную координату курсора мыши в клиентской системе координат.

Старшее слово lparam содержит вертикальную координату курсора мыши в клиентской системе координат.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

Не используйте макросы LOWORD и HIWORD, так как эти макросы возвращают неверные результаты в случае систем с несколькими мониторами. Такие системы могут иметь отрицательные значения координат курсора мыши. А макросы LOWORD и HIWORD интерпретируют их как беззнаковые значения.

WM_RENDERALLFORMATS

Отправляется владельцу буфера обмена перед разрушением буфера обмена, если владелец буфера обмена имеет отложенные отображения (delayed rendering) данных одного или нескольких форматов. Для того, чтобы содержимое буфера обмена было доступно другим приложениям, владелец буфера обмена должен преобразовать данные во все форматы, которые он может сгенерировать, и разместить данные в буфере обмена с помощью функции SetClipboardData.

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

wparam не используется и должен быть равен нулю.

lparam не используется и должен быть равен нулю.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

При обработке сообщения WM_RENDERALLFORMATS владелец буфера обмена должен вызвать функции OpenClipboard и EmptyClipboard перед вызовом функции SetClipboardData.

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

WM_RENDERFORMAT

Отправляется владельцу буфера обмена, если он поддерживает отложенное отображение данных (delayed rendering) в заданном формате буфера обмена, и если у приложения запросили данные в этом формате. Владелец буфера обмена в ответ на это сообщение должен представить данные в указанном формате и разместить их в буфере обмена с помощью функции SetClipboardData.

wparam содержит формат буфера обмена.

lparam не используется.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

При обработке сообщения WM_RENDERFORMAT владелец буфера обмена не должен открывать его до вызова функции SetClipboardData.

WM_SETCURSOR

Отправляется окну, когда курсор мыши перемещается внутри этого окна и ввод мыши не захвачен.

wparam содержит дескриптор окна, которому принадлежит курсор.

Младшее слово lparam определяет код положения курсора.

Старшее слово lparam содержит идентификатор сообщения мыши.

Оконная процедура должна вернуть значение TRUE, если хочет прервать дальнейшую обработку этого сообщения, или значение FALSE, чтобы продолжить ее.

Старшее слово lparam равно нулю тогда, когда окно входит в режим меню.

Функция DefWindowProc перед обработкой этого сообщения передает его родительскому окну. Если оконная процедура родительского окна возвращает значение TRUE его обработка прерывается. Передавая сообщение родительскому окну окно позволяет своему родителю управлять настройками курсора в дочернем окне.

WM_SETFOCUS

Посылается окну после того как оно захватило фокус ввода.

wparam содержит дескриптор окна, которое потеряло фокус ввода. Значение этого параметра может быть равно значению NULL.

lparam не используется.

Если приложение обрабатывает это сообщение оно должно вернуть значение нуль.

WM_SETFONT

Устанавливает новый шрифт, которым должен отображаться заголовок окна.

wparam содержит дескриптор устанавливаемого шрифта или NULL в том случае, если окно должно использовать системный шрифт.

Младшее слово lparam определяет должно ли окно немедленно перерисовать себя с учетом нового шрифта. Если оно равно TRUE, то окно перерисовывает себя.

Оконная процедура ничего не возвращает.

WM_SETHOTKEY

Ассоциирует окно с горячей клавишей. Когда пользователь нажимает на эту горячую клавишу, система активирует окно.

Младшее слово wparam определяет код виртуальной клавишы, ассоциируемой с окном.

Старшее слово wparam содержит значение, представленное ниже, или сочетание этих значений (описаны в CommCtrl.h).

HOTKEYF_ALT - клавиша Alt.

HOTKEYF_CONTROL - клавиша Ctrl.

HOTKEYF_EXT - дополнительная клавиша.

HOTKEYF_SHIFT - клавиша Shift.

Если значение wparam равно NULL, то ассоциация окна с горячей клавишей удаляется.

lparam не используется.

Возможные ворзвращаемые значения представлены ниже:

-1 - функция завершилась с ошибкой из-за неверной горячей клавишы.

0 - функция завершилась с ошибкой из-за неверного дескриптора окна.

1 - функция успешно завершилась, других окон с такой же горячей клавишей нет.

2 - функция успешно завершилась, но есть другие окна с такой же горячей клавишей.

Горячая клавиша не может быть ассоциирована с дочерним окном.

VK_ESCAPE, VK_SPACE и VK_TAB - недопустимые горячие клавишы.

WM_SETICON

Ассоциирует с окном новую большую или маленькую иконку. Большая иконка отображается в диалоге выбора окна по Alt+Tab. Маленькая иконка отображается в заголовке окна.

wparam содержит тип устанавливаемой иконки. Он принимает одно из значений перечисленных ниже.

ICON_BIG - устанавливается большая иконка.

ICON_SMALL - устанавливается маленькая иконка.

lparam содержит дескриптор новой иконки. Если значение lparam равно NULL, то иконка, на которую указывает wparam, удаляется.

Возвращаемое значение представляет собой дескриптор замененной иконки. Если возвращаемое значение равно NULL, то окно прежде не имело иконки.

WM_SETREDRAW

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

wparam задает состояние перерисовки. Если значение этого параметра равно TRUE, то содержимое окна может быть перерисовано после изменения. Если же знчаение этого параметра равно FALSE содержимое окна не может быть перерисовано после изменения.

lparam не используется.

Если приложение обрабатывает это сообщение, оно должно вернуть значение нуль.

WM_SETTEXT

Устанавливает новый заголовок окна.

wparam не используется.

lparam содержит адрес строки с новым заголовком окна.

Оконная процедура возвращает TRUE если заголовок успешно установлен. Если в полях ввода недостаточно места для размещения заголовка, оконная процедура возвращает FALSE (для поля ввода) или LB_ERRSPACE (для списка (ListBox)), или CB_ERRSPACE (для комбинированного списка (ComboBox)).

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

WM_SETTINGCHANGE

Данное сообщение рассылается всем окнам верхнего уровня, когда функция SystemParametersInfo изменяет общесистемную настройку или когда были изменены настройки политики.

Приложение должно рассылать сообщение WM_SETTINGCHANGE всем окнам верхнего уровня когда оно изменяет параметры системы. (данное сообщение не может быть отправлено какому-то одному окну) для его отправки используйте функцию SendMessageTimeout с параметром hwnd равным HWND_BROADCAST.

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

Когда данное сообщение отправляет система в результате вызова функции SystemParametersInfo, wparam содержит значение параметра uiAction, переданного в функцию SystemParametersInfo.

Когда данное сообщение отправляет система после изменения настроек политики, wparam содержит тип примененной политики. Если его значение равно 1, то была применена политика компьютера (computer policy). Если же была применена политика пользователя (user policy), то значение wparam равно нулю.

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

Когда сообщение рассылает приложение значение wparam должно быть равно NULL.

Когда данное сообщение отправляет система, в результате вызова функции SystemParametersInfo, lparam содержит указатель на строку, которая характеризует область, настройка в которой быра изменена. Этот параметр обычно не указывает какой именно параметр был изменен. (Заметьте, что некоторые приложения передают в этом параметре значение NULL). В целом, когда вы получили это сообщение, то вы должны проверить и перечитать все нстройки системы, которые использует ваше приложение.

Строка может содержать имя ключа реестра или наименование раздела в файле win.ini. Когда строка содержит наименование реестра, это, обычно, наименование ключа в реестре, не весь путь.

Когда данное сообщение отправляет система в результате изменения настроек политики, lparam указывает на строку "Policy".

Когда данное сообщение отправляет система в результате изменения локальных настроек, lparam указывает на строку "intl".

Для отображения изменений в переменных окружения для системы или пользователя, разошлите сообщение WM_SETTINGCHANGE, в котором lparam указывает на строку "Environment".

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

WM_SHOWWINDOW

Отправляется окну, когда оно скрывается или показывается на экране.

Если значение параметра wparam равно TRUE, то окно показывается. Если же значение параметра wparam равно FALSE, то окно скрывается.

Если значение параметра lparam равно нулю, то данное сообщение является следствием вызова функции ShowWindow. В противном случае параметр lparam принимает одно из значений перечисленнных ниже.

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

SW_OTHERZOOM - окно перекрывается другим окном, которое было развернуто на весь экран.

SW_PARENTCLOSING - владелец окна был свернут.

SW_PARENTOPENING - владелец окна был возвращен в свое первоначальное состояние.

Если приложение обрабатывает это сообщение, оно должно вернуть значение нуль.

WM_SIZE

Отправляется окну после того как его размер был изменен.

Значение wparam определяет тип изменения размера окна. Его значение равно одному из значений перечисленных ниже.

SIZE_MAXHIDE - посылается всем выскакивающим окнам когда другое окно было максимизировано.

SIZE_MAXIMIZED - окно было максимизировано.

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

SIZE_MINIMIZED - окно было минимизировано.

SIZE_RESTORED - размер окна был изменен, но не минимизировано и не максимизировано.

Младшее слово lparam задает новую ширину клиентской области окна.

Старшее слово lparam задает новую высоту клиентской области окна.

Если приложение обрабатывает это сообщение, оно должно вернуть значение нуль.

WM_SIZECLIPBOARD

Отправляется владельцу буфера обмена окном просмотрщика буфера обмена, когда буфер обмена содержит данные в формате CF_OWNERDISPLAY и размер клиентской области окна просмотрщика буфера обмена был изменен.

wparam содержит дескриптор окна просмотрщика буфера обмена.

lparam содержит дескриптор глобального объекта памяти (global memory object), который содержит структуру RECT. Эта структура содержит новые размеры клиентской области окна просмотрщика буфера обмена.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

Когда окно просмотрщика буфера обмена скоро будет уничтожено или его размер скоро будет изменен, сообщение WM_SIZECLIPBOARD поступает с пустым прямоугольником (0,0,0,0) в качестве нового размера. Это позволяет владельцу буфера обмена освободить ресурсы, используемые для отображения содержимого буфера обмена.

Ваделец буфера обмена должен использовать функцию GlobalLock для блокирования объекта памяти, содержащего структуру RECT. Перед возвращением управления владелец буфера обмена должен разблокировать объект памяти с помощью функции GlobalUnlock.

WM_SIZING

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

Приложение получает это сообщение посредством оконной процедуры WindowProc.

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

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

Если приложение обрабатывает это сообщение, то оно должно вернуть значение TRUE.

WM_SPOOLERSTATUS

Отправляется менеджером печати, когда в очереди менеджера печати появляется новое задание, или задание удаляется из этой очереди.

wparam принимает значение PR_JOBSTATUS.

Младшее слово lparam задает количество заданий, находящихся в очереди менеджера печати.

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

Данное сообщение не поддерживается в операционных системах старше, чем Windows XP.

WM_STYLECHANGED

Отправляется окну после того как функция SetWindowLong изменила один или несколько стилей окна.

wparam указывает какие стили окна: стандартные или расширенные были изменены. Этот параметр принимает одно из значений перечисленных ниже.

GWL_EXSTYLE - изменились расширенные стили окна.

GWL_STYLE - изменились стили окна.

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

Если приложение обрабатывает это сообщение, оно должно вернуть значение нуль.

WM_STYLECHANGING

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

wparam указывает какие стили окна: стандартные или расширенные изменяются. Этот параметр принимает одно из значений перечисленных ниже.

GWL_EXSTYLE - изменяются расширенные стили окна.

GWL_STYLE - изменяются стили окна.

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

Если приложение обрабатывает это сообщение, оно должно вернуть значение нуль.

WM_SYSCHAR

Отправляется окну, владеющему фокусом ввода клавиатуры, когда функция TranslateMessage обработает сообщение WM_SYSKEYDOWN. Сообщение WM_SYSCHAR содержит код символа соответствующий клавише нажатой при удержании клавишы Alt в нажатом состояниии.

wparam содержит код символа клаишы.

lparam содержит количество повторений, скан код, флаг дополнительной клавишы, код контекста, флаг предыдущего состояния клавишы и флаг переходного состояния. Эта информация представляется в следующем формате.

Биты 0-15 - содержат количество повторений для текущего сообщения. Данное значение представляет собой количество автоматических повторений нажатий клавишы в результате удержания пользователем данной клавишы в нажатом состоянии. Если нажатие длится достаточно долго, то происходит отправка нескольких сообщений. Однако, количество повторений не является накопительным.

Биты 16-23 содержат скан код. Зависит от устройства.

Бит 24 указывает является ли отпущенная клавиша дополнительной клавишей, как например, правая Alt и Ctrl, которые появились на усовершенствованных 101- и 102- клавишных клавиатурах. Значение этого бита равное 1 указывает на то, что это дополнительная клавиша. В противном случае значение этого бита равно нулю.

Биты 25-28 зарезервированы и не используются.

Бит 29 содержит код контекста. Если его значение равно 1, то при нажатии клавишы, клавиша Alt удерживалась в нажатом состоянии. В противном случае его значение равно нулю.

Бит 30 содержит предыдущее состояние клавишы. Если перед отправкой сообщения клавиша была нажата, то его значение равно 1. Если же клавиша была отпущена, то его значение равно нулю.

Бит 31 содержит состояние перехода. Если клавиша отпускается то его значение равно единица. Если же клавиша нажимается, то его значение нуль.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

Когда код контекста равен нулю сообщение может быть передано в функцию TranslateAccelerator, которая обработает его как обычное сообщение о нажатии клавишы. Это позволяет использовать сочетания клавиш при работе с активным окном, которое не владеет фокусом ввода клавиатуры.

Для усовершенствованных 101- и 102- клавишных клавиатур к дополнительным клавишам отностся: правые Alt и Ctrl в основной части клавиатуры; клавишы Insert, Delete, Home, End, Page Up,Page Downи другие клавишы в группе клавиш слева от цифровой клавиатуры;а также клавишы деления (/) и Enter на цифровой клавиатуре. Некоторые клавиатуры могут поддерживать бит расширенной клавишы в параметре lparam.

WM_SYSCOLORCHANGE

Система рассылает его всем окнам верхнего уровня когда изменяется настройка системного цвета.

wparam и lparam не используются.

WM_SYSCOMMAND

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

wparam содержит тип затребованной команды.

Если команда выбрана с помощью мыши, то младшее слово lparam содержит позицию курсора мыши по горизонтали в экранных координатах. В противном случае младшее слово lparam не используется. Если команда выбрана с помощью мыши, то старшее слово lparam содержит позицию курсора мыши по вертикали в экранных координатах. Если команда была выбрана с помощью клавиш быстрого вызова (system accelerator), то старшее слово lparam содержит значение -1 (минус единица). Если команда была выбрана с помощью мнемоники, то старшее слово lparam содержит значение нуль.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

Функция DefWindowProc выполняет затребованные операции.

4 младших бита параметра wparam используются внутри системы. Поэтому перед проверкой значения этого параметра необходимо принудительно сбрасывать младшие 4 бита. Например командой and с параметром 0xFFF0.

Пункты меню в меню окна могут быть изменены функциями GetSystemMenu, AppendMenu, InsertMenu, ModifyMenu,InsertMenuItem и SetMenuItemInfo. Приложения, которые изменяют меню окна должны обрабатывать сообщение WM_SYSCOMMAND.

Приложения могут эмулировать системную команду путем отправки сообщения WM_SYSCOMMAND в функцию DefWindowProc. Сообщения WM_SYSCOMMAND не обработанные приложением должны передаваться в функцию DefWindowProc. Дополнительные команды, добавленные приложением, должны обрабатываться приложением и могут не передаваться в функцию DefWindowProc.

Экранная заставка запускается вне зависимости от того обрабатывает приложение SC_SCREENSAVE или нет.

Клавишы быстрого запуска, которые ассоциированы с пунктами меню окна передаются в виде сообщения WM_SYSCOMMAND, все остальные клавишы быстрого запуска передаются в виде сообщения WM_COMMAND.

Если значение параметра wparam равно SC_KEYMENU, то lparam содержит код клавишы, которая была нажата совместно с клавишей Alt для отображения меню. Например, нажатие комбинации Alt+F приведет к созданию сообщения WM_SYSCOMMAND, в котором wparam равен SC_KEYMENU, а lparam содержит код символа 'f'.

WM_SYSDEADCHAR

Отправляется окну, владеющему фокусом ввода клавиатуры, когда функция TranslateMessage обработает сообщение WM_SYSKEYDOWN. Сообщение WM_SYSDEADCHAR определяет код символа соответствующего системной слепой клавише, т.е. слепой клавише, которая была нажата во время удержания клавишы Alt в нажатом состоянии.

wparam содержит код символа, созданного системной слепой клавишей.

Параметр lparam содержит ту же информацию и в том же формате, что и в случае сообщения WM_SYSCHAR.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

WM_SYSKEYDOWN

Отправляется окну, владеющему фокусом ввода клавиатуры, когда пользователь нажимает на клавишу F10 (которая активирует меню) или, удерживая клавишу Alt, нажимает на какую-либо другую клавишу. Данное сообщение отправляется также тогда когда нет ни одного окна, владующего фокусом ввода клавиатуры. В этом случае сообщение WM_SYSKEYDOWN отправляется активному окну. Окно, принимающее это сообщение может различать эти две ситуации путем проверки кода контекста в параметре lparam.

wparam содержит виртуальный код нажатой клавишы. Перечень виртуальных кодов клавиш смотри здесь.

lparam содержит количество повторений, скан код, флаг дополнительной клавишы, код контекста, флаг предыдущего состояния клавишы и флаг переходного состояния. Эта информация представляется в следующем формате.

Биты 0-15 - содержат количество повторений для текущего сообщения. Данное значение представляет собой количество автоматических повторений нажатий клавишы в результате удержания пользователем данной клавишы в нажатом состоянии. Если нажатие длится достаточно долго, то происходит отправка нескольких сообщений. Однако, количество повторений не является накопительным.

Биты 16-23 содержат скан код. Зависит от устройства.

Бит 24 указывает является ли отпущенная клавиша дополнительной клавишей, как например, правая Alt и Ctrl, которые появились на усовершенствованных 101- и 102- клавишных клавиатурах. Значение этого бита равное 1 указывает на то, что это дополнительная клавиша. В противном случае значение этого бита равно нулю.

Биты 25-28 зарезервированы и не используются.

Бит 29 содержит код контекста. Если его значение равно 1, то при нажатии клавишы, клавиша Alt удерживалась в нажатом состоянии. Если его значение равно нулю, то данное сообщение было отправлено активному окну, так как нет ни одного окна, владеющего фокусом ввода клавиатуры.

Бит 30 содержит предыдущее состояние клавишы. Если перед отправкой сообщения клавиша была нажата, то его значение равно 1. Если же клавиша была отпущена, то его значение равно нулю.

Бит 31 содержит состояние перехода. Для сообщения WM_SYSKEYDOWN его значение всегда равно нулю.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

Функция DefWindowProc порверяет специальные клавишы и, если была нажата клавиша Tab или Enter, то отправляет сообщение WM_SYSCOMMAND.

Когда код контекста равен нулю сообщение может быть передано в функцию TranslateAccelerator, которая обработает его как обычное сообщение о нажатии клавишы. Это позволяет использовать сочетания клавиш при работе с активным окном, которое не владеет фокусом ввода клавиатуры.

Из-за автоматического повторения перед сообщением WM_SYSKEYUP может поступать несколько сообщений WM_SYSKEYDOWN. Предыдущее состояние клавишы (бит 30) может быть использовано для определения первого и повторных отправлений сообщения WM_SYSKEYDOWN.

Для усовершенствованных 101- и 102- клавишных клавиатур к дополнительным клавишам отностся: правые Alt и Ctrl в основной части клавиатуры; клавишы Insert, Delete, Home, End, Page Up,Page Downи другие клавишы в группе клавиш слева от цифровой клавиатуры;а также клавишы деления (/) и Enter на цифровой клавиатуре. Некоторые клавиатуры могут поддерживать бит расширенной клавишы в параметре lparam.

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

WM_SYSKEYUP

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

Приложение получает это сообщение от функции WindowProc.

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

lparam содержит количество повторений, скан код, флаг дополнительной клавишы, код контекста, флаг предыдущего состояния клавишы и флаг переходного состояния. Эта информация представляется в следующем формате.

Биты 0-15 - содержат количество повторений для текущего сообщения. Данное значение представляет собой количество автоматических повторений нажатий клавишы в результате удержания пользователем данной клавишы в нажатом состоянии. Для сообщения WM_SYSKEYUP количество повторений всегда равно единице.

Биты 16-23 содержат скан код. Зависит от устройства.

Бит 24 указывает является ли отпущенная клавиша дополнительной клавишей, как например, правая Alt и Ctrl, которые появились на усовершенствованных 101- и 102- клавишных клавиатурах. Значение этого бита равное 1 указывает на то, что это дополнительная клавиша. В противном случае значение этого бита равно нулю.

Биты 25-28 зарезервированы и не используются.

Бит 29 содержит код контекста. Если его значение равно 1, то при отпускании клавишы, клавиша Alt удерживалась в нажатом состоянии. Если его значение равно нулю, то данное сообщение было отправлено активному окну, так как нет ни одного окна, владеющего фокусом ввода клавиатуры.

Бит 30 содержит предыдущее состояние клавишы. Для сообщения WM_SYSKEYUP его значение всегда равно единице.

Бит 31 содержит состояние перехода. Для сообщения WM_SYSKEYUP его значение всегда равно единице.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

Если отпускается клавиша F10 или Alt, то функция DefWindowProc отправляет окну верхнего уровня сообщение WM_SYSCOMMAND. При этом параметр wparam этого сообщения содержит значение SC_KEYMENU.

Когда код контекста равен нулю сообщение может быть передано в функцию TranslateAccelerator, которая обработает его как обычное сообщение об изменении состояния клавишы. Это позволяет использовать сочетания клавиш при работе с активным окном, которое не владеет фокусом ввода клавиатуры.

Для усовершенствованных 101- и 102- клавишных клавиатур к дополнительным клавишам отностся: правые Alt и Ctrl в основной части клавиатуры; клавишы Insert, Delete, Home, End, Page Up,Page Downи другие клавишы в группе клавиш слева от цифровой клавиатуры;а также клавишы деления (/) и Enter на цифровой клавиатуре. Некоторые клавиатуры могут поддерживать бит расширенной клавишы в параметре lparam.

Для неамериканских расширенных клавиатур, правая клавиша Alt обрабатывается как комбинация Alt+Ctrl. Ниже представлена последовательность сообщений при нажатии и отпускании пользователем этой клавишы.

WM_KEYDOWN VK_CONTROL

WM_KEYDOWN VK_MENU

WM_KEYUP VK_CONTROL

WM_SYSKEYUP VK_MENU

WM_SYSTEMERROR

Сейчас не используется. Оставлено для совместимости со старыми приложениями.

WM_TIMECHANGE

Сообщение отправляется при изменении системного времени.

wparam и lparam не используются и должны быть равны нулю.

Если приложение обрабатывает это сообщение, оно должно вернуть значение нуль.

WM_TIMER

Помещается в очередь сообщений потока при очередном срабатывании таймера.

wparam содержит идентификатор таймера.

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

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

Вы можете обработать это сообщение в оконной процедуре. Функция DispatchMessage вызывает функцию обратного вызова, указанную при создании таймера.

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

WM_UNDO

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

wparam не используется и должен быть равен нулю.

lparam не используется и должен быть равен нулю.

Если сообщение успешно обработано, то возвращается значение TRUE.

Если же во время обработки сообщения произошла ошибка, то возвращается значение FALSE.

Для окна Rich Edit рекомендуется вместо сообщения WM_UNDO использовать сообщение EM_UNDO.

WM_UNICHAR

Это сообщение может быть использовано приложением для отправки ввода в другое окно. Это сообщение содержит код символа клавишы, которая была нажата. Для проверки того, обрабатывает ли целевое окно это сообщение или нет, отправьте это сообщение с параметром wparam равным UNICODE_NOCHAR.

wparam содержит код символа клавишы.

Если wparam равен UNICODE_NOCHAR и приложение обрабатывает это сообщение, то возвращается значение TRUE. Функция DefWindowProc в ответ на это сообщение возвращает значение FALSE.

Если wparam отличен от UNICODE_NOCHAR, то возвращается значение FALSE. Unicode версия функции DefWindowProc отправляет сообщение WM_CHAR с такими же параметрами. ANSI версия функции DefWindowProc отправляет одно или два сообщения WM_CHAR с соответствующими ANSI символами.

lparam хранит ту же информация и в таком же формате, что и в случае сообщения WM_CHAR.

Если приложение обрабатывает это сообщение, то оно долдно вернуть значение нуль.

Сообщение WM_UNICHAR похоже на сообщение WM_CHAR, но использует формат UTF-32, в то время как WM_CHAR использует формат UTF-16.

Это сообщение создано для предоставления возможности отправки Unicode символов в ANSI-окна и может обрабатывать Unicode символы дополнительного набора.

WM_USER

Данная константа используется для определения закрытых сообщений (private messages), используемых закрытыми оконными классами (private window classes). Обычно, такие сообщения имеют вид WM_USER+X, где X - целое число.

Ниже представлено несколько диапазонов номеров сообщений.

от 0 до WM_USER-1 - сообщения зарезервированы для использования системой.

от WM_USER до 0x7FFF - предназначены для использования закрытыми оконными классами.

от WM_APP(0x8000) до 0xBFFF - доступны для использования приложениями.

от 0xC000 до 0xFFFF - строковые сообщения для использования приложениями.

от 0xFFFF - зарезервировано системой.

Номера сообщений из первого диапазона (от 0 до WM_USER-1) определены системой. Значения в этом диапазоне, которые явно не определены зарезервированы системой.

Номера сообщений из второго диапазона (от WM_USER до 0x7FFF) могут быть определены и использованы приложением для отправки сообщений в закрытые оконные классы (private window class). Эти значения не могут быть использованы для описания сообщений, используемых во всем приложении, так как некоторые предопределенные оконные класы уже определили значения в этом диапазоне. Например такие предопределенные оконные классы как BUTTON, EDIT, LISTBOX и COMBOBOX могут использовать эти значения. Сообщения из этого диапазона не могут отправляться в другие приложения, если только приложения не были разработаны для обмена сообщениями и есть уверенность в том, что они одинаково интерпретируют номера сообщений.

Номера сообщений из третьего диапазона (от 0x8000 до 0xBFFF) доступны приложениям для определения закрытых сообщений (private messages). Сообщения в этом диапазоне не пересекаются с системными сообщениями.

Номера сообщений из четвертого диапазона (от 0xC000 до 0xFFFF) определяются во время исполнения, когда приложение вызывает функцию RegisterWindowMessage для получения номера сообщения по строке. Все приложения, которые регистрируют одну и ту же строку могут использовать ассоциированный с ней номер сообщения для обмена сообщениями. Фактический номер сообщения, тем не менее, не является постоянным и может различаться в разных сеансах.

Номера сообщений из пятого диапазона (от 0xFFFF) зарезервированы системой.

WM_USERCHANGED

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

Окно получает сообщение посредством своей функции WindowProc.

wparam и lparam не используются.

Приложение должно вернуть нуль, если оно обрабатывает это сообщение.

WM_VKEYTOITEM

Данное сообщение отправляется окну-владельцу списка с установленным стилем LBS_WANTKEYBOARDINPUT при получении этим списком сообщения WM_KEYDOWN.

Младшее слово wparam определяет код виртуальной клавишы, нажатой пользователем. Старшее слово wparam определяет положение курсора.

lparam содержит дескриптор окна-списка.

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

Функция DefWindowProc возвращает значение -1.

WM_VSCROLL

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

Если младшее слово wparam содержит значение SB_THUMBPOSITION или SB_THUMBTRACK, то старшее слово wparam содержит текущее положение ползунка полосы прокрутки. В противном случае значение старшего слова wparam не используется.

Младшее слово wparam содержит значение, которое указывает на запрос пользователя на прокрутку в вертикальном направлении. Перечень возможных значений этого параметра представлен здесь.

Если сообщение пришло от элемента управления полосы прокрутки, то lparam содержит дескриптор этого элемента управления. Если сообщение пришло от стандартной полосы прокрутки, то lparam содержит значение NULL.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

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

WM_VSCROLLCLIPBOARD

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

wparam содержит дескриптор окна просмотрщика буфера обмена.

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

Старшее слово lparam содержит текущее положение полосы прокрутки. Если значение младшего слова lparam отлично от SB_THUMBPOSITION, то старшее слово lparam не используется.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение нуль.

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

WM_WINDOWPOSCHANGED

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

wparam не используется.

lparam содержит указатель на структуру WINDOWPOS, которая содержит информацию о новом размере и положении окна.

Если приложение обрабатывает это сообщение, оно должно вернуть значение нуль.

По умолчанию, функция DefWindowProc в отправляет окну сообщения WM_SIZE и WM_MOVE. Эти сообщения не приходят, если приложение обрабатывает сообщение WM_WINDOWPOSCHANGED без вызова DefWindowProc.

WM_WINDOWPOSCHANGING

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

wparam не используется.

lparam содержит указатель на структуру WINDOWPOS, которая содержит информацию о новом размере и положении окна.

Если приложение обрабатывает это сообщение, оно должно вернуть значение нуль.

Для окон с установленными стилями WS_OVERLAPPED или WS_THICKFRAME функция DefWindowProc отправляет окну сообщение WM_GETMINMAXINFO. Это позволяет проверить новый размер и положение окна.

WM_WININICHANGE

Приложение рассылает данное сообщение всем окнам верхнего уровня после того как завершит изменение файла win.ini.

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

wparam не используется.

Значение lparam указывает на строку, содержащую наименование системного параметра, который был изменен.

Если оконная процедура обрабатывает это сообщеие, то она возвращает значение нуль.

WM_XBUTTONDBLCLK

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

Окно получает сообщение посредством своей функции WindowProc.

Младшее слово wparam содержит информацию о том, какие виртуальные клавишы находились в нажатом состоянии. Допустимые значения перечислены здесь.

Старшее слово wparam содержит информацию о том, какой дополнительной кнопкой мыши был произведен двойной щелчок. Допустимые значения перечислены ниже (в скобках указаны фактические значения констант).

XBUTTON1 (0x0001) - первая дополнительная кнопка.

XBUTTON2 (0x0002) - вторая дополнительная кнопка.

Младшее слово lparam содержит горизонтальную координату курсора мыши в клиентской системе координат.

Старшее слово lparam содержит вертикальную координату курсора мыши в клиентской системе координат.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение TRUE.

Для извлечения информации из параметра wparam используйте следующий код:

fwKeys = GET_KEYSTATE_WPARAM(wparam);

fwButton = GET_XBUTTON_WPARAM(wparam);

Для извлечения информации из параметра lparam используйте следующий код:

xPos = GET_X_LPARAM(lparam);

yPos = GET_Y_LPARAM(lparam);

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

Не используйте макросы LOWORD и HIWORD, так как они могут возвращать неверные результаты на системах с несколькими мониторами.

WM_XBUTTONDOWN

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

Окно получает сообщение посредством своей функции WindowProc.

Младшее слово wparam содержит информацию о том, какие виртуальные клавишы находились в нажатом состоянии. Допустимые значения перечислены здесь.

Старшее слово wparam содержит информацию о том, какая дополнительная кнопка была нажата. Допустимые значения перечислены ниже (в скобках указаны фактические значения констант).

XBUTTON1 (0x0001) - первая дополнительная кнопка.

XBUTTON2 (0x0002) - вторая дополнительная кнопка.

Младшее слово lparam содержит горизонтальную координату курсора мыши в клиентской системе координат.

Старшее слово lparam содержит вертикальную координату курсора мыши в клиентской системе координат.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение TRUE.

Для извлечения информации из параметра wparam используйте следующий код:

fwKeys = GET_KEYSTATE_WPARAM(wparam);

fwButton = GET_XBUTTON_WPARAM(wparam);

Для извлечения информации из параметра lparam используйте следующий код:

xPos = GET_X_LPARAM(lparam);

yPos = GET_Y_LPARAM(lparam);

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

Не используйте макросы LOWORD и HIWORD, так как они могут возвращать неверные результаты на системах с несколькими мониторами.

WM_XBUTTONUP

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

Окно получает сообщение посредством своей функции WindowProc.

Младшее слово wparam содержит информацию о том, какие виртуальные клавишы находились в нажатом состоянии. Допустимые значения перечислены здесь.

Старшее слово wparam содержит информацию о том, какая дополнительная кнопка была отпущена. Допустимые значения перечислены ниже (в скобках указаны фактические значения констант).

XBUTTON1 (0x0001) - первая дополнительная кнопка.

XBUTTON2 (0x0002) - вторая дополнительная кнопка.

Младшее слово lparam содержит горизонтальную координату курсора мыши в клиентской системе координат.

Старшее слово lparam содержит вертикальную координату курсора мыши в клиентской системе координат.

Если приложение обрабатывает это сообщение, то оно должно вернуть значение TRUE.

Для извлечения информации из параметра wparam используйте следующий код:

fwKeys = GET_KEYSTATE_WPARAM(wparam);

fwButton = GET_XBUTTON_WPARAM(wparam);

Для извлечения информации из параметра lparam используйте следующий код:

xPos = GET_X_LPARAM(lparam);

yPos = GET_Y_LPARAM(lparam);

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

Не используйте макросы LOWORD и HIWORD, так как они могут возвращать неверные результаты на системах с несколькими мониторами.

Заголовочный файл: winuser.h (включен в windows.h)


Стили оконного класса

CS_BYTEALIGNCLIENT

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

CS_BYTEALIGNWINDOW

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

CS_CLASSDC

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

CS_DBLCLKS

Позволяет окну реагировать на двойные щелчки мыши.

CS_DROPSHADOW

Включает эффект тени на окне.

CS_GLOBALCLASS

Указывает на то, что оконный класс является глобальным и может использоваться всеми работающими приложениями.

CS_HREDRAW

При изменении горизонтального размера окна перерисовывается все содержимое окна. Если вывлдимое в окне изоюражение не зависит от ширины окна, то данный стиль можно не устанавливать в данном оконном классе.

CS_NOCLOSE

Запрещает в системном меню окна команду Close

CS_OWNDC

Указывает, что каждый экземпляр класса должен иметь свой собственный контекст отображения (контекст отображения используется для вывода информации в окно)

CS_PARENTDC

Окно использует контекст устройства (DC) родительского окна

CS_SAVEBITS

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

CS_VREDRAW

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

Заголовочный файл: winuser.h (включен в windows.h)


Типы ввода

DLGC_BUTTON

Кнопка.

DLGC_DEFPUSHBUTTON

Кнопка, нажимаемая по умолчанию.

DLGC_HASSETSEL

Сообщение EM_SETSEL.

DLGC_RADIOBUTTON

Переключатель.

DLGC_STATIC

Статический элемент управления.

DLGC_UNDEFPUSHBUTTON

Кнопка, не нажимаемая по умолчанию.

DLGC_WANTALLKEYS

Любой клавиатурный ввод.

DLGC_WANTARROWS

Клавишы управления.

DLGC_WANTCHARS

Сообщение WM_CHAR.

DLGC_WANTMESSAGE

Любой клавиатурный ввод (приложение передает это сообщение элементу управления в виде структуры MSG).

DLGC_WANTTAB

Клавиша Tab.

Заголовочный файл: winuser.h (включен в windows.h)


Флаги функции ShowWindow

SW_FORCEMINIMIZE

Минимизировать окно, даже если поток, которому принадлежит это окно, не отвечает. Этот должен использоваться только окно минимизируются другим потоком, не являющимся владельцем этого окна.

SW_HIDE

Скрывает окно (делает его невидимым)и активирует другое окно.

SW_MAXIMIZE

Разворачивает окно на весь экран.

SW_MINIMIZE

Сворачивает окно и активизурует следующее окно в Z-последовательности.

SW_RESTORE

Активирует и отображает окно. Если окно было свернуто или развернуто на весь экран система восстанавливает его первоначальный размер и положение на экране. Приложение должно использовать этот флаг при восстановлении свернутых окон.

SW_SHOW

Активирует окно в его текущем размере и положении на экране.

SW_SHOWDEFAULT

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

SW_SHOWMAXIMIZED

Активирует, делает видимым и разворачивает окно на весь экран.

SW_SHOWMINIMIZED

Активирует, делает видимым и сворачивает окно.

SW_SHOWMINNOACTIVE

Похоже на SW_SHOWMINIMIZED, но, в отличие от последнего, не активирует окно.

SW_SHOWNA

Похоже на SW_SHOW, но, в отличие от последнего, не активирует окно.

SW_SHOWNOACTIVATE

Похоже на SW_SHOWNORMAL, но, в отличие от последнего не активирует окно.

SW_SHOWNORMAL

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

Заголовочный файл: winuser.h (включен в windows.h)


AUTO3STATE

Описывает автоматический (automatic) флажок с тремя состояниями. Создается невыбранный флажок с указанным заголовком, коорый размещен справа от флажка. При выборе пользователем флажок автоматически переключается между тремя состояниями: выбран, не выбран, неопределено. При выборе пользователем элемент управления отправляет сообщение своему родителю.

AUTO3STATE text, id, x, y, width, height [, style [, extended-style]]

style

Набор стилей элемента управления, который может быть комбинацией стиля BS_AUTO3STATE со стилями: WS_TABSTOP, WS_DISABLED и WS_GROUP.

Если вы не определили стили, то используется стиль: (BS_AUTO3STATE|WS_TABSTOP).


AUTOCHECKBOX

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

Данное объявление может использоваться только внутри объявления DIALOG или DIALOGEX.

AUTOCHECKBOX text, id, x, y, width, height [, style [, extended-style]]

style

Набор стилей элемента управления, который может быть комбинацией стиля BS_AUTOCHECKBOX со стилями: WS_TABSTOP и WS_GROUP.

Если вы не определили стили, то используется стиль: (BS_AUTOCHECKBOX|WS_TABSTOP).


AUTORADIOBUTTON

Описывает элемент управления автоматический переключатель (radio button). Данный элемент управления обеспечивает взаимное исключение с другими элементами управления AUTORADIOBUTTON в той же группе. Когда кнопка выбирается пользователем, приложение уведомляется об этом посредством уведомления BN_CLICKED.

AUTORADIOBUTTON text, id, x, y, width, height [, style [, extended-style]]

text

Текст, который будет отображаться рядом с переключателем.

style

Набор стилей автоматического переключателя, который может быть комбинацией стилей окна Button, перечисленных здесь и следующих стилей: WS_TABSTOP, WS_DISABLED и WS_GROUP.

Если вы не указали стиль, то используется стиль по умолчанию: BS_AUTORADIOBUTTON|WS_TABSTOP.


CHECKBOX

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

Объявление CHECKBOX может использоваться только внутри объявления DIALOGEX, описывая заголовок, идентификатор, размеры и атрибуты элемента управления.

CHECKBOX text, id, x, y, width, height [, style [, extended-style]]

text

Текст, которй будет отображаться справа от элемента управления.

style

Набор стилей элемента управления. Данное значение может быть комбинацией стиля BS_CHECKBOX со стилями WS_TABSTOP и WS_GROUP.

Если стили не заданы, то используются стили по умолчанию: BS_CHECKBOX|WS_TABSTOP.


COMBOBOX

Описывает комбинированный список. Комбинированный список состоит или из статического текстового поля, или из поля ввода, объединенного со списком. Список может все время отображаться на экране, или раскрываться только по требованию пользователя. Если комбинированный список содержит статическое текстовое поле (static text box), то данное поле всегда отображает текущий выбор в списке. Если используется поле ввода, то пользователь может самостоятельно ввести в поле выбора желаемый выбор, при этом список выделит первую запись, которая совпадет с вводимым пользователем текстом. пользователь затем может выбрать запись, выделенную в списке, для того, чтобы завершить ввод. Дополнительно, комбинированный может перерисовываться владельцем, иметь постоянную или переменную высоту.

COMBOBOX id, x, y, width, height [, style [, extended-style]]

style

Набор стилей элемента управления. Данное значение является комбинацией стилей комбинированного списка, перечисленных здесь, и стилей: WS_TABSTOP, WS_GROUP, WS_VSCROLL и WS_DISABLED.

Если вы не задали стиль, то будет использоваться стиль по умолчанию: CBS_SIMPLE|WS_TABSTOP.

Параметр height задает высоту комбинированного списка с полностью раскрытым списком.


DEFPUSHBUTTON

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

DEFPUSHBUTTON text, id, x, y, width, height [, style [, extended-style]]

text

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

style

Набор стилей элемента управления. Данное значение может быть комбинацией следующих стилей: BS_DEFPUSHBUTTON, WS_TABSTOP, WS_GROUP и WS_DISABLED.

Если вы не определили стиль, то используется стиль по умолчанию: BS_DEFPUSHBUTTON|WS_TABSTOP.


GROUPBOX

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

Объявление GROUPBOX может быть использовано только внутри объявления DIALOGEX, описывая заголовок, идентификатор, размеры и атрибуты элемента управления.

GROUPBOX text, id, x, y, width, height [, style [, extended-style]]

style

Набор стилей элемента управления. Данное значение может комбинацией стиля BS_GROUPBOX и стилей WS_TABSTOP и WS_DISABLED.

Если вы не определилистиль, то по умолчанию будет использоваться стиль BS_GROUPBOX.

Когда стиль содержит WS_TABSTOP или заголовок содержит акселератор, нажатие клавишы Tab или командной клавишы (accelerator key) перемещает фокус ввода на первый элемент внутри группы.


PUSHBOX

Описывает элемент управления push-box, который аналогичен PUSHBUTTON, за тем исключением что не отображает рамку кнопки; отображается только заголовок.

PUSHBOX text, id, x, y, width, height [, style [, extended-style]]

style

Стили для элемента управления, которые могут быть комбинацией стиля BS_PUSHBOX и стилей: WS_TABSTOP, WS_DISABLED и WS_GROUP.

Если стиль не задан, то используется стиль по умолчанию: BS_PUSHBOX|WS_TABSTOP.

Честно говоря, я так и не понял, что это за элемент управления такой. Стиль BS_PUSHBOX вообще говоря недокументирован. В msdn он упоминается только в топике об элементе управления PUSHBOX.

При создании элемента управления PUSHBOX в неактивном состоянии он не отображается на экране; в активном состоянии выглядит как флажок, который нельзя выбрать. При этом заголовок, вопреки msdn не отображается.


PUSHBUTTON

Описывает элемент управления нажимная кнопка. Элемент управления представляет собой прямоугольник, содержащий заданный заголовок. Заголовок выравнивается по центру. Когда пользователь выбирает элемент управления, то он отправляет своему родителю сообщение.

PUSHBUTTON text, id, x, y, width, height [, style [, extended-style]]

style

Набор стилей нажимной кнопки, который может быть комбинацией стиля BS_PUSHBUTTON и стилей: WS_TABSTOP, WS_DISABLED и WS_GROUP.

Если стиль не задан, то используется стиль по умолчанию: BS_PUSHBUTTON|WS_TABSTOP.


RADIOBUTTON

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

RADIOBUTTON text, id, x, y, width, height [, style [, extended-style]]

style

Набор стилей переключателя, который может быть комбинацией стилей кнопки, которые перечислены здесь, и стилей: WS_TABSTOP, WS_DISABLED и WS_GROUP.

Если стиль не указан, то используется стиль по умолчанию: BS_RADIOBUTTON|WS_TABSTOP.


STATE3

Описывает элемент управления флажок с тремя состояниями. Данный элемент управления аналогичен элементу управления CHECKBOX, за тем исключением, что он имеет три состояния: выбран, невыбран и неопределено.

STATE3 text, id, x, y, width, height [, style [, extended-style]]

text

Заголовок, который отображается справа от элемента управления.

style

Набор стилей элемента управления. Данное значение может быть комбинацией стиля BS_3STATE и стилей: WS_TABSTOP и WS_GROUP.

Если стиль не указан, то используется стиль по умолчанию: BS_3STATE|WS_TABSTOP.


ComboBox

Демонстрация работы с комбинированный списком. В данном примере создаётся простое окно с комбинированным списком и статическим элементом управления. После своего создания комбинированный список с помощью сообщения CB_ADDSTRING заполняется строками. С помощью сообщения CB_SETCURSEL устанавливается выбор по умолчанию (на первую строку). При изменении выбора пользователем, новая выбранная строка выводится в заголовке статического элемента управления. Обработка изменения выбора происходит при обработке уведомления CBN_SELCHANGE.

Новая выбранная пользователем строка получается с помощью сообщений CB_GETCURSEL (возвращает номер выбранной строки), CB_GETLBTEXTLEN (возвращает длину выбранной строки) и CB_GETLBTEXT (возвращает саму выбранную строку).

Выбранную строку можно получить и с помощью функции GetWindowText.

#include <windows.h>

//Идентификаторы элементов управления

#define ID_COMBOBOX 0x100

#define ID_STATIC 0x200

#define _WPARAM ((WPARAM)((CBN_SELCHANGE<<16)+ID_COMBOBOX))

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

char* s;

unsigned int index;

unsigned int len;

switch(uMsg){

case WM_COMMAND:

if(wParam == _WPARAM){

//Получаем номер выбранной строки

index = SendMessage((HWND)lParam,CB_GETCURSEL,0,0);

//Получаем длину выбранной строки

len = SendMessage((HWND)lParam,CB_GETLBTEXTLEN,index,0);

//Выделяем память под строку

s = (char*)malloc((len+1)*sizeof(char));

//Получаем строку

SendMessage((HWND)lParam,CB_GETLBTEXT,index,(LPARAM)s);

//Выводим строку в статический элемент управления

SetDlgItemText(hwnd,ID_STATIC,s);

//Освобождаем память

free(s);

s = NULL;

}

break;

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg){

return 0;

}

WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

MSG msg;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = 0;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = NULL;

wc.hCursor = NULL;

wc.hbrBackground = (HBRUSH)COLOR_BTNSHADOW;

wc.lpszMenuName = NULL;

wc.lpszClassName = ClassName;

wc.hIconSm = NULL;

//Регистрируем оконный класс

RegisterClassEx(&wc);

//Создаем главное окно

HWND hwnd;

hwnd = CreateWindowEx(0, ClassName, "ComboBox",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED|WS_BORDER,

400, 400, 120, 100, NULL, 0, hInstance, 0);

//Создаем комбинированный список

HWND hwndCB;

hwndCB = CreateWindowEx(0, "ComboBox", "",

WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST|CBS_HASSTRINGS|WS_VSCROLL,

10, 10, 100, 100, hwnd, (HMENU)ID_COMBOBOX, hInstance, 0);

//Создаем статическое поле

HWND hwndStatic;

hwndStatic = CreateWindowEx(0, "Static", "",

WS_CHILD|WS_VISIBLE,

10, 40, 400, 20, hwnd, (HMENU)ID_STATIC, hInstance, 0);

//Заполняем комбинированный список

SendMessage(hwndCB,CB_ADDSTRING,0,(LPARAM)"Строка 1");

SendMessage(hwndCB,CB_ADDSTRING,0,(LPARAM)"Строка 2");

SendMessage(hwndCB,CB_ADDSTRING,0,(LPARAM)"Строка 3");

//Устанавливаем выбор по умолчанию

SendMessage(hwndCB,CB_SETCURSEL,0,0);

//Цикл обработки сообщений

while(GetMessage(&msg,NULL,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}


ComboBox 2

Демонстрация работы с комбинированном списком. В данном примере создается окно с пустым комбинированным списком, у которого затем устанавливается подсказка (cue banner). Возможность устанавливать текст подсказки появилась в Windows Vista.

#include <windows.h>

#define CB_SETCUEBANNER 0x1703

#define CB_GETCUEBANNER 0x1704

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

switch(uMsg){

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg){

return 0;

}

WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

MSG msg;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = 0;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = NULL;

wc.hCursor = NULL;

wc.hbrBackground = (HBRUSH)COLOR_BTNSHADOW;

wc.lpszMenuName = NULL;

wc.lpszClassName = ClassName;

wc.hIconSm = NULL;

//Регистрируем оконный класс

RegisterClassEx(&wc);

//Создаем окно

HWND hwnd;

hwnd = CreateWindowEx(0, ClassName, "ComboBox",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED|WS_BORDER,

400, 300, 130, 100, NULL, 0, hInstance, 0);

//Создаем кнопку SplitButton

HWND hwndCB;

hwndCB = CreateWindowEx(0, "ComboBox", "",

WS_CHILD|WS_VISIBLE|CBS_DROPDOWN|CBS_HASSTRINGS,

10, 10, 100, 50, hwnd, NULL, NULL, 0);

//Выводим подсказку

char s[] = "Подсказка";

wchar_t text[20];

//Конвертируем текст подсказки в Unicode

MultiByteToWideChar(CP_ACP,0,s,-1,text,20);

//Выводим подсказку

SendMessage(hwndCB,CB_SETCUEBANNER,0,text);

//Цикл обработки сообщений

while(GetMessage(&msg,NULL,0,0)){

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}

Ниже приводится главное окно данного приложения.

ComboBox with CueBanner


ComboBoxEx

Демонстрация работы с элементом управления ComboBoxEx. В данном примере создается элемент управления ComboBoxEx, в который затем добавляется 2 записи. Элемент управления ComboBoxEx создается с помощью функции CreateWindowEx, после инициализации библиотеки Comctl32.dll с помощью функции InitCommonControlsEx.

Изображения для коллекции изображений берутся из ресурсов.

#define _WIN32_IE 0x0300

#include <windows.h>

#include <Commctrl.h>

#include "Constants.h"

//Прототип функции InitCommonControlsEx

_stdcall typedef BOOL (*FINITCOMMONCONTROLSEX)(const LPINITCOMMONCONTROLSEX);

FINITCOMMONCONTROLSEX lpfICCE;

//Прототип функции ImageList_Create

_stdcall typedef HIMAGELIST (*IMAGELIST_CREATE)(int,int,UINT,int,int);

IMAGELIST_CREATE lpfIL_Create;

//Прототип функции ImageList_Destroy

_stdcall typedef BOOL (*IMAGELIST_DESTROY)(HIMAGELIST);

IMAGELIST_DESTROY lpfIL_Destroy;

//Прототип функции ImageList_ReplaceIcon

_stdcall typedef int (*IMAGELIST_REPLACEICON)(HIMAGELIST,int,HICON);

IMAGELIST_REPLACEICON lpfIL_ReplaceIcon;

//Прототип функции ImageList_SetBkColor

_stdcall typedef COLORREF (*IMAGELIST_SETBKCOLOR)(HIMAGELIST,COLORREF);

IMAGELIST_SETBKCOLOR lpfIL_SetBkColor;

//Инициализирует библиотеку Comctl32.dll и получает адреса функций

void GetFunctions(void){

HINSTANCE hComctl32;

hComctl32 = LoadLibrary("Comctl32.dll");

//Инициализируем библиотеку Comctl32.dll

INITCOMMONCONTROLSEX icex;

icex.dwSize = sizeof(INITCOMMONCONTROLSEX);

icex.dwICC = ICC_USEREX_CLASSES;

lpfICCE = (FINITCOMMONCONTROLSEX)GetProcAddress(hComctl32,"InitCommonControlsEx");

lpfICCE(&icex);

//Получаем адреса функций работы с коллекцией изображений

lpfIL_Create = (IMAGELIST_CREATE)GetProcAddress(hComctl32,"ImageList_Create");

lpfIL_Destroy = (IMAGELIST_DESTROY)GetProcAddress(hComctl32,"ImageList_Destroy");

lpfIL_ReplaceIcon = (IMAGELIST_REPLACEICON)GetProcAddress(hComctl32,"ImageList_ReplaceIcon");

lpfIL_SetBkColor = (IMAGELIST_SETBKCOLOR)GetProcAddress(hComctl32,"ImageList_SetBkColor");

}

//Подготавливаем коллекцию изображений

HIMAGELIST PrepareImageList(HINSTANCE hmod){

HIMAGELIST hIL;

//Создаем коллекцию

hIL = lpfIL_Create(32,32,ILC_COLOR32,2,0);

//Устанавливаем цвет фона

lpfIL_SetBkColor(hIL,RGB(0xFF,0xFF,0xFF));

//Добавляем изображения в коллекцию

lpfIL_ReplaceIcon(hIL,-1,LoadIcon(hmod,MAKEINTRESOURCE(ID_ICON1)));

lpfIL_ReplaceIcon(hIL,-1,LoadIcon(hmod,MAKEINTRESOURCE(ID_ICON2)));

return hIL;

}

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

switch(uMsg){

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

return 0;

}

WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

MSG msg;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = CS_HREDRAW|CS_VREDRAW;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = NULL;

wc.hCursor = NULL;

wc.hbrBackground = (HBRUSH)COLOR_BTNSHADOW;

wc.lpszMenuName = NULL;

wc.lpszClassName = ClassName;

wc.hIconSm = NULL;

//Регистрируем оконный класс

RegisterClassEx(&wc);

//Создаем главное окно

HWND hwnd;

hwnd = CreateWindowEx(0, ClassName, "ComboBoxEx",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED,

100, 100, 200, 200, NULL, NULL, hInstance, 0);

//Иницализируем библиотеку Comctl32.dll и получаем адреса функций

GetFunctions();

//Создаем окно ComboBoxEx

hwnd = CreateWindowEx(0, WC_COMBOBOXEX, "",

WS_BORDER|WS_VISIBLE|WS_CHILD|CBS_DROPDOWN,

20, 20, 150, 200, hwnd, NULL, hInstance, 0);

//Создаем коллекцию изображений и связываем её с окном ComboBoxEx

HIMAGELIST hIL;

hIL = PrepareImageList(hInstance);

SendMessage(hwnd,CBEM_SETIMAGELIST,0,(LPARAM)hIL);

//Добавляем первую запись в ComboBoxEx

COMBOBOXEXITEM cbei;

cbei.mask = (CBEIF_IMAGE|CBEIF_TEXT|CBEIF_SELECTEDIMAGE);

cbei.iItem = 0;

cbei.pszText = "Запись 1";

cbei.iImage = 0;

cbei.iSelectedImage = 0;

SendMessage(hwnd,CBEM_INSERTITEM,0,(LPARAM)&cbei);

//Добавляем вторую запись ComboBoxEx

cbei.iItem = 1;

cbei.pszText = "Запись 2";

cbei.iImage = 1;

cbei.iSelectedImage = 1;

SendMessage(hwnd,CBEM_INSERTITEM,0,(LPARAM)&cbei);

//Устанавливаем выбор по умолчанию

SendMessage(hwnd,CB_SETCURSEL,0,0);

//Цикл обработки сообщений

while(GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}

Файл ресурсов.

#include "Constants.h"

ID_ICON1 ICON "MyIcon1.ico"

ID_ICON2 ICON "MyIcon2.ico"

Заголовочный файл Constants содержит идентификаторы ресурсов.

#define ID_ICON1 0x100

#define ID_ICON2 0x200

На рисунке ниже показано главное окно разработанного приложения.


ComboBoxEx 2

Демонстрация работы с элементом управления ComboBoxEx. Это чуть более сложный пример, по сравнению с примером. Здесь мы не только создаем элемент управления и добавляем в него две записи, но и обрабатываем изменение выбора записи. Выбранная пользователем запись выводится в двух статических элементах управления: в первом выводится изображение, связанное с записью, во втором - текст записи. Обработка выбора осуществляется так же как и в случае элемента управления ComboBox, приведенное в примере, но с небольшими дополнениями связанными с получением изображений.

#define _WIN32_IE 0x0300

#include <windows.h>

#include <Commctrl.h>

#include "Constants.h"

#define ID_COMBOBOX 0x100

#define _WPARAM ((WPARAM)((CBN_SELCHANGE<<16)+ID_COMBOBOX))

//Прототип функции InitCommonControlsEx

_stdcall typedef BOOL (*FINITCOMMONCONTROLSEX)(const LPINITCOMMONCONTROLSEX);

FINITCOMMONCONTROLSEX lpfICCE;

//Прототип функции ImageList_Create

_stdcall typedef HIMAGELIST (*IMAGELIST_CREATE)(int,int,UINT,int,int);

IMAGELIST_CREATE lpfIL_Create;

//Прототип функции ImageList_Destroy

_stdcall typedef BOOL (*IMAGELIST_DESTROY)(HIMAGELIST);

IMAGELIST_DESTROY lpfIL_Destroy;

//Прототип функции ImageList_ReplaceIcon

_stdcall typedef int (*IMAGELIST_REPLACEICON)(HIMAGELIST,int,HICON);

IMAGELIST_REPLACEICON lpfIL_ReplaceIcon;

//Прототип функции ImageList_SetBkColor

_stdcall typedef COLORREF (*IMAGELIST_SETBKCOLOR)(HIMAGELIST,COLORREF);

IMAGELIST_SETBKCOLOR lpfIL_SetBkColor;

//Прототип функции ImageList_GetIcon

_stdcall typedef HICON (*IMAGELIST_GETICON)(HIMAGELIST,int,UINT);

IMAGELIST_GETICON lpfIL_GetIcon;

//Описатель коллекции изображений

HIMAGELIST hIL;

//Описатель элемента управления ComboBoxEx

HWND hwndCBE;

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

HWND hwndStaticPict;

//Описатель статического элемента управления, в который будем выводит текст

HWND hwndStaticText;

//Инициализирует библиотеку Comctl32.dll и получает адреса функций

void GetFunctions(void)

{

HINSTANCE hComctl32;

hComctl32 = LoadLibrary("Comctl32.dll");

//Инициализируем библиотеку Comctl32.dll

INITCOMMONCONTROLSEX icex;

icex.dwSize = sizeof(INITCOMMONCONTROLSEX);

icex.dwICC = ICC_USEREX_CLASSES;

lpfICCE = (FINITCOMMONCONTROLSEX)GetProcAddress(hComctl32,"InitCommonControlsEx");

lpfICCE(&icex);

//Получаем адреса функций работы с коллекцией изображений

lpfIL_Create = (IMAGELIST_CREATE)GetProcAddress(hComctl32,"ImageList_Create");

lpfIL_Destroy = (IMAGELIST_DESTROY)GetProcAddress(hComctl32,"ImageList_Destroy");

lpfIL_ReplaceIcon = (IMAGELIST_REPLACEICON)GetProcAddress(hComctl32,"ImageList_ReplaceIcon");

lpfIL_SetBkColor = (IMAGELIST_SETBKCOLOR)GetProcAddress(hComctl32,"ImageList_SetBkColor");

lpfIL_GetIcon = (IMAGELIST_GETICON)GetProcAddress(hComctl32,"ImageList_GetIcon");

}

//Подготавливаем коллекцию изображений

void PrepareImageList(HINSTANCE hmod)

{

//Создаем коллекцию

hIL = lpfIL_Create(32,32,ILC_COLOR32,2,0);

//Устанавливаем цвет фона

lpfIL_SetBkColor(hIL,RGB(0xFF,0xFF,0xFF));

//Добавляем изображения в коллекцию

lpfIL_ReplaceIcon(hIL,-1,LoadIcon(hmod,MAKEINTRESOURCE(ID_ICON1)));

lpfIL_ReplaceIcon(hIL,-1,LoadIcon(hmod,MAKEINTRESOURCE(ID_ICON2)));

}

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

NMHDR *pnmhdr;

NMCBEENDEDIT *pnmcbeee;

COMBOBOXEXITEM pcbei;

int index, len;

char *s;

switch(uMsg){

case WM_COMMAND:

if(wParam == _WPARAM){

//Получаем номер выбранной строки

index = SendMessage((HWND)lParam,CB_GETCURSEL,0,0);

//Получаем длину выбранной строки

len = SendMessage((HWND)lParam,CB_GETLBTEXTLEN,index,0);

//Выделяем память под строку

s = (char*)malloc((len+1)*sizeof(char));

//Получаем строку

SendMessage((HWND)lParam,CB_GETLBTEXT,index,(LPARAM)s);

//Выводим строку в статический элемент управления

SetWindowText(hwndStaticText,s);

//Освобождаем память

free(s);

s = NULL;

//Получаем номер изображения в коллекции изображений

pcbei.mask = CBEIF_IMAGE;

pcbei.iItem = index;

SendMessage(hwndCBE,CBEM_GETITEM,0,(LPARAM)&pcbei);

//Получаем иконку из коллекции изображений

HICON hicon;

hicon = lpfIL_GetIcon(hIL,pcbei.iItem,0);

//Выводим иконку в статический элемент управления

SendMessage(hwndStaticPict,STM_SETICON,(LPARAM)hicon,0);

DestroyIcon(hicon);

}

break;

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

return 0;

}

WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

MSG msg;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = CS_HREDRAW|CS_VREDRAW;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = NULL;

wc.hCursor = NULL;

wc.hbrBackground = (HBRUSH)COLOR_BTNSHADOW;

wc.lpszMenuName = NULL;

wc.lpszClassName = ClassName;

wc.hIconSm = NULL;

//Регистрируем оконный класс

RegisterClassEx(&wc);

//Создаем главное окно

HWND hwnd;

hwnd = CreateWindowEx(0, ClassName, "ComboBoxEx",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED,

100, 100, 200, 200, NULL, NULL, hInstance, 0);

//Иницализируем библиотеку Comctl32.dll и получаем адреса функций

GetFunctions();

//Создаем окно ComboBoxEx

hwndCBE = CreateWindowEx(0, WC_COMBOBOXEX, "",

WS_BORDER|WS_VISIBLE|WS_CHILD|CBS_DROPDOWN,

20, 20, 150, 200, hwnd, (HMENU)ID_COMBOBOX, hInstance, 0);

//Создаем коллекцию изображений и связываем её с окном ComboBoxEx

PrepareImageList(hInstance);

SendMessage(hwndCBE,CBEM_SETIMAGELIST,0,(LPARAM)hIL);

//Добавляем первую запись в ComboBoxEx

COMBOBOXEXITEM cbei;

cbei.mask = (CBEIF_IMAGE|CBEIF_TEXT|CBEIF_SELECTEDIMAGE);

cbei.iItem = 0;

cbei.pszText = "Запись 1";

cbei.iImage = 0;

cbei.iSelectedImage = 0;

SendMessage(hwndCBE,CBEM_INSERTITEM,0,(LPARAM)&cbei);

//Добавляем вторую запись ComboBoxEx

cbei.iItem = 1;

cbei.pszText = "Запись 2";

cbei.iImage = 1;

cbei.iSelectedImage = 1;

SendMessage(hwndCBE,CBEM_INSERTITEM,0,(LPARAM)&cbei);

//Устанавливаем выбор по умолчанию

SendMessage(hwndCBE,CB_SETCURSEL,0,0);

//Создаем окно, в которое будем выводить иконку

hwndStaticPict = CreateWindowEx(0, "Static", "",

WS_VISIBLE|WS_CHILD|SS_ICON,

20, 80, 50, 50, hwnd, NULL, hInstance, 0);

//Выводим в него иконку

HICON hicon;

hicon = lpfIL_GetIcon(hIL,0,0);

SendMessage(hwndStaticPict,STM_SETICON,(LPARAM)hicon,0);

DestroyIcon(hicon);

//Создаем окно, в которое будем выводить иконку

hwndStaticText = CreateWindowEx(0, "Static", "Static",

WS_VISIBLE|WS_CHILD,

80, 80, 80, 50, hwnd, NULL, hInstance, 0);

//Выводим в него текст

char s[50];

GetWindowText(hwndCBE,s,50);

SetWindowText(hwndStaticText,s);

//Цикл обработки сообщений

while(GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}

Файл ресурсов.

#include "Constants.h"

ID_ICON1 ICON "MyIcon1.ico"

ID_ICON2 ICON "MyIcon2.ico"

Заголовочный файл "Constants.h" содержит идентификаторы ресурсов.

#define ID_ICON1 0x100

#define ID_ICON2 0x200

Ниже приводится изображение главного окна разработанного приложения.


CommandLinkButton

Демонстрация работы с кнопкой CommandLinkButton. Это новый тип кнопок, появившийся в Windows Vista. Их отличает установленный стиль BS_COMMANDLINK. Внешне они выглядят как копка с зеленой стрелкой, надписью и комментарием. Для их создание необходимо определить манифест, уведомляющий систему о том, что мы хотим работать с библиотекой Comctl32.dll версии 6.0. Обработка нажатия на эту кнопку происходит так же как и в случае обычной кнопки. При нажатии на кнопку выводится сообщение "Вы нажали на кнопку".

Разрбаотанное приложение проверялось в операцмионной системе Windows 7. В Windows XP оно не работает.

#include <windows.h>

#define BCM_FIRST 0x1600

#define BCM_SETNOTE (BCM_FIRST + 0x0009)

#define BS_COMMANDLINK 0x0000000E

#define ID_BUTTON 0x100

#define _WPARAM ((BN_CLICKED<<16)+ID_BUTTON)

//Оконная процедур

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

switch(uMsg){

case WM_COMMAND:

//Нажатие на кнопку

if(wParam == _WPARAM)

MessageBox(hwnd,"Вы нажали на кнопку","",MB_OK);

break;

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg)

return 0;

}

WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = CS_HREDRAW|CS_VREDRAW;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = NULL;

wc.hCursor = NULL;

wc.hbrBackground = (HBRUSH) COLOR_MENU;

wc.lpszMenuName = NULL;

wc.lpszClassName = ClassName;

wc.hIconSm = NULL;

//Регистрируем оконный класс

RegisterClassEx(&wc);

//Создаем окно

HWND hwnd;

hwnd = CreateWindowEx(0, ClassName, "Command Link Button",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED,

350, 350, 300, 100, NULL, NULL, hInstance, 0);

//Создаем командную кнопку

HWND hwndCLB;

hwndCLB = CreateWindowEx(0,"Button","КНОПКА",

WS_VISIBLE|WS_CHILD|BS_COMMANDLINK,

10,10,280,50,hwnd,(HMENU)ID_BUTTON,hInstance,NULL);

//Подготавливаем Unicode строку

char str[] = "Комментарий";

wchar_t note[20];

MultiByteToWideChar(CP_ACP,0,str,-1,note,20);

//Выводим комментарий

SendMessage(hwndCLB,BCM_SETNOTE,(WPARAM)0,(LPARAM)note);

//Цикл обработки сообщений

MSG msg;

while(GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}

Файл ресурсов:

#include <winuser.h>

1 RT_MANIFEST "Manifest.xml"

Манифест, сохраненный в файле Manifest.xml.

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">

<security>

<requestedPrivileges>

<requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>

</requestedPrivileges>

</security>

</trustInfo>

<dependency>

<dependentAssembly>

<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*"></assemblyIdentity>

</dependentAssembly>

</dependency>

</assembly>

Ниже приводится главное окно приложения.


CommandLinkButton 2

Чуть более сложная демонстрация работы с CommandLinkButton. В данном примере мы создаем две такие кнопки. В первой кнопке мы устанавливаем значок щита вместо зеленой стрелки по умолчанию (это делается с помощью сообщения BCM_SETSHIELD). Во второй кнопке мы (с помощью сообщения BM_SETIMAGE) устанавливаем вместо зеленой стрелки свою иконку, хранящуюся в ресурсах. Загрузка иконки из ресурсов осуществляется функцией LoadIcon.

Данное приложение проверялось в Windows 7. В Windows XP оно не работает.

#include <windows.h>

#include "Constants.h"

//Оконная процедур

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

switch(uMsg){

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg)

return 0;

}

WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = CS_HREDRAW|CS_VREDRAW;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = NULL;

wc.hCursor = NULL;

wc.hbrBackground = (HBRUSH) COLOR_MENU;

wc.lpszMenuName = NULL;

wc.lpszClassName = ClassName;

wc.hIconSm = NULL;

//Регистрируем оконный класс

RegisterClassEx(&wc);

//Создаем окно

HWND hwnd;

hwnd = CreateWindowEx(0, ClassName, "Command Link Button",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED,

350, 350, 300, 160, NULL, NULL, hInstance, 0);

//Создаем первую командную кнопку

HWND hwndCLB;

hwndCLB = CreateWindowEx(0,"Button","КНОПКА 1",

WS_VISIBLE|WS_CHILD|BS_COMMANDLINK,

10,10,280,50,hwnd,NULL,hInstance,NULL);

//Устанавливаем щит

SendMessage(hwndCLB,BCM_SETSHIELD, (WPARAM)NULL, (LPARAM)TRUE);

//Подготавливаем Unicode строку

char str[] = "С щитом";

wchar_t note[20];

MultiByteToWideChar(CP_ACP,0,str,-1,note,20);

//Выводим комментарий

SendMessage(hwndCLB,BCM_SETNOTE,(WPARAM)0,(LPARAM)note);

//Создаем вторую командную кнопку

hwndCLB = CreateWindowEx(0,"Button","КНОПКА 2",

WS_VISIBLE|WS_CHILD|BS_COMMANDLINK|BS_BITMAP,

10,70,280,50,hwnd,NULL,hInstance,NULL);

//Устанавливаем иконку

HICON hIcon;

hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(ID_ICON));

SendMessage(hwndCLB,BM_SETIMAGE,(WPARAM)IMAGE_ICON,(LPARAM)hIcon);

//Вводим комментарий

char _str[] = "C иконкой";

MultiByteToWideChar(CP_ACP,0,_str,-1,note,20);

SendMessage(hwndCLB,BCM_SETNOTE,(WPARAM)0,(LPARAM)note);

//Цикл обработки сообщений

MSG msg;

while(GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}

Заголовочный файл Constants.h

#define BCM_FIRST 0x1600

#define BCM_SETNOTE (BCM_FIRST + 0x0009)

#define BCM_SETSHIELD (BCM_FIRST + 0x000C)

#define BS_COMMANDLINK 0x0000000E

#define ID_ICON 0x100

Файл ресурсов

#include <winuser.h>

#include "Constants.h"

1 RT_MANIFEST "Manifest.xml"

ID_ICON ICON "MyIcon.ico"

Манифест, сохраненный в файле Manifest.xml.

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">

<security>

<requestedPrivileges>

<requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>

</requestedPrivileges>

</security>

</trustInfo>

<dependency>

<dependentAssembly>

<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*"></assemblyIdentity>

</dependentAssembly>

</dependency>

</assembly>

Ниже приводится главное окно приложения.


DlgDirListComboBox

Демонстрация использования функции DlgDirListComboBox, которая выводит в комбинированный список имена подкаталогов и файлов заданного каталога. В данном примере в комбинированный список выводится содержимое каталога "D:\FASM".

#include <windows.h>

//Идентификаторы элементов управления

#define ID_COMBOBOX 0x100

#define ID_STATIC 0x200

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

switch(uMsg){

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg){

return 0;

}

WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

MSG msg;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = 0;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = NULL;

wc.hCursor = NULL;

wc.hbrBackground = (HBRUSH)COLOR_BTNSHADOW;

wc.lpszMenuName = NULL;

wc.lpszClassName = ClassName;

wc.hIconSm = NULL;

//Регистрируем оконный класс

RegisterClassEx(&wc);

//Создаем главное окно

HWND hwnd;

hwnd = CreateWindowEx(0, ClassName, "DlgDirListComboBox",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED|WS_BORDER,

400, 400, 200, 130, NULL, 0, hInstance, 0);

//Создаем комбинированный список

HWND hwndCB;

hwndCB = CreateWindowEx(0, "ComboBox", "",

WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST|CBS_HASSTRINGS|WS_VSCROLL,

10, 30, 170, 150, hwnd, (HMENU)ID_COMBOBOX, hInstance, 0);

//Создаем статическое поле

HWND hwndStatic;

hwndStatic = CreateWindowEx(0, "Static", "",

WS_CHILD|WS_VISIBLE,

10, 10, 400, 20, hwnd, (HMENU)ID_STATIC, hInstance, 0);

//Выводим в список содержимое каталог

char s[MAX_PATH] = "D:\\FASM";

DlgDirListComboBox(hwnd,s,ID_COMBOBOX,ID_STATIC,DDL_DIRECTORY);

//Устанавливаем выбор по умолчанию

SendMessage(hwndCB,CB_SETCURSEL,0,0);

//Цикл обработки сообщений

while(GetMessage(&msg,NULL,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}


DlgDirSelectComboBoxEx

Демонстрация работы функции DlgDirSelectComboBoxEx, которая возвращает текущий выбор для комбинированного списка, заполненного с помощью функции DlgDirListComboBox.

В данном примере создается окно с комбинированным списком и статическим элементом управления. Комбинированный список заполняется с помощью функции DlgDirListComboBox (как в примере). При изменении текущего выбора пользователем, новое выбранное наименование файла или каталога выводится в статическом элементе управления. Обработка изменения текущего выбора осуществляется путём обработки уведомления CBN_SELCHANGE.

#include <windows.h>

//Идентификаторы элементов управления

#define ID_COMBOBOX 0x100

#define ID_STATIC 0x200

#define _WPARAM ((WPARAM)((CBN_SELCHANGE<<16)+ID_COMBOBOX))

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

char s[50];

switch(uMsg){

case WM_COMMAND:

if(wParam == _WPARAM){

//Получаем текущий выбор

DlgDirSelectComboBoxEx(hwnd,s,sizeof(s)-1,ID_COMBOBOX);

//Выводим его в статический элемент управления

SetDlgItemText(hwnd,ID_STATIC,s);

}

break;

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg){

return 0;

}

WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

MSG msg;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = 0;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = NULL;

wc.hCursor = NULL;

wc.hbrBackground = (HBRUSH)COLOR_BTNSHADOW;

wc.lpszMenuName = NULL;

wc.lpszClassName = ClassName;

wc.hIconSm = NULL;

//Регистрируем оконный класс

RegisterClassEx(&wc);

//Создаем главное окно

HWND hwnd;

hwnd = CreateWindowEx(0, ClassName, "DlgDirSelectComboBoxEx",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED|WS_BORDER,

400, 400, 220, 130, NULL, 0, hInstance, 0);

//Создаем комбинированный список

HWND hwndCB;

hwndCB = CreateWindowEx(0, "ComboBox", "",

WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST|CBS_HASSTRINGS|WS_VSCROLL,

10, 10, 190, 150, hwnd, (HMENU)ID_COMBOBOX, hInstance, 0);

//Создаем статическое поле

HWND hwndStatic;

hwndStatic = CreateWindowEx(0, "Static", "",

WS_CHILD|WS_VISIBLE,

10, 40, 400, 20, hwnd, (HMENU)ID_STATIC, hInstance, 0);

//Выводим в список содержимое каталог

char s[MAX_PATH] = "D:\\FASM";

DlgDirListComboBox(hwnd,s,ID_COMBOBOX,0,DDL_DIRECTORY);

//Устанавливаем выбор по умолчанию

SendMessage(hwndCB,CB_SETCURSEL,0,0);

//Цикл обработки сообщений

while(GetMessage(&msg,NULL,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}


GetComboBoxInfo

Демонстрация работы функции GetComboBoxInfo. Эта функция используется для получения информации о комбинированном списке. В данном примере мы создаем окно с комбинированным списком и статическим элементом управления, в которое будут выводиться информация о комбинированном списке.

#include <windows.h>

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

switch(uMsg){

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg){

return 0;

}

WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

MSG msg;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = 0;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = NULL;

wc.hCursor = NULL;

wc.hbrBackground = (HBRUSH)COLOR_BTNSHADOW;

wc.lpszMenuName = NULL;

wc.lpszClassName = ClassName;

wc.hIconSm = NULL;

//Регистрируем оконный класс

RegisterClassEx(&wc);

//Создаем главное окно

HWND hwnd;

hwnd = CreateWindowEx(0, ClassName, "GetComboBoxInfo",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED|WS_BORDER,

400, 400, 320, 130, NULL, 0, hInstance, 0);

//Создаем комбинированный список

HWND hwndCB;

hwndCB = CreateWindowEx(0, "ComboBox", "",

WS_CHILD|WS_VISIBLE,

100, 10, 100, 20, hwnd, NULL, hInstance, 0);

//Создаем статическое поле, в которое будем выводить информацию о комбинированном списке

HWND hwndStatic;

hwndStatic = CreateWindowEx(0, "Static", "Кнопка",

WS_CHILD|WS_VISIBLE,

5, 40, 400, 50, hwnd, NULL, hInstance, 0);

//Получаем информацию о комьинированном списке

COMBOBOXINFO cbi;

cbi.cbSize = sizeof(COMBOBOXINFO);

GetComboBoxInfo(hwndCB,&cbi);

//Формируем строку с информацией о списке

char s[100];

snprintf(s,sizeof(s)-1,"Описатель комбинированного списка %X\nОписатель поля ввода %X\nОписатель списка %X",cbi.hwndCombo,cbi.hwndItem,cbi.hwndList);

//Выводим информацию о списке

SetWindowText(hwndStatic,s);

//Цикл обработки сообщений

while(GetMessage(&msg,NULL,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}

Ниже представлено главное окно приложения (у вас значения будут другими).


ImageList_Draw

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

#include <windows.h>

#include <commctrl.h>

#include "Constants.h"

//Прототип функции ImageList_Create

_stdcall typedef HIMAGELIST (*IMAGELIST_CREATE)(int,int,UINT,int,int);

IMAGELIST_CREATE lpfIL_Create;

//Прототип функции ImageList_Destroy

_stdcall typedef BOOL (*IMAGELIST_DESTROY)(HIMAGELIST);

IMAGELIST_DESTROY lpfIL_Destroy;

//Прототип функции ImageList_Add

_stdcall typedef int (*IMAGELIST_ADD)(HIMAGELIST,HBITMAP,HBITMAP);

IMAGELIST_ADD lpfIL_Add;

//Прототип функции ImageList_Draw

_stdcall typedef BOOL (*IMAGELIST_DRAW)(HIMAGELIST,int,HDC,int,int,UINT);

IMAGELIST_DRAW lpfIL_Draw;

//Прототип функции DeleteObject

_stdcall typedef BOOL (*DELETEOBJECT)(HGDIOBJ);

DELETEOBJECT lpfDeleteObject;

//Описатель коллекции изображений

HIMAGELIST hIL;

//Получает адреса функций из библиотек Comctl32.dll и gdi32.dll

void GetFunctions(void){

HINSTANCE hComctl32;

hComctl32 = LoadLibrary("Comctl32.dll");

lpfIL_Create = (IMAGELIST_CREATE)GetProcAddress(hComctl32,"ImageList_Create");

lpfIL_Destroy = (IMAGELIST_DESTROY)GetProcAddress(hComctl32,"ImageList_Destroy");

lpfIL_Add = (IMAGELIST_ADD)GetProcAddress(hComctl32,"ImageList_Add");

lpfIL_Draw = (IMAGELIST_DRAW)GetProcAddress(hComctl32,"ImageList_Draw");

//Находим адрес функции DeleteObject

HINSTANCE hgdi32;

hgdi32 = LoadLibrary("gdi32.dll");

lpfDeleteObject = (DELETEOBJECT)GetProcAddress(hgdi32,"DeleteObject");

}

//Подготавливает коллекцию изображений

void PrepareImageList(void){

//Получаем адреса функций

GetFunctions();

//Создаем коллекцию

hIL = lpfIL_Create(48,48,ILC_COLOR32,2,0);

//Добавляем в коллекцию первое изображение

HBITMAP hBitmap;

hBitmap = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(ID_BITMAP1));

lpfIL_Add(hIL,hBitmap,NULL);

lpfDeleteObject(hBitmap);

//Добавляем в коллекцию второе изображение

hBitmap = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(ID_BITMAP2));

lpfIL_Add(hIL,hBitmap,NULL);

lpfDeleteObject(hBitmap);

}

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

HDC hdc;

switch(uMsg){

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0); break;

case WM_PAINT:

//Отображаем изображение из коллекции в окне

hdc = GetWindowDC(hwnd);

lpfIL_Draw(hIL,0,hdc,50,50,ILD_NORMAL);

ReleaseDC(hwnd,hdc);

break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

return 0;

}

WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

//Создаем коллекцию изображений

PrepareImageList();

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

MSG msg;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = CS_HREDRAW|CS_VREDRAW;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = NULL;

wc.hCursor = NULL;

wc.hbrBackground = (HBRUSH)COLOR_BTNSHADOW;

wc.lpszMenuName = NULL;

wc.lpszClassName = ClassName;

wc.hIconSm = NULL;

//Регистрируем оконный класс

RegisterClassEx(&wc);

//Создаем окно

CreateWindowEx(0, ClassName, "Иконка",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED,

100, 100, 200, 200, NULL, NULL, hInstance, 0);

//Цикл обработки сообщений

while(GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

//Уничтожаем коллекцию изображений

lpfIL_Destroy(hIL);

return 0;

}

Файл ресурсов.

#include "Constants.h"

ID_BITMAP1 BITMAP "pict_1.bmp"

ID_BITMAP2 BITMAP "pict_2.bmp"

Заголовочный файл "Constants.h" содержит идентификаторы изображений, хранящихся в ресурсах.

#define ID_BITMAP1 0x100

#define ID_BITMAP2 0x200


ImageList_DrawEx

Данный пример аналогичен примеру, но с одним отличием: вместо функции ImageList_Draw мы используем функцию ImageList_DrawEx.

#include <windows.h>

#include <commctrl.h>

#include "Constants.h"

//Прототип функции ImageList_Create

_stdcall typedef HIMAGELIST (*IMAGELIST_CREATE)(int,int,UINT,int,int);

IMAGELIST_CREATE lpfIL_Create;

//Прототип функции ImageList_Destroy

_stdcall typedef BOOL (*IMAGELIST_DESTROY)(HIMAGELIST);

IMAGELIST_DESTROY lpfIL_Destroy;

//Прототип функции ImageList_Add

_stdcall typedef int (*IMAGELIST_ADD)(HIMAGELIST,HBITMAP,HBITMAP);

IMAGELIST_ADD lpfIL_Add;

//Прототип функции ImageList_DrawEx

_stdcall typedef BOOL (*IMAGELIST_DRAWEX)(HIMAGELIST,int,HDC,int,int,int,int,COLORREF,COLORREF,UINT);

IMAGELIST_DRAWEX lpfIL_DrawEx;

//Прототип функции DeleteObject

_stdcall typedef BOOL (*DELETEOBJECT)(HGDIOBJ);

DELETEOBJECT lpfDeleteObject;

//Описатель коллекции изображений

HIMAGELIST hIL;

//Получает адреса функций из библиотек Comctl32.dll и gdi32.dll

void GetFunctions(void){

HINSTANCE hComctl32;

hComctl32 = LoadLibrary("Comctl32.dll");

lpfIL_Create = (IMAGELIST_CREATE)GetProcAddress(hComctl32,"ImageList_Create");

lpfIL_Destroy = (IMAGELIST_DESTROY)GetProcAddress(hComctl32,"ImageList_Destroy");

lpfIL_Add = (IMAGELIST_ADD)GetProcAddress(hComctl32,"ImageList_Add");

lpfIL_DrawEx = (IMAGELIST_DRAWEX)GetProcAddress(hComctl32,"ImageList_DrawEx");

//Находим адрес функции DeleteObject

HINSTANCE hgdi32;

hgdi32 = LoadLibrary("gdi32.dll");

lpfDeleteObject = (DELETEOBJECT)GetProcAddress(hgdi32,"DeleteObject");

}

//Подготавливает коллекцию изображений

void PrepareImageList(void){

//Получаем адреса функций

GetFunctions();

//Создаем коллекцию

hIL = lpfIL_Create(48,48,ILC_COLOR32,2,0);

//Добавляем в коллекцию первое изображение

HBITMAP hBitmap;

hBitmap = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(ID_BITMAP1));

lpfIL_Add(hIL,hBitmap,NULL);

lpfDeleteObject(hBitmap);

//Добавляем в коллекцию второе изображение

hBitmap = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(ID_BITMAP2));

lpfIL_Add(hIL,hBitmap,NULL);

lpfDeleteObject(hBitmap);

}

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

HDC hdc;

switch(uMsg){

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0); break;

case WM_PAINT:

//Отображаем изображение из коллекции в окне

hdc = GetWindowDC(hwnd);

lpfIL_DrawEx(hIL,0,hdc,50,50,0,0,CLR_NONE,CLR_NONE,ILD_NORMAL);

ReleaseDC(hwnd,hdc);

break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

return 0;

}

WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

//Создаем коллекцию изображений

PrepareImageList();

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

MSG msg;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = CS_HREDRAW|CS_VREDRAW;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = NULL;

wc.hCursor = NULL;

wc.hbrBackground = (HBRUSH)COLOR_BTNSHADOW;

wc.lpszMenuName = NULL;

wc.lpszClassName = ClassName;

wc.hIconSm = NULL;

//Регистрируем оконный класс

RegisterClassEx(&wc);

//Создаем окно

CreateWindowEx(0, ClassName, "Иконка",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED,

100, 100, 200, 200, NULL, NULL, hInstance, 0);

//Цикл обработки сообщений

while(GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

//Уничтожаем коллекцию изображений

lpfIL_Destroy(hIL);

return 0;

}

Файл ресурсов.

#include "Constants.h"

ID_BITMAP1 BITMAP "pict_1.bmp"

ID_BITMAP2 BITMAP "pict_2.bmp"

Заголовочный файл "Constants.h" содержит идентификаторы изображений, хранящихся в ресурсах.

#define ID_BITMAP1 0x100

#define ID_BITMAP2 0x200


ImageList_DrawIndirect

Данный пример аналогичен примеру, но с одним отличием: вместо функции ImageList_Draw мы используем функцию ImageList_DrawIndirect.

#define _WIN32_IE 0x0300

#include <windows.h>

#include <commctrl.h>

#include "Constants.h"

//Прототип функции ImageList_Create

_stdcall typedef HIMAGELIST (*IMAGELIST_CREATE)(int,int,UINT,int,int);

IMAGELIST_CREATE lpfIL_Create;

//Прототип функции ImageList_Destroy

_stdcall typedef BOOL (*IMAGELIST_DESTROY)(HIMAGELIST);

IMAGELIST_DESTROY lpfIL_Destroy;

//Прототип функции ImageList_Add

_stdcall typedef int (*IMAGELIST_ADD)(HIMAGELIST,HBITMAP,HBITMAP);

IMAGELIST_ADD lpfIL_Add;

//Прототип функции ImageList_DrawIndirect

_stdcall typedef BOOL (*IMAGELIST_DRAWINDIRECT)(IMAGELISTDRAWPARAMS*);

IMAGELIST_DRAWINDIRECT lpfIL_DrawIndirect;

//Прототип функции DeleteObject

_stdcall typedef BOOL (*DELETEOBJECT)(HGDIOBJ);

DELETEOBJECT lpfDeleteObject;

//Описатель коллекции изображений

HIMAGELIST hIL;

//Получает адреса функций из библиотек Comctl32.dll и gdi32.dll

void GetFunctions(void){

HINSTANCE hComctl32;

hComctl32 = LoadLibrary("Comctl32.dll");

lpfIL_Create = (IMAGELIST_CREATE)GetProcAddress(hComctl32,"ImageList_Create");

lpfIL_Destroy = (IMAGELIST_DESTROY)GetProcAddress(hComctl32,"ImageList_Destroy");

lpfIL_Add = (IMAGELIST_ADD)GetProcAddress(hComctl32,"ImageList_Add");

lpfIL_DrawIndirect = (IMAGELIST_DRAWINDIRECT)GetProcAddress(hComctl32,"ImageList_DrawIndirect");

//Находим адрес функции DeleteObject

HINSTANCE hgdi32;

hgdi32 = LoadLibrary("gdi32.dll");

lpfDeleteObject = (DELETEOBJECT)GetProcAddress(hgdi32,"DeleteObject");

}

//Подготавливает коллекцию изображений

void PrepareImageList(void){

//Получаем адреса функций

GetFunctions();

//Создаем коллекцию

hIL = lpfIL_Create(48,48,ILC_COLOR32,2,0);

//Добавляем в коллекцию первое изображение

HBITMAP hBitmap;

hBitmap = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(ID_BITMAP1));

lpfIL_Add(hIL,hBitmap,NULL);

lpfDeleteObject(hBitmap);

//Добавляем в коллекцию второе изображение

hBitmap = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(ID_BITMAP2));

lpfIL_Add(hIL,hBitmap,NULL);

lpfDeleteObject(hBitmap);

}

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

HDC hdc;

IMAGELISTDRAWPARAMS ILDP;

switch(uMsg){

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0); break;

case WM_PAINT:

//Получаем описатель контекста устройства

hdc = GetWindowDC(hwnd);

//Подготавливаем структуру IMAGELISTDRAWPARAMS

ILDP.cbSize = sizeof(IMAGELISTDRAWPARAMS);

ILDP.himl = hIL;

ILDP.i = 0;

ILDP.hdcDst = hdc;

ILDP.x = 50;

ILDP.y = 50;

ILDP.cx = 0;

ILDP.cy = 0;

ILDP.xBitmap = 0;

ILDP.yBitmap = 0;

ILDP.rgbBk = CLR_NONE;

ILDP.rgbFg = CLR_NONE;

ILDP.fStyle = ILD_NORMAL;

ILDP.dwRop = SRCCOPY;

//Отрисовываем изображение из коллекции

lpfIL_DrawIndirect(&ILDP);

//Освобождаем контекст устройства

ReleaseDC(hwnd,hdc);

break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

return 0;

}

WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

//Создаем коллекцию изображений

PrepareImageList();

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

MSG msg;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = CS_HREDRAW|CS_VREDRAW;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = NULL;

wc.hCursor = NULL;

wc.hbrBackground = (HBRUSH)COLOR_BTNSHADOW;

wc.lpszMenuName = NULL;

wc.lpszClassName = ClassName;

wc.hIconSm = NULL;

//Регистрируем оконный класс

RegisterClassEx(&wc);

//Создаем окно

CreateWindowEx(0, ClassName, "Иконка",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED,

100, 100, 200, 200, NULL, NULL, hInstance, 0);

//Цикл обработки сообщений

while(GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

//Уничтожаем коллекцию изображений

lpfIL_Destroy(hIL);

return 0;

}

Файл ресурсов.

#include "Constants.h"

ID_BITMAP1 BITMAP "pict_1.bmp"

ID_BITMAP2 BITMAP "pict_2.bmp"

Заголовочный файл "Constants.h" содержит идентификаторы изображений, хранящихся в ресурсах.

#define ID_BITMAP1 0x100

#define ID_BITMAP2 0x200


LoadImage

Демонстрация работы с функцией LoadImage, которая используется для загрузки растровых изображений, иконок и курсоров. Мы приведем два примера её использования.

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

#include <windows.h>

#include "Constants.h"

//Прототип функции DeleteObject

_stdcall typedef BOOL (*DELETEOBJECT)(HGDIOBJ);

DELETEOBJECT lpfDeleteObject;

int main()

{

//Находим адрес функции DeleteObject

HINSTANCE hgdi32;

hgdi32 = LoadLibrary("gdi32.dll");

lpfDeleteObject = (DELETEOBJECT)GetProcAddress(hgdi32,"DeleteObject");

//Загружаем из ресурсов растровое изображение

HBITMAP hBitmap;

hBitmap = LoadImage(GetModuleHandle(NULL),MAKEINTRESOURCE(ID_BITMAP),IMAGE_BITMAP,0,0,LR_DEFAULTCOLOR);

printf("%x\n",hBitmap);

//Освобождаем ресурсы

lpfDeleteObject(hBitmap);

getchar();

return 0;

}

Ниже приводится содержимое файла ресурсов.

#include "Constants.h"

ID_BITMAP BITMAP "pict_1.bmp"

Заголовочный файл "Constants.h" используется для описания одной единственной константы (идентификатора ресурса растрового изображения).

#define ID_BITMAP 0x100

Во втором примере мы будем загружать растровое изображение из отдельного файла.

#include <windows.h>

//Прототип функции DeleteObject

_stdcall typedef BOOL (*DELETEOBJECT)(HGDIOBJ);

DELETEOBJECT lpfDeleteObject;

int main()

{

//Находим адрес функции DeleteObject

HINSTANCE hgdi32;

hgdi32 = LoadLibrary("gdi32.dll");

lpfDeleteObject = (DELETEOBJECT)GetProcAddress(hgdi32,"DeleteObject");

//Загружаем растровое изображение

HBITMAP hBitmap;

hBitmap = LoadImage(NULL,"pict_1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

printf("%x\n",hBitmap);

//Освобождаем ресурсы

lpfDeleteObject(hBitmap);

getchar();

return 0;

}

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


SplitButton

Демонстрация работы с кнопкой SplitButton. Это новый тип кнопок, появившийся в Windows Vista. Их отличает установленный стиль BS_SPLITBUTTON или BS_DEFSPLITBUTTON. Внешне они выглядят как кнопки с раскрывающимся списком.

В данном примере мы создаём простую кнопку SplitButton с пустым раскрывающимся списком. Приложение обрабатывает два события связанных с кнопкой: нажатие на кнопку (выводится сообщение "Вы нажали на кнопку") и раскрытие списка (выводится сообщение "Вы раскрыли список").

Данный пример проверялся на операционной системе Windows 7.

#include <windows.h>

//Идентификатор кнопки

#define ID_BUTTON 0x0200

#define _WPARAM ((WPARAM)((BN_CLICKED<<16)+ID_BUTTON))

#define BS_SPLITBUTTON 0x0000000C

#define BS_DEFSPLITBUTTON 0x0000000D

#define BCN_FIRST -1250

#define BCN_DROPDOWN (BCN_FIRST + 2)

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

switch(uMsg){

case WM_COMMAND:

if(wParam == _WPARAM)

MessageBox(hwnd,"Вы нажали на кнопку","",MB_OK);

break;

case WM_NOTIFY:

if(((LPNMHDR)lParam)->code == BCN_DROPDOWN)

MessageBox(hwnd,"Вы раскрыли список","",MB_OK);

break;

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg){

return 0;

}

WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

MSG msg;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = 0;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = NULL;

wc.hCursor = NULL;

wc.hbrBackground = (HBRUSH)COLOR_BTNSHADOW;

wc.lpszMenuName = NULL;

wc.lpszClassName = ClassName;

wc.hIconSm = NULL;

//Регистрируем оконный класс

RegisterClassEx(&wc);

//Создаем окно

HWND hwnd;

hwnd = CreateWindowEx(0, ClassName, "SplitButton",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED|WS_BORDER,

400, 300, 130, 100, NULL, 0, hInstance, 0);

//Создаем кнопку SplitButton

HWND hwndButton;

hwndButton = CreateWindowEx(0, "Button", "Кнопка",

WS_CHILD|WS_VISIBLE|BS_DEFSPLITBUTTON|WS_BORDER,

10, 10, 100, 50, hwnd, (HMENU)ID_BUTTON, NULL, 0);

//Цикл обработки сообщений

while(GetMessage(&msg,NULL,0,0)){

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}

Файл ресурсов.

#include <winuser.h>

1 RT_MANIFEST "Manifest.xml"

Манифест, сохраненный в файле Manifest.xml.

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">

<security>

<requestedPrivileges>

<requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>

</requestedPrivileges>

</security>

</trustInfo>

<dependency>

<dependentAssembly>

<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*"></assemblyIdentity>

</dependentAssembly>

</dependency>

</assembly>

Ниже приводится главное окно приложения:


Группа переключателей (RadioButton)

Данный пример демонстрирует работу с группой переключателей. При создании группы переключателей первый переключатель в ней должен иметь стиль WS_GROUP. Переключатели, создаваемые вслед за ним, будут объединены системой в одну группу с первым переключателем. Так будет продолжаться до тех пор, пока не будет создан новый переключатель со стилем WS_GROUP, который начнет новую группу переключателей.

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

Проверка состояния переключателя осуществляется также как и в случае кнопки с помощью функции IsDlgButtonChecked. Для выбора переключателей по умолчанию используется функция CheckRadioButton.

#include <windows.h>

#include "Constants.h"

/***************************/

//Возвращает идентификатор переключателя с выбранным текстом сообщения

/***************************/

int GetText(HWND hwnd){

int res;

res = IsDlgButtonChecked(hwnd, ID_HELLO);

if(res == BST_CHECKED)

return ID_HELLO;

res = IsDlgButtonChecked(hwnd, ID_GOODMORNING);

if(res == BST_CHECKED)

return ID_GOODMORNING;

res = IsDlgButtonChecked(hwnd, ID_GOODDAY);

if(res == BST_CHECKED)

return ID_GOODDAY;

res = IsDlgButtonChecked(hwnd, ID_GOODEVENING);

if(res == BST_CHECKED)

return ID_GOODEVENING;

return ID_GOODNIGHT;

}

/***************************/

//Возвращает выбранный набор кнопок

/***************************/

int GetButtons(HWND hwnd){

int res;

res = IsDlgButtonChecked(hwnd, ID_OK);

if(res == BST_CHECKED)

return MB_OK;

res = IsDlgButtonChecked(hwnd, ID_OKCANCEL);

if(res == BST_CHECKED)

return MB_OKCANCEL;

res = IsDlgButtonChecked(hwnd, ID_RETRYCANCEL);

if(res == BST_CHECKED)

return MB_RETRYCANCEL;

res = IsDlgButtonChecked(hwnd, ID_YESNO);

if(res == BST_CHECKED)

return MB_YESNO;

return MB_YESNOCANCEL;

}

/***************************/

//Оконная процедура

/***************************/

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

int idText, Buttons;

char s[50];

switch(uMsg){

case WM_COMMAND:

//Убеждаемся в том, что получено сообщение от кнопки

if(wParam == _WPARAM){

idText = GetText(hwnd);

GetDlgItemText(hwnd,idText,s,50);

Buttons = GetButtons(hwnd);

MessageBox(hwnd,s,"",Buttons);

}//if(wParam == _WPARAM){

break;

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg){

return 0;

}

WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = 0;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = NULL;

wc.hCursor = NULL;

wc.hbrBackground = (HBRUSH)COLOR_BTNSHADOW;

wc.lpszMenuName = NULL;

wc.lpszClassName = ClassName;

wc.hIconSm = NULL;

//Регистрируем оконный класс

RegisterClassEx(&wc);

//Создаем главное окно

HWND hwnd;

hwnd = CreateWindowEx(0, ClassName, "Группа переключателей",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED|WS_BORDER,

400, 300, 305, 225, NULL, 0, hInstance, 0);

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

CreateWindowEx(0, "Button", "Текст сообщения",

WS_CHILD|WS_VISIBLE|BS_GROUPBOX,

5, 5, 140, 125, hwnd, 0, hInstance, 0);

//Создаем переключатели первой группы

CreateWindowEx(0,"Button","Привет",

WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON|WS_GROUP,

10, 25, 125, 15, hwnd, (HMENU)ID_HELLO, hInstance, 0);

CreateWindowEx(0,"Button","Доброе утро",

WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,

10, 45, 125, 15, hwnd, (HMENU)ID_GOODMORNING, hInstance, 0);

CreateWindowEx(0,"Button","Добрый день",

WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,

10, 65, 125, 15, hwnd, (HMENU)ID_GOODDAY, hInstance, 0);

CreateWindowEx(0,"Button","Добрый вечер",

WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,

10, 85, 125, 15, hwnd, (HMENU)ID_GOODEVENING, hInstance, 0);

CreateWindowEx(0,"Button","Добрая ночь",

WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,

10, 105, 125, 15, hwnd, (HMENU)ID_GOODNIGHT, hInstance, 0);

//Создаем рамку группы переключателей выбора набора кнопок

CreateWindowEx(0, "Button", "Кнопки",

WS_CHILD|WS_VISIBLE|BS_GROUPBOX,

155, 5, 140, 125, hwnd, 0, hInstance, 0);

//Создаем переключатели второй группы

CreateWindowEx(0,"Button","ОК",

WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON|WS_GROUP,

160, 25, 125, 15, hwnd, (HMENU)ID_OK, hInstance, 0);

CreateWindowEx(0,"Button","ОК, Отмена",

WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,

160, 45, 125, 15, hwnd, (HMENU)ID_OKCANCEL, hInstance, 0);

CreateWindowEx(0,"Button","Повтор, Отмена",

WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,

160, 65, 125, 15, hwnd, (HMENU)ID_RETRYCANCEL, hInstance, 0);

CreateWindowEx(0,"Button","Да, Нет",

WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,

160, 85, 125, 15, hwnd, (HMENU)ID_YESNO, hInstance, 0);

CreateWindowEx(0,"Button","Да, Нет, Отмена",

WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,

160, 105, 130, 15, hwnd, (HMENU)ID_YESNOCANCEL, hInstance, 0);

//Создаем кнопку

CreateWindowEx(0, "Button", "Показать сообщение",

WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON,

70, 140, 150, 50, hwnd, (HMENU)ID_BUTTON, hInstance, 0);

//"Выбираем" переключатели по умолчанию

CheckRadioButton(hwnd,ID_HELLO,ID_GOODNIGHT,ID_HELLO);

CheckRadioButton(hwnd, ID_OK, ID_YESNOCANCEL, ID_OK);

//Цикл обработки сообщений

MSG msg;

while(GetMessage(&msg,NULL,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}

Файл Constants.h

//Идентификатор кнопки

#define ID_BUTTON 0x0100

//Идентификаторы переключателей

#define ID_HELLO 0x0200

#define ID_GOODMORNING 0x0201

#define ID_GOODDAY 0x0202

#define ID_GOODEVENING 0x0203

#define ID_GOODNIGHT 0x0204

#define ID_OK 0x0300

#define ID_OKCANCEL 0x0301

#define ID_RETRYCANCEL 0x0302

#define ID_YESNO 0x0303

#define ID_YESNOCANCEL 0x0304

#define _WPARAM ((WPARAM)((BN_CLICKED<<8)+ID_BUTTON))

Ниже приведен внешний вид главного ока приложения:


Группа переключателей (RadioButton) 2

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

#include <windows.h>

#include "Constants.h"

/***************************/

//Возвращает идентификатор переключателя с выбранным текстом сообщения

/***************************/

int GetText(HWND hwnd){

int res;

res = IsDlgButtonChecked(hwnd, ID_HELLO);

if(res == BST_CHECKED)

return ID_HELLO;

res = IsDlgButtonChecked(hwnd, ID_GOODMORNING);

if(res == BST_CHECKED)

return ID_GOODMORNING;

res = IsDlgButtonChecked(hwnd, ID_GOODDAY);

if(res == BST_CHECKED)

return ID_GOODDAY;

res = IsDlgButtonChecked(hwnd, ID_GOODEVENING);

if(res == BST_CHECKED)

return ID_GOODEVENING;

return ID_GOODNIGHT;

}

/***************************/

//Возвращает выбранный набор кнопок

/***************************/

int GetButtons(HWND hwnd){

int res;

res = IsDlgButtonChecked(hwnd, ID_OK);

if(res == BST_CHECKED)

return MB_OK;

res = IsDlgButtonChecked(hwnd, ID_OKCANCEL);

if(res == BST_CHECKED)

return MB_OKCANCEL;

res = IsDlgButtonChecked(hwnd, ID_RETRYCANCEL);

if(res == BST_CHECKED)

return MB_RETRYCANCEL;

res = IsDlgButtonChecked(hwnd, ID_YESNO);

if(res == BST_CHECKED)

return MB_YESNO;

return MB_YESNOCANCEL;

}

/***************************/

//Оконная процедура

/***************************/

INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

int idText, Buttons;

char s[50];

switch(uMsg){

//"Выбираем" переключатели по умолчанию

case WM_INITDIALOG:

CheckRadioButton(hwnd,ID_HELLO,ID_GOODNIGHT ,ID_HELLO);

CheckRadioButton(hwnd,ID_OK ,ID_YESNOCANCEL,ID_OK);

break;

case WM_COMMAND:

//Убеждаемся в том, что получено сообщение от кнопки

if(wParam == _WPARAM){

idText = GetText(hwnd);

GetDlgItemText(hwnd,idText,s,50);

Buttons = GetButtons(hwnd);

MessageBox(hwnd,s,"",Buttons);

}//if(wParam == _WPARAM){

break;

case WM_CLOSE: EndDialog(hwnd,0); break;

}//switch(uMsg){

return 0;

}

WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

DialogBoxParam(hInstance,MAKEINTRESOURCE(ID_DIALOG),HWND_DESKTOP,Dlg_Proc,0);

return 0;

}

Файл ресурсов:

#include <windows.h>

#include "Constants.h"

ID_DIALOG DIALOG 0,0,157,95

STYLE WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED|WS_BORDER|DS_CENTER

CAPTION "Группа переключателей"

BEGIN

//Рамка группы переключателей выбора текста сообщения

PUSHBUTTON "Текст сообщения",0, 2,2,75,65,WS_VISIBLE|BS_GROUPBOX

//Переключатели первой группы

AUTORADIOBUTTON "Привет" ,ID_HELLO ,5,10,70,15,WS_VISIBLE|WS_GROUP

AUTORADIOBUTTON "Доброе утро" ,ID_GOODMORNING,5,20,70,15,WS_VISIBLE

AUTORADIOBUTTON "Добрый день" ,ID_GOODDAY ,5,30,70,15,WS_VISIBLE

AUTORADIOBUTTON "Добрый вечер",ID_GOODEVENING,5,40,70,15,WS_VISIBLE

AUTORADIOBUTTON "Добрая ночь" ,ID_GOODNIGHT ,5,50,70,15,WS_VISIBLE

//Рамка группы переключателей выбора набора кнопок

PUSHBUTTON "Кнопки",0,80,2,75,65,WS_VISIBLE|BS_GROUPBOX

//Переключатели второй группы

AUTORADIOBUTTON "ОК" ,ID_OK ,83,10,70,15,WS_VISIBLE|WS_GROUP

AUTORADIOBUTTON "ОК, Отмена" ,ID_OKCANCEL ,83,20,70,15,WS_VISIBLE

AUTORADIOBUTTON "Повтор, Отмена" ,ID_RETRYCANCEL,83,30,70,15,WS_VISIBLE

AUTORADIOBUTTON "Да, Нет" ,ID_YESNO ,83,40,70,15,WS_VISIBLE

AUTORADIOBUTTON "Да, Нет, Отмена",ID_YESNOCANCEL,83,50,70,15,WS_VISIBLE

//Кнопка вывода сообщения

PUSHBUTTON "Показать сообщение", ID_BUTTON, 35,70,80,20,BS_DEFPUSHBUTTON

END

Заголовочный файл Costants.h:

//Идентификатор кнопки

#define ID_DIALOG 0x0400

#define ID_BUTTON 0x0100

//Идентификаторы переключателей

#define ID_HELLO 0x0200

#define ID_GOODMORNING 0x0201

#define ID_GOODDAY 0x0202

#define ID_GOODEVENING 0x0203

#define ID_GOODNIGHT 0x0204

#define ID_OK 0x0300

#define ID_OKCANCEL 0x0301

#define ID_RETRYCANCEL 0x0302

#define ID_YESNO 0x0303

#define ID_YESNOCANCEL 0x0304

#define _WPARAM ((WPARAM)((BN_CLICKED<<8)+ID_BUTTON))


Кнопка (Button)

Данный пример демонстрирует создание простой нажимной кнопки и обработку её нажатия. В приере создаётся простое окно с кнопкой. По нажатию на кнопку выводится сообщение "Вы нажали на кнопку"

#include <windows.h>

//Идентификатор кнопки

#define ID_BUTTON 0x00000100

#define _WPARAM ((WPARAM)((BN_CLICKED<<16)+ID_BUTTON))

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

int res;

char s[10];

switch(uMsg){

case WM_COMMAND:

if(wParam == _WPARAM)

MessageBox(hwnd,"Вы нажали на кнопку", "", MB_OK);

break;

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg){

return 0;

}

WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

MSG msg;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = 0;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = NULL;

wc.hCursor = NULL;

wc.hbrBackground = (HBRUSH)COLOR_BTNSHADOW;

wc.lpszMenuName = NULL;

wc.lpszClassName = ClassName;

wc.hIconSm = NULL;

//Регистрируем оконный класс

RegisterClassEx(&wc);

//Создаем окно

HWND hwnd;

hwnd = CreateWindowEx(0, ClassName, "Простая кнопка",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED|WS_BORDER,

400, 300, 170, 150, NULL, 0, hInstance, 0);

//Создаем кнопку

HWND hwndButton;

hwndButton = CreateWindowEx(0, "Button", "Кнопка",

WS_CHILD|WS_VISIBLE|WS_BORDER|BS_PUSHBUTTON,

30, 30, 100, 50, hwnd, (HMENU)ID_BUTTON, hInstance, 0);

//Цикл обработки сообщений

while(GetMessage(&msg,NULL,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}


Кнопка остающаяся в нажатом состоянии

В данном примере демонстрируется работа с кнопкой, которая после щелчка по ней остается в нажатом состоянии вплоть до повторного щелчка. Такая кнопка является обычным флажком с установленным стилем BS_PUSHLIKE.

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

#include <windows.h>

//Идентификатор статического поля

#define ID_STATIC 0x0100

//Идентияикатор кнопки

#define ID_BUTTON 0x0200

#define _WPARAM ((WPARAM)((BN_CLICKED<<16)+ID_BUTTON))

//Описатели окон

HWND hwndStatic;

HWND hwndButton;

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

//Идентификатор таймера

static int idTimer = 1;

//Счетчик

static unsigned int k = 0;

int res;

char s[10];

switch(uMsg){

case WM_COMMAND:

//Убуждаемся в том, что получено сообщение от кнопки

if(wParam == _WPARAM){

//Проверяем состояние кнопки

res = IsDlgButtonChecked(hwnd,ID_BUTTON);

if(res == BST_CHECKED){

//Кнопка нажата: включаем таймер

idTimer = SetTimer(hwnd,idTimer,1000,NULL);

}else{

//Копка не нажата: сбрасываем счетчик и отключаем таймер

KillTimer(hwnd,idTimer);

k = 0;

sprintf(s,"%d",0);

SetWindowText(hwndStatic,s);

}//if(res == BST_CHECKED){

}//if(wParam == _WPARAM){

break;

case WM_TIMER:

//Сообщение от таймера: увеличиваем значение счетчика

k++;

sprintf(s,"%d",k);

SetWindowText(hwndStatic,s);

break;

case WM_CLOSE:

//Если нас закрывают при включенном таймере, то сначала нужно его выключить

res = IsDlgButtonChecked(hwnd,ID_BUTTON);

if(res == BST_CHECKED)

KillTimer(hwnd,idTimer);

DestroyWindow(hwnd);

break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg){

return 0;

}

WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

MSG msg;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = 0;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = NULL;

wc.hCursor = NULL;

wc.hbrBackground = (HBRUSH)COLOR_BTNSHADOW;

wc.lpszMenuName = NULL;

wc.lpszClassName = ClassName;

wc.hIconSm = NULL;

//Регистрируем оконный класс

RegisterClassEx(&wc);

//Создаем окно

HWND hwnd;

hwnd = CreateWindowEx(0, ClassName, "Кнопка",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED|WS_BORDER,

400, 300, 170, 150, NULL, 0, hInstance, 0);

//Создаем статическое поле

hwndStatic = CreateWindowEx(0, "Static", "0",

WS_CHILD|WS_VISIBLE,

40, 20, 100, 15, hwnd, (HMENU)ID_STATIC, hInstance, 0);

//Создаем кнопку, остающуюся в нажатом состоянии

hwndButton = CreateWindowEx(0, "Button", "Кнопка",

WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX|BS_PUSHLIKE,

30, 60, 100, 50, hwnd, (HMENU)ID_BUTTON, hInstance, 0);

//Цикл обработки сообщений

while(GetMessage(&msg,NULL,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}


Кнопка с иконкой

Демонстрация создания кнопки с иконкой. Это обычная кнопка с установленным стилем BS_ICON. Для установки иконки используется сообщение BM_SETIMAGE. При нажатии на кнопку выводится сообщение "Вы нажали на кнопку с иконкой".

#include <windows.h>

#include "Constants.h"

//Оконная процедура главного окна

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

switch(uMsg){

case WM_COMMAND:

//Убеждаемся в том, что получено сообщение от кнопки

if(wParam == _WPARAM)

MessageBox(hwnd,"Вы нажали на кнопку с иконкой","",MB_OK);

break;

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg){

return 0;

}

WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

MSG msg;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = 0;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = NULL;

wc.hCursor = NULL;

wc.hbrBackground = (HBRUSH)COLOR_BTNSHADOW;

wc.lpszMenuName = NULL;

wc.lpszClassName = ClassName;

wc.hIconSm = NULL;

//Регистрируем оконный класс

RegisterClassEx(&wc);

//Создаем окно

HWND hwnd;

hwnd = CreateWindowEx(0, ClassName, "Кнопка с иконкой",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED|WS_BORDER,

400, 300, 170, 130, NULL, 0, hInstance, 0);

//Создаем кнопку

HWND hwndButton;

hwndButton = CreateWindowEx(0, "Button", "",

WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_ICON,

25, 25, 100, 50, hwnd, (HMENU)ID_BUTTON, hInstance, 0);

//Загружаем иконку из ресурсов

HICON hIcon;

hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(ID_ICON));

//Устанавливаем иконку на кнопке

SendMessage(hwndButton,BM_SETIMAGE,(WPARAM)IMAGE_ICON,(LPARAM)hIcon);

//Цикл обработки сообщений

while(GetMessage(&msg,NULL,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}

Заголовочный файл Constants.h

#define ID_ICON 0x100

//Идентификатор кнопки

#define ID_BUTTON 0x0200

#define _WPARAM ((WPARAM)((BN_CLICKED<<8)+ID_BUTTON))

Файл ресурсов

#include "Constants.h"

ID_ICON ICON "MyIcon.ico"

Ниже приводится главное окно приложения.


Кнопка с иконкой и текстом

Демонстрация создания кнопки, на которой отображается и иконка и заголовок. Для решения этой задачи я использовал перегрузку стандартной оконной процедуры кнопки (сабклассинг). Перегрузка оконной процедуры осуществляется с помощью функции SetWindowLong. При этом специальным образом обрабатывалось сообщение WM_PAINT. Работает это следующим образом.

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

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

#include <windows.h>

#include "Constants.h"

//Описатель кнопки

HWND hwndButton;

//Описатель иконки

HICON hIcon;

//"Родная" оконная процедура кнопки

LONG oldwndProc = 0;

//Оконная процедура главного окна

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

switch(uMsg){

case WM_COMMAND:

//Убеждаемся в том, что получено сообщение от кнопки

if(wParam == _WPARAM)

MessageBox(hwnd,"Вы нажали на кнопку с иконкой и заголовком","",MB_OK);

break;

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg){

return 0;

}

//Оконная процедура кнопки

LRESULT ButtonWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){

//Вызываем "родную" оконную процедуру кнопки

LRESULT res;

res = CallWindowProc((WNDPROC)oldwndProc,hwnd,uMsg,wParam,lParam);

HDC hdc;

if(uMsg == WM_PAINT){

//Отрисовываем на кнопке иконку

hdc = GetDC(hwnd);

DrawIcon(hdc,5,10,hIcon);

ReleaseDC(hwnd,hdc);

}

return res;

}

WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

//Загружаем иконку из ресурсов

hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(ID_ICON));

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

MSG msg;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = 0;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = NULL;

wc.hCursor = NULL;

wc.hbrBackground = (HBRUSH)COLOR_BTNSHADOW;

wc.lpszMenuName = NULL;

wc.lpszClassName = ClassName;

wc.hIconSm = NULL;

//Регистрируем оконный класс

RegisterClassEx(&wc);

//Создаем окно

HWND hwnd;

hwnd = CreateWindowEx(0, ClassName, "Кнопка с иконкой и заголовком",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED|WS_BORDER,

400, 300, 260, 130, NULL, 0, hInstance, 0);

//Создаем кнопку

hwndButton = CreateWindowEx(0, "Button", "Кнопка с иконкой ",

WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_RIGHT,

40, 20, 170, 50, hwnd, (HMENU)ID_BUTTON, hInstance, 0);

//Переопределяем оконную процедуру кнопки (сабклассинг)

oldwndProc = SetWindowLong(hwndButton,GWL_WNDPROC, (LONG)ButtonWndProc);

//Цикл обработки сообщений

while(GetMessage(&msg,NULL,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}

Заголовочный файл "Constants.h"

#define ID_ICON 0x100

//Идентияикатор кнопки

#define ID_BUTTON 0x0300

#define _WPARAM ((WPARAM)((BN_CLICKED<<8)+ID_BUTTON))

Файл ресурсов

#include "Constants.h"

ID_ICON ICON "MyIcon.ico"

Ниже приводится главное окно приложения.


Кнопка с иконкой и текстом 2

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

Мы создаём обычную кнопку и два статических элемента управления (окна "Static"), которые являются дочерними (по отношению к кнопке) окнами. В первое окно "Static" мы с помощью сообщения STM_SETICON выведем иконку. Второе окно "Static" будет отображать "заголовок" кнопки.

Так мы имитируем кнопку с иоконкой и заголовком. Его можно использовать и для имитации CommandLinkButton. Причем такая имитация будет работать и на более старых (по сравненю с Windows Vista) версиях операционной системы.

#include <windows.h>

#include "Constants.h"

//Оконная процедура главного окна

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

switch(uMsg){

case WM_COMMAND:

//Убеждаемся в том, что получено сообщение от кнопки

if(wParam == _WPARAM)

MessageBox(hwnd,"Вы нажали на кнопку с иконкой и заголовком","",MB_OK);

break;

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg){

return 0;

}

WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

MSG msg;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = 0;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = NULL;

wc.hCursor = NULL;

wc.hbrBackground = (HBRUSH)COLOR_BTNSHADOW;

wc.lpszMenuName = NULL;

wc.lpszClassName = ClassName;

wc.hIconSm = NULL;

//Регистрируем оконный класс

RegisterClassEx(&wc);

//Создаем окно

HWND hwnd;

hwnd = CreateWindowEx(0, ClassName, "Кнопка с иконкой и заголовком",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED|WS_BORDER,

400, 300, 260, 130, NULL, 0, hInstance, 0);

//Создаем кнопку

HWND hwndButton;

hwndButton = CreateWindowEx(0, "Button", "",

WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,

40, 20, 170, 50, hwnd, (HMENU)ID_BUTTON, hInstance, 0);

//Создаём окно, в котором будет отображаться иконка

HWND hwndStatic;

hwndStatic = CreateWindowEx(0,"Static","",

WS_CHILD|WS_VISIBLE|SS_ICON,

5,5,20,20,hwndButton,NULL,hInstance,0);

//Загружаем иконку из ресурсов

HICON hIcon;

hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(ID_ICON));

//Устанавливаем иконку

SendMessage(hwndStatic,STM_SETICON,(WPARAM)hIcon,(LPARAM)0);

//Создаём окно, в котором будет отображаться заголовок

hwndStatic = CreateWindowEx(0,"Static","Кнопка с иконкой",

WS_CHILD|WS_VISIBLE,

45,15,120,20,hwndButton,NULL,hInstance,0);

//Цикл обработки сообщений

while(GetMessage(&msg,NULL,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}

Заголовочный файл Constants.h

#define ID_ICON 0x100

//Идентификатор кнопки

#define ID_BUTTON 0x0200

#define _WPARAM ((WPARAM)((BN_CLICKED<<8)+ID_BUTTON))

Файл ресурсов.

#include "Constants.h"

ID_ICON ICON "MyIcon.ico"

Внешне главное окно данного приложения ничем не отличается от главного окна приложения в примере.


Окно с перетаскиваемым изображением

Демонстрация программирования окна с перетаскиваемым изображением. Ператскиваемым элементом является не статический элемент управления, а элемент коллекции изображения (ImageList).

Согласно концепции Drag&Drop перетаскиваемый объект может находиться в одном из двух состояний: свободном (объект не перетаскивается пользователем) и захваченном (пользователь перетаскивает объект). Для идентификации режима мы используем глобальную переменную IsCatch.

Для решения задачи мы обрабатываем три оконных сообщения: WM_LBUTTONDOWN (пользователь нажал на левую кнопку мыши), WM_LBUTTONUP (пользователь отпустил левую кнопку мыши) и WM_MOUSEMOVE (пользователь переместил курсор мыши).

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

Если в момент нажатия на левую кнопку мыши курсор находился над перетаскивывемым объектом, то этот объект переводится в захваченное состоянии. В противном случае объект остается в свободном состоянии.

При переводе перетаскиваемого объекта в захваченное состояние выполняются следующие действия: 1) с помощью функции ImageList_BeginDrag начинаем операцию перетаскивания; 2) изменяем значение глобальной перменной IsCatch; 3) с помощью функции ClipCursor ограничиваем область перемещения курсора (чтобы пользователь не смог "утащить" объект за пределы главного окна); 4) с помощью функции InvalidateRect обновляем клиентскую область окна.

Обработка сообщения WM_MOUSEMOVE зависит от состояния перетаскиваемого объекта. Если этот объект захвачен, то в сответствии с изменением положения курсора мыши с помощью функции ImageList_DragMove меняется положение изображения, а с помощью функции ImageList_DragShowNolock мы явно указываем, что перетаскиваемое изображение должно быть видимым во время пертаскивания. Если же объект не захвачен, то ничего не делаем.

Обработка сообщения WM_LBUTTONUP также зависит от состояния перетаскиваемого объекта. Если он был захвачен, то выполняются следующие действия: 1) изменяется значение глобальной переменной IsCatch; 2) с помощью функции ImageList_EndDrag останавливается операция перетаскивания; 3) с помощью функции ClipCursor "освобождается" курсор мыши: теперь он может свободно перемещаться по всему экрану; 4) с помощью функции InvalidateRect обновляется клиентская область окна.

Обработка сообщения WM_PAINT также зависит от состояния перетаскиваемого объекта. Если изображение захвачено, то оно отрисовывается с помощью функции ImageList_DragEnter, если же оно не захвачено, то изображение отрисовывается с помощью функции ImageList_Draw.

Исходный код приложения.

#include <windows.h>

#include <windowsx.h>

#include <commctrl.h>

#include "Constants.h"

//Размер изображений в коллекции

#define X_IMAGE 48

#define Y_IMAGE 48

//Номер отрисовываемого изображения

#define NIMAGE 0

//Минимальный отступ от краев при ограничении курсора

#define MINOTSTUP 20

//Прототип функции ImageList_Create

_stdcall typedef HIMAGELIST (*IMAGELIST_CREATE)(int,int,UINT,int,int);

IMAGELIST_CREATE lpfIL_Create;

//Прототип функции ImageList_Destroy

_stdcall typedef BOOL (*IMAGELIST_DESTROY)(HIMAGELIST);

IMAGELIST_DESTROY lpfIL_Destroy;

//Прототип функции ImageList_Add

_stdcall typedef int (*IMAGELIST_ADD)(HIMAGELIST,HBITMAP,HBITMAP);

IMAGELIST_ADD lpfIL_Add;

//Прототип функции ImageList_BeginDrag

_stdcall typedef BOOL (*IMAGELIST_BEGINDRAG)(HIMAGELIST,int,int,int);

IMAGELIST_BEGINDRAG lpfIL_BeginDrag;

//Прототип функции ImageList_DragEnter

_stdcall typedef BOOL (*IMAGELIST_DRAGENTER)(HWND,int,int);

IMAGELIST_DRAGENTER lpfIL_DragEnter;

//Прототип функции ImageList_DragLeave

_stdcall typedef BOOL (*IMAGELIST_DRAGMOVE)(int,int);

IMAGELIST_DRAGMOVE lpfIL_DragMove;

//Прототип функции ImageList_DragShowNolock

_stdcall typedef BOOL (*IMAGELIST_DRAGSHOWNOLOCK)(BOOL);

IMAGELIST_DRAGSHOWNOLOCK lpfIL_DragShowNolock;

//Прототип функции ImageList_DragShowNolock

_stdcall typedef VOID (*IMAGELIST_ENDDRAG)(void);

IMAGELIST_ENDDRAG lpfIL_EndDrag;

//Прототип функции ImageList_Draw

_stdcall typedef BOOL (*IMAGELIST_DRAW)(HIMAGELIST,int,HDC,int,int,UINT);

IMAGELIST_DRAW lpfIL_Draw;

//Прототип функции DeleteObject

_stdcall typedef BOOL (*DELETEOBJECT)(HGDIOBJ);

DELETEOBJECT lpfDeleteObject;

//Описатель коллекции изображений

HIMAGELIST hIL;

//Признак захвата

char isCatch = 0;

//Высота заголовка окна

int HeightTitle = 0;

//Текущее положение изобржения

POINT p;

//Получает адреса функций из библиотек Comctl32.dll и gdi32.dll

void GetFunctions(void){

HINSTANCE hComctl32;

hComctl32 = LoadLibrary("Comctl32.dll");

lpfIL_Create = (IMAGELIST_CREATE)GetProcAddress(hComctl32,"ImageList_Create");

lpfIL_Destroy = (IMAGELIST_DESTROY)GetProcAddress(hComctl32,"ImageList_Destroy");

lpfIL_Add = (IMAGELIST_ADD)GetProcAddress(hComctl32,"ImageList_Add");

lpfIL_Draw = (IMAGELIST_DRAW)GetProcAddress(hComctl32,"ImageList_Draw");

lpfIL_BeginDrag = (IMAGELIST_BEGINDRAG)GetProcAddress(hComctl32,"ImageList_BeginDrag");

lpfIL_DragEnter = (IMAGELIST_DRAGENTER)GetProcAddress(hComctl32,"ImageList_DragEnter");

lpfIL_DragMove = (IMAGELIST_DRAGMOVE)GetProcAddress(hComctl32,"ImageList_DragMove");

lpfIL_DragShowNolock = (IMAGELIST_DRAGSHOWNOLOCK)GetProcAddress(hComctl32,"ImageList_DragShowNolock");

lpfIL_EndDrag = (IMAGELIST_ENDDRAG)GetProcAddress(hComctl32,"ImageList_EndDrag");

//Находим адрес функции DeleteObject

HINSTANCE hgdi32;

hgdi32 = LoadLibrary("gdi32.dll");

lpfDeleteObject = (DELETEOBJECT)GetProcAddress(hgdi32,"DeleteObject");

}

//Подготавливает коллекцию изображений

void PrepareImageList(void){

//Получаем адреса функций

GetFunctions();

//Создаем коллекцию

hIL = lpfIL_Create(X_IMAGE,Y_IMAGE,ILC_COLOR32,2,0);

//Добавляем в коллекцию первое изображение

HBITMAP hBitmap;

hBitmap = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(ID_BITMAP1));

lpfIL_Add(hIL,hBitmap,NULL);

lpfDeleteObject(hBitmap);

//Добавляем в коллекцию второе изображение

hBitmap = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(ID_BITMAP2));

lpfIL_Add(hIL,hBitmap,NULL);

lpfDeleteObject(hBitmap);

}

//Проверяет, что курсор мыши находится в пределах перетаскиваемого изображения

BOOL IsWithinImage(LPARAM lparam){

POINT pCur;

pCur.x = GET_X_LPARAM(lparam);

pCur.y = GET_Y_LPARAM(lparam);

return (((pCur.x >= p.x)&(pCur.x <= p.x + X_IMAGE))&((pCur.y >= p.y)&(pCur.y <= p.y + Y_IMAGE)));

}

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

RECT rc;

switch(uMsg){

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0); break;

case WM_LBUTTONDOWN:

//Если нажатие внутри изображения то "захватываем" его

if(IsWithinImage(lParam)){

isCatch = 1;

//Начинаем операцию перетаскивания

lpfIL_BeginDrag(hIL,NIMAGE,0,0);

//Обновляем клиентскую область окна

GetClientRect(hwnd,&rc);

InvalidateRect(hwnd,&rc, TRUE);

//Ограничиваем возможные перемещения курсора мыши

GetWindowRect(hwnd,&rc);

rc.top += HeightTitle;

rc.bottom -= MINOTSTUP;

rc.right -= MINOTSTUP;

rc.left += MINOTSTUP;

ClipCursor(&rc);

}

break;

case WM_MOUSEMOVE:

//При перемещении курсора мыши

if(isCatch){

//Если изображение захвачено, то перемещаем его

p.x = GET_X_LPARAM(lParam);

p.y = GET_Y_LPARAM(lParam);

lpfIL_DragMove(p.x, p.y);

lpfIL_DragShowNolock(TRUE);

}

break;

case WM_LBUTTONUP:

//Пользователь отпустил левую кнопку мыши

if(isCatch){

//Останавливаем операцию перетаскивания

lpfIL_EndDrag();

isCatch = 0;

//Освобождаем курсор мыши

ClipCursor(NULL);

//Перерисовываем клиентскую область окна

GetClientRect(hwnd,&rc);

InvalidateRect(hwnd,&rc, TRUE);

}

break;

case WM_PAINT:

//Отрисовывание изображения в различных режимах

if(isCatch)

lpfIL_DragEnter(hwnd,p.x,p.y);

else{

//Захвата нет

HDC hdc;

hdc = GetDC(hwnd);

//Отрисовываем изображение из коллекции

lpfIL_Draw(hIL,NIMAGE,hdc,p.x,p.y,ILD_NORMAL);

ReleaseDC(hwnd,hdc);

}

break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

return 0;

}

WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

//Создаем коллекцию изображений

PrepareImageList();

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

MSG msg;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = CS_HREDRAW|CS_VREDRAW;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = NULL;

wc.hCursor = NULL;

wc.hbrBackground = (HBRUSH)COLOR_BTNSHADOW;

wc.lpszMenuName = NULL;

wc.lpszClassName = ClassName;

wc.hIconSm = NULL;

//Регистрируем оконный класс

RegisterClassEx(&wc);

p.x = p.y = 30;

//Создаем окно

HWND hwnd;

hwnd = CreateWindowEx(0, ClassName, "Иконка",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED,

100, 100, 200, 200, NULL, NULL, hInstance, 0);

//Определяем высоту заголовка окна

RECT rcWindow, rcClientWindow;

GetWindowRect(hwnd,&rcWindow);

GetClientRect(hwnd,&rcClientWindow);

HeightTitle = (rcWindow.bottom-rcWindow.top)-rcClientWindow.bottom;

//Цикл обработки сообщений

while(GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

//Уничтожаем коллекцию изображений

lpfIL_Destroy(hIL);

return 0;

}

Файл ресурсов описывает изображения, которые войдут в коллекцию изображений.

#include "Constants.h"

ID_BITMAP1 BITMAP "pict_1.bmp"

ID_BITMAP2 BITMAP "pict_2.bmp"

Заголовочный файл "Constants.h" содержит идентификаторы ресурсов.

#define ID_BITMAP1 0x100

#define ID_BITMAP2 0x200


Оконное приложение

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

#include <windows.h>

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

switch(uMsg){

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

return 0;

}

WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

char ClassName[] = "MyWindowClass";

WNDCLASS wc;

MSG msg;

//Заполняем структуру WNDCLASS

wc.style = CS_HREDRAW|CS_VREDRAW;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = NULL;

wc.hCursor = NULL;

wc.hbrBackground = (HBRUSH) COLOR_MENU;

wc.lpszMenuName = NULL;

wc.lpszClassName = ClassName;

//Регистрируем оконный класс

RegisterClass(&wc);

//Создаем окно

CreateWindow(ClassName, "MyWindow",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED,

100, 100, 100, 100, NULL, NULL, hInstance, 0);

//Цикл обработки сообщений

while(GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}

На рисунке ниже изображено окно, создаваемое этой программой.


Оконное приложение 2

Данный пример аналогичен примеру, но с двумя отличиями:

1) вместо функции RegisterClass используется функция RegisterClassEx;

2) вместо функции CreateWindow используется функция CreateWindowEx.

#include <windows.h>

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

switch(uMsg){

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

return 0;

}

WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

MSG msg;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = CS_HREDRAW|CS_VREDRAW;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = NULL;

wc.hCursor = NULL;

wc.hbrBackground = (HBRUSH) COLOR_MENU;

wc.lpszMenuName = NULL;

wc.lpszClassName = ClassName;

wc.hIconSm = NULL;

//Регистрируем оконный класс

RegisterClassEx(&wc);

//Создаем окно

CreateWindowEx(0, ClassName, "MyWindow",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED,

100, 100, 100, 100, NULL, NULL, hInstance, 0);

//Цикл обработки сообщений

while(GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}

Окно, создаваемое этой программой аналогично окну, создаваемому в примере.


Флажок

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

#include <windows.h>

//Идентификатор кнопки

#define ID_BUTTON 0x0100

#define ID_CHECKBOX 0x0200

#define _WPARAM ((WPARAM)((BN_CLICKED<<8)+ID_BUTTON))

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

int res;

char s[10];

switch(uMsg){

case WM_COMMAND:

if(wParam == _WPARAM){

//Проверяем состояние флажка

res = IsDlgButtonChecked(hwnd,ID_CHECKBOX);

if(res == BST_CHECKED)

MessageBox(hwnd,"Флажок выбран", "", MB_OK);

}

break;

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg){

return 0;

}

WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

MSG msg;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = 0;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = NULL;

wc.hCursor = NULL;

wc.hbrBackground = (HBRUSH)COLOR_BTNSHADOW;

wc.lpszMenuName = NULL;

wc.lpszClassName = ClassName;

wc.hIconSm = NULL;

//Регистрируем оконный класс

RegisterClassEx(&wc);

//Создаем окно

HWND hwnd;

hwnd = CreateWindowEx(0, ClassName, "Простая кнопка",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED|WS_BORDER,

400, 300, 170, 150, NULL, 0, hInstance, 0);

//Создаем флажок

HWND hwndCheckBox;

hwndCheckBox = CreateWindowEx(0, "Button", "Флажок",

WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX,

30, 10, 100, 50, hwnd, (HMENU)ID_CHECKBOX, hInstance, 0);

//Создаем кнопку

HWND hwndButton;

hwndButton = CreateWindowEx(0, "Button", "Кнопка",

WS_CHILD|WS_VISIBLE|WS_BORDER|BS_PUSHBUTTON,

30, 60, 100, 50, hwnd, (HMENU)ID_BUTTON, hInstance, 0);

//Цикл обработки сообщений

while(GetMessage(&msg,NULL,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}


Флажок 2

Данный пример аналогичен примеру. Но с двумя важными отличиями: 1) мы создаем диалоговое окно, а не обычное; 2) при обработке сообщения WM_INITDIALOG, с помощью функции CheckDlgButton мы переводим флажок в установленное состояние.

#include <windows.h>

#include "Resource.h"

//Прототип диалоговой процедуры

INT_PTR WINAPI Dlg_Proc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int hFunsterStil)

{

//Создаем диалоговое окно

DialogBoxParam(hThisInstance, MAKEINTRESOURCE(ID_DIALOG), HWND_DESKTOP, Dlg_Proc, 0);

return 0;

}

//диалоговая процедура

INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

int res;

switch(uMsg){

case WM_INITDIALOG:

//Переводим флажок в выбранное состояние

CheckDlgButton(hwnd,ID_CHECKBOX,BST_CHECKED);

break;

case WM_COMMAND:

//Убеждаемся в том, что это сообщение от кнопки

if(wParam == _WPARAM){

//Проверяем установлен флажок или нет

res = IsDlgButtonChecked(hwnd, ID_CHECKBOX);

if(res == BST_CHECKED)

MessageBox(hwnd,"Флажок выбран","", MB_OK);

} break;

case WM_CLOSE:

//Закрываем окно

EndDialog(hwnd,0);

}//switch(uMsg){

return 0;

}

Файл ресурсов:

#include "Resource.h"

#include <windows.h>

ID_DIALOG DIALOG 100,100,120,80

STYLE WS_CAPTION | WS_VISIBLE | WS_SYSMENU | DS_CENTER

CAPTION "CheckBox"

BEGIN

AUTOCHECKBOX "Флажок", ID_CHECKBOX, 40, 10, 100, 20, WS_VISIBLE

PUSHBUTTON "Простая кнопка", ID_BUTTON, 20, 40, 75, 30, WS_VISIBLE|WS_BORDER

END

Заголовочный файл "Resource.h":

#define ID_DIALOG 0x1000

#define ID_BUTTON 0x0100

#define ID_CHECKBOX 0x0200

#define _WPARAM ((WPARAM)((BN_CLICKED<<8)+ID_BUTTON))


BUTTON_IMAGELIST

Появилась в Windows XP. Содержит информацию о коллекции изображений (image list), которые используются с кнопкой.

Прототип

typedef struct {

HIMAGELIST himl;

RECT margin;

UINT uAlign;

} BUTTON_IMAGELIST, *PBUTTON_IMAGELIST;

Поля структуры

himl

Описатель коллекции изображений. Поставщик (provider) остаётся владельцем коллекции изображений и несет ответственность за её использование (disposal). В Windows Vista вы можете передать в этом поле значение BCCL_NOGLYPH (-1), указывая тем самым, что должен быть изображен знак (glyph).

margin

Структура RECT, которая описывает границу иконки.

uAlign

Используемое выравнивание. Принимает одно из значений перечисленных ниже.

BUTTON_IMAGELIST_ALIGN_BOTTOM (3) - по нижнему краю.

BUTTON_IMAGELIST_ALIGN_CENTER (4) - по центру.

BUTTON_IMAGELIST_ALIGN_LEFT (0) - по левому краю.

BUTTON_IMAGELIST_ALIGN_RIGHT (1) - по правому краю.

BUTTON_IMAGELIST_ALIGN_TOP (2) - по верхнему краю.

Заголовочный файл: Commctrl.h


BUTTON_SPLITINFO

Появилась в Windows Vista. Содержит инормацию о разворачивающейся кнопке (split button) (кнопка, у которой установлен стиль BS_SPLITBUTTON или BS_DEFSPLITBUTTON). Используется с сообщениями BCM_GETSPLITINFO и BCM_SETSPLITINFO.

Прототип

typedef struct {

UINT mask;

HIMAGELIST himlGlyph;

UINT uSplitStyle;

SIZE size;

} BUTTON_SPLITINFO, *PBUTTON_SPLITINFO;

Поля структуры

mask

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

BCSIF_GLYPH (1) - значение поля himlGlyph действительно.

BCSIF_IMAGE (2) - значение поля himlGlyph действительно. Используется когда значение поля uSplitStyle равно BCSS_IMAGE,

BCSIF_SIZE (8) - значение поля size действительно.

BCSIF_STYLE (4) - значение поля uSplitStyle действительно.

himlGlyph

Описатель (handle) коллекции изображений (image list). Поставщик (provider) остаётся владельцем коллекции изображений и несет ответственность за её использование (disposal).

uSplitStyle

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

BCSS_ALIGNLEFT (4) - горизонтальное выравнивание изображения или глифа (glyph) по левой границе.

BCSS_IMAGE (8) - отрисовать изображение иконки в качестве глифа.

BCSS_NOSPLIT (1) - не раскрывать (no split).

BCSS_STRETCH (2) - растянуть глиф, но постараться сохранить соотношение сторон.

size

Структура SIZE, которая описывает размер глифа в himlGlyph.

Примечание

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

Заголовочный файл: Commctrl.h


CLIENTCREATESTRUCT

Описывает информацию о меню и первом рабочем окне дочернего окна многодокументальной среды (MDI).

Прототип

typedef struct tagCLIENTCREATESTRUCT {

HANDLE hWindowMenu;

UINT idFirstChild;

}CLIENTCREATESTRUCT, *LPCLIENTCREATESTRUCT;

Поля структуры

hWindowMenu

Описатель (handle) меню окна MDI приложения.

idFirstChild

Идентификатор дочернего окна первого созданного дочернего MDI окна. Система увеличением на единицу получает идентификаторы всех добавляемых дочерних MDI окон. Также система переназначает идентификаторы когда приложение разрушает окна, сохраняя тем самым непрерывность идентификаторов. Эти идентификаторы используются в сообщениях WM_COMMAND, посылаемых рамочному MDI окну приложения, когда дочернее окно выбрано из меню "Окна". Данные идентификаторы не должны совпадать с какими-либо другими идентификаторами.

Заголовочный файл: winuser.h (включен в windows.h)


COMBOBOXEXITEM

Содержит информацию о записи в элементе управления ComboBoxEx.

Прототип

typedef struct {

UINT mask;

INT_PTR iItem;

LPTSTR pszText;

int cchTextMax;

int iImage;

int iSelectedImage;

int iOverlay;

int iIndent;

LPARAM lParam;

} COMBOBOXEXITEM, *PCOMBOBOXEXITEM;

Поля структуры

mask

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

CBEIF_DI_SETITEM - устанавливайте этот флаг при обработке уведомления CBEN_GETDISPINFO; элемент управления сохранит предоставленную информацию и не будет запршивать её снова.

CBEIF_IMAGE - поле iImage содержит корректное значение или должно быть заполнено.

CBEIF_INDENT - поле iIndent содержит корректное значение или должно быть заполнено.

CBEIF_lPARAM - поле lParam содержит корректное значение или должно быть заполнено.

CBEIF_OVERLAY - поле iOverlay содержит корректное значение или должно быть заполнено.

CBEIF_SELECTEDIMAGE - поле iSelectedImage содержит корректное значение или должно быть заполнено.

CBEIF_TEXT - поле pszText содержит корректное значение или должно быть заполнено.

iItem

Номер записи. Нумерация начинается с нуля.

pszText

Указатель на буфер символов, который содержит, или в который записывается, текстовый заголовок записи. Если заголовок запрашивается, то данный параметр содержит указатель на буфер, в который будет записан текст. Размер буфера указывается в поле cchTextMax. Если значение поля pszText равно LPSTR_TEXTCALLBACK, то элемент управления будет запрашивать информацию посредством уведомления CBEN_GETDISPINFO.

cchTextMax

Размер буфера pszText в символах TCHAR. Если текст заголовка устанавливается, то значение этого поля игнорируется.

iImage

Номер изображения в коллекции изображений. Нумерация начинается с нуля. Данное изображение будет отображаться для записи, когда она не выбрана. Если значение этого поля равно I_IMAGECALLBACK, то элемент управления будет запрашивать информацию посредством уведомления CBEN_GETDISPINFO.

iSelectedImage

Номер изображения в коллекции изображений. Нумерация начинается с нуля. Данное изображение будет отображаться для записи, когда она выбрана. Если значение этого поля равно I_IMAGECALLBACK, то элемент управления будет запрашивать информацию посредством уведомления CBEN_GETDISPINFO.

iOverlay

Номер перекрывающего изображения в коллекции изображений. Нумерация начинается с единицы. Если значение этого поля равно I_IMAGECALLBACK, то элемент управления будет запрашивать информацию посредством уведомления CBEN_GETDISPINFO.

iIndent

Количество отступов используемых при отображении записи. Каждый отступ эквивалентен 10 пикселям. Если значение этого поля равно I_INDENTCALLBACK, то элемент управления будет запрашивать информацию посредством уведомления CBEN_GETDISPINFO.

lParam

Значение, определенное для записи.

Заголовочный файл: commctrl.h


COMBOBOXINFO

Содержит информацию о состоянии комбинированного списка.

Прототип

typedef struct tagCOMBOBOXINFO {

DWORD cbSize;

RECT rcItem;

RECT rcButton;

DWORD stateButton;

HWND hwndCombo;

HWND hwndItem;

HWND hwndList;

} COMBOBOXINFO, *PCOMBOBOXINFO, *LPCOMBOBOXINFO;

Поля структуры

cbSize

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

rcItem

Структура RECT, которая описывает координаты поля ввода (edit box).

rcButton

Структура RECT, которая описывает координаты кнопки, на которой изображена стрелка.

stateButton

Состояние кнопки комбинированного списка. Данный параметр принимает одно из значений перечисленных ниже.

0 - кнопка существует и она не нажата.

STATE_SYSTEM_INVISIBLE - кнопки нет.

STATE_SYSTEM_PRESSED - кнопка нажата.

hwndCombo

Описатель комбинированного списка.

hwndItem

Описатель поля ввода.

hwndList

Описатель раскрывающегося списка.

Заголовочный файл: winuser.h (включен в windows.h)


COMPAREITEMSTRUCT

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

Прототип

typedef struct tagCOMPAREITEMSTRUCT {

UINT CtlType;

UINT CtlID;

HWND hwndItem;

UINT itemID1;

ULONG_PTR itemData1;

UINT itemID2;

ULONG_PTR itemData2;

DWORD dwLocaleId;

} COMPAREITEMSTRUCT;

Поля структуры

CtlType

ODT_LISTBOX (самостоятельно перерисовываемый список) или ODT_COMBOBOX (самостоятельно перерисовываемый комбинированный список).

CtlID

Идентификатор списка или комбинированного списка.

hwndItem

Описатель элемента управления.

itemID1

Индекс первой записи в списке или комбинированном списке, подлежащей сравнению. Это поле должно равняться -1 если запись еще не добавлена в список (комбинированный список) или во время поиска нужной записи в списке или комбинированном списке.

itemData1

Определенные приложением данные для первой записи, подлежащей сравнению.

itemID2

Индекс второй записи в списке или комбинированном списке, подлежащей сравнению. Это поле должно равняться -1 если запись еще не добавлена в список (комбинированный список) или во время поиска нужной записи в списке или комбинированном списке.

itemData2

Определенные приложением данные для второй записи, подлежащей сравнению.

dwLocaleId

Идентификатор локали.

Заголовочный файл: winuser.h (включен в windows.h)


CREATESTRUCT

Описывает параметры инициализации, передаваемые оконной процедуре.

Прототип

typedef struct tagCREATESTRUCT {

LPVOID lpCreateParams;

HINSTANCE hInstance;

HMENU hMenu;

HWND hwndParent;

int cy;

int cx;

int y;

int x;

LONG style;

LPCTSTR lpszName;

LPCTSTR lpszClass;

DWORD dwExStyle;

}CREATESTRUCT, *LPCREATESTRUCT;

Поля структуры

lpCreateParams

Указатель на дополнительные данные, которые могут быть использованы при создании окна. Если окно создается функцией CreateWindow или CreateWindowEx, то данное поле содержит значение параметра lpParam этих функций.

Если создаваемое окно - это клиентское MDI окно, данное поле указывает на структуру CLIENTCREATESTRUCT. Если создаваемое окно - это дочернее MDI окно, данное поле указывает на структуру MDICREATESTRUCT.

Если создаваемое окно - это диалоговое окно, создаваемое на основе шаблона диалогового окна, то данное поле представляет собой адрес значения типа SHORT, которое определяет размер, в байтах, данных, использованных для создания этого окна.

hInstance

Описатель модуля, которому принадлежит окно, то есть того модуля, в котором задана оконная поцедура этого окна.

hMenu

Описатель меню окна

hwndParent

Описатель окна, родительского по отношению к создаваемому окну

cy

Высота окна в пикселях

cx

Ширина окна в пикселях

y

y-координата верхнего левого угла окна. Если новое окно - это дочернее окно, то координаты относительны по отношению к родительскому окну. Если новое окно не имеет родителя, то это экранные координаты.

x

x-координата верхнего левого угла окна. Если новое окно - это дочернее окно, то координаты относительны по отношению к родительскому окну. Если новое окно не имеет родителя, то это экранные координаты.

style

Набор стилей окна.

lpszName

Строка с заголовком окна

lpszClass

Строка с наименованием класса окна

dwExStyle

Набор расширенных стилей окна

Заголовочный файл: Winuser.h (включен в WIndows.h)


DATETIMEPICKERINFO

Появилась в Windows Vista. Содержит информацию об элементе управления Date and Time Picker (DTP).

Прототип

typedef struct tagDATETIMEPICKERINFO {

DWORD cbSize;

RECT rcCheck;

DWORD stateCheck;

RECT rcButton;

DWORD stateButton;

HWND hwndEdit;

HWND hwndUD;

HWND hwndDropDown;

} DATETIMEPICKERINFO, *LPDATETIMEPICKERINFO;

Поля структуры

cbSize

Размер структуры в байтах. Значение этого поля должно быть равно sizeof(DATETIMEPICKERINFO). Оно должно быть установлено до отправки указателя на структуру в сообщении DTM_GETDATETIMEPICKERINFO.

rcCheck

Структура RECT, описывающая положение флажка (checkbox). Если флажок отображается на экране и взведен, поле ввода должно быть доступно для редактирования выбранной даты/времени.

stateCheck

Состояние флажка. Одно из значений перечисленных ниже.

STATE_SYSTEM_CHECKED (0x00000010) - флажок взведен.

STATE_SYSTEM_INVISIBLE (0x00008000) - флажок невидим.

rcButton

Структура RECT, описывающая положение раскрывающейся сетки (grid), или элемента управления up/down.

stateButton

Состояние элемента rcButton. Значение данного поля представляет собой одно из значений перечисленных ниже, или их комбинацию.

STATE_SYSTEM_UNAVAILABLE (0x00000001) - элемент недоступен.

STATE_SYSTEM_INVISIBLE (0x00008000) - элемент невидим.

STATE_SYSTEM_PRESSED (0x00000008) - элемент находится в нажатом состоянии.

Если используется элемент управления up/down, то кнопка находится в состоянии STATE_SYSTEM_INVISIBLE.

hwndEdit

Описатель окна элемента управления поле ввода.

hwndUD

Описатель элемента управления Up/Down. Он может использоваться вместо раскрывающейся сетки, отображаемой в виде календаря.

hwndDropDown

Описатель раскрывающейся сетки.

Заголовочный файл: Commctrl.h


DELETEITEMSTRUCT

Описывает удалемую запись списка или комбинированного списка. Параметр lparam сообщения WM_DELETEITEM указывает на эту структуру. Когда удаляется запись из списка или комбинированного списка, а также при разрушении списка или комбинированного списка системе посылает окну-владельцу сообщение WM_DELETEITEM для каждой удаляемой записи.

Windows NT/2000/XP: система рассылает сообщение WM_DELETEITEM только для записей в самостоятельно перерисовываемом списке или комбинированном списке.

Windows 95/98/Me: система рассылает сообщение WM_DELETEITEM при удалении любых непустых записей из списка или комбинированного списка.

Прототип

typedef struct tagDELETEITEMSTRUCT {

UINT CtlType;

UINT CtlID;

UINT itemID;

HWND hwndItem;

ULONG_PTR itemData;

} DELETEITEMSTRUCT, *PDELETEITEMSTRUCT;

Поля структуры

CtlType

Определяет откуда была удалена запись. Принимает одно из значений перечисленных ниже.

ODT_LISTBOX - список.

ODT_COMBOBOX - комбинированный список.

CtlID

Идентификатор списка или комбинированного списка.

itemID

Номер удаляемой записи в списке или комбинированном списке.

hwndItem

Описатель окна-элемента управления.

itemData

Определенные приложением данные, асссоциированные с записью. Это значение передается в качестве значения параметра lparam сообщения, которое добавляет запись в список или комбинированный список.

Заголовочный файл: Winuser.h (включен в WIndows.h)


DRAWITEMSTRUCT

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

Прототип

typedef struct tagDRAWITEMSTRUCT {

UINT CtlType;

UINT CtlID;

UINT itemID;

UINT itemAction;

UINT itemState;

HWND hwndItem;

HDC hDC;

RECT rcItem;

ULONG_PTR itemData;

} DRAWITEMSTRUCT;

Поля структуры

CtlType

Тип элемента управления. Принимает одно из значений перечисленных ниже.

ODT_BUTTON - кнопка.

ODT_COMBOBOX - комбинированный список.

ODT_LISTBOX - список.

ODT_LISTVIEW - список.

ODT_MENU - элемент меню.

ODT_STATIC - статический элемент управления.

ODT_TAB - набор вкладок.

CtlID

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

itemID

Идентификатор элемента меню или индекс элемента в списке или комбинированном списке. Для пустого списка (комбинированного списка) это поле может иметь значение -1.

itemAction

Запрашиваемое действие перерисовки. Это поле может принимать одно из значений перечисленных ниже или их комбинацию.

ODA_DRAWENTIRE - должен быть перерисован весь элемент управления.

ODA_FOCUS - элемент управления потерял или получил фокус ввода. Поле itemState должно быть првоерено на предмет того какому элементу управления принадлежит фокус ввода.

ODA_SELECT - выбранный элемент изменился. Поле itemState должно быть проверено на предмет нового состояния выбора.

itemState

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

ODS_CHECKED - был выбран элемент меню. Это значение используется только для меню.

ODS_COMBOBOXEDIT - перерисовка осуществляется в поле ввода комбинированного списка.

ODS_DEFAULT - элемент является элементом по умолчанию.

ODS_DISABLED - элемент будет перерисован как недоступный.

ODS_FOCUS - элемент владеет фокусом ввода клавиатуры.

ODS_GRAYED - Элемент является недоступным. Это значение используется только для меню.

ODS_HOTLIGHT - Windows 98/Me, Windows 2000/XP: элемент будет подсвечен когда курсор мыши окажется в нём.

ODS_INACTIVE - Windows 98/Me, Windows 2000/XP: элемент неактивен и окно, ассоциированное с меню неактивно.

ODS_NOACCEL - Windows 2000/XP: элемент управления перерисовывается без сигналов ускорителя клавиатуры.

ODS_NOFOCUSRECT - Windows 2000/XP: элемент управления перерисовывается без сигналов индикатора клавиатуры.

ODS_SELECTED - выбран пункт меню.

hwndItem

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

hDC

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

rcItem

Структура RECT, которая описывает границы перерисовываемого элемента управления. Этот прямоугольник находится в контексте устройства hDC. Система автоматически обрезает всё, что окно-владелец рисует в списке, комбинированном списке и кнопке, но не в пунктах меню. Когда отрисовываются пункты меню окно-владелец не должно рисовать за пределами границ прямоугольника, задаваемым rcItem.

itemData

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

Заголовочный файл: winuser.h (включен в windows.h)


HELPINFO

Содержит информацию о пункте меню или элементе управления, для которого была запрошена помощь. Появилась в Windows XP.

Прототип

typedef struct tagHELPINFO {

UINT cbSize;

int iContextType;

int iCtrlId;

HANDLE hItemHandle;

DWORD dwContextId;

POINT MousePos;

} HELPINFO, *LPHELPINFO;

Поля структуры

cbSize

Размер структуры в байтах.

iContextType

Тип объекта, для которого запрошена помощь. Принимает одно из значений, перечисленных ниже.

HELPINFO_MENUITEM - запрашивается помощь для пункта меню.

HELPINFO_WINDOW - запрашивается помощь для элемента управления или окна.

iCtrlId

Если значение iContextType равно HELPINFO_MENUITEM, тогда iCtrlId содержит идентификатор пункта меню. Если же значение iContextType равно HELPINFO_WINDOW, тогда iCtrlId содержит идентификатор окна или элемента управления.

hItemHandle

Если значение iContextType равно HELPINFO_MENUITEM, тогда hItemHandle содержит идентификатор меню. Если же значение iContextType равно HELPINFO_WINDOW, тогда hItemHandle содержит идентификатор дочернего окна или элемента управления.

dwContextId

Идентификатор контекста помощи для окна или элемента управления.

MousePos

Структура POINT, которая содержит экранные координаты курсора мыши. Эта информация полезна для предоставления помощи, зависящей от положения курсора мыши.

Заголовочный файл: winuser.h


IMAGEINFO

Содержит информацию об изображении в коллекции изображений. Эта структура используется в функции ImageList_GetImageInfo.

Прототип

typedef struct _IMAGEINFO {

HBITMAP hbmImage;

HBITMAP hbmMask;

int Unused1;

int Unused2;

RECT rcImage;

} IMAGEINFO, *LPIMAGEINFO;

Поля структуры

hbmImage

Описатель битовой карты (bitmap), содержащей изображение.

hbmMask

Описатель двуцветной битовой карты, содержащей маски для изображений. Если коллекция изображений не имеет маски, то значение этого поля равно NULL.

Unused1

Не используется. Значение этого поля всегда должно быть равно нулю.

Unused2

Не используется. Значение этого поля всегда должно быть равно нулю.

rcImage

Структура RECT, описывающая ограничивающий прямоугольник, внутри которого расположено изображение hbmImage.

Заголовочный файл: Commctrl.h


IMAGELISTDRAWPARAMS

Содержит информацию об операции рисования коллекции изображений. Используется совместно с функцией ImageList_DrawIndirect.

Прототип

#if (_WIN32_IE >= 0x0300)

typedef struct tagIMAGELISTDRAWPARAMS {

DWORD cbSize;

HIMAGELIST himl;

int i;

HDC hdcDst;

int x;

int y;

int cx;

int cy;

int xBitmap;

int yBitmap;

COLORREF rgbBk;

COLORREF rgbFg;

UINT fStyle;

DWORD dwRop;

#if (_WIN32_WINNT >= 0x0501)

DWORD fState;

DWORD Frame;

COLORREF crEffect;

#endif

} IMAGELISTDRAWPARAMS,*LPIMAGELISTDRAWPARAMS;

#endif /* (_WIN32_IE >= 0x0300) */

Поля структуры

cbSize

Размер структуры в байтах.

himl

Описатель коллекции изображений, содержащей отрисовываемое изображение.

i

Номер отрисовываемого изображения. Нумерация ведется с нуля.

hdcDst

Описатель целевого контекста устройства.

x

Координата по горизонтали, определяющая где следует отрисовать изображение.

y

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

cx

Значение, определяющее количество отрисовываемых пикселей, считая от левого верхнего угла изображения, заданного полями xBitmap и yBitmap. Если значения полей cx и cy равны нулю, то функция отрисовывает всю секцию. Функция не гарантирует корректность значения этого поля.

cy

Значение, определяющее количество отрисовываемых пикселей, считая от левого верхнего угла изображения, заданного полями xBitmap и yBitmap. Если значения полей cx и cy равны нулю, то функция отрисовывает всю секцию. Функция не гарантирует корректность значения этого поля.

xBitmap

Координата по горизонтали, определяющая левый верхний угол отрисовываемого изображения внутри самого изображения. Пиксели изображения, находящиеся слева от xBitmap и выше yBitmap не отображаются.

yBitmap

Координата по вертикали, определяющая левый верхний угол отрисовываемого изображения внутри самого изображения. Пиксели изображения, находящиеся слева от xBitmap и выше yBitmap не отображаются.

rgbBk

Цвет фона изображения. Данный параметр может содержать определенное приложением значение в формате RGB, или одно из значений перечисленных ниже.

CLR_DEFAULT - цвет фона по умолчанию. Изображение отображается используя цвет фона коллекции изображения.

CLR_NONE - цвета фона нет. Изображение делается прозрачным.

rgbFg

Цвет переднего плана (foreground color) изображения. Значение данного поля используется только если в поле fStyle задан флаг ILD_BLEND25 или ILD_BLEND50. Данное поле может содержать определенный приложением цвет в формате RGB, или одно из значений перечисленных ниже.

CLR_DEFAULT - цвет переднего плана по умолчанию. Изображение отрисовывается используя системный цвет подсветки в качестве цвета переднего плана.

CLR_NONE - цвета смешивания (blend color) нет. Изображение смешивается с цветом целевого контекста устройства.

fStyle

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

dwRop

Значение определяющее растровую операцию. Даное значение определяет как цвета исходного прямоугольника будут объединяться с цветами целевого прямоугольника, получая тем самым финальный цвет. Данное поле игнорируется если значение поля fStyle не содержит флага ILD_ROP. Значение поля dwRop принимает одно из значений перечсленных здесь.

fState

Флаг, который определяет состояние рисования. Данное поле может содержать одно из значений перечисленных здесь, или их комбинацию. Для использования этого поля вы должны использовать библиотеку comctl32.dll версии 6.

Frame

Используется совместно с эффектом альфа смешивания.

Когда установлен флаг ILS_ALPHA, даннон поле содержит значение альфа канала. Значение данного параметра находится в интервале от 0 до 255, где значение нуль соответствует полностью прозрачному изображению, а значение 255 - полностью непрозрачному.

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

crEffect

Цвет используемый для эффектов свечения (glow) и тени (shadow). Для использования этого поля вы должны использовать библиотеку comctl32.dll версии 6.

Примечание

Перекрывающее изображение - это изображение, которое отображается поверх изображения заданного в поле i даной структуры. Для указания перекрывающего изображения, используйте битовую операцию OR для объединения значения поля fStyle со значением возвращенным макросом INDEXTOOVERLAYMASK, которому передан номер перекрыающего изображения. Нумерация ведется с единицы. Предварительно перекрывающее изображение должно быть установлено с помощью функции ImageList_SetOverlayImage.

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

Библиотека Comctl32.dll версии 6 не является свободно распространяемой, но она входит в состав операционной системы Windows XP и более новых версий. Для использования библиотеки Comctl32.dll версии 6 вы должны явно указать её в манифесте.

Заголовочный файл: Commctrl.h


INITCOMMONCONTROLSEX

Содержит информацию, используемую для загрузки классов элементов управления из динамической библиотеки (DLL). Эта структура используется совместно с функцией InitCommonControlsEx.

Прототип

typedef struct tagINITCOMMONCONTROLSEX {

DWORD dwSize;

DWORD dwICC;

} INITCOMMONCONTROLSEX, *LPINITCOMMONCONTROLSEX;

Поля структуры

dwSize

Размер структуры в байтах.

dwICC

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

Заголовочный файл: Commctrl.h


MDICREATESTRUCT

Содержит информацию о классе, заголовке, владельце, положении и размере дочернего окна многодокументальной среды (MDI).

Прототип

typedef struct tagMDICREATESTRUCT {

LPCTSTR szClass;

LPCTSTR szTitle;

HANDLE hOwner;

int x;

int y;

int cx;

int cy;

DWORD style;

LPARAM lParam;

}MDICREATESTRUCT, *LPMDICREATESTRUCT;

Поля структуры

szClass

Строка с наименованием оконного класса дочернего окна. Данный оконный класс должен быть зарегистрирован.

szTitle

Строка с заголовком дочернего MDI окна.

hOwner

Описатель экземпляра приложения, создавшего киентское MDI окно

x

Начальная позиция по горизонтали в клиентских координатах дочернего MDI окна. Если это поле равно CW_USEDEFAULT, дочернее MDI окно занимает горизонтальную позицию заданную по умолчанию.

y

Начальная позиция по вертикали в клиентских координатах дочернего MDI окна. Если это поле равно CW_USEDEFAULT, дочернее MDI окно занимает вертикальную позицию заданную по умолчанию.

cx

Начальная ширина дочернего MDI окна в единицах измерения устройства. Если это поле равно CW_USEDEFAULT, дочернее MDI окно принимает ширину по умолчанию.

cy

Начальная высота дочернего MDI окна в единицах измерения устройства. Если это поле равно CW_USEDEFAULT, дочернее MDI окно принимает высоту по умолчанию.

style

Набор стилей дочернего MDI окна. Если клиентское MDI окно было создано с оконным стилем MDIS_ALLCHILDSTYLES, данное поле структуры может являться комбинацией любых оконных стилей.В противном случае (данный стиль не был задан) значение этого поля модет включать в себя один или несколько оконых стилей, перечисленых в таблице ниже.

Оконный стиль | Описание
WS_MAXIMIZE | Дочернее MDI окно в начальном состоянии развернуто на весь экран
WS_MINIMIZE | Дочернее MDI окно в начальном состоянии свернуто
WS_HSCROLL | Дочернее MDI окно имеет горизонтальную полосу прокрутки
WS_VSCROLL | Дочернее MDI окно имеет вертикальную полосу прокрутки

lParam

Значение, определяемое приложением

Заголовочный файл: winuser.h (включен в windows.h)


MEASUREITEMSTRUCT

Описывает информацию о размерах элемента управления или пункта меню. Это позволяет системе корректно обрабатывать работу пользователя с элементом управления.

Прототип

typedef struct MEASUREITEMSTRUCT {

UINT CtlType;

UINT CtlID;

UINT itemID;

UINT itemWidth;

UINT itemHeight;

ULONG_PTR itemData;

} MEASUREITEMSTRUCT;

Поля структуры

CtlType

Тип элемента управления. Принимать одно из значений перечисленных ниже.

ODT_COMBOBOX - комбинированный список.

ODT_LISTBOX - список.

ODT_LISTVIEW - список.

ODT_MENU - меню.

CtlID

Идентификатор списка или комбинированного списка. Это поле не используется для меню.

itemID

Идентификатор пункта меню или записи в списке, комбинированном списке. Это значение определено для списка, только если у списка установлен стиль LBS_OWNERDRAWVARIABLE. Это значение определено для комбинированного списка, только если у него установлен стиль CBS_OWNERDRAWVARIABLE.

itemWidth

Ширина пункта меню в пикселях.Перед завершением обработки сообщения окно-владелец должно заполнить это поле.

itemHeight

Высота в пикселях отдельной записи в списке или пункта меню. Перед завершением обработки сообщения окно-владелец долдно заполнить этого поле.

itemData

Заданное приложением значение, ассоциированное с пунктом меню или элементом управления.

Заголовочный файл: winuser.h (включен в windows.h)


MINMAXINFO

Описывает информацию о размере и положении окна в развернутом состоянии, а также установленнные минимальный и максимальный размеры этого окна.

Прототип

typedef struct tagMINMAXINFO {

POINT ptReserved;

POINT ptMaxSize;

POINT ptMaxPosition;

POINT ptMinTrackSize;

POINT ptMaxTrackSize;

} MINMAXINFO, *PMINMAXINFO, *LPMINMAXINFO;

Поля структуры

ptReserved

Зарезервировано.

ptMaxSize

Структура POINT, содержащая ширину (поле x) и высоту (поле y) окна в развернутом состоянии. Для окон верхнего уровня эти значения основываются на ширине основного монитора.

ptMaxPosition

Структура POINT, содержащая положение левой (поле x) и верхней (поле y) границ развернутого окна. Для окон верхнего уровня эти значения основываются на положении главного монитора.

ptMinTrackSize

Структура POINT, содержащая минимальные изменяемые ширину (поле x) и высоту (поле y) окна.

ptMaxTrackSize

Структура POINT, содержащая максимальные изменяемые ширину (поле x) и высоту (поле y) окна.

Примечание

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

Заголовочный файл: winuser.h (включен в windows.h)


MSG

Описывает сообщение, извлеченное из очереди сообщений потока.

Прототип

typedef struct tagMSG {

HWND hwnd;

UINT message;

WPARAM wParam;

LPARAM lParam;

DWORD time;

POINT pt;

} MSG, *PMSG, *LPMSG;

Поля структуры

hwnd

Описатель окна, которому адресовано данное сообщение. Если это сообщение потоку, то это поле равно NULL

message

Код сообщения. Приложения могут использовать только младшее слово этого кода. Старшее слово зарезервировано системой.

wParam

Дополнительная информация о сообщении. Зависит от его кода.

lParam

Дополнительная информация о собщении. Зависит от его кода.

time

Время, в которое было отправлено данное сообщение

pt

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

Заголовочный файл: winuser.h (включен в windows.h)


NMBCDROPDOWN

Появилась в Windows Vista. Содержит информацию об уведомлении BCN_DROPDOWN.

Прототип

typedef struct tagNMBCDROPDOWN {

NMHDR hdr;

RECT rcButton;

} NMBCDROPDOWN, *LPNMBCDROPDOWN;

Поля структуры

hdr

Структура NMHDR, которая содержит информацию об уведомлении.

rcButton

Структура RECT, которая описывает клиентскую область кнопки.

Заголовочный файл: Commctrl.h


NMBCHOTITEM

Появилась в Windows XP. Содержит информацию о перемещении курсора мыши над кнопкой.

Прототип

typedef struct tagNMBCHOTITEM {

NMHDR hdr;

DWORD dwFlags;

} NMBCHOTITEM, *LPNMBCHOTITEM;

Поля структуры

hdr

Структура NMHDR.

dwFlags

Действие мыши. Данный параметр принимает одно из значений перечисленных ниже в сочетании с HICF_MOUSE.

HICF_ENTERING - курсор мыши "вошел" в область над кнопкой.

HICF_LEAVING - курсор мыши покинул облачсть над кнопкой.

Заголовочный файл: Commctrl.h


NMCBEDRAGBEGIN

Содержит информацию, используемую совместно с уведомлением CBEN_DRAGBEGIN.

Прототип

typedef struct {

NMHDR hdr;

int iItemid;

TCHAR szText;

} NMCBEDRAGBEGIN, *LPNMCBEDRAGBEGIN;

Поля структуры

hdr

Структура NMHDR, содержащая информацию об уведомлении.

iItemid

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

szText

Буфер символов, который содержит текст перетаскиваемой записи.

Заголовочный файл: Commctrl.h


NMCBEENDEDIT

Содержит информацию, о завершившейся операции редактирования в элементе управления ComboBoxEx. Эта структура используется совместно с уведомлением CBEN_ENDEDIT.

Прототип

typedef struct {

NMHDR hdr;

BOOL fChanged;

int iNewSelection;

TCHAR szText;

int iWhy;

} NMCBEENDEDIT, *PNMCBEENDEDIT;

Поля структуры

hdr

Структура NMHDR, содержащая информацию об уведомлении.

fChanged

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

iNewSelection

Порядковый номер записи, которая была выбрана по окончании операции редактирования. Если не выбрана ни одна запись, то данное поле содержит значение CB_ERR.

szText

Завершающаяся NULL символом строка, содержащая текст из поля ввода элемента управления.

iWhy

Значение, определяющее действие, которое привело к отправке уведомления CBEN_ENDEDIT. Данное поле содержит одно из значений, перечисленных ниже.

CBENF_DROPDOWN - пользователь активировал раскрывающийся список.

CBENF_ESCAPE - пользователь нажал на клавишу Escape.

CBENF_KILLFOCUS - поле ввода потеряло фокус ввода клавиатуры.

CBENF_RETURN - пользователь завершил операцию редактирования путем нажатия на клавишу Enter.

Заголовочный файл: Commctrl.h


NMCOMBOBOXEX

Содержит информацию, специфичную для записей элемента управления ComboBoxEx, используемую в уведомлениях.

Прототип

typedef struct {

NMHDR hdr;

COMBOBOXEXITEM ceItem;

} NMCOMBOBOXEX, *PNMCOMBOBOXEX;

Поля структуры

hdr

Структура NMHDR, содержащая информацию об уведомлоении.

ceItem

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

Заголовочный файл: Commctrl.h


NMCUSTOMDRAW

Содержит информацию специфичную для уведомления NM_CUSTOMDRAW.

Прототип

typedef struct tagNMCUSTOMDRAWINFO {

NMHDR hdr;

DWORD dwDrawStage;

HDC hdc;

RECT rc;

DWORD_PTR dwItemSpec;

UINT uItemState;

LPARAM lItemlParam;

} NMCUSTOMDRAW, *LPNMCUSTOMDRAW;

Поля структуры

hdr

Структура NMHDR, которая содержит информацию об уведомлении.

dwDrawStage

Текущий этап отрисовки. Доступные значения этого поля перечислены здесь.

hdc

Описатель контекста устройства (HDC) элемента управления. Используйте этот HDC для выполнения каких-либо функций GDI.

rc

Структура RECT, которая описывает прямоугольные границы перерисовываемой области. Это поле инициализировано только при этапе отрисовки CDDS_ITEMPREPAINT. Версия 5.80: это поле также инициализировано при этапе отрисовки CDDS_PREPAINT.

dwItemSpec

Номер элемента (item number). Значение этого поля зависит от типа элемента управления, который отправил это уведомление. Смотрите описание уведомления NM_CUSTOMDRAW для конкретного типа элемента управления для опредедения значения этого поля.

uItemState

Текущее состояние элемента (item). Состояние элемента определяется комбинацией флагов, пречисленных здесь.

lItemlParam

Определенные приложением данные элемента (item data).

Примечание

Значение, которое должно вернуть ваше приложение зависит от текущего этапа отрисовки. Поле dwDrawStage содержит значение, определяющее этап отрисовки. Когда значение поля dwDrawStage равно CDDS_PREPAINT или CDDS_PREERASE, некоторые элементы управления (controls) первым отправляют сообщение на этапе CDDS_PREERASE и проверяют возвращенное значение для определения того какое сообщение отправлять следующим.

Заголовочный файл: Commctrl.h


NMHDR

Содержит информацию об уведомительном сообщении.

Прототип

typedef struct tagNMHDR {

HWND hwndFrom;

UINT_PTR idFrom;

UINT code;

} NMHDR;

Поля структуры

hwndFrom

Описатель окна элемента управления, от которого пришло сообщение.

idFrom

Идентификатор элемента управления, от которого пришло сообщение.

code

Код уведомления. Зависит от типа элемента управления и произошедшего события.

Заголовочный файл: winuser.h (включен в windows.h)


NMMOUSE

Содержит информацию, используемую совместно с уведомительными сообщениями мыши.

Прототип

typedef struct tagNMMOUSE {

NMHDR hdr;

DWORD_PTR dwItemSpec;

DWORD_PTR dwItemData;

POINT pt;

LPARAM dwHitInfo;

} NMMOUSE, *LPNMMOUSE;

Поля структуры

hdr

Структура NMHDR, содержащая дополнительную информацию об уведомлении.

dwItemSpec

Идентификатор записи, специфичный для элемента управления.

dwItemData

Данные записи, специфичные для элемента управления.

pt

Структура POINT, содержащая клиентские координаты мыши в момент щелчка.

dwHitInfo

Информация о том, на что указывает курсор: на запись, или на элемент управления.

Заголовочный файл: Commctrl.h


PAINTSTRUCT

Содержит информацию для приложения. Эта информация может быть использована для отрисовки клиентской области окна принадлежащего этому приложению.

Прототип

typedef struct tagPAINTSTRUCT {

HDC hdc;

BOOL fErase;

RECT rcPaint;

BOOL fRestore;

BOOL fIncUpdate;

BYTE rgbReserved[32];

} PAINTSTRUCT, *PPAINTSTRUCT;

Поля структуры

hdc

Описатель контекста устройства (DC) используемый для рисования.

fErase

Указывает должен ли фон быть очищен.Если значение этого поля отлично от нуля, то приложение должно стереть фон. Приложение ответственно за очистку фона если оконный класс был создан без кисти фона. Для получения дополнительной информации смотри описание поля hbrBackground структуры WNDCLASS.

rcPaint

Структура RECT, которая задает положение левого верхнего и правого нижнего углов прямоугольной области внутри которой требуется отрисовка. Координаты задаются в клиентской системе координат в единицах устройства.

fRestore

Зарезервировано. Используется системой.

fIncUpdate

Зарезервировано. Используется системой.

rgbReserved

Зарезервировано. Используется системой.

Заголовочный файл: winuser.h (включен в windows.h)


POINT

Определяет координаты точки.

Прототип

typedef struct tagPOINT {

LONG x;

LONG y;

} POINT, *PPOINT;

Поля структуры

x

координата точки по горизонтали

y

координата точки по вертикали

Заголовочный файл: Windef.h (включен в Windows.h)


POINTS

Определяет координаты точки.

Прототип

typedef struct tagPOINTS {

SHORT x;

SHORT y;

} POINTS, *PPOINTS;

Поля структуры

x

координата точки по горизонтали

y

координата точки по вертикали

Заголовочный файл: Windef.h (включен в Windows.h)


RECT

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

Прототип

typedef struct _RECT {

LONG left;

LONG top;

LONG right;

LONG bottom;

} RECT, *PRECT;

Поля структуры

left

Горизонтальная координата левого верхнего угла прямоугольника

top

Вертикальная координата левого верхнего угла прямоугольника

right

Горизонтальная координата правого нижнего угла прямоугольника

bottom

Вертикальная координата правого нижнего угла прямоугольника

Заголовочный файл: windef.h (включен в windows.h)


SIZE

Определяет ширину и высоту прямоугольника.

Прототип

typedef struct tagSIZE {

LONG cx;

LONG cy;

} SIZE, *PSIZE;

Поля структуры

cx

Ширина прямоугольника. Единица измерения зависит от используемой функции.

cy

Высота прямоугольника. Единица измерения зависит от используемой функции.

Заголовочный файл: windef.h (включен в windows.h)


SYSTEMTIME

Описывает дату и время, используя отдельные поля для месяца, дня, года, дня недели, часа, минут, секуню и миллисекунд. Время является всемирно скоординированным (UTC) или локальным, в зависимости от того, посредством какой функции заполнена эта структура.

Прототип

typedef struct _SYSTEMTIME {

WORD wYear;

WORD wMonth;

WORD wDayOfWeek;

WORD wDay;

WORD wHour;

WORD wMinute;

WORD wSecond;

WORD wMilliseconds;

} SYSTEMTIME, *PSYSTEMTIME;

Поля структуры

wYear

Год. Допустимыми значениями этого поля являются значения от 1601 до 30827.

wMonth

Месяц. Допустимые значения этого поля перечислены ниже.

1 - Январь.

2 - Февраль.

3 - Март.

4 - Апрель.

5 - Май.

6 - Июнь.

7 - Июль.

8 - Август.

9 - Сентябрь.

10 - Октябрь.

11 - Ноябрь.

12 - Декабрь.

wDayOfWeek

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

0 - Воскресенье.

1 - Понедельник.

2 - Вторник.

3 - Среда.

4 - Четверг.

5 - Пятница.

6 - Суббота.

wDay

День месяца. Допустимые значения этого поля находятся в интервале от 1 до 31.

wHour

Час. Допустимые значения этого поля находятся в интервале от 0 до 23.

wMinute

Минута. Допустимые значения этого поля находятся в интервале от 0 до 59.

wSecond

Секунда. Допустимые значения этого поля находятся в интервале от 0 до 59.

wMilliseconds

Миллисекунда. Допустимые значения этого поля находятся в интервале от 0 до 999.

Примечание

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

· конвертировать структуру SYSTEMTIME в структуру FILETIME;
· копировать структуру FILETIME в структуру ULARGE_INTEGER;
· использовать операции 64-разрядной арифметики над значением ULARGE_INTEGER.

Система может периодически обновлять время путем его синхронизации с источником времени. Так как системное время может быть скоррекировано вперед или назад, не сравнивайте полученные временные метки для определения прошедшего времени.

Заголовочный файл: winbase.h (включен в windows.h)


STYLESTRUCT

Содержит стили окна.

Прототип

typedef struct tagSTYLESTRUCT {

DWORD styleOld;

DWORD styleNew;

} STYLESTRUCT, *LPSTYLESTRUCT;

Поля структуры

styleOld

Предыдущий набор стилей или расширенных стилей окна.

styleNew

Новый набор стилей или расширенных стилей окна.

Заголовочный файл: winuser.h (включен в windows.h)


WNDCLASS

Содержит атрибуты оконного класса.

Прототип

typedef struct tagWNDCLASS {

UINT style;

WNDPROC lpfnWndProc;

int cbClsExtra;

int cbWndExtra;

HINSTANCE hInstance;

HICON hIcon;

HCURSOR hCursor;

HBRUSH hbrBackground;

LPCTSTR lpszMenuName;

LPCTSTR lpszClassName;

} WNDCLASS, *PWNDCLASS;

Поля структуры

style

Набор стилей оконного класса.

lpfnWndProc

Адрес оконной процедуры.

cbClsExtra

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

cbWndExtra

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

hInstance

Описатель модуля, в котором содержится оконная процедура данного класса.

hIcon

Описатель иконки окна. Это поле структуры должно быть равно идентификатору ресурса, описывающего иконку. Если оно равно NULL, то используется иконка по умолчанию

hCursor

Описатель курсора окна. Это поле структуры должно быть равно идентификатору ресурса, описывающего курсор. Если NULL, то используется курсор по умолчанию

hbrBackground

Описатель кисти фона окна. Это поле может быть равно дескриптору кисти, которая используется для закраски фона. Или оно может быть системным цветом фона.

lpszMenuName

Строка с именем ресурса или идентификатор ресурса, описывающего меню окна. Если это поле равно NULL, то у данного окна нет меню.

lpszClassName

Строка с наименованием оконного класса.

Заголовочный файл: Winuser.h (включен в Windows.h)


WNDCLASSEX

 Top Previous

Содержит атрибуты оконного класса. Является расширенным вариантом структуры WNDCLASS.

Прототип

typedef struct tagWNDCLASSEX {

UINT cbSize;

UINT style;

WNDPROC lpfnWndProc;

int cbClsExtra;

int cbWndExtra;

HINSTANCE hInstance;

HICON hIcon;

HCURSOR hCursor;

HBRUSH hbrBackground;

LPCTSTR lpszMenuName;

LPCTSTR lpszClassName;

HICON hIconSm;

} WNDCLASSEX, *PWNDCLASSEX;

Поля структуры

cbSize

Размер структуры WNDCLASSEX в байтах.

style

Набор стилей оконного класса.

lpfnWndProc

Адрес оконной процедуры.

cbClsExtra

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

cbWndExtra

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

hInstance

Описатель модуля, в котором содержится оконная процедура данного класса.

hIcon

Описатель иконки окна. Это поле структуры должно быть равно идентификатору ресурса, описывающего иконку. Если оно NULL, то используется иконка по умолчанию

hCursor

Описатель курсора окна. Это поле структуры должно быть равно идентификатору ресурса, описывающего курсор. Если NULL, то используется курсор по умолчанию

hbrBackground

Описатель кисти фона окна. Это поле может быть равно дескриптору кисти, которая используется для закраски фона. Или оно может быть системным цветом фона.

lpszMenuName

Строка с именем ресурса или идентификатор ресурса, описывающего меню окна. Если это поле равно NULL, то у данного окна нет меню.

lpszClassName

Строка с наименованием оконного класса.

hIconSm

Описатель маленькой иконки, ассоциированной с оконным классом.

Заголовочный файл: Winuser.h (включен в Windows.h)