Титульный

28.01.2018


CreateDialog

 Top Previous Next

Создает немодальное диалоговое окно на основе шаблона в ресурсах. CreateDialog - это макрос, который вызывает функцию CreateDialogParam.

Прототип

HWND WINAPI CreateDialog(

_In_opt_ HINSTANCE hInstance,

_In_ LPCTSTR lpTemplate,

_In_opt_ HWND hWndParent,

_In_opt_ DLGPROC lpDialogFunc

);

Параметры

hInsatnce [in, opt]

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

lpTemplate [in]

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

hWndParent [in, opt]

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

lpDialogFunc [in, opt]

Указатель на диалоовую процедуру DialogProc.

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

Описатель диалогового окна.

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

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

Обычно, функция завершается ошибкой по одной из следующих причин:

· недопустимое значение параметра;
· системный класс был зарегистрирован другим модулем;
· установленный хук WH_CBT вернул код ошибки;
· один из элементов управления в шаблоне диалогового окна не зарегистрирован, или в его оконной процедуре произошла ошибка при обработке сообщения WM_CREATE или WM_NCCREATE.

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

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

Примечание

CreateDialog - это макрос, который вызывает функцию CreateDialogParam.

Функция CreateDialogParam для создания диалогового окна использует функцию CreateWindowEx. После создания окна функция CreateDialogParam отправляет диалоговому окну сообщение WM_INITDIALOG (если в шаблоне диалогового окна установлен стиль DS_SETFONT или DS_SHELLFONT, то дополнительно отправляется сообщение WM_SETFONT). Затем, если установлен стиль WS_VISIBLE, функция отображает окно. Наконец, функция CreateDialogParam возвращает описатель диалогового окна.

После того, как функция CreateDialogParam вернула управление, приложение может с помощью функции ShowWindow отобразить окно, если оно еще не отображается на экране. Приложение разрушает диалоговое окно с помощью функции DestroyWindow. Для поддержки навигации с помощью клавиатуры и другой функциональности диалогового окна, цикл обработки сообщений должен вызывать функцию IsDialogMessage.

Заголовочный файл | winuser.h (подключен в windows.h)
ANSI и Unicode наименования | СreateDialogA и CreateDialogW


CreateDialogIndirect

Создает немодальное диалоговое окно на основе шаблона в памяти. CreateDialogIndirect- это макрос, вызывающий функцию CreateDialogIndirectParam.

Прототип

HWND WINAPI CreateDialogIndirect(

_In_opt_ HINSTANCE hInstance,

_In_ LPCDLGTEMPLATE lpTemplate,

_In_opt_ HWND hWndParent,

_In_opt_ DLGPROC lpDialogFunc

);

Параметры

hInstance [in, opt]

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

lpTemplate [in]

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

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

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

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

hWndParent [in, opt]

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

lpDialogFunc [in, opt]

Указатель на диалоговую процедуру DialogProc.

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

Описатель диалогового окна.

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

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

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

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

Примечание

CreateDialogIndirect - это макрос, который вызывает функцию CreateDialogIndirectParam.

Функция CreateDialogIndirectParam для создания диалогового окна использует функцию CreateWindowEx. После создания окна она отправляет ему сообщение WM_INITDIALOG. Если в шаблоне задан стиль DS_SETFONT или DS_SHELLFONT, то в диалоговую процедуру также отправляется сообщение WM_SETFONT. Если в шаблоне задан стиль WS_VISIBLE, то функция отображает диалоговое окно. Наконец, функция CreateDialogIndirectParam возвращает описатель диалогового окна.

После того, как функция CreateDialogIndirectParam вернула управление, вы можете использовать функцию ShowWindow для отображения диалогового окна (если оно еще не видимо на экране). Для разрушения диалогового окна, используйте функцию DestroyWindow. Для поддержки навигации с помощью клавиатуры и другой функциональности диалоговых окон, цикл обработки сообщений должен вызывать функцию IsDialogMessage.

В стандартном шаблоне структура DLGTEMPLATE и все структуры DLGITEMTEMPLATE должны быть выровнены по границе двойного слова (DWORD). Массив дополнительных данных, расположенный после структуры DLGITEMTEMPLATE, также должен быть выровнен по границе двойного слова (DWORD). Все прочие массивы переменной длины в шаблоне должны быть выровнены по границе слова (WORD).

В расширенном шаблоне заголовок DLGTEMPLATEEX и все структуры DLGITEMTEMPLATEEX должны быть выровнены по границе двойного слова (DWORD). Массив дополнительных данных, если он есть, располагающийся сразу за структурой DLGITEMTEMPLATEEX, также должен быть выровен по границе двойного слова (DWORD). Все прочие массивы переменной длины в шаблоне должны быть выровнены по границе слова (WORD).

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

Заголовочный файл | winuser.h (подключен в windows.h)
ANSI и Unicode наименования | СreateDialogIndirectA и CreateDialogIndirectW


CreateDialogIndirectParam

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

Прототип

HWND WINAPI CreateDialogIndirectParam(

_In_opt_ HINSTANCE hInstance,

_In_ LPCDLGTEMPLATE lpTemplate,

_In_opt_ HWND hWndParent,

_In_opt_ DLGPROC lpDialogFunc,

_In_ LPARAM lParamInit

);

Параметры

hInstance [in, opt]

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

lpTemplate [in]

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

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

В расширенном шаблоне, заголовок использет структуру DLGTEMPLATEEX, а элементы управления - структуру DLGITEMTEMPLATEEX.

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

hWndParen [in, opt]

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

lpDialogFunc [in, opt]

Указатель на диалоговую процедуру DialogProc.

lParamInit [in]

Значение, которое в качестве параметра lParam сообщения WM_INITDIALOG, будет передано диалоговому окну.

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

Описатель диалогового окна.

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

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

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

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

Примечание

Функция CreateDialogIndirectParam для создания диалогового окна использует функцию CreateWindowEx. После создания окна она отправляет ему сообщение WM_INITDIALOG. Если в шаблоне задан стиль DS_SETFONT или DS_SHELLFONT, то в диалоговую процедуру также отправляется сообщение WM_SETFONT. Если в шаблоне задан стиль WS_VISIBLE, то функция отображает диалоговое окно. Наконец, функция CreateDialogIndirectParam возвращает описатель диалогового окна.

После того, как функция CreateDialogIndirectParam вернула управление, вы можете использовать функцию ShowWindow для отображения диалогового окна (если оно еще не видимо на экране). Для разрушения диалогового окна, используйте функцию DestroyWindow. Для поддержки навигации с помощью клавиатуры и другой функциональности диалоговых окон, цикл обработки сообщений должен вызывать функцию IsDialogMessage.

В стандартном шаблоне структура DLGTEMPLATE и все структуры DLGITEMTEMPLATE должны быть выровнены по границе двойного слова (DWORD). Массив дополнительных данных, расположенный после структуры DLGITEMTEMPLATE, также должен быть выровнен по границе двойного слова (DWORD). Все прочие массивы переменной длины в шаблоне должны быть выровнены по границе слова (WORD).

В расширенном шаблоне заголовок DLGTEMPLATEEX и все структуры DLGITEMTEMPLATEEX должны быть выровнены по границе двойного слова (DWORD). Массив дополнительных данных, если он есть, располагающийся сразу за структурой DLGITEMTEMPLATEEX, также должен быть выровен по границе двойного слова (DWORD). Все прочие массивы переменной длины в шаблоне должны быть выровнены по границе слова (WORD).

Все строки символов в шаблоне, такие как заголовки диалогового окна и кнопок должны быть заданы в кодировке Unicode.

Заголовочный файл | Winuser.h (включен в Windows.h)
Экспортирующая библиотека | user32.dll
ANSI и UNICODE наименования | CreateDialogIndirectParamA и CreateDialogIndirectParamW


CreateDialogParam

Создает немодальное диалоговое окно на основе шаблона в ресурсах. Перед отображением диалогового окна функция CreateDialogParam посредством параметра lParam сообщения WM_INITDIALOG передает в диалоговую процедуру определенное приложением значение. Приложение может использовать это значение для инициализации элементов уравления.

Прототип

HWND WINAPI CreateDialogParam(

_In_opt_ HINSTANCE hInstance,

_In_ LPCTSTR lpTemplateName,

_In_opt_ HWND hWndParent,

_In_opt_ DLGPROC lpDialogFunc,

_In_ LPARAM dwInitParam

);

Параметры

hInstance [in, opt]

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

lpTemplateName [in]

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

hWndParent [in, opt]

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

lpDialogFunc [in, opt]

Указатель на диалоговую процедуру DialogProc.

dwInitParam [in]

Значение, передаваемое в диалоговую процедуру в качестве значения параметра lParam сообщения WM_INITDIALOG.

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

Описатель диалогового окна.

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

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

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

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

Примечание

Функция CreateDialogParam для создания диалогового окна использует функцию CreateWindowEx. После создания окна функция CreateDialogParam отправляет диалоговому окну сообщение WM_INITDIALOG (если в шаблоне диалогового окна установлен стиль DS_SETFONT или DS_SHELLFONT, то дополнительно отправляется сообщение WM_SETFONT). Затем, если установлен стиль WS_VISIBLE, функция отображает окно. Наконец, функция CreateDialogParam возвращает описатель диалогового окна.

После того, как функция CreateDialogParam вернула управление, приложение может с помощью функции ShowWindow отобразить окно, если оно еще не отображается на экране. Приложение разрушает диалоговое окно с помощью функции DestroyWindow. Для поддержки навигации с помощью клавиатуры и другой функциональности диалогового окна, цикл обработки сообщений должен вызывать функцию IsDialogMessage.

Заголовочный файл | Winuser.h (включен в Windows.h)
Экспортирующая библиотека | user32.dll
ANSI и UNICODE наименования | CreateDialogParamA и CreateDialogParamW


DefDlgProc

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

Прототип

LRESULT WINAPI DefDlgProc(

_In_ HWND hDlg,

_In_ UINT Msg,

_In_ WPARAM wParam,

_In_ LPARAM lParam

);

Параметры

hDlg[in]

Описатель диалогового окна.

Msg[in]

Сообщение.

wParam[in]

Дополнительный параметр сообщения.

lParam[in]

Дополнительный параметр сообщения.

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

Результат обработки сообщения. Зависит от сообщения.

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

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

Примечание

Функция DefDlgProc является оконной процедурой системного класса диалоговых окон. Эта процедура осуществляет обработку сообщений, для которых диалоговая процедура вернула FALSE. Приложения, которые реализуют собственные оконные процедуры для своих диалоговых окон часто используют функцию DefDlgProc вместо функции DefWindowProc, для стандартной обработки сообщений.

Приложения создают собственные классы диалоговых окон путем заполнения структуры WNDCLASS и регистрацией класса функцией RegisterClass. Некоторые приложения заполняют структуру с помощью функции GetClassInfo, указывая ей наименование системного диалогового окна. В этих случаях, приложения перед регистрацией изменяют содержимое поля lpszClassName. В любом случае, поле cbWndExtra структуры WNDCLASS должно содержать значение не меньшее, чем DLGWINDOWEXTRA.

Функция DefDlgProc не должна вызываться в диалоговой процедуре. Это приведет к бесконечной рекурсии.

Заголовочный файл | Winuser.h (включен в Windows.h)
Экспортирующая библиотека | user32.dll
ANSI и UNICODE наименования | DefDlgProcA и DefDlProcW


DialogBox

Создает модальное диалоговое окно на основе шаблона диалогового окна в ресурсах. Функция DialogBox не возвращает управления до тех пор, пока заданная функция обратного вызова не уничтожит диалоговое окно вызовом функции EndDialog.

Функция DialogBox реализована в виде макроса, вызывающего функцию DialogBoxParam.

Прототип

INT_PTR WINAPI DialogBox(

_In_opt_ HINSTANCE hInstance,

_In_ LPCTSTR lpTemplate,

_In_opt_ HWND hWndParent,

_In_opt_ DLGPROC lpDialogFunc

);

Параметры

hInstance [in,opt]

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

lpTemplate [in]

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

hWndParent [in, opt]

Описатель окна-владельца диалогового окна.

lpDialogFunc [in, opt]

Указатель на диалоговую процедуру DialogProc.

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

Значение параметра nResult, которое было передано в функцию EndDialog при уничтожении диалогового окна.

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

Если функция завершилась ошибкой из-за некорректного значения параметра hWndParent, то возвращается значение нуль. Такое поведение объясняется необходимостью обратной совместимости с предыдущими версиями Windows. Если функция завершилась ошибкой по какой-либо другой причине, то врозвращается значение -1. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

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

· некорректное значение параметра,
· системный класс был зарегистрирован другим модулем,
· хук WH_CBT установлен и вернул код ошибки,
· один из элементов управления диалогового окна не зарегистрирован, или в его оконной процедуре произошла ошибка при обработке сообщения WM_CREATE или WM_NCCREATE.

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

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

Примечание

Макрос DialogBox реализован как вызов функции DialogBoxParam.

Функция DialogBoxParam для создания диалогового окна использует функцию CreateWindowEx. После создания окна функция DialogBoxParam отправляет окну сообщение WM_INITDIALOG. Если у шаблона определен стиль DS_SETFONT или DS_SHELLFONT, то дополнительно отправляется сообщение WM_SETFONT. Затем функция DialogBoxParam отображает диалоговое окно (если у него установлен стиль WS_VISIBLE), делает недоступным окно-владельца и запускает свой цикл обработки оконных сообщений.

Когда диалоговая процедура вызывает функцию EndDialog, функция DialogBoxParam разрушает диалоговое окно, завершает цикл обработки сообщений, делает доступным окно-владельца (если оно было доступным до вызова функции DialogBoxParam), и возвращает значение параметра nResult, переданного в функцию EndDialog.

Заголовочный файл | winuser.h (подключен в windows.h)
ANSI и Unicode наименования | DialogBoxA и DialogBoxW


DialogBoxIndirect

Создает модальное диалоговое окно на основе шаблона диалогового окна в памяти. Функция DialogBoxIndirect не возвращает управления до тех пор, пока заданная функция обатного вызова не разрушит модальное диалоговое окно вызовом функции EndDialog.

Функция DialogBoxIndirect реализована в виде макроса, вызывающего функцию DialogBoxIndirectParam.

Прототип

INT_PTR WINAPI DialogBoxIndirect(

_In_opt_ HINSTANCE hInstance,

_In_ LPCDLGTEMPLATE lpTemplate,

_In_opt_ HWND hWndParent,

_In_opt_ DLGPROC lpDialogFunc

);

Параметры

hInstance [in, opt]

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

lpTemplate [in]

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

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

В расширенном шаблоне диалогового окна, заголовок представляется в виде структуры DLGTEMPLATEEX, а элементы управления в виде структуры DLGITEMTEMPLATEEX.

hWndParent [in, opt]

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

lpDialogFunc [in, opt]

Указатель на диалоговую процедуру DialogProc.

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

Значение параметра nResult, переданного в функцию EndDialog при уничтожении диалогового окна.

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

Если функция завершилась ошибкой из-за неверного значения параметра hWndParent, то возвращается значение нуль. Функция возвращает нуль в целях совместимости с предыдущими версиями Windows. Если же функция завершается ошибкой по какой-либо другой причине, то возвращается значение -1. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

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

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

Примечание

Единственное, что делает макрос DialogBoxIndirect так это вызывает функцию DialogBoxIndirectParam.

Функция DialogBoxIndirectParam для создания диалогового окна использует функцию CreateWindowEx. После создания окна функция DialogBoxIndirectParam отправляет ему сообщение WM_INITDIALOG. Если в шаблоне заданы стили DS_SETFONT или DS_SHELLFONT, функция также отправляет сообщение WM_SETFONT. Функция отображает диалоговое окно (в зависимости от того установлен стиль WS_VISIBLE или нет), делает недоступным окно владельца, и запускает цикл выборки и перенаправления сообщений для диалогового окна.

Когда диалоговая процедура вызывает функцию EndDialog, функция DialogBoxIndirectParam разрушает диалоговое окно, останавливает цикл обработки сообщений, делает доступным окно владельца (если оно прежде было доступным), и возвращает значение nResult, которое диалоговая процедура передала в функцию EndDialog.

В стандартном шаблоне диалогового окна структура DLGTEMPLATE и все структуры DLGITEMTEMPLATE должны быть выровнены по границе двойного слова (DWORD). Массив дополнительных данных, располагающийся сразу за структурой DLGITEMTEMPATE также должен быть выровнен по границе двойного слова (DWORD). Все остальные массивы переменной длины в шаблоне должны быть выровнены по границе слова (WORD).

В расширенном шаблоне структура DLGTEMPLATEEX и все структуры DLGITEMTEMPLATEEX должны быть выровнены по границе двойного слова (DWORD). Массив дополнительных данных, если он есть, располагающийся сразу за структурой DLGITEMTEMPLATEEX также должен быть выровнен по границе двойного слова (DWORD). Все остальные массивы переменной длины в шаблоне должны быть выровнены по границе слова (WORD).

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

Заголовочный файл | winuser.h (подключен в windows.h)
ANSI и Unicode наименования | DialogBoxIndirectA и DialogBoxIndirectW


DialogBoxIndirectParam

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

Прототип

INT_PTR WINAPI DialogBoxIndirectParam(

_In_opt_ HINSTANCE hInstance,

_In_ LPCDLGTEMPLATE hDialogTemplate,

_In_opt_ HWND hWndParent,

_In_opt_ DLGPROC lpDialogFunc,

_In_ LPARAM dwInitParam

);

Параметры

hInstance [in, opt]

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

hDialogTemplate [in]

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

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

В расширенном шаблоне диалогового окна, заголовок представляется в виде структуры DLGTEMPLATEEX, а элементы управления в виде структуры DLGITEMTEMPLATEEX.

hWndParent [in, opt]

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

lpDialogFunc [in, opt]

Указатель на диалоговую процедуру DialogProc.

dwInitParam [in]

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

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

Значение параметра nResult, переданного в функцию EndDialog при уничтожении диалогового окна.

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

Если функция завершилась ошибкой из-за неверного значения параметра hWndParent, то возвращается значение нуль. Функция возвращает нуль в целях совместимости с предыдущими версиями Windows. Если же функция завершается ошибкой по какой-либо другой причине, то возвращается значение -1. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

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

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

Примечание

Функция DialogBoxIndirectParam для создания диалогового окна использует функцию CreateWindowEx. После создания окна функция DialogBoxIndirectParam отправляет ему сообщение WM_INITDIALOG. Если в шаблоне заданы стили DS_SETFONT или DS_SHELLFONT, функция также отправляет сообщение WM_SETFONT. Функция отображает диалоговое окно (в зависимости от того установлен стиль WS_VISIBLE или нет), делает недоступным окно владельца, и запускает цикл выборки и перенаправления сообщений для диалогового окна.

Когда диалоговая процедура вызывает функцию EndDialog, функция DialogBoxIndirectParam разрушает диалоговое окно, останавливает цикл обработки сообщений, делает доступным окно владельца (если оно прежде было доступным), и возвращает значение nResult, которое диалоговая процедура передала в функцию EndDialog.

В стандартном шаблоне диалогового окна структура DLGTEMPLATE и все структуры DLGITEMTEMPLATE должны быть выровнены по границе двойного слова (DWORD). Массив дополнительных данных, располагающийся сразу за структурой DLGITEMTEMPATE также должен быть выровнен по границе двойного слова (DWORD). Все остальные массивы переменной длины в шаблоне должны быть выровнены по границе слова (WORD).

В расширенном шаблоне структура DLGTEMPLATEEX и все структуры DLGITEMTEMPLATEEX должны быть выровнены по границе двойного слова (DWORD). Массив дополнительных данных, если он есть, располагающийся сразу за структурой DLGITEMTEMPLATEEX также должен быть выровнен по границе двойного слова (DWORD). Все остальные массивы переменной длины в шаблоне должны быть выровнены по границе слова (WORD).

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

Заголовочный файл | Winuser.h (включен в Windows.h)
Экспортирующая библиотека | user32.dll
ANSI и UNICODE наименования | DialogBoxIndirectParamA и DialogBoxIndirectParamW


DialogBoxParam

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

Прототип

INT_PTR WINAPI DialogBoxParam(

_In_opt_ HINSTANCE hInstance,

_In_ LPCTSTR lpTemplateName,

_In_opt_ HWND hWndParent,

_In_opt_ DLGPROC lpDialogFunc,

_In_ LPARAM dwInitParam

);

Параметры

hInstance[in,opt]

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

lpTemplateName[in]

Шаблон диалогового окна. Данный параметр может содержать либо указатель на завершающуюся NULL-символом строку с наименованием шабона диалогового окна, либо целочисленный идентификатор ресурса. Если параметр lpTemplateName содержит идентификатор ресурса, то его старшее слово должно быть равно нулю, а младшее слово должно содержать идентификатор. Для создания значения параметра lpTemplateName вы можете использовать макрос MAKEINTRESOURCE.

hWndParent[in, opt]

Описатель окна-владельца диалогового окна.

lpDialogFunc[in, opt]

Указатель на диалоговую процедуру DialogProc.

dwInitParam[in]

Значение, передаваемое в диалоговую процедуру в качестве значения параметра lParam сообщения WM_INITDIALOG.

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

Значение параметра nResult, переданного в функцию EndDialog при уничтожении диалогового окна.

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

Если причиной ошибки стало неверное значение параметра hWndParent, то функция возвращает значение нуль. Такое поведение объясняется необходимостью обратной совместимости с предыдущими версиями Windows. Если же ошибка произошла по какой-либо другой причине, то функция возвращает значение -1. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

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

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

Примечание

Функция DialogBoxParam для создания диалогового окна использует функцию CreateWindowEx. После создания окна функция DialogBoxParam отправляет окну сообщение WM_INITDIALOG. Если у шаблона определен стиль DS_SETFONT или DS_SHELLFONT, то дополнительно отправляется сообщение WM_SETFONT. Затем функция DialogBoxParam отображает диалоговое окно (если у него установлен стиль WS_VISIBLE), делает недоступным окно-владельца и запускает свой цикл обработки оконных сообщений.

Когда диалоговая процедура вызывает функцию EndDialog, функция DialogBoxParam разрушает диалоговое окно, завершает цикл обработки сообщений, делает доступным окно-владельца (если оно было доступным до вызова функции DialogBoxParam), и возвращает значение параметра nResult, переданного в функцию EndDialog.

Заголовочный файл | Winuser.h (включен в Windows.h)
Экспортирующая библиотека | user32.dll
ANSI и UNICODE наименования | DialogBoxParamA и DialogBoxParamW


EndDialog

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

Прототип

BOOL WINAPI EndDialog(

_In_ HWND hDlg,

_In_ INT_PTR nResult

);

Параметры

hDlg[in]

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

nResult[in]

Значение, которое будет возвращено приложению функцией, создавшей диалоговое окно.

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

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

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

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

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

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

Примечание

Диалоговые окна создаваемые функциями DialogBox, DialogBoxParam, DialogBoxIndirect и DialogBoxIndirectParam должны быть разрушены функцией EndDialog. приложение вызывает функцию EndDialog из диалоговой процедуры. Функция EndDialog не должна использоваться для каких-либо других целей.

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

Функция EndDialog не разрушает диалоговое окно немедленно. Вместо этого, она взводит специальный флаг и позволяет диалоговой процедуре вернуть системе управление. Система проверяет значение этого флага перед попыткой извлечь очередное сообщение из очереди сообщений. Если флаг взведен, система останавливает цикл обработки сообщений, разрушает диалоговое окно и, при выходе из функции создавшей диалоговое окно, возвращает значение параметра nResult.

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


GetDialogBaseUnits

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

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

Прототип

LONG WINAPI GetDialogBaseUnits(void);

Параметры

У функции нет параметров.

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

Базовые диалоговые единицы. Младшее слово результата содержит базовую единицу (base unit) по горизонтали, старшее слово - базовую единицу по вертикали.

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

#include <Windows.h>

int main(int argc, char *argv[]) {

printf("%X\n", GetDialogBaseUnits());

getch();

return 0;

}

В данном примере, на экран выводится значение 0x100008 (у вас значение может быть другим).

Примечание

Базовая единица по горизонтали, возвращенная функцией GetDialogBaseUnits равна средней ширине, в пикселях, символов системного шрифта. Базовая единица по вертикали равна средней высоте шрифта, в пикселях.

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

Для диалоговых окон, которые не используют системный шрифт, базовые единицы равны средней ширине и высоте символов шрифта, в пикселях. Для определения этих значений для выбранного шрифта вы можете использовать функции GetTextMetrics и GetTextExtentPoint32. Тем не менее, используя функцию MapDialogRect, вы можете избежать ошибок, которые могут возникнуть при самостоятельном пересчете.

Каждая базовая единица по горизонтали равна 4 шаблонным единицам по горизонтали. Каждая базовая единица по вертикали равна 8 шаблонным единицам по вертикали. Таким образом, пересчет шаблонных единиц в пиксели осуществляется по следующей формуле:

pixelX = MulDiv(templateunitX, baseunitX, 4);

pixelY = MulDiv(templateunitY, baseunitY, 8);

Аналогично, пересчет из пикселей в шаблонные единицы осуществляется по формуле:

templateunitX = MulDiv(pixelX, 4, baseunitX);

templateunitY = MulDiv(pixelY, 8, baseunitY);

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


MapDialogRect

Пересчитывает шаблонные единицы в единицы экрана (пиксели). Функция замещает координаты в заданной структуре RECT пересчитанными координатами.

Прототип

BOOL WINAPI MapDialogRect(

_In_ HWND hDlg,

_Inout_ LPRECT lpRect

);

Параметры

hDlg[in]

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

lpRect[in,out]

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

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

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

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

Нуль. Дополнительная информация об ошибке может быть получена функцией GetLastError.

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

#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)

{

//Координаты в шаблонных единицах

RECT rc = {5,5,5+15,5+15};

HWND hwndStatic=NULL;

switch(uMsg){

case WM_INITDIALOG:

//выводим координаты в шаблонных единицах

SetDlgItemInt(hwnd,ID_EDITLEFT1 ,rc.left ,0);

SetDlgItemInt(hwnd,ID_EDITTOP1 ,rc.top ,0);

SetDlgItemInt(hwnd,ID_EDITRIGHT1 ,rc.right ,0);

SetDlgItemInt(hwnd,ID_EDITBOTTOM1,rc.bottom,0);

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

MapDialogRect(hwnd,&rc);

//Выводим пересчитанные координаты

SetDlgItemInt(hwnd,ID_EDITLEFT2 ,rc.left ,0);

SetDlgItemInt(hwnd,ID_EDITTOP2 ,rc.top ,0);

SetDlgItemInt(hwnd,ID_EDITRIGHT2 ,rc.right ,0);

SetDlgItemInt(hwnd,ID_EDITBOTTOM2,rc.bottom,0);

//Перемещаем окно

hwndStatic = GetDlgItem(hwnd,ID_STATICLEFT);

SetWindowPos(hwndStatic,NULL,rc.left,rc.top,0,0,SWP_NOZORDER|SWP_NOSIZE);

break;

case WM_CLOSE:

//Закрываем окно

EndDialog(hwnd,0);

}

return 0;

}

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

В данном приложении создаётся диалоговое окно. Изначально в структуру RECT (переменная rc) заносятся координаты статического элемента управления (надпись "Left"). Эти координаты выводятся в первой колонке. Затем с помощью функции MapDialogRect эти координаты пересчитываются из шаблонных единиц в пиксели. Пересчитанные координаты выводятся во второй колонке. Псле пересчета, с помощью функции SetWindowPos мы пытаемся переместить это окно (статический элемент управления с надписью "Left"). Поскольку окно осталось на прежнем месте, то пересчет выполнен правильно. Если бы мы попытались переместить окно без пересчета, то оно переместилось бы ближе к левому верхнему углу родительского окна.

Ниже представлено содержимое файла ресурсов.

#include "Resource.h"

#include <windows.h>

ID_DIALOG DIALOG 0,0,95,80

STYLE WS_CAPTION | WS_VISIBLE | WS_SYSMENU | DS_CENTER |WS_MINIMIZEBOX

CAPTION "MapDialogRect"

BEGIN

LTEXT "Left",ID_STATICLEFT, 5,5,15,15,WS_VISIBLE

EDITTEXT ID_EDITLEFT1, 30,5,20,12, WS_BORDER | ES_READONLY

EDITTEXT ID_EDITLEFT2, 60,5,20,12, WS_BORDER | ES_READONLY

LTEXT "Top",ID_STATICTOP, 5,25,15,15,WS_VISIBLE

EDITTEXT ID_EDITTOP1, 30,25,20,12, WS_BORDER | ES_READONLY

EDITTEXT ID_EDITTOP2, 60,25,20,12, WS_BORDER | ES_READONLY

LTEXT "Right",ID_STATICRIGHT, 5,45,20,15,WS_VISIBLE

EDITTEXT ID_EDITRIGHT1, 30,45,20,12, WS_BORDER | ES_READONLY

EDITTEXT ID_EDITRIGHT2, 60,45,20,12, WS_BORDER | ES_READONLY

LTEXT "Bottom",ID_STATICBOTTOM, 5,65,25,15,WS_VISIBLE

EDITTEXT ID_EDITBOTTOM1, 30,65,20,12, WS_BORDER | ES_READONLY

EDITTEXT ID_EDITBOTTOM2, 60,65,20,12, WS_BORDER | ES_READONLY

END

Содержимое заголовочного файла Resource.h.

#define ID_DIALOG 0x1000

#define ID_STATICLEFT 0x1020

#define ID_EDITLEFT1 0x1030

#define ID_EDITLEFT2 0x1040

#define ID_STATICTOP 0x1050

#define ID_EDITTOP1 0x1060

#define ID_EDITTOP2 0x1070

#define ID_STATICRIGHT 0x1080

#define ID_EDITRIGHT1 0x1090

#define ID_EDITRIGHT2 0x10A0

#define ID_STATICBOTTOM 0x10B0

#define ID_EDITBOTTOM1 0x10C0

#define ID_EDITBOTTOM2 0x10D0

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


CloseHandle

Закрывает описатель созданного (открытого) ранее объекта

Прототип

BOOL WINAPI CloseHandle(

_In_ HANDLE hObject

);

Параметры

hObject[in]

Закрываемый описатель объекта

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

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

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

Нуль. Дополнительная информация об ошибке может быть получена функцией GetLastError.

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

#include <windows.h>

int main()

{

CloseHandle(NULL);

return 0;

}

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

Примечание

Данная функция подходит для закрытия дескрипторов следующих объектов:

буфер экрана консоли (Console screen buffer),

задание (job),

именованный канал (named pipe),

канал (pipe),

консольный ввод (console input),

маркер доступа (access token),

мьютекс (mutex),

ожидаемый таймер (waitable timer),

порт завершения ввода/вывода (I/O completion port),

поток (rhread),

почтовый ящик (слот) (mailslot),

проекция файла (File mapping),

процесс (process),

семафор (semaphore),

событие (Event),

транзакция (transaction),

уведомление о состоянии ресурса памяти (Memory resource notification),

устройство связи (communication device),

файл (File).

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


DeleteObject

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

Прототип

BOOL DeleteObject(

_In_ HGDIOBJ hObject

);

Параметры

hObject[in]

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

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

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

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

Если указанный описатель является недействительным описателем, или он выбран в контексте устройства (selected into a DC), то возвращается значение нуль.

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

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

Примечание

Не удаляйте объект рисования (перо или кисть) пока он выбран в контексте устройства.

Когда удаляется шаблонная кисть (pattern brush), растровое изображение, ассоциированное с кистью не удаляется. Оно должно быть удалено отдельно.

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


DragFinish

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

Прототип

VOID DragFinish(

HDROP hDrop

);

Параметры

hDrop

Идентификатор структуры, описывающей отпущенные (dropped) файлы. Этот описатель указывается в параметре wParam сообщения WM_DROPFILES.

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

Функция ничего не возвращает.

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

Функция ничего не возвращает.

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

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

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


DragQueryFile

Появилась в Windows XP. Возвращает наименования файлов отпущенных (dropped) во время успешной операции перетаскивания (drag-and-drop).

Прототип

UINT DragQueryFile(

_In_ HDROP hDrop,

_In_ UINT iFile,

_Out_ LPTSTR lpszFile,

UINT cch

);

Параметры

hDrop [in]

Идентификатор структуры, содержащей наименования отпущенных файлов.

iFile [in]

Порядковый номер запрашиваемого файла. Если значение этого параметра равно 0xFFFFFFFF, функция вернет количество отпущенных файлов. Если значение параметра находится в интервале между нулем и количеством отпущенных файлов, функция DragQueryFile скопирует наименование соответсвующего файла в буфер lpszFile.

lpszFile [out]

Указатель на буфер, в который заносится наименование отпущенного файла. Наименование файла представляется в виде строки с NULL символом на конце. Если значение параметра lpszFile равно NULL, функция DragQueryFile вернет требуемый размер буфера в символах.

cch

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

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

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

При копировании в буфер наименования файла функция возвращает количество скопированных символов, исключая завершающий NULL символ.

Если значение параметра iFile равно 0xFFFFFFFF, функция возвращает количество отпущенных файлов. Учтите, что переменная, содержащая индекс не изменяется. Поэтому в ней сохраняется значение 0xFFFFFFFF.

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

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

Значение нуль.

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

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

Примечание

Нумерация отпущенных файлов ведется с нуля.

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


DwmIsCompositionEnabled

Появилась в Windows Vista. Возвращает значение, которое указывает доступно ли отрисовывание окон посредством диспетчера рабочего стола (Desktop Window Manager - DWM). Приложения запущенные на компьютерах под управлением Windows 7 или более ранних версий могут отслеживать доступность DWM путем обработки уведомления WM_DWMCOMPOSITIONCHANGED.

Прототип

HRESULT WINAPI DwmIsCompositionEnabled(

_Out_ BOOL *pfEnabled

);

Параметры

pfEnabled[out]

Указатель на переменную типа BOOL, в которую будет записано запрашиваемое значение.

В Windows 8 построение DWM всегда включено. Если приложение в своем манифесте (manifest) декларирует совместимость с Windows 8, то данная функция в переменной, на которую указывает параметр pfEnabled запишет значение TRUE. Если такой манифест не будет найден, то совместимость приложения с Windows 8 не признаётся и функция в переменной, на которую указывает параметр pfEnabled запишет значение FALSE. Это сделано для того, чтобы старые приложения, которые интерпретируют значение TRUE как признак того, что режим высокой контрастности (high contrast mode) выключен, могли корректно отображать свои изображения. (Заметьте, что это является плохой практикой - для определения состояния режима высокой контрастности вы должны использовать функцию SystemParametersInfo с флагом SPI_GETHIGHCONTRAST).

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

значение S_OK.

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

Код ошибки.

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

#include <windows.h>

typedef HRESULT (*DWMISCOMPOSITIONENABLED)(BOOL*);

DWMISCOMPOSITIONENABLED lpfDWMIsCompositionEnabled;

int main()

{

HINSTANCE hdwmapi;

hdwmapi = LoadLibrary("dwmapi.dll");

if(!hdwmapi) return -1;

lpfDWMIsCompositionEnabled = (DWMISCOMPOSITIONENABLED)GetProcAddress(hdwmapi,"DwmIsCompositionEnabled");

BOOL res = TRUE;

if(lpfDWMIsCompositionEnabled)

lpfDWMIsCompositionEnabled(&res);

FreeLibrary(hdwmapi);

printf("DWM is %s\n",(res)?("on"):("off"));

getchar();

return 0;

}

Данная программа проверялась на виртуальной машине с установленной операционной системой Windows 7. На ней программа выдала, что построение окон посредством DWM (DWM composition) выключено. Включить его не удалось из-за слишком плохой видеокарты.

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


EnumUILanguages

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

Прототип

BOOL EnumUILanguages(

_In_ UILANGUAGE_ENUMPROC lpUILanguageEnumProc,

_In_ DWORD dwFlags,

_In_ LONG_PTR lParam

);

Параметры

lpUILanguageEnumProc[in]

Указатель на определенную приложением функцию обратного вызова EnumUILanguagesProc. Функция EnumUILanguages вызывает эту функцию обратного вызова для каждого найденного языка.

dwFlags[in]

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

MUI_LANGUAGE_ID (4) - в функцию обратного вызова передается идентификатор языка.

MUI_LANGUAGE_NAME (8) - в функцию обратного вызова передается наименование языка.

Флаги перечисленные ниже определяют фильтрацию языков при их перечислении. Данные флаги взаимно исключаются. По умолчанию используется флаг MUI_LICENSED_LANGUAGES.

MUI_ALL_INSTALLED_LANGUAGES - перечисляются все установленные в операционной системе языки.

MUI_LICENSED_LANGUAGES - перечисляются все установленные языки, которые доступны и лицензированы для использования.

MUI_GROUP_POLICY - перечисляются все установленные языки, которые доступны и лицензированы для использования, а также разрешены групповой политикой.

Windows Vista и новее: приложение может установить значение этого параметра равным нулю, или равным одному или нескольким флагам. Значение равное нулю интерпретируется как значение MUI_LANGUAGE_ID|MUI_LICENSED_LANGUAGES.

Windows 2000, Windows XP, Windows Server 2003: значение данного параметра должно быть равно нулю.

lParam[in]

Определенное приложением значение.

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

Значение TRUE.

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

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

ERROR_INVALID_FLAGS - в функциию передан недопустмиый набор флагов.

ERROR_INVALID_PARAMETER - в функцию передан какой-либо другой недопустимый параметр.

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

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

Примечание

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

Для приложений, работающих толоко в Windows Vista и более новых версиях операционной системы, рекомендуется использовать флаг MUI_LANGUAGE_NAME вместо MUI_LANGUAGE_ID. Флаг MUI_LANGUAGE_NAME разрешает различие между языками, ассоциированными с дополнительной локалью (supplement locale).

Если задан флаг MUI_LANGUAGE_ID, то передаваемая в функцию обратного вызова строка будет содержать идентификатор языка в шестнадцатеричной системе счисления, не включая лидирующих символов 0x. Передаваемая строка имеет длину 4 символа. Например, для языка en-US будет передана строка "0409". Строка "1000" будет передаваться в функцию обратного вызова для всех языков ассоциированных с дополнительной локалью. Это значение представляет собой шестнадцатеричное значение константы LOCALE_CUSTOM_UNSPECIFIED. Это не различает дополнительные локали, даже если выбранный язык находится в списке предпочтительных языков пользовательского интерфейса или в системном списке предпочтительных языков пользовательского интерфейса.

Функция EnumUILanguages перечисляет только один язык в системе. Почему? Ответа я так и не нашел.

Значения констант MUI_ALL_INSTALLED_LANGUAGES, MUI_LICENSED_LANGUAGES, MUI_GROUP_POLICY я так же не нашел.

Заголовочный файл | Winnls.h (включен в Windows.h)
Экспортирующая библиотека | kernel32.dll
ANSI и UNICODE наименования | EnumUILanguagesA и EnumUILanguagesW


GdiFlush

Сбрасывает группу (batch) текущего потока.

Прототип

BOOL GdiFlush(void);

Параметры

У функции нет параметров.

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

Если все функции в текущей группе завершились успешно, то возвращается ненулевое значение.

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

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

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

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

GdiFlush();

return 0;

}

Примечание

Группирование вызовов улучшает выполнение функций рисования за счет миннимизации кооличества времени, необходимого для вызова функций GDI, возвращающих значение типа Boolean. Система накапливает параметры вызываемых функций в текущей группе и затем, при сбросе группы, вызывает эти функции. Сброс группы осуществляется по одной из следующих причин.

· Вызов функции GdiFlush.
· Превышения ограничения, установленного функцией GdiSetBatchLimit.
· Наполнение буферов группы.
· Вызов функции GDI, возвращающей значение отличное от типа Boolean.

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

Значение текущего ограничения на размер группы возвращает функция GdiGetBatchLimit.

Учтите, что ограничение на размер группы применяется отдельно для каждого потока. Для полного отключения группирования вызовов вызовите функцию GdiSetBatchLimit(1) при инициализации каждого потока вашего приложения.

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

Могопоточные приложения, которые сериализуют доступ к объектам GDI с помощью мьютекса должны сбрасывать группу с помощью функции GDI каждый раз, когда поток перестает владеть объектом GDI. Такое поведение предотвращает конфликты (collisions) между объектами GDI (контекстами устройств, метафайлами и т.д.)

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


GdiGetBatchLimit

Возвращает максимальное количество вызовов функций, которые могут быть объединены в одну группу (batch) для текущего потока. Система сбрасывает (flush) группу при превышении ограничения на максимальное количество вызовов.

Прототип

DWORD GdiGetBatchLimit(void);

Параметры

У функции нет параметров.

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

Значение ограничения на группу.

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

Значение нуль.

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

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Получаем значение ограничения

DWORD limit;

limit = GdiGetBatchLimit();

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

char s[10];

sprintf(s, "%d", limit);

//Выводим строку на экран

MessageBox(NULL, s, "GdiGetBatchLimit", MB_OK);

return 0;

}

В данном примере на экран выводится текущее значение ограничения. На моем компьютере это значение равно 20. У вас оно может быть другим.

Примечание

Ограничение на группу устанавливается функцией GdiSetBatchLimit. Установка этого ограничения в значение 1, равносильна отмене группировке вызовов функций.

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

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

Учтите, что ограничение применяется отдельно для каждого потока. Для полного отключения группировки в своем приложении, вызовите GdiSetBatchLimit(1) при инициализации каждого потока.

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


GdiSetBatchLimit

Устанавливает максимальное количество вызовов функций, которые могут быть объединены в текущей группе (batch) вызывающего потока. При превышении этого ограничения система сбрасывает текущую группу.

Прототип

DWORD GdiSetBatchLimit(

_In_ DWORD dwLimit

);

Параметры

dwLimit [in]

Устанавливаемое ограничение. Значение нуль устанавливает ограничение по умолчанию. Значение 1 отключает группировку.

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

Предыдущее значение ограничения.

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

Значение нуль.

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

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Устанавливаем значение лимита

GdiSetBatchLimit(5);

//Получаем значение лимита

DWORD limit;

limit = GdiGetBatchLimit();

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

char s[10];

sprintf(s, "%d", limit);

//Выводим строку на экран

MessageBox(NULL, s, "GdiSetBatchLimit", MB_OK);

return 0;

}

В данном примере мы устанавливаем ограничение равное 5. После этого мы вызываем функцию GdiGetBatchLimit, для получения текущего значения ограничения. Данное значение впоследствии выводится на экран. Оно должно равняться 5.

Примечание

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

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

Учтите, что ограничение применяется отдельно для каждого потока. Для полного отключения группировки в своем приложении, вызовите GdiSetBatchLimit(1) при инициализации каждого потока.

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


GetCPInfo

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

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

Прототип

BOOL GetCPInfo(

_In_ UINT CodePage,

_Out_ LPCPINFO lpCPInfo

);

Параметры

CodePage [in]

Идентификатор кодовой страницы для которой запрашивается информация. Данный параметр аналогичен параметру CodePage функции GetCPInfoEx.

lpCPInfo [out]

Указатель на структуру CPINFO, в которую заносится информация о кодовой странице.

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

Значение 1.

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

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

ERROR_INVALID_PARAMETER - недопустимое значение какого-либо параметра.

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

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

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

CPINFO cpi;

char s[10];

if(GetCPInfo(CP_ACP, &cpi))

sprintf(s, "%s", "Успех");

else

sprintf(s, "%s", "Ошибка");

MessageBox(NULL, s, "", MB_OK);

return 0;

}

В данном примере на экран выводится сообщение "Успех". Тем не менее при извлечении символа по умолчанию я был несколько удивлен тому, что им является символ "p", хотя по идее должен быть символ "?". При этом функция возвращала успех.

Примечание

Аналогично примечанию к функции GetCPInfoEx.

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


GetCPInfoEx

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

Прототип

BOOL GetCPInfoEx(

_In_ UINT CodePage,

_In_ DWORD dwFlags,

_Out_ LPCPINFOEX lpCPInfoEx

);

Параметры

CodePage [in]

Идентификатор кодовой страницы для которой запрашивается информация. Приложение может задать идентификатор кодовой страницы или одно из предопределенных значений, приведенных ниже.

CP_ACP - системная кодовая страница ANSI по умолчанию.

CP_MACCP - системная кодовая страница Macintosh по умолчанию.

CP_OEMCP - системная кодовая страница OEM по умолчанию.

CP_THREAD_ACP - текущая кодовая страница потока (ANSI).

dwFlags [in]

Зарезервировано. Должно быть равно нулю.

lpCPInfoEx [out]

Указатель на структуру CPINFOEX, в которую заносится информация о кодовой странице

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

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

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

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

ERROR_INVALID_PARAMETER - недопустимое значение какого-либо параметра.

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

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

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

CPINFOEX cpie;

GetCPInfoEx(CP_ACP, 0, &cpie);

MessageBox(NULL, cpie.CodePageName, "", MB_OK);

return 0;

}

В данном примере на экран выводится полное наименование системной кодовой страницы. На мое компьютере была выведена строка "1251 (ANSI - кириллица)" (у вас строка может отличаться).

Примечание

Информация заносимая в структуру CPINFOEX не всегда полезна для всех кодовых страниц. Например, для корректного определения размера буфера приложение должно использовать функцию MultiByteToWideChar и WideCharToMultiByte. Если параметры кодовой страницы говорят о наличии лидирующих байтов, функция конвертирования не обязана обрабатывать лидирующие байты каким-то особым образом в случае, например, некорректного значения ведомого байта (trail byte).

Заголовочный файл | Winnls.h (включен в Windows.h)
Экспортирующая библиотека | kernel32.dll
ANSI и UNICODE наименования | GetCPInfoExA и GetCPInfoExW


GetDeviceCaps

Возвращает информацию специфичную для заданного устройства.

Прототип

int GetDeviceCaps(

_In_ HDC hdc,

_In_ int nIndex

);

Параметры

hdc [in]

Описатель контекста устройства.

nIndex [in]

Возвращаемая информация. Допустимые значения этого параметра перечислены здесь.

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

Зависит от значения параметра nIndex.

Если значение параметра nIndex равно BITSPIXEL, а устройство имеет глубину цвета 15 или 16 бит на пиксель, то функция вернет значение 16.

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

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Получаем контекст устройства экрана

HDC hdc;

hdc = GetDC(NULL);

//Получаем версию драйвера

int ver;

ver = GetDeviceCaps(hdc, DRIVERVERSION);

//Оформляем его в виде строки

char s[100];

sprintf(s, "%d", ver);

//Выводим на экран

MessageBox(NULL, s, "", MB_OK);

return 0;

}

В данном примере мы запрашиваем версию драйвера и выводим ее на экран. На моем компьютере выводится значение "16384" (у вас оно может быть другим).

Примечание

Если значение параметра nIndex равно SHADEBLENDCAPS:

· для принтеров, функция вернет то, что сообщит ей драйвер принтера;
· для дисплейного устройства, доступны все операции смешивания; кроме флага SB_NONE также возвращаются флаги SB_CONST_ALPHA и SB_PIXEL_ALPHA, которые указывают на то, что эти операции ускорены (accelerated).

На системах с несколькими мониторами, если параметр hdc задает рабочий стол, функция GetDeviceCaps вернет параметры основного монитора. если вы хотите поолуить информацию о других мониторах, вы должны использовать специальное API (https://msdn.microsoft.com/ru-ru/library/windows/desktop/dd145073(v=vs.85).aspx) или же использовать функцию CreateDC для получения описателя контекста устройства (HDC) заданного монитора.

Учтите, что "Display1" обычно является основным монитором, но не всегда.

Функция GetDeviceCaps предоставляет следующие шесть индексов вместо значений возвращаемых драйвером принтера (printer escapes).

Индекс | Параметр принтера
PHYSICALWIDTH | GETPHYSPAGESIZE
PHYSICALHEIGHT | GETPHYSPAGESIZE
PHYSICALOFFSETX | GETPRINTINGOFFSET
PHYSICALOFFSETY | GETPHYSICALOFFSET
SCALINGFACTORX | GETSCALINGFACTOR
SCALINGFACTORY | GETSCALINGFACTOR

Помните, что функция GetDeviceCaps сообщает информацию, которую ей передает драйвер. Если драйвер не сообщает информацию, функция вычисляет значение, основываясь на фиксированных значениях. Если драйвер сообщает неверную информацию, функция вернет неверную информацию. Также, если драйвер не сообщил информацию, функция может вычислить неверное значение, так как она предполагает фиксированное разрешение (96 dpi) и фиксированный размер (в зависимости от той информации, которую сообщил или не сообщил драйвер).К сожалению, драйвер реализованный в модели драйверов Windows для дисплеев (Windows Display Driver Model) (введена в Windows Vista) не позволяет подсистеме GDI получать информацию, поэтому функция GetDeviceCaps должна всегда вычислять информацию.

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


GetModuleHandle

GetModuleHandle(A/W)

 Top Previous Next

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

Прототип

HMODULE WINAPI GetModuleHandle(

_In_opt_ LPCTSTR lpModuleName

);

Параметры

lpModuleName [in, opt]

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

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

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

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

NULL. Дополнительную информацию об ошибке можно получить с помощью функции GetLastError.

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

#include <windows.h>

#include <stdio.h>

#include <conio.h>

int main()

{

HMODULE hModule;

hModule = GetModuleHandle("kernel32.dll");

printf("%x\n", hModule);

getch();

return 0;

}

В результате работы этой программы будет выведено число 0x7c800000. У вас оно может быть другим.

Примечание

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

Заголовочный файл | Winbase.h (включен в Windows.h)
Экспортирующая библиотека | kernel32.dll
ANSI и UNICODE наименования | GetModuleHandleA и GetModuleHandleW


GetObject

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

Прототип

int GetObject(

_In_ HGDIOBJ hgdiobj,

_In_ int cbBuffer,

_Out_ LPVOID lpvObject

);

Параметры

hgdiobj [in]

Описатель графического объекта. Это может быть описатель растрового изображения (bitmap), кисти, шрифта, палитры, пера или независящего от устройства растрового изображения (Device Independent Bitmap - DIB), созданного функцией CreateDIBSection.

cbBuffer [in]

Количество байт, записываемых в буфер.

lpvObject [out]

Указатель на буфер, в который заносится информация о заданном графическом объекте.

Таблица ниже содержит тип информации, заносимой в буфер для каждого типа графического объекта.

Тип объекта | Информация
HBITMAP | BITMAP
HBITMAP, созданный функцией CreateDIBSection | Если значение параметра cbBuffer равно sizeof(DIBSECTION), то DIBSECTION. Если же значение параметра cbBuffer равно sizeof(BITMAP), то BITMAP.
HPALETTE | Количество элементов в палитре. в виде значения типа WORD.
HPEN, созданный функцией ExtCreatePen | EXTLOGPEN
HPEN | LOGPEN
HBRUSH | LOGBRUSH
HFONT | LOGFONT

Если значение параметра lpvObject равно NULL, то функция вернет необходимый размер буфера для размещения в нем информации о заданном графическом объекте.

Адрес буфера lpvObject должен быть выровнен по границе 4 байта. В противном случае функция завершится ошибкой.

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

Количество байт, записанных в буфер.

Если значение параметра lpvObject равно NULL, то функция вернет необходимый размер буфера для размещения в нем информации об объекте.

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

Значение нуль.

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

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

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Создаем перо

HPEN hpen;

hpen = CreatePen(PS_SOLID, 0, RGB(0, 0xFF, 0));

//Получаем информацию о пере

LOGPEN lpen;

GetObject(hpen, sizeof(LOGPEN), &lpen);

//Выводим цвет пера в строку

char s[100];

sprintf(s, "(%X; %X, %X)", GetRValue(lpen.lopnColor), GetGValue(lpen.lopnColor), GetBValue(lpen.lopnColor));

//Выводим строку на экран

MessageBox(NULL, s, "GetObject", MB_OK);

//Удаляем перо

DeleteObject(hpen);

return 0;

}

В данном примере мы создаем перо (посредством функции CreatePen) и получаем информацию об этом пере. На экран выводится цвет пера в формате RGB. Для извлечения компонентов цвета используются макросы GetRValue, GetGValue и GetBValue. В результате работы этой программы на экран выводится строка "(0; FF; 0)".

Примечание

Буфер lpvObject должен иметь достаточный размер для того, чтобы вместить в себя информацию о графическом объекте. В зависимости от графического объекта функцитя заносит туда структуру BITMAP, DIBSECTION, EXTLOGPEN, LOGBRUSH, LOGFONT, или LOGPEN или же количество элементов (для палитры).

Если параметр hgdiobj содержит описатель растрового изображения, созданного функцией CreateDIBSection, и буфер имеет достаточный размер, функция вернет структуру DIBSECTION. Дополнительно, поле bmBits структуры BITMAP, входящей в состав DIBSECTION, будет содержать указатель на биты растрового изображения.

Если же параметр hgdiobj содержит описатель растрового изображения, созданного какой-либо другой функцией, функция GetObject вернет только ширину, высоту и формат цвета растрового изображения. Для получения битов изображения используйте функцию GetDIBits или GetBitmapBits.

Если параметр hgdiobj содержит описатель палитры, функция GetObject вернет двухбайтовое целое, задающее количество элементов палитры Функция не возвращает структуру LOGPALETTE, описывающую палитру. Для получения информации об элементах палитры используйте функцию GetPaletteEntries.

Если параметр hgdiobj содержит описатель шрифта, то функция возвращает структуру LOGFONT, использующуюся при создании шрифта. Если система выполнила какие-либо корректировки (interpolation) по причине того, что шрифт, описанный в оригинальной структуре LOGFONT, не может быть отображен, то эти корректировки не отображаются в структуре LOGFONT, возвращаемой функцией GetObject. Например, если вы запрашиваете информацию о вертикальном шрифте, который не поддерживает вертикальное отображение, то структура LOGFONT будет описывать шрифт как вертикальный, однако система будет отрисовывать его горизонтально.

Заголовочный файл | Wingdi.h (включен в Windows.h)
Экспортирующая библиотека | gdi32.dll
ANSI и UNICODE наименования | GetObjectA и GetObjectW


GetObjectType

Возвращает тип заданного объекта.

Прототип

DWORD GetObjectType(

_In_ HGDIOBJ h

);

Параметры

h [in]

Описатель графического объекта.

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

Тип объекта. Допустимые значения перечислены здесь.

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

Значение нуль.

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

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Создаем объект

HPEN hpen;

hpen = CreatePen(PS_SOLID, 0, RGB(0, 0xFF, 0));

//Получаем тип объекта

DWORD type;

type = GetObjectType(hpen);

DeleteObject(hpen);

if(type == OBJ_PEN)

MessageBox(NULL, "Перо", "", MB_OK);

else

MessageBox(NULL, "Не перо", "", MB_OK);

return 0;

}

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

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


GetStockObject

Возвращает описатель предварительно подготовленного графического объекта (пера, кисти, шрифта или палитры).

Прототип

HGDIOBJ GetStockObject(

_In_ int fnObject

);

Параметры

fnObject [in]

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

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

Описатель запрошенного логического объекта.

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

Значение NULL.

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

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

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Получаем описатель готового объекта

HGDIOBJ hgdiobj = NULL;

hgdiobj = GetStockObject(BLACK_BRUSH);

//Выводим описатель объекта в строку

char s[32];

sprintf(s,"%X", hgdiobj);

//Выводим строку с описателем объекта

MessageBox(NULL, s, "", MB_OK);

return 0;

}

В данном примере мы получаем описатель черной кисти и выводим его на экран.

Примечание

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

Используйте объекты DKGRAY_BRUSH, GRAY_BRUSH и LTGRAY_BRUSH только для окон, классы которых имеют стиль CS_HREDRAW или CS_VREDRAW. Использование серой кисти для других оконных классов моджет привести к отклонению шаблона кисти от нужного положения при перемещении или изменении размеров окна. Шаблоны (origins) предварительно подготовленных кистей не могут быть подстроены (adjusted).

Объекты HOLLOW_BRUSH и NULL_BRUSH идентичны друг другу.

Нет необходимости удалять объекты с помощью функции DeleteObject (но их удаление не вызывет ошибку).

Параметры DC_BRUSH и DC_PEN могут поочередно использоваться с такими объектами как BLACK_BRUSH и BLACK_PEN. Для получения информации о цвете текущего пера или кисти используйте функцию GetDCBrushColor или GetDCPenColor. Функция GetStockObject с параметром DC_BRUSH или DC_PEN может поочередно использоваться с функциями SetDCPenColor или SetDCBrushColor.

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


GetSysColor

Возвращает текущий цвет заданного элемента экрана (display element). Элемент экрана - это часть окна и экрана, которая отображается на системном экране.

Прототип

DWORD WINAPI GetSysColor(

_In_ int nIndex

);

Параметры

nIndex[in]

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

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

RGB значение цвета заданного элемента.

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

Если параметр nIndex содержит недопустимое значение, то возвращается значение нуль. Так как нуль - допустимое RGB значение цвета, вы не может использовать функцию GetSysColor для определения: поддерживает ли текущая платформа заданный цвет. Вместо неё используйте функцию GetSysColorBrush, которая возвращает значение NULL, если цвет не поддерживается.

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

#include <windows.h>

int main()

{

DWORD Color=0;

Color = GetSysColor(COLOR_ACTIVEBORDER);

printf("%x\n", Color);

getchar();

return 0;

}

Примечание

Для извлечения компонентов RGB значения используйте макросы GetRValue, GetGValue и GetBValue.

Системные цвета для чернобелых мониторов обычно интерпретируются как оттенки серого.

При рисовании кистью системного цвета (system color brush), приложение должно использовать GetSysColorBrush(nIndex) вместо CreateSolidBrush(GetSysColor(nIndex)), так как GetSysColorBrush возвращает ранее созданную кисть, и не создает новую кисть.

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


GetSystemMetrics

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

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

Прототип

int WINAPI GetSystemMetrics(

_In_ int nIndex

);

Параметры

nIndex[in]

Запрашиваемая системная метрика, или настройка конфигурации. Допустимые значения этого параметра перечислены здесь. Заметьте, что все значения SM_CX* описывают ширину чего-либо, а значения SM_CY* описывают высоту чего-либо. Также заметьте, что все булевские величины представляют значение TRUE как ненулевое значение, а значение FALSE как значение нуль.

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

Запрошенная системная метрика или настройка конфигурации.

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

Значение нуль. Функция GetLastError не дает дополнительной информации об ошибке.

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

#include <windows.h>

int main()

{

printf("%d x %d\n",GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN));

getchar();

return 0;

}

Данная программа выводит на экран текущее разрешение экрана.

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


GetSystemPaletteEntries

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

Прототип

UINT GetSystemPaletteEntries(

_In_ HDC hdc,

_In_ UINT iStartIndex,

_In_ UINT nEntries,

_Out_ LPPALETTEENTRY lppe

);

Параметры

hdc [in]

Описатель контекста утройства.

iStartIndex [in]

Первый элемент, запрашиваемый из палитры.

nEntries [in]

Количество элементов, запрашиваемых из палитры.

lppe [out]

Указатель на массив структур PALETTEENTRY, в который будут записаны элементы палитры. Массив должен содержать не менее nEntries структур. Если значение параметра lppe равно NULL, функция вернет общее количество элементов в палитре.

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

Количество элементов, полученных из палитры.

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

Значение нуль.

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

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Получаем количество элементов в палитре

HDC hdc = GetDC(NULL);

UINT count;

count = GetSystemPaletteEntries(hdc, 0, 0, NULL);

//Выводим его на экран

char s[50];

sprintf(s, "%d", count);

MessageBox(NULL, s, "", MB_OK);

return 0;

}

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

Примечание

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

Заголовочный файл | Wingdi.h (включен в Windows.h)
Экспортирующая библиотека | gdi32.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 и выше)


SetSysColors

Устанавливает цвета для заданных элементов экрана. Элемент экрана - это часть окна и экрана, которая отображается на системном экране.

Прототип

BOOL WINAPI SetSysColors(

_In_ int cElements,

_In_ const INT *lpaElements,

_In_ const COLORREF *lpaRgbValues

);

Параметры

cElements[in]

Количество элементов в массиве lpaElements.

lpaElements[in]

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

lpaRgbValues[in]

Массив новых RGB цветов для элементов экрана, перечисленных в массиве lpaElements.

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

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

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

Нуль. Дополнительная информация об ошибке может быть получена функцией GetLastError.

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

#include <windows.h>

#define COUNT_COLORS 3

int main()

{

//Массив старых цветов

DWORD OldColors[COUNT_COLORS];

//Массив новых цветов

DWORD NewColors[COUNT_COLORS] = {0xFF, 0xFF, 0xFF};

//Массив индексов цветов, которые мы будем ихменять

int Colors[COUNT_COLORS] = {COLOR_ACTIVEBORDER, COLOR_BTNTEXT, COLOR_MENU};

int i;

//Получаем старые цвета

for(i=0;i<COUNT_COLORS;i++)

OldColors[i] = GetSysColor(Colors[i]);

//Выводим их на экран

printf("old colors are:\n%x\t%x\t%x\n",OldColors[0],OldColors[1],OldColors[2]);

//Меняем цвета

SetSysColors(COUNT_COLORS, Colors, NewColors);

//Получаем измененные цвета

for(i=0;i<COUNT_COLORS;i++)

NewColors[i] = GetSysColor(Colors[i]);

//Выводим их на экран

printf("new colors are:\n%x\t%x\t%x\n",NewColors[0],NewColors[1],NewColors[2]);

//Восстанавливаем старые цвета

SetSysColors(COUNT_COLORS, Colors, OldColors);

getchar();

return 0;

}

Примечание

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

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

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


SystemParametersInfo

Возвращает или устанавливает новое значение общесистемного параметра. Эта функция при установке параметра обновляет профиль пользователя.

Прототип

BOOL WINAPI SystemParametersInfo(

_In_ UINT uiAction,

_In_ UINT uiParam,

_Inout_ PVOID pvParam,

_In_ UINT fWinIni

);

Параметры

uiAction[in]

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

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

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

Параметры рабочего стола перечислены здесь.

Параметры иконок перечислены здесь.

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

Параметры меню перечислены здесь.

Параметры питания перечислены здесь.

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

Параметры заставки экрана перечислены здесь.

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

Параметры эффектов интерфейса пользователя (UI effects) перечислены здесь. Параметр SPI_SETUIEFFECTS используется для включения или выключения этих эффектов.

Параметры окон перечислены здесь.

uiParam[in]

Параметр, использование и формат которого зависит от значения параметра uiAction. Если в описании параметра uiAction не указано иное, вы должны передавать в параметре uiParam значение нуль.

pvParam[in,out]

Параметр использование и формат которого зависит от значения параметра uiAction. Если в описании параметра uiAction не указано иное, вы должны передавать в параметре pvParam значение NULL.

fWinIni[in]

Если устанавливается новое значение общесистемного параметjра, задаёт нужно ли обновлять профиль пользователя и, если нужно, то нужно ли рассылать всем окнам верхнего уровня уведомительное сообщение WM_SETTINGCHANGE.

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

SPIF_UPDATEINIFILE - записывает новое значение общесистемного параметра в профиль пользователя.

SPIF_SENDCHANGE - рассылает сообщение WM_SETTINGCHANGE после обновления профиля пользователя.

SPIF_SENDWININICHANGE - то же самое что SPIF_SENDCHANGE.

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

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

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

Нуль. Дополнительная информация об ошибке может быть получена функцией GetLastError.

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

#define WINVER 0x0500

#include <windows.h>

int main()

{

DWORD lockTimeOut=0;

SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT,0,&lockTimeOut,0);

printf("%d\n", lockTimeOut);

getchar();

return 0;

}

В данном примере мы читаем значение общесистемного параметрат и выводим его на экран.

Обратите внимание: для доступа к некоторым допустимым значениям параметра uiAction необходимо переопределить WINVER (как в нашем примере).

Примечание

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

Наименование схемы расположения клавиш клавиатуры (keyboard layout name) должно быть получено из шестнадцатеричного значения идентификатора языка, соответствующему схеме расположения клавиш. Например, американский английский имеет идентификатор языка 0x0409, поэтому наименование основной схемы расположения клавиш американского английского "00000409". Варианты схемы раскладки американского английского, такие как раскладка DVORAK, имеют имя "00010409", "00020409" и т.д.

Существует различие между высококонтрастной цветовой схемой (High Contrast color scheme) и режимом высокой контрастности (High Contrast Mode). Высококонтрастная цветовая схема заменяет системные цвета цветами с явным контрастом (obvious contrast); вы можете изменить эту цветовую схему в настройках экрана (Display Options) в Панели Управления (control panel). Высококонтрастный режим, который используется параметрами SPI_GETHIGHCONTRAST и SPI_SETHIGHCONTRAST, рекомендует приложениям подстроить своё отображение на экране для слабовидящих пользователей. Он включает такие вещи как: звуковое предупреждение и индивидуальная цветовая схема (используя "специальные возможности" в панели управления).

Во время удержания основной кнопки (primary button) мыши в нажатом состоянии (held down) для включения функции ClickLock пользователь может перемещать мышь. После того как основная кнопка мыши заблокирована (locked down), её отпускание не генерирует сообщения WM_LBUTTONUP. Таким образом появятся приложения, в которых основная кнопка все еще нажата. Любое последующее сообщение кнопки (button message) освобождает основную кнопку, отправляя приложению сообщение WM_LBUTTONUP. Кнопка может быть программно разблокирована или пользовательским щелчком по любой кнопке.

Заголовочный файл | Winuser.h (включен в Windows.h)
Экспортирующая библиотека | user32.dll
ANSI и UNICODE наименования | SystemParametersInfoA и SystemParametersInfoW


CopyIcon

Копирует заданную иконку из другого модуля в текущий модуль.

Прототип

HICON WINAPI CopyIcon(

_In_ HICON hIcon

);

Параметры

hIcon[in]

Описатель копируемой иконки.

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

Описатель копии иконки.

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

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

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

В приведенном ниже примере мы загружаем из ресурсов иконку, делаем её копию, выводим на экран описатель иконки-копии, и уничтожаем копию функцией DestroyIcon.

#include <windows.h>

#include "Constants.h"

int main()

{

HICON hicon1,hicon2;

//Загружаем иконку

hicon1 = LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(ID_ICON));

//Копируем иконку

hicon2 = CopyIcon(hicon1);

//Выводим описатель

printf("%X\n",hicon2);

//Уничтожаем иконку

DestroyIcon(hicon2);

getchar();

return 0;

}

Файл ресурсов:

#include "Constants.h"

ID_ICON ICON "MyIcon.ico"

Заголовочный файл "Constants.h" используется для описания идентификатора ресурса.

#define ID_ICON 0x100

Примечание

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

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

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


CreateIcon

Создает иконку, имеющую заданный размер, цвета и битовые шаблоны.

Прототип

HICON WINAPI CreateIcon(

_In_opt_ HINSTANCE hInstance,

_In_ int nWidth,

_In_ int nHeight,

_In_ BYTE cPlanes,

_In_ BYTE cBitsPixel,

_In_ const BYTE *lpbANDbits,

_In_ const BYTE *lpbXORbits

);

Параметры

hInstance[in]

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

nWidth[in]

Ширина иконки в пикселях.

nHeight[in]

Высота иконки в пикселях.

cPlanes[in]

Количество полоскостей (planes) в битовой XOR маске.

cBitsPixel[in]

Количество бит на пиксель в битовой XOR маске.

lpbANDbits[in]

Массив байтов, содержащий битовые значения AND маски иконки. Данная маска описывает двуцветное растровое изображение.

lpbXORbits[in]

Массив байтов, содержащий битовые значения XOR маски иконки. Данная маска описывает двуцветное или зависимое от устройства цветное растровое изображение.

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

Описатель иконки.

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

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

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

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

Примечание

Параметры nWidth и nHeight должны определять ширину и высоту, поддерживаемую текущим драйвером монитора, так как система не может создать иконку другого размера. Для определения ширины и высоты поддерживаемой драйвером монитора используйте функцию GetSystemMetrics с флагами SM_CXICON и SM_CYICON.

Функция CreateIcon использует следующую таблицу истинности для битовых масок XOR и AND.

AND маска | XOR маска | Цвет
0 | 0 | Черный
0 | 1 | Белый
1 | 0 | Экранный
1 | 1 | Противоположный экранному

Когда вы завершили работу с иконкой вы должны вызвать функцию DestroyIcon для разрушения иконки.

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


CreateIconFromResource

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

Для указания желаемой высоты или ширины иконки используйте функцию CreateIconFromResourceEx.

Прототип

HICON WINAPI CreateIconFromResource(

_In_ PBYTE presbits,

_In_ DWORD dwResSize,

_In_ BOOL fIcon,

_In_ DWORD dwVer

);

Параметры

presbits[in]

Буфер, содержащий последовательность битов ресурса иконки или курсора. Эти биты обычно загружаются с помощью функций LookupIconIdFromDirectory, LookupIconIdFromDirectoryEx и LoadResource.

dwResSize[in]

Размер, в байтах, набора бит presbits.

fIcon[in]

Определяет, что создается: иконка или курсор. Если значение этого параметра равно TRUE, то создается иконка. Если же значение этого параметра равно FALSE, то создается курсор.

dwVer[in]

Номер версии формата ресурса иконки или курсора в буфере presbits. Значение этого параметра должно быть больше или равно значению 0x00020000 и меньше или равно значению 0x00030000. Обычно значение данного параметра устанавливают равным 0x00030000.

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

Описатель иконки или курсора.

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

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

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

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

Примечание

Функции CreateIconFromResource, CreateIconFromResourceEx, CreateIconIndirect, GetIconInfo, LookupIconIdFromDirectory и LookupIconIdFromDirectoryEx позволяют приложениям и просмотрщикам иконок проверять и использовать ресурсы всей системы.

Функция CreateIconFromResource вызывает функцию CreateIconFromResourceEx, передавая ей набор флагов LR_DEFAULTSIZE|LR_SHARED.

Когда вы завершили использование иконки, разрушьте её вызовом функции DestroyIcon.

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


CreateIconFromResourceEx

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

Прототип

HICON WINAPI CreateIconFromResourceEx(

_In_ PBYTE pbIconBits,

_In_ DWORD cbIconBits,

_In_ BOOL fIcon,

_In_ DWORD dwVersion,

_In_ int cxDesired,

_In_ int cyDesired,

_In_ UINT uFlags

);

Параметры

pbIconBits[in]

Последовательность битов ресурса иконки или курсора. Эти биты обычно загружаются с помощью функций LookupIconIdFromDirectoryEx и LoadResource.

cbIconBits[in]

Размер, в байтах, набора битов pbIconBits.

fIcon[in]

Определяет что создается: иконка или курсор. Если значение этого параметра равно TRUE, то создается иконка. Если же значение этого параметра равно FALSE, то создается курсор.

dwVersion[in]

Номер версии формата ресурса иконки или курсора в буфере presbits. Значение этого параметра должно быть больше или равно значению 0x00020000 и меньше или равно значению 0x00030000. Обычно значение данного параметра устанавливают равным 0x00030000.

cxDesired[in]

Желаемая ширина иконки или курсора, в пикселях. Если значение этого параметра равно нулю, то функция использует значения системных метрик SM_CXICON или SM_CXCURSOR для установки ширины.

cyDesired[in]

Желаемая высота иконки или курсора, в пикселях. Если значение этого параметра равно нулю, то функция использует значения системных метрик SM_CYICON или SM_CYCURSOR для установки высоты.

uFlags[in]

Комбинация значений, перечисленных ниже.

LR_DEFAULTCOLOR (0x00000000) - использовать формат цвета по умолчанию.

LR_DEFAULTSIZE (0x00000040) - использовать ширину и высоту, указанные в системных метриках, если значения параметров cxDesired и cyDesired равны нулю. Если этот флаг не установлен, а значения параметров cxDesired и cyDesired равны нулю, функция будет использовать фактический размер ресурса. Если ресурс содержит несколько изображений, функция будет использовать размер первого изображения.

LR_MONOCHROME (0x00000001) - создать чернобелую иконку или курсор.

LR_SHARED (0x00008000) - разделяет описатель иконки или курсора если иконка или курсор создается несколько раз. Если этот флаг не установлен, то второй вызов функции CreateIconFromResourceEx для того же ресурса снова создаст иконку или курсор и вернет новый описатель.

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

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

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

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

Описатель иконки или курсора.

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

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

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

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

Примечание

Функции CreateIconFromResource, CreateIconFromResourceEx, CreateIconIndirect, GetIconInfo и LookupIconIdFromDirectoryEx позволяют приложениям и просмотрщикам иконок проверять и использовать ресурсы всей системы.

Вы должны вызвать функцию DestroyIcon для иконок созданных функцией CreateIconFromResourceEx.

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


CreateIconIndirect

Создает иконку или курсор на основе структуры ICONINFO.

Прототип

HICON WINAPI CreateIconIndirect(

_In_ PICONINFO piconinfo

);

Параметры

piconinfo[in]

Указатель на структуру ICONINFO, которую функция использует для создания иконки или курсора.

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

Описатель иконки или курсора.

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

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

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

#include <windows.h>

#include "Constants.h"

//Прототип функции DeleteObject

_stdcall typedef BOOL (*DELETEOBJECT)(HGDIOBJ);

DELETEOBJECT lpfDeleteObject;

int main()

{

//Загружаем растровое изображение

HBITMAP hbitmap;

hbitmap = LoadBitmap(GetModuleHandle(NULL),MAKEINTRESOURCE(ID_BITMAP));

//Подготавливаем структуру ICONINFO

ICONINFO iconinfo;

iconinfo.fIcon = TRUE;

iconinfo.xHotspot = 0;

iconinfo.yHotspot = 0;

iconinfo.hbmMask = hbitmap;

iconinfo.hbmColor = NULL;

//Создаём иконку

HICON hicon;

hicon = CreateIconIndirect(&iconinfo);

//Выводим на экран её описатель

printf("%X\n",hicon);

//Уничтожаем иконку

DestroyIcon(hicon);

//Находим адрес функции DeleteObject

HINSTANCE hgdi32;

hgdi32 = LoadLibrary("gdi32.dll");

lpfDeleteObject = (DELETEOBJECT)GetProcAddress(hgdi32,"DeleteObject");

//уничтожаем загруженное растровое изображение

lpfDeleteObject(hbitmap);

getchar();

return 0;

}

Файл ресурсов.

#include "Constants.h"

ID_BITMAP BITMAP "MyBitmap.bmp"

Заголовочный файл Constants.h используется для описания идентификатора растрового изображения.

#define ID_BITMAP 0x100

Примечание

Система перед созданием иконки или курсора копирует битовые карты (bitmaps) из структуры ICONINFO. Так как система может временно выбирать (select) битовые карты в контексте устройства, то битовые карты hbmMask и hbmColor в структуре ICONINFO не должны быть выбранными в контексте устройства. Приложение должно продолжить управление оригинальными битовыми картами и удалить их когда они больше не будут нужны.

Когда вы завершите использование иконки, разрушьте её вызовом функции DestroyIcon.

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


DestroyIcon

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

Прототип

BOOL WINAPI DestroyIcon(

_In_ HICON hIcon

);

Параметры

hIcon[in]

Описатель разрушаемой иконки. Иконка не должна использоваться.

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

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

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

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

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

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

Примечание

Используйте функцию DestroyIcon для иконок и курсоров созданных следующими функциями: CreateIconFromResourceEx (если вызывалась без флага LR_SHARED), CreateIconIndirect и CopyIcon. Не используйте эту функцию для разрушения разделяемых иконок. Время жизни разделяемых иконок соответствует времени нахождеия в памяти модуля, из которого была иконка. Следующие функции создают разделяемые иконки:

· LoadIcon;
· LoadImage(с флагом LR_SHARED);
· CopyImage(если используется флаг LR_COPYRETURNORG, а параметр hImage описывает разделяемую иконку);
· CreateIconFromResource;
· CreateIconFromResourceEx (с флагом LR_SHARED).

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


DrawIcon

Отрисовывает иконку или курсор в заданном контексте устройства.

Для определения дополнительных настроек отрисовывания используйте функцию DrawIconEx.

Прототип

BOOL WINAPI DrawIcon(

_In_ HDC hDC,

_In_ int X,

_In_ int Y,

_In_ HICON hIcon

);

Параметры

hDC[in]

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

X[in]

Логическая координата по горизонтали левого верхнего угла иконки.

Y[in]

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

hIcon[in]

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

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

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

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

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

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

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

#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)

{

static HICON hicon;

HDC hdc;

switch(uMsg){

case WM_INITDIALOG:

//Загпужаем иконку из ресурсов

hicon = LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(ID_ICON));

break;

case WM_PAINT:

//Получаем контекст устройства

hdc = GetDC(hwnd);

//Отрисовываем иконку

DrawIcon(hdc,50,50,hicon);

//Освобождаем контекст устройства

ReleaseDC(hwnd,hdc);

break;

case WM_CLOSE:

//Закрываем окно

EndDialog(hwnd,0);

}//switch(uMsg){

return 0;

}

Файл ресурсов.

#include <windows.h>

#include "Resource.h"

ID_ICON ICON "MyIcon.ico"

ID_DIALOG DIALOG 100,100,120,80

STYLE WS_CAPTION | WS_VISIBLE | WS_SYSMENU | DS_CENTER

CAPTION "DrawIcon"

BEGIN

END

Заголовочный файл "Resource.h" используется для описания идентификаторов ресурсов.

#define ID_DIALOG 0x1000

#define ID_ICON 0x100

Примечание

Функция DrawIcon размещает левый верхний угол иконки в точке, задаваемой параметрами X и Y. Расположение зависит от текущего режима отображения контекста устройства.

Функция DrawIcon рисует иконку или курсор, ширина и высота которых определяется системными метриками. Получить значение системной метрики можно с помощью функции GetSystemMetrics.

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


DrawIconEx

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

Прототип

BOOL WINAPI DrawIconEx(

_In_ HDC hdc,

_In_ int xLeft,

_In_ int yTop,

_In_ HICON hIcon,

_In_ int cxWidth,

_In_ int cyWidth,

_In_ UINT istepIfAniCur,

_In_opt_ HBRUSH hbrFlickerFreeDraw,

_In_ UINT diFlags

);

Параметры

hdc[in]

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

xLeft[in]

Логическая координата по горизонтали левого верхнего угла иконки или курсора.

yTop[in]

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

hIcon[in]

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

cxWidth[in]

Логическая ширина иконки или курсора. Если значение этого параметра равно нулю, а параметр diFlags содержит флаг DI_DEFAULTSIZE, функция использует значение системной метрики SM_CXICON для ширины. Если значение этого параметра равно нулю, а флаг DI_DEFAULTSIZE не используется, то функция использует фактическую ширину ресурса.

cyWidth[in]

Логическая высота иконки или курсора. Если значение этого параметра равно нулю, а параметр diFlags содержит флаг DI_DEFAULTSIZE, функция использует значение системной метрики SM_CYICON для высоты. Если значение этого параметра равно нулю, а флаг DI_DEFAULTSIZE не используется, то функция использует фактическую высоту ресурса.

isteplfAniCur[in]

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

hbrFlickerFreeDraw[in,opt]

Описатель кисти, которую использует система для немерцающего рисования. Если hbrFlickerFreeDraw содержит корректный описатель кисти, то система создаёт внеэкранное растровое изображение (offscreen bitmap), используя при этом заданную кисть для цвета фона, отрисовывает иконку или курсор в растровом изображении, а затем копирует растровое изображение в контекст устройства hdc. Если значение параметра hbrFlickerFreeDraw равно NULL, то система отрисовывает иконку или курсор непосредственно в контексте устройства.

diFlags[in]

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

DI_COMPAT (0x0004) - данный флаг игнорируется.

DI_DEFALTSIZE (0x0008) - если значения параметров cxWidth и cyWidth равны нулю, то функция отрисовывает иконку или курсор, испольуя ширину и высоту, заданную в системных метриках для иконки. Еслиданный флаг не установлен, а значения параметров cxWidth и cyWidth равны нулю, то функция использует фактический размер ресурса.

DI_IMAGE (0x0002) - отрисовывает иконку или курсор используя изображение (using image).

DI_MASK (0x0001) - отрисовывает иконку или курсор используя маску.

DI_NOMIRROR (0x0010) - отрисовывает иконку как незеркалируемую иконку. По умолчанию, если контекст устройства hdc зеркалирован, то иконка так же зеркалируется.

DI_NORMAL (0x0003) - комбинация флагов DI_IMAGE и DI_MASK.

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

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

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

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

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

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

#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)

{

static HICON hicon;

HDC hdc;

switch(uMsg){

case WM_INITDIALOG:

//Загпужаем иконку из ресурсов

hicon = LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(ID_ICON));

break;

case WM_PAINT:

//Получаем контекст устройства

hdc = GetDC(hwnd);

//Отрисовываем иконку

DrawIconEx(hdc,50,50,hicon,48,48,0,NULL,DI_NORMAL);

//Освобождаем контекст устройства

ReleaseDC(hwnd,hdc);

break;

case WM_CLOSE:

//Закрываем окно

EndDialog(hwnd,0);

}//switch(uMsg){

return 0;

}

Файл ресурсов.

#include <windows.h>

#include "Resource.h"

ID_ICON ICON "MyIcon.ico"

ID_DIALOG DIALOG 100,100,120,80

STYLE WS_CAPTION | WS_VISIBLE | WS_SYSMENU | DS_CENTER

CAPTION "DrawIcon"

BEGIN

END

Заголовочный файл "Resource.h" используется для описания идентификаторов ресурсов.

#define ID_DIALOG 0x1000

#define ID_ICON 0x100

Примечание

Функция DrawIconEx размещает левый верхний угол иконки в точке с координатами xLeft и yTop. Расположение зависит от текущего режима отображения контекста устройства.

Для дублирования вызова функции DrawIcon(hDC, X, Y, hIcon) вызовите функцию DrawIconEx следующим образом:

DrawIconEx(hDC, X, Y, hIcon, 0, 0, 0, NULL, DI_NORMAL | DI_COMPAT | DI_DEFAULTSIZE)

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


DuplicateIcon

Создаёт копию заданной иконки.

Прототип

HICON WINAPI DuplicateIcon(

_Reserved_ HINSTANCE hInst,

_In_ HICON hIcon

);

Параметры

hInst[res]

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

hIcon[in]

Описатель копируемой иконки.

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

Описатель новой иконки.

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

Значение NULL.

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

В приведенном ниже примере мы загружаем из ресурсов иконку, делаем её копию, выводим на экран описатель иконки-копии, и уничтожаем копию функцией DestroyIcon.

#include <windows.h>

#include "Constants.h"

int main()

{

HICON hicon1, hicon2;

//Загружаем иконку из ресурсов

hicon1 = LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(ID_ICON));

//Создаём копию иконки

hicon2 = DuplicateIcon(NULL,hicon1);

//Выводим на экран описатель копии

printf("%X\n",hicon2);

//Разрушаем копию

DestroyIcon(hicon2);

getchar();

return 0;

}

Файл ресурсов.

#include "Constants.h"

ID_ICON ICON "MyIcon.ico"

Заголовочный файл "Constants.h" используется для описания идентификатора ресурса.

#define ID_ICON 0x100

Примечание

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

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


ExtractAssociatedIcon

Возвращает описатель иконки, найденной в файле или иконки, найденной в ассоциированном исполняемом файле.

Прототип

HICON WINAPI ExtractAssociatedIcon(

_Reserved_ HINSTANCE hInst,

_Inout_ LPTSTR lpIconPath,

_Inout_ WORD *lpiIcon

);

Параметры

hInst

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

lpIconPath[in,out]

Полный путь и имя файла, содержащего иконку. Функция извлекает оисатель иконки из этого файла, или из исполняемого файла ассоциированного с этим файлом. Если описатель иконки извлекается из исполняемого файла, функция сохраняет полный путь и имя этого файла в строке lpIconPath.

lpiIcon[in,out]

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

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

Описатель иконки. Если иконка извлекается из ассоциированного исполняемого файла, то в строке lpIconPath сохраняется полный путь и имя исполняемого файла, а в переменную, на которую указывает параметр lpiIcon, будет записан идентификатор иконки (мои эксперименты это не подтверждают).

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

Значение NULL.

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

В примере приведенном ниже мы извлекаем иконку из исполняемого файла приложения Microsoft Word. При этом в функцию мы передаем путь к документу Microsoft Word.

#include <windows.h>

int main()

{

HICON hicon;

char path[MAX_PATH] = "C:\\Documents and Settings\\СЕргей\\Мои документы\\Документ.docx";

WORD w=0;

//Извлекаем иконку

hicon = ExtractAssociatedIcon(GetModuleHandle(NULL),path,&w);

//Выводим описатель иконки

printf("%X\n",hicon);

//Разрушаем иконку

DestroyIcon(hicon);

getchar();

return 0;

}

Примечание

Вы должны разрушить описатель иконки, возвращенный функцией ExtractAssociatedIcon с помощью функции DestroyIcon.

Функция ExtractAssociatedIcon первоначально ищет иконки в файле, указанному в строке lpIconPath. Если функция не может получить описатель иконки из этого файла и файл имеет ассоциированный с ним исполняемый файл, она просматривает этот исполняемый файл на предмет наличия в нём иконок. Ассоциации с исполняемыми файлами основываются на основе расширений имен файлов, и хранятся в реестре, отдельно для каждого пользователя. Данные ассоциации могут быть изменены пользователем.

Заголовочный файл | shellapi.h
Экспортирующая библиотека | shell32.dll
ANSI и Unicode наименования | ExtractAssociatedIconA и ExtractAssociatedIconW


ExtractIcon

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

Для получения массива описателей больших или маленьких иконок используйте функцию ExtractIconEx.

Прототип

HICON WINAPI ExtractIcon(

_Reserved_ HINSTANCE hInst,

_In_ LPCTSTR lpszExeFileName,

_In_ UINT nIconIndex

);

Параметры

hInst

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

lpszExeFileName[in]

Наименование исполняемого файла, библиотеки DLL, или файла иконки.

nIconIndex[in]

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

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

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

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

Описатель иконки. Если заданный файл не является исполняемым файлом, библиотекой DLL или файлом иконки, то возвращается значение 1. Если в файле не найдено ни одной иконки, то возвращается значение NULL.

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

В приводимом ниже примере мы извлекаем из исполняемого файла стандартного калькулятора Windows первую иконку и выводим на экран её описатель.

#include <windows.h>

int main()

{

HICON hicon;

char path[MAX_PATH] = "C:\\WINDOWS\\System32\\calc.exe";

//Извлекаем иконку

hicon = ExtractIcon(GetModuleHandle(NULL),path,0);

//Выводим описатель иконки

printf("%X\n",hicon);

//Разрушаем иконку

DestroyIcon(hicon);

getchar();

return 0;

}

Примечание

Вы должны разрушить описатель иконки, возвращенный функцией ExtractIcon с помощью функции DestroyIcon.

Заголовочный файл | shellapi.h
Экспортирующая библиотека | shell32.dll
ANSI и Unicode наименования | ExtractIconA и ExtractIconW


ExtractIconEx

Создает массив описателей больших или маленьких иконок извлеченных из заданного исполняемого файла, библиотеки DLL, или файла иконки.

Прототип

UINT WINAPI ExtractIconEx(

_In_ LPCTSTR lpszFile,

_In_ int nIconIndex,

_Out_opt_ HICON *phiconLarge,

_Out_opt_ HICON *phiconSmall,

_In_ UINT nIcons

);

Параметры

lpszFile[in]

Наименование исполняемого файла, библиотеки DLL, или файла иконки, из которого будут извлекаться иконки.

nIconIndex[in]

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

Если значение этого параметра равно -1, а значения параметров phiconLarge и phiconSmall одновременно равны NULL, функция возвращает общее количество иконок в заданном файле. Если файл является исполняемым файлом или библиотекой DLL, то возвращается количество ресурсов RT_GROUP_ICON. Если файл является .ico файлом, то возвращается значение 1.

Если значение этого параметра равно отрицательному числу, а значения параметров phiconLarge и phiconSmall отличны от NULL, то функция начинает извлечение иконок с иконки, идентификатор ресурса которой равен абсолютному значению nIconIndex. Например, для извлечения иконки, идентификатор которой равен 3, используйте значение -3 в параметре nIconIndex.

phiconLarge[out,opt]

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

phiconSmall[out,opt]

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

nIcons[in]

Количество иконок извлекаемых из файла.

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

Если значение параметра nIconIndex равно -1, phiconLarge - NULL, phiconSmall - NULL, то возвращается количество иконок, содержащихся в заданном файле. В противном случае возвращается количество иконок успешно извлеченных из файла.

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

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

#include <windows.h>

int main()

{

char path[MAX_PATH] = "C:\\WINDOWS\\System32\\calc.exe";

//Получаем количество иконок в файле

UINT count;

count = ExtractIconEx(path,-1,NULL,NULL,0);

//Выводим количество иконок

printf("%d\n",count);

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

HICON* hicons;

hicons = (HICON*)malloc(count*sizeof(HICON));

//Подучаем массив иконок

ExtractIconEx(path,0,hicons,NULL,count);

int i;

for(i=0;i<count;i++){

//Выводим описатель иконки

printf("%X\n",hicons[i]);

//Освобождаем описатель иконки

DestroyIcon(hicons[i]);

}

//Освобождаем память

free(hicons);

getchar();

return 0;

}

Примечание

Вы должны разрушить все иконки извлеченные функцией ExtractIconEx с помощью функции DestroyIcon.

Для получения размеров большой и маленькой иконок, используйте функцию GetSystemMetrics с флагами SM_CXICON, SM_CYICON, SM_CXSMICON и SM_CYSMICON.

Заголовочный файл | shellapi.h
Экспортирующая библиотека | shell32.dll
ANSI и Unicode наименования | ExtractIconExA и ExtractIconEXW


GetIconInfo

Возвращает информацию о заданной иконке или курсоре.

Прототип

BOOL WINAPI GetIconInfo(

_In_ HICON hIcon,

_Out_ PICONINFO piconinfo

);

Параметры

hIcon[in]

Описатель иконки или курсора. Для получения информации о стандартной иконке или курсоре, используйте одно из значений перечисленных здесь (для иконок) или здесь (для курсоров).

piconinfo[out]

Указатель на структуру ICONINFO. Функция заполняет поля этой структуры.

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

Ненулевое значение. При этом функция заполняет поля заданной структуры ICONINFO.

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

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

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

В приводимом ниже примере мы загружаем из ресурсов иконку и выводим на экран информацию об этой иконке.

#include <windows.h>

#include "Constants.h"

//Прототип функции DeleteObject

_stdcall typedef BOOL (*DELETEOBJECT)(HGDIOBJ);

DELETEOBJECT lpfDeleteObject;

int main()

{

//Загружаем иконку из ресурсов

HICON hicon;

hicon = LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(ID_ICON));

//Получаем информацию об иконке

ICONINFO iconinfo;

GetIconInfo(hicon,&iconinfo);

//выводим информацию о иконке

printf("%X\n",iconinfo.hbmMask);

printf("%X\n",iconinfo.hbmColor);

//Находим адрес функции DeleteObject

HINSTANCE hgdi32;

hgdi32 = LoadLibrary("gdi32.dll");

lpfDeleteObject = (DELETEOBJECT)GetProcAddress(hgdi32,"DeleteObject");

//Освобождаем ресурсы

lpfDeleteObject(iconinfo.hbmMask);

lpfDeleteObject(iconinfo.hbmColor);

getchar();

return 0;

}

Файл ресурсов.

#include "Constants.h"

ID_ICON ICON "MyIcon.ico"

Заголовочный файл " Constants.h" используется для задания идентификатора ресурса.

#define ID_ICON 0x100

Примечание

Функция GetIconInfo создаёт битовые карты (bitmaps) для полей hbmMask и hbmColor структуры ICONINFO. Вызывающее приложение должно удалить их после того, как они перестанут быть нужными. В примере выше мы используем для этого функцию DeleteObject.

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


GetIconInfoEx

Появилась в Windows Vista. Возвращает информацию о заданной иконке или курсоре. Данная функция расширяет функцию GetIconInfo за счет использования структуры ICONINFOEX.

Прототип

BOOL WINAPI GetIconInfoEx(

_In_ HICON hIcon,

_Inout_ PICONINFOEX piconinfoex

);

Параметры

hIcon[in]

Описатель иконки или курсора. Для получения информации о стандартной иконке или курсоре, используйте одно из значений перечисленных здесь (для иконок) или здесь (для курсоров).

piconinfoex[in,out]

Указатель на структуру ICONINFOEX. Функция заполнит поля этой структуры.

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

Значение TRUE.

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

Значение FALSE.

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

В приводимом ниже примере мы загружаем из ресурсов иконку и выводим на экран информацию об этой иконке.

#include <windows.h>

#include "Constants.h"

//Структура ICONINFOEX

typedef struct _ICONINFOEX {

DWORD cbSize;

BOOL fIcon;

DWORD xHotspot;

DWORD yHotspot;

HBITMAP hbmMask;

HBITMAP hbmColor;

WORD wResID;

TCHAR szModName[MAX_PATH];

TCHAR szResName[MAX_PATH];

} ICONINFOEX;

//Прототип функции GetIconInfoEx

typedef __stdcall BOOL WINAPI(*GETICONINFOEX)(HICON,ICONINFOEX*);

GETICONINFOEX lpfGetIconInfoEx;

//Прототип функции DeleteObject

typedef __stdcall BOOL (*DELETEOBJECT)(HGDIOBJ);

DELETEOBJECT lpfDeleteObject;

int main()

{

//Загружаем иконку из ресурсов

HICON hicon;

hicon = LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(ID_ICON));

//Находим адрес функции GetIconInfoEx

HINSTANCE huser;

huser = GetModuleHandle("user32.dll");

lpfGetIconInfoEx = (GETICONINFOEX)GetProcAddress(huser,"GetIconInfoExA");

//Получаем информацию об иконке

ICONINFOEX iconinfoex;

iconinfoex.cbSize = sizeof(ICONINFOEX);

if(lpfGetIconInfoEx)

lpfGetIconInfoEx(hicon,&iconinfoex);

//Находим адрес функции DeleteObjecct

HINSTANCE hgdi;

hgdi = LoadLibrary("gdi32.dll");

lpfDeleteObject = (DELETEOBJECT)GetProcAddress(hgdi,"DeleteObject");

//Освобождаем ресурсы

if(lpfDeleteObject){

lpfDeleteObject(iconinfoex.hbmMask);

lpfDeleteObject(iconinfoex.hbmColor);

}

//Выводим на экран описатели битовых карт

printf("%X\n",iconinfoex.hbmMask);

printf("%X\n",iconinfoex.hbmColor);

getchar();

return 0;

}

Файл ресурсов.

#include "Constants.h"

ID_ICON ICON "MyIcon.ico"

Заголовочный файл Constants.h служит для описания идентификатора ресурса.

#define ID_ICON 0x100

Примечание

Функция GetIconInfoEx создаёт битовые карты (bitmaps) для полей hbmMask и hbmColor структуры ICONINFOEX. Вызывающее приложение должно удалить их после того, как они перестанут быть нужными. В примере выше мы используем для этого функцию DeleteObject.

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


LoadIcon

Загружает заданный ресурс иконки из исполняемого файла (.exe), связанного с экземпляром приложения.

Данная функция заменена функцией LoadImage.

Прототип

HICON WINAPI LoadIcon(

_In_opt_ HINSTANCE hInstance,

_In_ LPCTSTR lpIconName

);

Параметры

hInstance[in,opt]

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

lpIconName[in]

Наименование загружаемого ресурса иконки. Данный параметр может состоять из идентификатора ресурса в младшем слове и нуля в старшем слове. Используйте макрос MAKEINTRESOURCE для создания такого значения.

Для загрузки предопределенной иконки укажите в параметре hInstance значение NULL, а в параметре lpIconName одно из значений перечисленных здесь.

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

Описатель загруженной иконки.

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

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

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

В приведенном ниже примере мы загружаем из ресурсов иконку и выводим на экран её описатель.

#include <windows.h>

#include "Constants.h"

int main()

{

HICON hicon;

//Загружаем иконку

hicon = LoadIcon(GetModuleHandle(NULL),MAKEINTRESOURCE(ID_ICON));

//Выводим описатель

printf("%X\n",hicon);

getchar();

return 0;

}

Файл ресурсов:

#include "Constants.h"

ID_ICON ICON "MyIcon.ico"

Заголовочный файл "Constants.h" используется для описания идентификатора ресурса.

#define ID_ICON 0x100

Примечание

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

Функция LoadIcon может загрузить иконку, размеры которой соответствуют системным метрикам SM_CXICON и SM_CYICON. Для загрузки иконок других размеров используйте функцию LoadImage.

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


LookupIconIdFromDirectory

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

Для указания желаемой высоты или ширины используйте функцию LookupIconIdFromDirectoryEx.

Прототип

int WINAPI LookupIconIdFromDirectory(

_In_ PBYTE presbits,

_In_ BOOL fIcon

);

Параметры

presbits[in]

Указатель на данные группы иконок или курсоров. Так как данная функция не проверяет корректность данных ресурса, то возможно нарушение общей защиты (GP) или возвращение неопределенного значения в том случае, если параметр presbits указывает на некорректные данные ресурса.

ficon[in]

Определяет что следует искать: иконку или курсор. Если значение этого параметра равно TRUE, то функция ищет иконку. Если же значение этого параметра равно FALSE, то функция ищет курсор.

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

Целочисленный идентификатор ресурса иконки или курсора, который лучше всего соответствует текущему устройству отображения.

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

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

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

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

Примечание

Файл ресурсов типа RT_GROUP_ICON (тип RT_GROUP_CURSOR определяет курсоры) содержит данные иконок (или курсоров) в нескольких зависимых от устройства и независимых от устройства форматах. Функция LookupIconIdFromDirectory ищет файл ресурсов для иконки (или курсора), которая лучше подходит текущему устройству отображения и возвращает её целочисленный идентификатор. Функции FindResource и FindResourceEx используют макрос MAKEINTRESOURCE с этим идентификатором для нахождения ресурса в модуле.

Каталог иконок загружается из файла ресурсов с типом RT_GROUP_ICON (или RT_GROUP_CURSORS для курсоров), и целочисленным именем ресурса для заданной загружаемой иконки. Функция LookupIconIdFromDirectory возвращает целочисленный идентификатор, который является именем ресурса иконки, которая лучше всего соответствует текущему устройству отображения.

Функции LoadIcon, LoadCursor и LoadImage используют функцию LookupIconIdFromDirectory для поиска данных ресурса иконки или курсора, лучше всего соответствующих текущему устройству отображения.

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


LookupIconIdFromDirectoryEx

Ищет данные для иконки или курсора, которая лучше всего соответствует текущему устройству отображения.

Прототип

int WINAPI LookupIconIdFromDirectoryEx(

_In_ PBYTE presbits,

_In_ BOOL fIcon,

_In_ int cxDesired,

_In_ int cyDesired,

_In_ UINT Flags

);

Параметры

presbits[in]

Указатель на данные группы иконок или курсоров. Так как данная функция не проверяет корректность данных ресурса, то возможно нарушение общей защиты (GP) или возвращение неопределенного значения в том случае, если параметр presbits указывает на некорректные данные ресурса.

fIcon[in]

Определяет что следует искать: иконку или курсор. Если значение этого параметра равно TRUE, то функция ищет иконку. Если же значение этого параметра равно FALSE, то функция ищет курсор.

cxDesired[in]

Желаемая ширина иконки в пикселях. Если значение этого параметра равно нулю, то функция использует значение системной метрики SM_CXICON или SM_CXCURSOR.

cyDesired[in]

Желаемая высота иконки в пикселях. Если значение этого параметра равно нулю, то функция использует значение системной метрики SM_CYICON или SM_CYCURSOR.

Flags[in]

Одно из значений перечисленных ниже.

LR_DEFAULTCOLOR (0x00000000) - использовать формат цвета по умолчанию;

LR_MONOCHROME (0x00000001) - создается чернобелая иконка или курсор.

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

Целочисленный идентификатор ресурса иконки или курсора, который лучше всего соответствует текущему устройству отображения.

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

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

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

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

Примечание

Файл ресурсов типа RT_GROUP_ICON (тип RT_GROUP_CURSOR определяет курсоры) содержит данные иконок (или курсоров) в нескольких зависимых от устройства и независимых от устройства форматах. Функция LookupIconIdFromDirectoryEx ищет файл ресурсов для иконки (или курсора), которая лучше подходит текущему устройству отображения и возвращает её целочисленный идентификатор. Функции FindResource и FindResourceEx используют макрос MAKEINTRESOURCE с этим идентификатором для нахождения ресурса в модуле.

Каталог иконок загружается из файла ресурсов с типом RT_GROUP_ICON (или RT_GROUP_CURSORS для курсоров), и целочисленным именем ресурса для заданной загружаемой иконки. Функция LookupIconIdFromDirectoryEx возвращает целочисленный идентификатор, который является именем ресурса иконки, которая лучше всего соответствует текущему устройству отображения.

Функции LoadIcon, LoadCursor и LoadImage используют функцию LookupIconIdFromDirectoryEx для поиска данных ресурса иконки или курсора, лучше всего соответствующих текущему устройству отображения.

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


PrivateExtractIcons

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

Создает массив описателей иконок, извлеченых из заданного файла.

Прототип

UINT WINAPI PrivateExtractIcons(

_In_ LPCTSTR lpszFile,

_In_ int nIconIndex,

_In_ int cxIcon,

_In_ int cyIcon,

_Out_opt_ HICON *phicon,

_Out_opt_ UINT *piconid,

_In_ UINT nIcons,

_In_ UINT flags

);

Параметры

lpszFile[in]

Путь и имя файла, из которого извлекаются иконки.

nIconIndex[in]

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

cxIcon[in]

Ожидаемая ширина иконки.

cyIcon[in]

Ожидаемая высота иконки.

phicon[out,opt]

Указатель на массив описателей иконок. Функция заполянет этот массив.

piconid[out,opt]

Указатель на переменую типа UINT, в которую будет записан идентификатор иконки, лучше всего соответствующей текущему устройству отображения. Идентификатор будет равен 0xFFFFFFFF если идентификатора подходящего формата не найдено. Идентификатор будет равен нулю, если получить идентификатор не удалось.

nicons[in]

Количество извлекаемых из файла иконок. Данный параметр действителен только при извлечении иконок из .exe и .dll файлов.

flags[in]

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

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

Если значение параметра phicon равно NULL, то возвращается количество иконок в файле.

Если значение параметра phicon отлично от NULL, то возвращается количество извлеченных из файла иконок.

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

Нуль.

Если указанный файл не найден, то возвращается значение 0xFFFFFFFF.

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

В приводимом ниже примере мы извлекаем иконки из исполняемого файла стандартного калькулятора Windows. При этом мы дважды вызываем функцию PrivateExtractIcons: первый раз для получения количества иконок в файле, а второй раз непосредственно для извлечения самих иконок.

#define UNICODE

#include <windows.h>

//Прототип функции DeleteObject

typedef _stdcall UINT WINAPI (*PRIVATEEXTRACTICONS)(LPCTSTR,int,int,int,HICON*,UINT*,UINT,UINT);

PRIVATEEXTRACTICONS lpfPEI;

int main()

{

//Находим адрес функции PrivateExtractIcons

HINSTANCE huser;

huser = LoadLibrary(L"user32.dll");

lpfPEI = (PRIVATEEXTRACTICONS)GetProcAddress(huser,"PrivateExtractIconsW");

//Получаем количество иконок в файле

UINT cIcons;

wchar_t path[] = L"C:\\WINDOWS\\system32\\calc.exe";

cIcons = lpfPEI(path,0,0,0,NULL,NULL,0,0);

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

HICON* phicon;

phicon = (HICON*)malloc(cIcons*sizeof(HICON));

//Извлекаем иконки

lpfPEI(path,0,0,0,phicon,NULL,cIcons,0);

//Выводим на экран описатели иконок и уничтожаем последние

UINT i;

for(i=0;i<cIcons;i++){

printf("%X\n",phicon[i]);

DestroyIcon(phicon[i]);

}

//Освобождаем память

free(phicon);

getchar();

return 0;

}

Примечание

Функция извлекает иконки из исполняемых файлов (.exe), динамических библиотек (.dll), файлов иконок (.ico), файлов курсоров (.cur), анимированных курсоров (.ani), и растровых изображений (.bmp). Также поддерживается извлечение иконок из 16-разрядных исполняемых файлов Windows (.exe и .dll).

Параметры cxIcon и cyIcon определяют размер извлекаемых иконок. Из файла могут быть извлечены иконки двух размеров. Для этого необходимо первый размер разместить в младшем слове параметра, а второй размер - в старшем слове. Например, значение MAKELONG(24,48) для обоих параметров cxIcon и cyIcon приведет к извлечению иконок размером 24 на 24 и 48 на 48.

Вы должны разрушить все извлеченные иконки с помощью функции DestroyIcon.

Функция PrivateExtractIcons не включалась в заговочные файлы и библиотеки SDK до Windows XP Service Pack 1 (SP1) и Windows Server 2003. Если у вас нет заголовочного файла и библиотеки импорта для этой функции вы можете вызвать эту функцию посредством функций LoadLibrary и GetProcAddress.

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


MessageBeep

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

Прототип

BOOL WINAPI MessageBeep(

_In_ UINT uType

);

Параметры

uType [in]

Код подаваемого звукового сигнала. Допустимые значения перечислены здесь.

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

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

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

нуль. Дополнительная информация об ошибке может быть получена функцией GetLastError.

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

#include <windows.h>

int main()

{

MessageBeep(MB_OK);

return 0;

}

Примечание

Реальный воспроизводимый звук зависит от настроек системы и может быть изменен пользователем. Настройка системных звуков осуществляется в "Панель управления\ Звуки и аудиоустройства".

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


MessageBox

MessageBox(A/W)

 Top Previous Next

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

Прототип

int WINAPI MessageBox(

_In_opt_ HWND hWnd,

_In_opt_ LPCTSTR lpText,

_In_opt_ LPCTSTR lpCaption,

_In_ UINT uType

);

Параметры

hwnd[in, opt]

Описатель окна, которое будет родительским по отношению к окну, создаваемому функцией MessageBox

lpText[in, opt]

Строка с текстом выводимого сообщения

lpCaption[in, opt]

Строка с заголовком окна, создаваемого функцией MessageBox

uType[in]

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

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

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

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

К третьей группе относятся флаги, определяющие кнопку по умолчанию. Эти флаги перечислены ниже.

MB_DEFBUTTON1 - Первая кнопка (используется по умолчанию).

MB_DEFBUTTON2 - Вторая кнопка.

MB_DEFBUTTON3 - Третья кнопка.

MB_DEFBUTTON4 - Четвертая кнопка.

К четвертой группе относятся флаги определяющие степень "модальности" окна создаваемого функцией MessageBox. Эти флаги представлены в таблице ниже.

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

MB_SYSTEMMODAL - Окно создаваемое функцией MessageBox имеет стиль WS_EX_TOPMOST.

MB_TASKMODAL - Тоже самое что и MB_APPLMODAL за исключением того, что если параметр hwnd принимает значение NULL, то все окна верхнего уровня данного потока становтся недоступны. В случае использования флага MB_APPLMODAL при hwnd равном NULL они доступны.

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

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

Функция возвращает идентификатор нажатой кнопки. Они перечислены здесь.

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

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

Нуль. Дополнительная информация об ошибке может быть получена функцией GetLastError.

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

#include <windows.h>

int main()

{

MessageBox(NULL, "Первая строка сообщения\n Вторая строка сообщения", "Заголовок окна", MB_OK | MB_ICONEXCLAMATION);

return 0;

}

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

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


MessageBoxEx

Создает, отображает и обслуживает окно с сообщением (message box). Окно с сообщением содержит определенное приложением текстовое сообщение и заголовок, плюс любую комбинацию заранее предопределенных иконок и кнопок. Кнопки имеют тот же язык, что и системный пользовательский интерфейс.

Функции MessageBoxEx и MessageBox работают идентично.

Прототип

int WINAPI MessageBoxEx(

_In_opt_ HWND hWnd,

_In_opt_ LPCTSTR lpText,

_In_opt_ LPCTSTR lpCaption,

_In_ UINT uType,

_In_ WORD wLanguageId

);

Параметры

hWnd[in,opt]

Описатель окна-владельца создаваемого окна сообщения. Если значение этого параметра равно NULL, то окно с сообщением не имеет владельца.

lpText[in,opt]

Текстовая строка с отображаемым сообщением.

lpCaption[in,opt]

Строка с текстом заголовка создаваемого функцией диалогового окна. Если значение этого параметра равно NULL, то испоьзуется заголовок с текстом "Error".

uType[in]

Набор флагов, определяющих содержимое и логику создаваемого диалогового окна. Более подробно смотрите в описании функции MessageBox.

wLanguageId[in]

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

Для указания языка отличного от текущего, используйте макрос MAKELANGID.

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

Функция возвращает идентификатор нажатой кнопки. Они перечислены здесь.

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

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

Нуль. Дополнительная информация об ошибке может быть получена функцией GetLastError.

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

#include <windows.h>

int main()

{

MessageBoxEx(NULL, "Сообщение","Заголовок", MB_OK, 0);

return 0;

}

Примечание

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

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

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


MessageBoxIndirect

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

Прототип

int WINAPI MessageBoxIndirect(

_In_ const LPMSGBOXPARAMS lpMsgBoxParams

);

Параметры

lpMsgBoxParams [in]

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

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

Функция возвращает идентификатор нажатой кнопки. Они перечислены здесь.

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

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

Нуль. Это может произойти при нехватке памяти.

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

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

Примечание

Если на экране отображается системное окно с предупреждением о том, что в системе мало памяти, строки, задаваемые полями lpszText и lpszCaption структуры MSGBOXPARAMS, не должны извлекаться из файла ресурсов, так как попытка их загрузки может привести к ошибке.

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

Заголовочный файл | Winuser.h (включен в Windows.h)
Экспортирующая библиотека | user32.dll
ANSI и UNICODE наименования | MessageBoxIndirectA и MessageBoxIndirectW


CreateBrushIndirect

Создает логическую кисть, имеющую заданный стиль, цвет и шаблон.

Прототип

HBRUSH CreateBrushIndirect(

_In_ const LOGBRUSH *lplb

);

Параметры

lplb [in]

Указатель на структуру LOGBRUSH, содержащую информацию о кисти.

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

Описатель логической кисти.

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

Значение NULL.

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

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Заполняем информацию о кисти

LOGBRUSH lbr;

lbr.lbStyle = BS_SOLID;

lbr.lbColor = RGB(0, 0xFF, 0);

lbr.lbHatch = 0;

//Создаем кисть

HBRUSH hbr;

hbr = CreateBrushIndirect(&lbr);

//Выводим описатель кисти в строку

char s[30];

sprintf(s, "%X", hbr);

//Отображаем строку с описателем кисти

MessageBox(NULL, s, "", MB_OK);

//Удаляем кисть

DeleteObject(hbr);

return 0;

}

В данном примере мы создаем простую кисть и выводим на экран ее описатель.

Примечание

Кисть - это растровое изображение (bitmap), которое система использует при отрисовке внутренней части заполненной фигуры.

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

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

Когда кисть вам больше не нужна, удалите ее с помощью функции DeleteObject.

При создании кисти цвет не используется. Однако, если кисть выбрана в контексте устройства, поддерживающим подстройку цвета (ICM), то выполняется управление цветом.

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


CreateDIBPatternBrushPt

Создает логическую кисть, имеющий шаблон, заданный в виде независящего от устройства изображения (device-independent bitmap, DIB).

Прототип

HBRUSH CreateDIBPatternBrushPt(

_In_ const VOID *lpPackedDIB,

_In_ UINT iUsage

);

Параметры

lpPackedDIB [in]

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

iUsage [in]

Задает формат поля bmiColors структуры BITMAPINFO, содержащего таблицу цветов. Допустимые значения этого параметра перечислены ниже.

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

DIB_RGB_COLORS - таблица цветов содержит значения цветов в формате RGB.

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

Описатель логической кисти.

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

Значение NULL.

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

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

Примечание

Кисть - это растровое изображение, которое система использует для закраски внутренних областей фигур.

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

Когда кисть вам больше не нужна, удалите ее с помощью функции DeleteObject,

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

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


CreateHatchBrush

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

Прототип

HBRUSH CreateHatchBrush(

_In_ int fnStyle,

_In_ COLORREF clrref

);

Параметры

fnStyle [in]

Стиль штриховки. Допустимые значения этого параметра перечислены ниже.

HS_BDIAGONAL - восходящая под углом 45 градусов слева направо.

HS_CROSS - горизонтальные и вертикальные линии.

HS_DIAGCROSS - перекрестные линии под углом 45 градусов.

HS_FDIAGONAL - нисходящая под углом 45 градусов слева направо

HS_HORIZONTAL - горизонтальные линии.

HS_VERTICAL - вертикальные линии

clrref [in]

Цвет штриховых линий. Для создания значения типа COLORREF используйте макрос RGB.

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

Описатель логической кисти.

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

Значение NULL.

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

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

Примечание

Кисть - это растровое изображение, которое система использует для закраски внутренних областей фигур.

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

Если приложение использует кисть для закраски фона родительского и дочернего окон одним цветом, то оно должно установить начало кисти до закраски фона дочернего окна. Для этого используется функция SetBrushOrgEx. Для получения координат текущего начала кисти используйте функцию GetBrushOrgEx.

Когда кисть вам больше не нужна, удалите ее с помощью функции DeleteObject,

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

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


CreatePatternBrush

Создает логическую кисть на основе заданного растрового изображения. Изображение может быть секцией DIB, созданной функцией CreateDIBSection, или же оно может быть изображением зависящим от устройсва (device-dependent bitmap - DDB).

Прототип

HBRUSH CreatePatternBrush(

_In_ HBITMAP hbmp

);

Параметры

hbmp [in]

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

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

Описатель логической кисти.

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

Значение NULL.

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

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

Примечание

Кисть - это растровое изображение, которое система использует для закраски внутренних областей фигур.

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

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

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

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

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


CreateSolidBrush

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

Прототип

HBRUSH CreateSolidBrush(

_In_ COLORREF crColor

);

Параметры

crColor [in]

Цвет кисти. Для создания значения типа COLORREF используйте макрос RGB.

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

Описатель логической кисти.

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

Значение NULL.

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

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

Примечание

Когда кисть вам больше не нужна удалите ее с помощью функции DeleteObject.

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

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

Для рисования системными цветами приложения дожны использовать GetSysColorBrush(nIndex), а не CreateSolidBrush(GetSysColor(nIdex)), так как функция GetSysColorBrush возвращает кэшированную кисть, а не создает новую.

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

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


GetBrushOrgEx

Возвращает начало (origin) текущей кисти заданного контекста устройства. Данная функция заменяет функцию GetBrushOrg.

Прототип

BOOL GetBrushOrgEx(

_In_ HDC hdc,

_Out_ LPPOINT lppt

);

Параметры

hdc [in]

Описатель контекста устройства.

lppt [out]

Указатель на структуру POINT, в которую будут записаны координаты начала кисти в единицах устройства (in device coordinates).

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

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

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

Значение нуль.

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

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

Примечание

Кисть - это растровое изображение, которое система использует для закраски внутренних частей фигур.

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

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

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

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


GetDCBrushColor

Возвращает текущий цвет кисти для заданного контекста устройства (DC).

Прототип

COLORREF GetDCBrushColor(

_In_ HDC hdc

);

Параметры

hdc [in]

Описатель контекста устройства, для которого возвращается цвет кисти.

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

Текущий цвет кисти в виде значения типа COLORREF.

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

Значение CLR_INVALID (0xFFFFFFFF).

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

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Получаем цвет кисти

COLORREF color;

color = GetDCBrushColor(GetDC(NULL));

if(color == CLR_INVALID){

MessageBox(NULL, "Ошибка", "", MB_OK);

return -1;

}

//Выводм цвет в строку

char s[32];

sprintf(s,"%X", color);

//Выводим строку с цветом кисти

MessageBox(NULL, s, "", MB_OK);

return 0;

}

В данном примере мы получаем текущий цвет кисти и выводим его на эран в виде числа в шестнадцатеричной системе счисления.

Примечание

Для установки цваета кисти используйте функцию SetDCBrushColor.

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

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


GetSysColorBrush

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

Прототип

HBRUSH GetSysColorBrush(

_In_ int nIndex

);

Параметры

nIndex [in]

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

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

Описатель логической кисти.

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

Значение NULL.

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

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

Примечание

Кисть - это растровое изображение, которое система использует при закраске внутрених областей закрашенных фигур. Приложение может получить текущие системные цвета с помощью функции GetSysColor. Приложение может именить текущие системные цвета с помощью функции SetSysColors.

Приложение не должно регистрировать оконный класс для окна, использующего системную кисть. О регистрации оконного класса с системным цветом смотрите описание поля hbrBackground структур WNDCLASS и WNDCLASSEX.

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

Для рисования системными цветами приложения дожны использовать GetSysColorBrush(nIndex), а не CreateSolidBrush(GetSysColor(nIdex)), так как функция GetSysColorBrush возвращает кэшированную кисть, а не создает новую.

Кисти системных цветов принадлежат системе, поэтому вы не должны уничтожать их. Хотя вы недолжны удалять кисти возвращенные функцией GetSysColorBrush, вызов функции DeleteObject не вызовет ошибку.

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


SetBrushOrgEx

Устанавливает начало кисти, которое система GDI ассоциирует со следующей кистью, которая будет выбрана в контексте устроства.

Прототип

BOOL SetBrushOrgEx(

_In_ HDC hdc,

_In_ int nXOrg,

_In_ int nYOrg,

_Out_ LPPOINT lppt

);

Параметры

hdc [in]

Описатель контекста устройства.

nXOrg [in]

Горизонтальная координата нового начала кисти в единицах устройства. Если значение этого параметра больше ширины кисти, то оно уменьшается по формуле: nXOrg mod ширина кисти.

nYOrg [in]

Вертикальная координата нового начала кисти в единицах устройства. Если значение этого параметра больше высоты кисти, то оно уменьшается по формуле: nYOrg mod высота кисти.

lppt [out]

Указатель на структуру POINT, в которую будет записаны координаты предыдущего начала кисти.

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

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

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

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

Значение нуль.

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

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

Примечание

Кисть - это растровое изображение, которое система использует для закраски внутренних областей фигур.

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

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

Приложение должно вызывать функцию SetBrushOrgEx после установки функцией SetStretchBltMode режима растяжения HALFTONE. Это нужно для обеспечения выравнивания кисти.

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


SetDCBrushColor

Устанавливает новый текущий цвет кисти пера контекста устройства (DC). Если устройство не может отобразить заданный цвет, то усианавливается ближайший к нему физический цвет.

Прототип

COLORREF SetDCBrushColor(

_In_ HDC hdc,

_In_ COLORREF crColor

);

Параметры

hdc [in]

Описатель контекста устройства (DC).

crColor [in]

Новый цвет кисти.

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

Предыдущий цвет кисти в виде значеия типа COLORREF.

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

Значение CLR_INVALID (0xFFFFFFFF).

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

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Меняем цвет кисти

COLORREF prevcolor;

prevcolor = SetDCBrushColor(GetDC(NULL), RGB(0, 0xFF, 0));

//Выводим результат

if(prevcolor == CLR_INVALID)

MessageBox(NULL, "Ошибка", "", MB_OK);

else

MessageBox(NULL, "Успех", "", MB_OK);

return 0;

}

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

Примечание

Если в контексте устройства (DC) выбрана кисть DC_BRUSH, то все последующие операции рисования будут выполняться цвета кисти контекста устройства, до тех пор, пока не будет выбрана другая кисть. По умолчанию кисть DC_BRUSH имеет белый цвет.

Функция возвращает предыдущий цвет кисти DC_BRUSH, даже если она не выбрана в контексте устройства (DC): однако, ее цвет не будет использоваться в операциях рисования до тех пор, пока кисть DC_BRUSH не будет выбрана в контексте устройства.

Функция GetStockObject с параметрами DC_BRUSH и DC_PEN может использоваться совместно с функциями SetDCPenColor и SetDCBrushColor.

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

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


GetAsyncKeyState

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

Прототип

SHORT WINAPI GetAsyncKeyState(

_In_ int vKey

);

Параметры

vKey [in]

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

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

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

Возвращаемое значение определяет нажималась ли клавиша с момента последнего вызова функции GetAsyncKeyState, и в каком состоянии она сейчас находится: нажата или нет. Если старший бит установлен, клавиша нажата. Если младший бит установлен, клавиша нажималась с момента последнего вызова функции GetAsyncState. Однако, вы не должны полагаться на такое поведение.

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

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

· Текущий рабочий стол не является активным.
· Приоритетный (foreground) поток принадлежит другому процессу и рабочий стол (desktop) не позволяет перехватывать (hook) или писать в журнал (journal record).

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

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

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

if(GetAsyncKeyState(VK_NUMLOCK) & 0x0001)

MessageBox(NULL, "Клавиша Numlock нажималась", "", 0);

else

MessageBox(NULL, "Клавиша Numlock не нажималась", "", 0);

return 0;

}

В данном примере проверяется: нажималась ли клавиша NUMLOCK с момента последнего вызова функции GetAsyncKeyState.

Примечание

Функция GetAsyncKeyState работает с кнопками мыши. Однако, она проверяет состояния физических кнопок мыши, а не логических, на которые обычно отображаются физические кнопки. Например, вызов GetAsyncState(VK_LBUTTON) всегла возвращает состояние левой физической кнопки мыши, вне зависимостии от того, как она отображается. Вы можете определить текущее отображение логичских кнопок мыши с помощью вызова GetSystemMetrics(SM_SWAPBUTTON). Если кнопки поменяны местами, то он вернет значение TRUE.

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

Вы можете использовать константы VK_SHIFT, VK_CONTROL и VK_MENU в качестве значений параметра vKey. Они позволяют определить состояния клавиш SHIFT, CTRL и ALT без различения на правые и левые клавиши.

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

VK_LSHIFT - левая клавиша SHIFT.

VK_RSHIFT - правая клавиша SHIFT.

VK_LCONTROL - левая клавиша CTRL.

VK_RCONTROL - правая клавиша CTRL.

VK_LMENU - левая клавиша ALT.

VK_RMENU - правая клавиша ALT.

Эти константы доступны приложениям только для функций GetKeyboardState, SetKeyboardState, GetAsyncKeyState, GetKeyState и MapVirtualKey.

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


GetKeyboardLayout

Возвращает идентификатор активной локали ввода (ранее называемый раскладкой клавиатуры).

Прототип

HKL WINAPI GetKeyboardLayout(

_In_ DWORD idThread

);

Параметры

idThread[in]

Идентификатор потока, или нуль для текущего потока.

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

Идентификатор локали ввода для указанного потока. Младшее слово содержит идентификатор языка для языка ввода, старшее слово содержит дескриптор устройства физической раскладки клавиатуры (physical layout of the keyboard).

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

#include <windows.h>

int main()

{

HKL KeyboardLayout;

KeyboardLayout = GetKeyboardLayout(0);

printf("%x\n",KeyboardLayout);

getchar();

return 0;

}

Примечание

Идентификатор локали ввода является более широким понятием чем раскладка клавиатуры, так как он может включать в себя преобразователь речи в текст, редактор метода ввода (IME), или какую-либо другую форму ввода.

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

Для получения идентификатора раскладки клавиатуры (keyboard layout ID, KLID) активного HKL используйте функцию GetKeyboardLayoutName.

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


GetKeyboardLayoutName

Возвращает наименование идентификатора активной локали ввода (ранее назваемый раcкладкой клавиатуры) системы.

Прототип

BOOL WINAPI GetKeyboardLayoutName(

_Out_ LPTSTR pwszKLID

);

Параметры

pwszKLID[out]

Адрес буфера (максимальной длины KL_NAMELENGTH символов), в который будет записано наименование идентификатора локали ввода, включая завершающий NULL символ. Эта строка впоследствии может быть передана в функцию LoadKeyboardLayout.

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

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

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

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

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

#include <windows.h>

int main()

{

char KLID[KL_NAMELENGTH];

GetKeyboardLayoutName(KLID);

printf("%s\n",KLID);

getchar();

return 0;

}

Примечание

Идентификатор локали ввода является более широким понятием чем раскладка клавиатуры, так как он может включать в себя преобразователь речи в текст, редактор метода ввода (IME), или какую-либо другую форму ввода.

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


GetKeyboardState

Копирует в заданный буфер состояние 256 виртуальных клавиш.

Прототип

BOOL WINAPI GetKeyboardState(

_Out_ PBYTE lpKeyState

);

Параметры

lpKeyState [out]

Массив из 256 байт, в который будет записана информация о состоянии всех виртуальных клавиш.

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

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

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

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

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

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

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

BYTE States[256];

GetKeyboardState(States);

if(States[VK_NUMLOCK] & 0x01)

MessageBox(NULL, "Режим Numlock включен", "", 0);

else

MessageBox(NULL, "Режим Numlock выключен", "", 0);

return 0;

}

В данном примере мы проверяем включен ли режим NUM LOCK.

Примечание

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

Когда функция вернет управление, каждый элемент массива lpKeyState содержит состояние виртуальной клавиши. Если старший бит равен 1, то коавиша нажата, в противном случае она отжата. Если клавиша является режимной, например, CAPS LOCK, то младший бит равен 1, когда включен соответствующий режим, и равен 0, когда он выключен. Для нережимных клавиш младший бит не имеет никакого смысла. Когда включен какой-либо режим, то на клавиатуре подсвечивается соответствующий индикатор. Когда режим выключен, то индикатор не горит.

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

Приложение может использовать константы VK_SHIFT, VK_CONTROL и VK_MENU в качестве индексов массива lpKeyState. Они позволяют определить состояния клавиш SHIFT, CTRL и ALT без различения на правые и левые клавиши. Приложение также может использовать константы, приведеные ниже, для указания правой и левой клавиши.

VK_LSHIFT

VK_RSHIFT

VK_LCONTROL

VK_RCONTROL

VK_LMENU

VK_RMENU

Эти константы доступны приложениям только для функций GetKeyboardState, SetKeyboardState, GetAsyncKeyState, GetKeyState и MapVirtualKey.

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


GetKeyState

Возвращает состояние заданной виртуальной клавиши. Существует три состояния: не нажата, нажата и включен соответствующий режим (toggled) (состояния нажата и не нажата меняются каждый раз при нажатии на клавишу).

Прототип

SHORT WINAPI GetKeyState(

_In_ int nVirtKey

);

Параметры

nVirtKey [in]

Виртуальная клавиша. Если клавиша обозначает букву или цифру (от A до Z, от a до z, от 0 до 9), параметр nVirtKey должен содержать ASCII код соответствующего символа. Для других клавиш он должен содержать код виртуальной клавиши.

Если используется не английская раскладка клавиатуры ASCII коды в интервалах от A до Z и от 0 до 9 используются для описания большинства символьных клавиш. Например, в немецкой раскладке клавиатуры, виртуальная клавиша O (0x4F ASCII) описывает клавишу "o", в то время как VK_OEM_1 описывает клавишу "o с умлаутом".

Виртуальные клавиши перечислены здесь.

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

Состояние заданной виртуальной клавиши так, как показано ниже.

· Если старший бит равен 1, клавиша нажата, в противном случае она отжата.
· Если младший бит равен 1, то включен режим, соответствующий этой клавише. Например, включен режим CAPS LOCK. Если режим клавиши выключен, младший бит раве 0. Режимы клавиш обычно подсвечиваются на клавиатуре, когда они включены.

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

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

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

if(GetKeyState(VK_NUMLOCK) & 0x8000)

MessageBox(NULL, "Клавиша Numlock нажата", "", 0);

else

MessageBox(NULL, "Клавиша Numlock не нажата", "", 0);

return 0;

}

В данном примере проверяется нажата ли клавиша NumLock. В примере ниже проверяется включен ли режим NumLock.

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

if(GetKeyState(VK_NUMLOCK) & 0x0001)

MessageBox(NULL, "Режим Numlock включен", "", 0);

else

MessageBox(NULL, "Режим Numlock выключен", "", 0);

return 0;

}

Примечание

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

Приложение вызывает функцию GetKeyState в ответ на сообщение клавиатурного ввода. Эта функция возвращает состояние клавиши в момент генерации сообщения ввода.

Для получения информации о состоянии всех виртуальных клавиш используйте функцию GetKeyboardState.

Приложение может использовать константы VK_SHIFT, VK_CONTROL и VK_MENU в качестве значений параметра nVirtKey. Они позволяют определить состояния клавиш SHIFT, CTRL и ALT без различения на правые и левые клавиши. Приложение также может использовать константы, приведеные ниже, для указания правой и левой клавиши.

VK_LSHIFT

VK_RSHIFT

VK_LCONTROL

VK_RCONTROL

VK_LMENU

VK_RMENU

Эти константы доступны приложениям только для функций GetKeyboardState, SetKeyboardState, GetAsyncKeyState, GetKeyState и MapVirtualKey.

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


MapVirtualKey

Транслирует (отображает) код виртуальной клавиши в скан код (scan code) или символ, или же транслирует скан код в код виртуальной клавиши.

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

Прототип

UINT WINAPI MapVirtualKey(

_In_ UINT uCode,

_In_ UINT uMapType

);

Параметры

uCode [in]

Код виртуальной клавиши или скан код клавиши. нтерпретация этого параметра зависит от значения параметра uMapType. Значения виртуальных кодов приведены здесь.

uMapType [in]

Выполняемая трансляция. Допустимые значения этого параметра перечислены ниже.

MAPVK_VK_TO_CHAR (2) - параметр uCode содержит код виртуальной клавиши, и он транслируется в символ. Код символа записывается в младшее слово возвращаемого значения. Слепые клавиши (диакритические знаки) обозначаются установкой старшего бита возвращаемого значения. Если клавиша не перекодирована, функция вернет значение ноль.

MAPVK_VK_TO_VSC (0) - параметр uCode содержит код виртуальной клавиши, и он транслируется в скан код (scan code). Если в коде виртуальной клавиши не указано правая это клавиша или левая, то функция вернет скан код левой клавиши. Если клавиша не перекодирована, то функция вернет значение ноль.

MAPVK_VSC_TO_VK (1) - параметр uCode содержит скан код, и он транслируется в код виртуальной клавиши, в котором нет различения на правую и левую клавиши. Если клавиша не перекодирована, то функция вернет значение ноль.

MAPVK_VSC_TO_VK_EX (3) - параметр uCode содержит скан код, и он транслируется в код виртуальной клавиши, в котором есть различение на правую и левую клавиши. Если клавиша не перекодирована, то функция вернет значение ноль.

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

Скан код, код виртуальной клавиши или символ в зависимости от значений параметров uCode и uMapType.

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

Если клавиша не перекодирована, то функция вернет значение ноль.

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

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

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Отображаем символ

UINT ch = 0;

ch = MapVirtualKey(0x41, MAPVK_VK_TO_CHAR);

//Выводим символ на экран

char s[10];

snprintf(s, 10, "%c\0", LOBYTE(LOWORD(ch)));

MessageBox(NULL, s, "", MB_OK);

return 0;

}

В результате работы этой программы на экран будет выведен символ, соответствующий коду виртуальной клавиши 0x41 (символ 'A').

Примечание

Приложение может использовать функцию MapVirtualKey для транслирования скан кодов в виртуальные клавиши VK_SHIFT, VK_CONTROL и VK_MENU и наоборот. Эти константы не различают правые и левые клавиши SHIFT, CTRL и ALT

Приложение может получить скан код, соответствующий правой или левой клавише, вывзва функцию MapVirtualKey с параметром uCode равным одной из констант, перечисленных ниже.

VK_LSHIFT

VK_RSHIFT

VK_LCONTROL

VK_RCONTROL

VK_LMENU

VK_RMENU

Эти константы доступны приложениям только для функций GetKeyboardState, SetKeyboardState, GetAsyncKeyState, GetKeyState и MapVirtualKey.

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


SendInput

Синтезирует клавиатурный ввод (keystrokes), перемещение мыши и нажатие кнопок.

Прототип

UINT WINAPI SendInput(

_In_ UINT nInputs,

_In_ LPINPUT pInputs,

_In_ int cbSize

);

Параметры

nInputs [in]

Количество структур в массиве pInputs.

pInputs [in]

Массив структур INPUT. Каждая структура описывает событие, добавляемое в поток ввода клавиатуры или мыши.

cbSize [in]

Размер структуры INPUT в байтах. Если значение этого параметра не совпадает с размером структуры INPUT, функция завершается ошибкой.

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

Количество событий добавленных в поток ввода клавиатуры или мыши.

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

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

Также функция могла быть заблокиррована UIPI (User Interface Privilege Isolation). В этом случае ни возвращаемое функцией значение, ни функция GetLastError не сообщат вам о том, что ввод был заблокирован системой UIPI.

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

В примере ниже переключается режим NUMLOCK. Для его переключения необходимо нажать и отпустить клавишу NUMLOCK. Поэтому мы формируем два события ввода.

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

INPUT input[2];

//Нажатие на клавишу NUMLOCK

input[0].type = INPUT_KEYBOARD;

input[0].ki.wVk = VK_NUMLOCK;

input[0].ki.wScan = 0;

input[0].ki.dwFlags = 0;

input[0].ki.time = 0;

input[0].ki.dwExtraInfo = 0;

//Отпускание клавиши NUMLOCK

input[1] = input[0];

input[1].ki.dwFlags = KEYEVENTF_KEYUP;

//Отправляем эти события

SendInput(2, input, sizeof(INPUT));

return 0;

}

Примечание

Функция SendInput подчиняется механизму UIPI. Приложениям разрешается направлять ввод только в приложения, имеющие такой же или более низкий уровень надежности (integrity level).

Функция поседовательно вставляет события INPUT в поток ввода клавиатуры или мыши. Эти события не перемешиваются с другими событиями клавиатуры или мыши сгенерированными пользователем, вызовами функции keybd_event, mouse_event, или другим вызовом функции SendInput.

Функция не сбрасывает текущее состояние клавиатуры. Клавиши,находящиеся в нажатом состоянии могут влиять на события, генерируемые данной функцией. Для решения этой проблемы, проверяйте состояние клавиатуры с помощью функции GetAsyncKeyState и, если необходимо, корректируйте его.

Так как сенсорные клавиатуры для отправки ввода системе используют макросы, описанные в заголовочном файле winnls.h, приемник (listener) этих событий должен самостоятельно декодировать ввод, получаемый от сенсорной клавиатуры.

Приложения могут использовать функцию SendInput для реализации ввода, соответствующего горячим клавишам запуска приложений в оболочке (shell). Однако такая функциональность не гарантируется для приложений других типов.

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


SetKeyboardState

Копирует массив состояний клавиш клавиатуры в таблицу состояния ввода вызывающего потока. Это та же самая таблица, к которой обращаются функции GetKeyboardState и GetKeyState. Изменения в этой таблице никак не влияют на клавиатурный ввод в другие потоки.

Прототип

BOOL WINAPI SetKeyboardState(

_In_ LPBYTE lpKeyState

);

Параметры

lpKeyState [in]

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

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

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

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

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

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

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

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

BYTE States[256];

GetKeyboardState(States);

if(SetKeyboardState(States))

MessageBox(NULL, "Состояния установлены", "", 0);

else

MessageBox(NULL, "Ошибка", "", 0);

return 0;

}

Примечание

Поскольку функция SetKeyboardState изменяет состояние ввода вызывающего потока и не изменяет глобальное состояние ввода системы, приложение не может использовать ее для установки клавиш NUM LOCK, CAPS LOCK или SCROLL LOCK (или японской KANA) и изменения соответствующих индикаторов на клавиатуре. Они могут быть установлены функцией SendInput, имитирующей клавиатурный ввод.

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


Активируемое окно IME (ISC_*)

ISC_SHOWUICANDIDATEWINDOW

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

ISC_SHOWUICANDIDATEWINDOW<<1

Отображается кандидатное окно с индексом 1.

ISC_SHOWUICANDIDATEWINDOW<<2

Отображается кандидатное окно с индексом 2.

ISC_SHOWUICANDIDATEWINDOW<<3

Отображается кандидатное окно с индексом 3.

ISC_SHOWUICOMPOSITIONWINDOW

Отображается окно композиции.

ISC_SHOWUIGUIDWINDOW

Отображается направляющее окно.

ISC_SHOWUISOFTKBD

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

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


Виртуальные клавиши (VK_*)

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_*)

MK_CONTROL

Нажата клавиша Ctrl.

MK_LBUTTON

Нажата левая кнопка мыши.

MK_MBUTTON

Нажата средняя кнопка мыши.

MK_RBUTTON

Нажата правая кнопка мыши.

MK_SHIFT

Нажата клавиша Shift.

MK_XBUTTON1

Нажата первая дополнительная кнопка мыши.

MK_XBUTTON2

Нажата вторая дополнительная кнопка мыши.

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


Возможности отображения текста (TC_*)

TC_CP_STROKE

Устройство имеет возможность точной обрезки штрихов (stroke clip precision).

TC_CR_90

Устройство может поворачивать символы на 90 градусов.

TC_CR_ANY

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

TC_EA_DOUBLE

Устройство может рисовать символы двойной толщины.

TC_IA_ABLE

Устройство может выделять курсивом.

TC_OP_CHARACTER

Устройство имеет возможность точного вывода символов (character output precision).

TC_OP_STROKE

Устройство имеет возможность точного вывода штрихов (stroke output precision).

TC_RA_ABLE

Устройство может выводить растровые шрифты.

TC_RESERVED

Зарезервировано. Должно быть равно нулю.

TC_SA_CONTIN

Устройство использует несколько множителей при масштабировании символов.

TC_SA_DOUBLE

Устройство может масштабировать двойные символы (double character for scaling).

TC_SA_INTEGER

Устройство использует целочисленные множители только при масштабировании символов.

TC_SCROLLBLT

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

TC_SF_X_YINDEP

Устройство может масштабировать независимо в горизонтальном и вертикальном направлениях.

TC_SO_ABLE

Устройство может зачеркивать (strikeouts).

TC_UA_ABLE

Устройство может подчеркнуть (underline).

TC_VA_ABLE

Устройство может выводить векторные шрифты.

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


Возможности рисования кривых (CC_*)

CC_CHORD

Устройство может рисовать дуги хорды (chord arcs).

CC_CIRCLES

Устройство может рисовать окружности.

CC_ELLIPSES

Устройство может рисовать эллипсы.

CC_INTERIORS

Устройство может заполнять внутреннее пространство.

CC_NONE

Устройство не поддерживает кривые.

CC_PIE

Устройство может рисовать векторные диаграммы (pie wedges).

CC_ROUNDRECT

Устройство может рисовать скругленные прямоугольники.

CC_STYLED

Устройство может рисовать стилизованные (styled) границы (borders).

CC_WIDE

Устройство может рисовать широкие границы.

CC_WIDESTYLED

Устройство может рисовать границы, являющиеся и стилизованными и широкими.

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


Возможности рисования линий (LC_*)

LC_INTERIORS

Устройство может заполнять внутреннее пространство.

LC_MARKER

Утройство может рисовать маркер (marker).

LC_NONE

Устройство не поддерживает линии.

LC_POLYLINE

Устройство может рисовать ломаную линию.

LC_POLYMARKER

Устройство может рисовать несколько маркеров (multiple markers).

LC_STYLED

Устройство может рисовать стилизованые линии.

LC_WIDE

Устройство может рисовать широкие (wide) линии.

LC_WIDESTYLED

Устройство может рисовать линии, являющиеся и широкими и стилизоваными.

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


Возможности рисования многоугольников (PC_*)

PC_INTERIORS

Устройство может заполнять внутреннее пространство (draw interiors).

PC_NONE

Устройство не поддерживает многоугольники (polygons).

PC_POLYGON

Устройство может рисовать многоугольники с переменной заливкой (alternate-fill polygons).

PC_RECTANGLE

Устройство может рисовать прямоугольники.

PC_SCANLINE

Устройство может рисовать отдельную строку пикселей (scanline).

PC_STYLED

Устройство может рисовать стилизованые границы.

PC_WIDE

Устройство может рисовать широкие границы.

PC_WIDESTYLED

Устройство может рисовать границы, являющиеся и широкими и стилизоваными.

PC_WINDPOLYGON

Устройство может рисовать многоугольники спирального заполнения (winding-fill polygons).

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


Возможности смешивания (SB_*)

SB_CONST_ALPHA

Обрабатывает поле SourceConstantAlpha структуры BLENDFUNCTION, указатель на которую передается в функцию AlphaBlend.

SB_GRAD_RECT

Допускает выполнение GradientFill в режиме прямоугольников.

SB_GRAD_TRI

Допускает выполнение GradientFill в режиме треугольников.

SB_NONE

Устройство не поддерживает данные возможности.

SB_PIXEL_ALPHA

Допускает попиксельную обработку значений альфа канала в функции AlphaBlend.

SB_PREMULT_ALPHA

Допускает обработку предварительно умноженных (premultiplied) значений альфа канала в функции AlphaBlend.

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


Возможности управления цветом (CM_*)

CM_CMYK_COLOR

Устройство может принять профиль цвета ICC цветового пространства CMYK.

CM_DEVICE_ICM

Устройство может осуществлять подгонку цветов (Image Color Matching - ICM). Подгонку выполняет либо драйвер устройства либо само устройство.

CM_GAMMA_RAMP

Устройство поддерживает функции GetDeviceGammaRamp и SetDeviceGammaRamp.

CM_NONE

Устройство не поддерживает подгонку цветов (ICM).

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


Временные задержки приложений и служб (SPI_*)

SPI_GETHUNGAPPTIMEOUT

Возвращает количество миллисекунд, в течение которых поток может исполняться без диспетчеризации перед тем, как система решит, что он стал неотзывчивым (unresponsive). Параметр pvParam должен указывать на переменную целого типа (integer), в которую будет записана запрошенная величина.

Windows Server 2008, Windows Vista, Windows Server 2003 и Windows XP/2000: данный параметр не поддерживается.

SPI_GETWAITTOKILLTIMEOUT

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

Windows Server 2008, Windows Vista, Windows Server 2003 и Windows XP/2000: данный параметр не поддерживается.

SPI_GETWAITTOKILLSERVICETIMEOUT

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

Windows Server 2008, Windows Vista, Windows Server 2003 и Windows XP/2000: данный параметр не поддерживается.

SPI_SETHUNGAPPTIMEOUT

Устанавливает новое значение интервала зависания приложения (hung application time-out), переданное в качестве параметра uiParam. Данное значение представляет собой количество миллисекунд, в течение которых поток может исполняться без диспетчеризации перед тем, как система решит, что он стал неотзывчивым (unresponsive).

Windows Server 2008, Windows Vista, Windows Server 2003 и Windows XP/2000: данный параметр не поддерживается.

SPI_SETWAITTOKILLTIMEOUT

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

Windows Server 2008, Windows Vista, Windows Server 2003 и Windows XP/2000: данный параметр не поддерживается.

SPI_SETWAITTOKILLSERVICETIMEOUT

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

Windows Server 2008, Windows Vista, Windows Server 2003 и Windows XP/2000: данный параметр не поддерживается.

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


Выравнивание текста (TA_*)

TA_BASELINE

24

Базовая точка (reference point) располагается на базовой линии текста.

TA_BOTTOM

8

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

TA_CENTER

6

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

TA_LEFT

0

Базовая точка располагается на левой границе ограничивающего прямоугольника.

TA_NOUPDATECP

0

Текущая позиция не обновляется после каждого вызова функции вывода текста. Базовая точка передается в функцию вывода текста.

TA_RIGHT

2

Базовая точка располагается на правой границе ограничивающего прямоугольника.

TA_RTLREADING

256

Для средне-азиатской редакции Windows: текст приводится к режиму чтения справа налево. Обычно режим чтения слева направо. Этот флаг применяется только если в контексте устройства выбран еврейский или арабский шрифт.

TA_TOP

0

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

TA_UPDATECP

1

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

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


Границы окна (WMSZ_*)

WMSZ_BOTTOM

Нижняя граница окна.

WMSZ_BOTTOMLEFT

Левый нижний угол окна.

WMSZ_BOTTOMRIGHT

Правый нижний угол окна.

WMSZ_LEFT

Левая граница окна.

WMSZ_RIGHT

Правая граница окна.

WMSZ_TOP

Верхняя граница окна.

WMSZ_TOPLEFT

Левый верхний угол окна.

WMSZ_TOPRIGHT

Правый верхний угол окна.

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


Дополнительные флаги MessageBox (MB_*)

MB_DEFAULT_DESKTOP_ONLY

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

Если текущий рабочий стол не является рабочим столом по умолчанию, то функция MessageBox не вернет управление, пока пользователь остаётся в рабочем столе по умолчанию.

MB_RIGHT

Выравнивание текста по правому краю.

MB_RTLREADING

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

MB_SERVICE_NOTIFICATION

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

MB_SETFOREGROUND

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

MB_TOPMOST

Окно сообщения создается со стилем WS_EX_TOPMOST.

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


Запрос пользователя на прокрутку (SB_*)

По горизонтали

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)


Значения составных строк (GCS_*)

GCS_COMPATTR

Возвращает или изменяет атрибут составной строки

GCS_COMPCLAUSE

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

GCS_COMPREADATTR

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

GCS_COMPREADCLAUSE

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

GCS_COMPREADSTR

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

GCS_COMPSTR

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

GCS_CURSORPOS

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

GCS_DELTASTART

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

GCS_RESULTCLAUSE

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

GCS_RESULTREADCLAUSE

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

GCS_RESULTREADSTR

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

GCS_RESULTSTR

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

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


Идентификаторы нажатой кнопки (ID*)

IDABORT

Прервать.

IDCANCEL

Отмена.

IDCONTINUE

Продолжить.

IDIGNORE

Пропустить.

IDNO

Нет.

IDOK

ОК.

IDRETRY

Повторить.

IDTRYAGAIN

"Повторить" при флаге MB_CANCELTRYCONTINUE.

IDYES

Да.

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


Изображения пунктов меню (HBMMENU_)

HBMMENU_CALLBACK

((HBITMAP) -1)

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

HBMMENU_MBAR_CLOSE

((HBITMAP) 5)

Кнопка закрытия для полоски меню (menu bar).

HBMMENU_MBAR_CLOSE_D

((HBITMAP) 6)

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

HBMMENU_MBAR_MINIMIZE

((HBITMAP) 3)

Кнопка "свернуть" для полоски меню.

HBMMENU_MBAR_MINIMIZE_D

((HBITMAP) 7)

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

HBMMENU_MBAR_RESTORE

((HBITMAP) 2)

Кнопка "восстановить" для полоски меню.

HBMMENU_POPUP_CLOSE

((HBITMAP) 8)

Кнопка "закрыть" для подменю.

HBMMENU_POPUP_MAXIMIZE

((HBITMAP) 10)

Кнопка "развернуть" для подменю.

HBMMENU_POPUP_MINIMIZE

((HBITMAP) 11)

Кнопка "свернуть" для подменю.

HBMMENU_POPUP_RESTORE

((HBITMAP) 9)

Кнопка "восстановить" для подменю.

HBMMENU_SYSTEM

((HBITMAP) 1)

Системная иконка или иконка окна, заданного в поле dwItemData.

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


Иконки

IDI_APPLICATION

MAKEINTRESOURCE(32512)

Иконка приложения по умолчанию.

IDI_ASTERISK

MAKEINTRESOURCE(32516)

Иконка в виде буквы i. Тоже самое что IDI_INFORMATION.

IDI_ERROR

MAKEINTRESOURCE(32513)

Иконка в виде красного круга с белым крестом.

IDI_EXCLAMATION

MAKEINTRESOURCE(32515)

Иконка в виде предупреждающего знака. Тоже самое что IDI_WARNING.

IDI_HAND

MAKEINTRESOURCE(32513)

Тоже самое что IDI_ERROR.

IDI_INFORMATION

MAKEINTRESOURCE(32516)

Тоже самое что IDI_ASTERISK.

IDI_QUESTION

MAKEINTRESOURCE(32514)

Иконка в виде знака вопроса.

IDI_SHIELD

MAKEINTRESOURCE(32518)

Появилась в Windows Vista. Иконка в виде щита.

IDI_WARNING

MAKEINTRESOURCE(32515)

Тоже самое что IDI_EXCLAMATION

IDI_WINLOGO

MAKEINTRESOURCE(32517)

Иконка приложения по умолчанию.

Windows 2000: иконка с логотипом Windows.

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


Иконки MessageBox (MB_ICON*)

MB_ICONASTERISK

то же самое что и MB_ICONINFORMATION

MB_ICONERROR

То же самое что и MB_ICONSTOP

MB_ICONEXCLAMATION

MB_ICONHAND

То же самое что и MB_ICONSTOP

MB_ICONINFORMATION

MB_ICONQUESTION

MB_ICONSTOP

MB_ICONWARNING

то же самое что и MB_ICONEXCLAMATION

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


Качество отображения шрифта (*_QUALITY)

ANTIALIASED_QUALITY

Шрифт всегда сглаживается, если он поддерживает сглаживание и размер шрифта не слишком мал и не слишком велик.

CLEARTYPE_QUALITY

Если это возможно, текст отображается с использованием метода сглаживания ClearType.

DEFAULT_QUALITY

Внешний вид шрифта не имеет значения.

DRAFT_QUALITY

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

NONANTIALIASED_QUALITY

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

PROOF_QUALITY

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

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


Качество отсечения шрифта (CLIP_*)

CLIP_CHARACTER_PRECIS

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

CLIP_DEFAULT_PRECIS

Определяет отсечение по умолчанию.

CLIP_DFA_DISABLED

В Windows XP SP1: выключает ассоциирование шрифтов для текущего шрифта. Данный флаг не гарантирует наличие какого-либо эффекта на платформах старше Windows Server 2003.

CLIP_DFA_OVERRIDE

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

CLIP_EMBEDDED

Вы должны использовать этот флаг для использования встроенного шрифта только для чтения.

CLIP_LH_ANGLES

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

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

CLIP_MASK

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

CLIP_STROKE_PRECIS

Не используется, но возвращается при перечислении растровых, векторных шрифтов или шрифтов формата TrueType.

В целях совместимости данное значение всегда возвращается при перечислении шрифтов.

CLIP_TT_ALWAYS

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

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


Кодовые страницы (CP_*)

CP_ACP

Системная кодировка ANSI по умолчанию.

Данное значение может различаться на разных компьютерах, даже принадлежащих одной сети. Оно может быть изменено на компьютере, приводя тем самым к повреждению хранимых данных. Данное значение предназначено для временного использования, для постоянного хранения должна использоваться кодировка UTF-16 или UTF-8.

CP_MACCP

Текущая системная кодировка компьютера Macintosh.

Данное значение может различаться на разных компьютерах, даже принадлежащих одной сети. Оно может быть изменено на компьютере, приводя тем самым к повреждению хранимых данных. Данное значение предназначено для временного использования, для постоянного хранения должна использоваться кодировка UTF-16 или UTF-8.

Данное значение используется в устаревшем коде. Современные компьютеры Macintosh используют Unicode.

CP_OEMCP

Текущая системная кодировка OEM.

Данное значение может различаться на разных компьютерах, даже принадлежащих одной сети. Оно может быть изменено на компьютере, приводя тем самым к повреждению хранимых данных. Данное значение предназначено для временного использования, для постоянного хранения должна использоваться кодировка UTF-16 или UTF-8.

CP_SYMBOL

Символьная кодовая страница (42).

CP_THREAD_ACP

Кодовая страница ANSI текущего потока.

Данное значение может различаться на разных компьютерах, даже принадлежащих одной сети. Оно может быть изменено на компьютере, приводя тем самым к повреждению хранимых данных. Данное значение предназначено для временного использования, для постоянного хранения должна использоваться кодировка UTF-16 или UTF-8.

CP_UTF7

UTF-7. Используйте это значение только при использовании 7-разрядной передачи (7-bit transport mechanism). Предпочительно использовать UTF-8.

CP_UTF8

UTF-8.

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


Команды IME (IMC_*)

IMC_CLOSESTATUSWINDOW

Указывает системе IME скрыть окно состояния.

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

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

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

IMC_GETCANDIDATEPOS

Указывает системе IME вернуть положение кандидатного окна.

lparam содержит указатель на структуру CANDIDATEFORM, которая описывает положение кандидатного окна.

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

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

IMC_GETCOMPOSITIONFONT

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

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

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

IMC_GETCOMPOSITIONWINDOW

Указывает окну IME получить положение композитного окна.

lparam содержит указатель на структуру COMPOSITIONFORM, которая содержит положение композитного окна.

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

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

IMC_GETSTATUSWINDOWPOS

Указывает окну IME получить положение окна состояния.

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

Возвращается структура POINTS, которая содержит координаты окна состояния в экранной системе координат.

IMC_OPENSTATUSWINDOW

Указывает окну IME показать окно состояния.

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

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

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

Если окно состояния уже отобраджается на экране, то данная команда не имеет никакого действия. Хотя приложение может отправить эту команду окну IME, приложение не получит уведомления IMN_OPENSTATUSWINDOW.

IMC_SETCANDIDATEPOS

Указывает окну IME установить заданное положение кандидатного окна.

lparam содержит указатель на структуру CANDIDATEFORM, которая содержит координаты кандидатного окна. Приложение должно заполнить поле dwIndex этой структуры.

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

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

IMC_SETCOMPOSITIONFONT

Указывает окну IME определить логический шрифт используемый для отображения промежуточных символов в композитном окне.

lparam содержит указатель на структуру LOGFONT, которая содержит информацию о логическом шрифте.

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

При обработке этой команды окно IME изменяет текущий шрифт в контексте ввода.

IMC_SETCOMPOSITIONWINDOW

Указывает окну IME установить стиль композитного окна.

lparam содержит указатель на структуру COMPOSITIONFORM, которая информацию о стиле.

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

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

По умолчанию окно IME имеет стиль CFS_POINT (см. описание структуры COMPOSITIONFORM). При нём IME окно использует текущее положение курсора и клиентскую область окна при открытии какого-либо композитного окна.

IMC_SETSTATUSWINDOWPOS

Указывает окну IME установить новое положение окна состояния.

lparam содержит указатель на структуру POINTS, которая содержит экранные координаты положения окна состояния.

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

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


Команды WM_APPCOMMAND (APPCOMMAND_*)

APPCOMMAND_BASS_BOOST (20)

Включить или выключить усиление басов.

APPCOMMAND_BASS_DOWN (19)

Уменьшить басы.

APPCOMMAND_BASS_UP (21)

Увеличить басы.

APPCOMMAND_BROWSER_BACKWARD (1)

Вернуться назад в браузере.

APPCOMMAND_BROWSER_FAVORITES (6)

Открыть "избранное" в браузере.

APPCOMMAND_BROWSER_FORWARD (2)

Перейти "вперёд" в браузере.

APPCOMMAND_BROWSER_HOME (7)

Перейти на домашнюю страницу в бразуере.

APPCOMMAND_BROWSER_REFRESH (3)

Обновить страницу в браузере.

APPCOMMAND_BROWSER_SEARCH (5)

Открыть поиск (open search) в браузере.

APPCOMMAND_BROWSER_STOP (4)

Остановить загрузку в браузере.

APPCOMMAND_CLOSE (31)

Закрыть окно (не приложение).

APPCOMMAND_COPY (36)

Скопировать выделенное.

APPCOMMAND_CORRECTION_LIST (45)

Отобразить список исправлений (correction list) при неправильном распознавании слова во время речевого ввода (speech iput).

APPCOMMAND_CUT (37)

Вырезать выделенное.

APPCOMMAND_DICTATE_OR_COMMAND_CONTROL_TOGGLE (43)

Переводит систему из одного режима речевого управления в другой. Например, из режима диктовки (dictation mode) в режим подачи команд (command/control) приложению или меню, или наоборот.

APPCOMMAND_FIND (28)

Окрыть окно поиска.

APPCOMMAND_FORWARD_MAIL (40)

Переслать почтовое сообщение.

APPCOMMAND_HELP (27)

Открыть диалоговое окно "Справка" (Help).

APPCOMMAND_LAUNCH_APP1 (17)

Запустить приложение 1.

APPCOMMAND_LAUNCH_APP2 (18)

Запустить приложение 2.

APPCOMMAND_LAUNCH_MAIL (15)

Запустиь почтового кллиента.

APPCOMMAND_LAUNCH_MEDIA_SELECT (16)

Перейти в режим выбора медиа (Media Select mode).

APPCOMMAND_MEDIA_CHANNEL_DOWN (52)

Уменьшает на единицу номер канала, например, ТВ-тюнера.

APPCOMMAND_MEDIA_CHANNEL_UP (51)

Увеличивает на единицу номер канала, например, ТВ-тбнера.

APPCOMMAND_MEDIA_FAST_FORWARD (49)

Увеличить скорость воспроизведения потока.

APPCOMMAND_MEDIA_NEXTTRACK (11)

Перейти к следующему треку.

APPCOMMAND_MEDIA_PAUSE (47)

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

APPCOMMAND_MEDIA_PLAY (46)

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

APPCOMMAND_MEDIA_PLAY_PAUSE (14)

Начать или приостановить воспроизведение. Если приложение имеет раздельные кнопки "воспроизведение" и "пауза", то оно должно обрабатывать эту команду точно так же как и команды APPCOMMAND_MEDIA_PLAY и APPCOMMAND_MEDIA_PAUSE.

APPCOMMAND_MEDIA_PREVIOUSTRACK (12)

Перейти к предыдущему треку.

APPCOMMAND_MEDIA_RECORD (48)

Начать запись текущего потока.

APPCOMMAND_MEDIA_REWIND (50)

Перемещение назад в потоке воспроизведения на повышенной скорости.

APPCOMMAND_MEDIA_STOP (13)

Остановить воспроизведение.

APPCOMMAND_MIC_ON_OFF_TOGGLE (44)

Включить или выключить микрофон.

APPCOMMAND_MICROPHONE_VOLUME_DOWN (25)

Увеличить громкость микрофона.

APPCOMMAND_MICROPHONE_VOLUME_MUTE (24)

Выключить микрофон.

APPCOMMAND_MICROPHONE_VOLUME_UP (26)

Уменьшить громкость микрофона.

APPCOMMAND_NEW (29)

Создать новое окно.

APPCOMMAND_OPEN (30)

Открыть окно.

APPCOMMAND_PASTE (38)

Вставить.

APPCOMMAND_PRINT (33)

Распечатать текущий документ.

APPCOMMAND_REDO (35)

Повторить последнее действие.

APPCOMMAND_REPLY_TO_MAIL (39)

Ответить на почтовое сообщение.

APPCOMMAND_SAVE (32)

Сохранить текущий документ.

APPCOMMAND_SEND_MAIL (41)

Отправить почтовое сообщение.

APPCOMMAND_SPELL_CHECK (42)

Начать поверку орфографии.

APPCOMMAND_TREBLE_DOWN (22)

Уменьшить высокие частоты (treble).

APPCOMMAND_TREBLE_UP (23)

Повысить высокие частоты (treble).

APPCOMMAND_UNDO (34)

Отменить последнее действие.

APPCOMMAND_VOLUME_DOWN (9)

Уменьшить громкость.

APPCOMMAND_VOLUME_MUTE (8)

Выключить звук.

APPCOMMAND_VOLUME_UP (10)

Увеличить громкость.


Курсоры (IDC_*)

Курсоры

IDC_APPSTARTING

MAKEINTRESOURCE(32650)

Стандартная стрелка и маленькие песочные часы.

IDC_ARROW

MAKEINTRESOURCE(32512)

Стандартная стрелка

IDC_CROSS

MAKEINTRESOURCE(32515)

Перекрестие

IDC_HAND

MAKEINTRESOURCE(32649)

Рука

IDC_HELP

MAKEINTRESOURCE(32651)

Стрелка и знак вопроса

IDC_IBEAM

MAKEINTRESOURCE(32513)

I-образный курсор

IDC_ICON

MAKEINTRESOURCE(32641)

Устарело.

IDC_NO

MAKEINTRESOURCE(32648)

Зачеркнутый круг

IDC_SIZE

MAKEINTRESOURCE(32640)

Устарело. Используйте вместо него IDC_SIZEALL.

IDC_SIZEALL

MAKEINTRESOURCE(32646)

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

IDC_SIZENESW

MAKEINTRESOURCE(32643)

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

IDC_SIZENS

MAKEINTRESOURCE(32645)

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

IDC_SIZENWSE

MAKEINTRESOURCE(32642)

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

IDC_SIZEWE

MAKEINTRESOURCE(32644)

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

IDC_UPARROW

MAKEINTRESOURCE(32516)

Вертикальная стрелка.

IDC_WAIT

MAKEINTRESOURCE(32514)

Песочные часы.

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


Локали (LOCALE_*)

LOCALE_CUSTOM_DEFAULT

(0x0C00)

Windows Vista и новее: индивидуальная (custom) локаль по умолчанию. Когда функция NLS (система поддержки национальных языков) должна врнуть идентификатор локали для дополнительной (supplemental) локали текущего пользователя, функция возвращает данное значение вместо LOCALE_USER_DEFAULT.

LOCALE_CUSTOM_UI_DEFAULT

(0x1400)

Windows Vista и новее: индивидуальная (custom) локаль по умолчанию для MUI (многоязыковой интерфейс пользователя). Предпочтительные для пользователя языки интерфейса и системные предпочтительные языки интерфейса могут состоять максимум из одного языка, реализованного пакетом интерфейса пользователя (Language Interface Pack - LIP). Идентификатор этого языка соответствует данной константе. Если этот язык находится в списке, константа используется для указания этого языка в отдельных контекстах.

LOCALE_CUSTOM_UNSPECIFIED

(0x1000)

Windows Vista и новее: незаданная индивидуальная (custom) локаль. Используется для задания всех дополнительных (supplemental) локалей, за исключением локали текущего пользователя. Дополнительные локали не могут быть отличены от идентификаторов других локалей, но могут быть различены по наименованию локалей. Некоторые функции NLS (система поддержки национальных языков) могут вернуть данную константу для указания того, что они не могут предоставить конкретный идентификатор локали.

LOCALE_INVARIANT

(0x007f)

Windows XP: локаль, используемая функциями операционной системы, которым нужен корректный результат, не зависящий от локали. Например, неизменяющаяся (invariant) локаль используется когда приложение сравнивает строки символов с помощью функции CompareString и хочет получить корректный результат, не зависящий от локали пользователя. Установка неизменяющейся локали аналогична установке анлийского языка (американского), но она не должна использоваться для отображения форматированных данных. Обычно, риложение не использует LOCALE_INVARIANT, так как оно рассчитывает получить результат, зависящий от правил каждой отдельной локали.

LOCALE_SYSTEM_DEFAULT

(0x0800)

Локаль по умолчанию в операционной системе.

LOCALE_USER_DEFAULT

(0x0400)

Локаль по умолчанию для пользователя или процесса.

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


Методы форматирования текста (DT_*)

DT_BOTTOM

Выровнять текст по нижнему краю прямоугольника. Данный флаг используется только совместно с флагом DT_SINGLELINE.

DT_CALCRECT

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

DT_CENTER

Текст выравнивается по центру прямоугольника в горизонтальном направлении.

DT_EDITCONTROL

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

DT_END_ELLIPSIS

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

Если флаг DT_MODIFYSTRING не задан, то строка не изменяется.

Сравните этот флаг с флагами DT_PATH_ELLIPSIS и DT_WORD_ELLIPSIS.

DT_EXPANDTABS

Увеличивает символ табуляции. По умолчанию, количество символов на одну табуляцию равно восьми. Флаги DT_WORD_ELLIPSIS, DT_PATH_ELLIPSIS и DT_END_ELLIPSIS не могут использоваться совместно с флагом DT_EXPANDTABS.

DT_EXTERNALLEADING

В высоту линии включается величина внешнего просвета шрифта (font external leading). Обычно, он не включается в высоту строки текста.

DT_HIDEPREFIX

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

Исходная строка: "A&bc&&d".

обычно: "Abc&d"

DT_HIDEPREFIX: "Abc&d"

Сравните этот флаг с флагами DT_NOPREFIX и DT_PREFIXONLY.

DT_INTERNAL

Для расчета метрик текста используется системный шрифт.

DT_LEFT

Текст выравнивается по левому краю.

DT_MODIFYSTRING

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

DT_NOCLIP

Отрисовывать без отсечения (clipping). Функция DrawText (и DrawTextEx) работает несколько быстрее, если задан флаг DT_NOCLIP.

DT_NOFULLWIDTHCHARBREAK

Предотвращает разрыв строки в DBCS (строки двухбайтовых символов). Благодаря этому правило разрыва строки эквивалентно правилу для SBCS (строки из однобайтовых символов). Это используется, например, в корейской реакции Windows, для повышения читаемости подписей иконок. Данный флаг не имеет действия, если не задан флаг DT_WORDBREAK.

DT_NOPREFIX

Отключает обработку префиксных символов. Обычно, функция DrawText (и DrawTextEx) интерпретирует символ & как указание подчеркнуть следующий за ним символ, а набор символов && как указание напечатать в строке символ &. Флаг DT_NOPREFIX отключает такую обработку. Пример.

Исходная строка: "A&bc&&d"

обычно: "Abc&d"

DT_NOPREFIX: "A&bc&&d"

Сравните данный флаг с флагами DT_HIDEPREFIX и DT_PREFIXONLY.

DT_PATH_ELLIPSIS

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

Если флаг DT_MODIFYSTRING не задан, то строка не изменяется.

Сравните данный флаг с флагами DT_END_ELLIPSIS и DT_WORD_ELLIPSIS.

DT_PREFIXONLY

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

Исходная строка: "A&bc&&d"

обычно: "Abc&d"

DT_PREFIXONLY: "_"

Сравните данный флаг с флагами DT_HIDEPREFIX и DT_NOPREFIX.

DT_RIGHT

Текст выравнивается по правому краю.

DT_RTLREADING

Если в контексте устройства (hdc) выбран еврейский или арабский шрифт, то текст приводится к режиму чтения справа налево. По умолчанию, порядок чтения всегда слева направо.

DT_SINGLELINE

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

DT_TABSTOP

Устанавливает шаг табуляции.

Для функции DrawText. Биты 15-8 (старший байт младшего слова) параметра uFormat задают количество символов для каждой табуляции. По умолчанию оно равно 8. Флаги DT_CALCRECT, DT_EXTERNALLEADING, DT_INTERNAL, DT_NOCLIP и DT_NOPREFIX не могут использоваться совместно с флагом DT_TABSTOP.

Для функции DrawTextEx. Размер шага табуляции задается в структуре DRAWTEXTPARAMS, на которую указывает параметр lpDTParams. Единицей измерения шага табуляции является средняя ширина символов.

DT_TOP

Текст выравнивается по верхнему краю прямоугольника.

DT_VCENTER

Текст выравнивается по центру в вертикальном направлении. Данный флаг используется только совместно с флагом DT_SINGLELINE.

DT_WORDBREAK

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

Если данный флаг не задан, то вывод осуществляется на одной строке.

DT_WORD_ELLIPSIS

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

Сравните данный флаг с флагами DT_END_ELLIPSIS и DT_PATH_ELLIPSIS.

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


Наборы кнопок (MB_*)

MB_ABORTRETRYIGNORE

"Прервать", "Повторить", "Пропустить"

MB_CANCELTRYCONTINUE

"Отмена", "Повторить", "Продолжить"

MB_HELP

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

MB_OK

"ОК"

MB_OKCANCEL

"ОК", "Отмена"

MB_RETRYCANCEL

"Повторить", "Отмена"

MB_YESNO

"Да", "Нет"

MB_YESNOCANCEL

"Да", "Нет", "Отмена"

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


Наборы символов (*_CHARSET)

ANSI_CHARSET

Набор символов английского языка.

ARABIC_CHARSET

Набор символов для арабских языков.

BALTIC_CHARSET

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

CHINESEBIG5_CHARSET

Набор символов для "стандартного" китайского языка.

DEFAULT_CHARSET

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

EASTEUROPE_CHARSET

Набор символов для языков Восточной Европы.

GB2312_CHARSET

Набор символов для "упрощенного" китайского языка.

GREEK_CHARSET

Набор символов для греческого языка.

HANGUL_CHARSET

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

HEBREW_CHARSET

Набор символов для еврейского языка.

JOHAB_CHARSET

Набор символов для корейского языка.

MAC_CHARSET

Набор символов, используемых в компьютерах Apple Macintosh.

OEM_CHARSET

Набор символов одной из кодовых страниц OEM, в соответствии с текущими параметрами языка системы.

RUSSIAN_CHARSET

Набор символов для кириллицы.

SHIFTJIS_CHARSET

Набор символов для японского языка.

SYMBOL_CHARSET

Кодировка произвольных символов.

THAI_CHARSET

Набор символов для тайского языка.

TURKISH_CHARSET

Набор символов для турецкого языка.

VIETNAMESE_CHARSET

Набор символов для въетнамского языка.

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


Наименования локалей (LOCALE_NAME_*)

LOCALE_NAME_INVARIANT

Имя постоянной (invariant) локали, обеспечивающей постоянную (stable) локаль и календарные данные.

Вводится так:

#if defined(__GNUC__)

#define LOCALE_NAME_INVARIANT (const WCHAR []){ 0 }

#elif defined(_MSC_VER)

# define LOCALE_NAME_INVARIANT L""

#else

static const WCHAR LOCALE_NAME_INVARIANT[] = { 0 };

#endif

LOCALE_NAME_MAX_LENGTH

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

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

Вводится так:

const int LOCALE_NAME_MAX_LENGTH = 85;

Но в Dev C++ (версия 5.11) этот вариант ввода не работает. Однако если из наименования константы удалить произвольный символ, то он заработает. Там будем вводить так:

#define LOCALE_NAME_MAX_LENGTH 85

LOCALE_NAME_SYSTEM_DEFAULT

Наименование текущей локали операционной системы.

По ссылке https://sourceforge.net/p/mingw-w64/mingw-w64/ci/653e545f958ea4556778eaac8f9c48d4538ad5cb/tree/mingw-w64-tools/widl/include/winnls.h?diff=bfa8f779ac929ab50a0934ec3002080e94b96559 дается неправильное описание этой константы. Ниже приводится исправленное описание этой константы.

#if defined(__GNUC__)

#define LOCALE_NAME_SYSTEM_DEFAULT (const WCHAR []){'!','x','-','s','y','s','-','d','e','f','a','u','l','t','-','l','o','c','a','l','e',0}

#elif defined(_MSC_VER)

#define LOCALE_NAME_SYSTEM_DEFAULT L"!x-sys-default-locale"

#else

static const WCHAR LOCALE_NAME_SYSTEM_DEFAULT[] = {'!','x','-','s','y','s','-','d','e','f','a','u','l','t','-','l','o','c','a','l','e',0};

#endif

LOCALE_NAME_USER_DEFAULT

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

Вводится так:

#define LOCALE_NAME_USER_DEFAULT NULL

Примечание

MSDN дает только словесное описание данных констант (https://msdn.microsoft.com/ru-ru/library/windows/desktop/dd373815(v=vs.85).aspx), но не предоставляет их численных значений. Более того, я не нашел их описания в заголовочных файлах, идущих в комплекте с используемыми мной IDE. Единственное описание значения этих констант я нашел на странице https://sourceforge.net/p/mingw-w64/mingw-w64/ci/653e545f958ea4556778eaac8f9c48d4538ad5cb/tree/mingw-w64-tools/widl/include/winnls.h?diff=bfa8f779ac929ab50a0934ec3002080e94b96559 и в комментарии пользователя Serge Baltic к вышеупомянутой статье msdn. Именно эти значения и приводятся в данном топике.


Направления следования свернутых окон (ARW_*)

ARW_DOWN

Вертикально сверху вниз.

ARW_HIDE

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

ARW_LEFT

Горизонтально слева направо.

ARW_RIGHT

Горизонтально справа налево.

ARW_UP

Вертикально, снизу вверх.

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


Направления штриховки (HS_*)

HS_BDIAGONAL

(3)

Снизу вверх, слева направо под углом 45 градусов.

HS_CROSS

(4)

Горизонтаьные и вертикальные пересекающиеся линии.

HS_DIAGCROSS

(5)

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

HS_FDIAGONAL

(2)

Сврху вниз, слева направо под углом 45 градусов.

HS_HORIZONTAL

(0)

Горизонтаьная штриховка.

HS_VERTICAL

(1)

Вертикальная штриховка.

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


Насыщенность шрифта (FW_*)

FW_BLACK

900

FW_BOLD

700

FW_DEMIBOLD

600

FW_DONTCARE

0

FW_EXTRABOLD

800

FW_EXTRALIGHT

200

FW_HEAVY

900

FW_LIGHT

300

FW_MEDIUM

500

FW_NORMAL

400

FW_REGULAR

400

FW_SEMIBOLD

600

FW_THIN

100

FW_ULTRABOLD

800

FW_ULTRALIGHT

200

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


Оконные сообщения DDE (WM_DDE_*)

WM_DDE_ACK

Данное сообщение уведомляет приложение DDE о получении и обработке следующих сообщений: WM_DDE_POKE, WM_DDE_EXECUTE, WM_DDE_DATA, WM_DDE_ADVISE, WM_DDE_UNADVISE, WM_DDE_INITIATE или WM_DDE_REQUEST (в некоторых случаях).

Для отправки этого сообщения используйте функцию PostMessage.

При ответе на сообщение WM_DDE_INITIATE wparam содержит дескриптор серверного окна, отправляющего сообщение.

При ответе на сообщение WM_DDE_EXECUTE wparam содержит дескриптор серверного окна, отправляющего сообщение.

При ответе на другие сообщения wparam содержит дескриптор клиентского или серверного окна, отправляющего сообщение.

При ответе на сообщение WM_DDE_INITIATE младшее слово lparam содержит атом, который идентифицирует отвечающее приложение. Старшее слово содержит атом, который идентифицирует тему, для которой устанавливается обмен.

При ответе на сообщение WM_DDE_EXECUTE младшее слово lparam определяет структуру DDEACK, содержащую набор флагов, которые описывают состояние ответа. Старшее слово lparam содержит дескриптор глобального объекта памяти (global memory object), который содержит командную строку, которая была получена с сообщением WM_DDE_EXECUTE.

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

За исколючением ответа на сообщение WM_DDE_INITIATE, приложения отправляют сообщение WM_DDE_ACK функцией PostMessage, но не функцией SendMessage. При ответе на сообщение WM_DDE_INITIATE ответное сообщение посылается функцией SendMessage. В этом случае ни атом с именем приложением, ни атом с именем темы не должны содержать значение NULL (даже если в сообщении WM_DDE_INITIATE они были равны NULL).

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

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

Все приложения, отправляющие сообщение WM_DDE_ACK, должны создавать или повторно использовать значение lparam с помощью функций PackDDElParam и ReuseDDElParam.

Если приложение инициировало прекращение обмена путём отправки сообщения WM_DDE_TERMINATE и ожидает подтверждения, то ожидающее приложение не должно принимать (положительно или негативно) какие-либо сообщения, отправленные другими приложениями. Ожидающее приложение должно удалить все атомы и объекты памяти, полученные в этих промежуточных сообщениях. Объекты памяти не должны освобождаться если флаг fRelease в сообщениях WM_DDE_POKE и WM_DDE_DATA был установлен в значение FALSE.

Приложение, которое получает сообщение WM_DDE_ACK должно удалить все атомы, сопровождающие это сообщение. Если приложение получает сообщение WM_DDE_ACK в ответ на сообщение, с которым передавался глобальный объект памяти (global memory object), и этот объект передавался со значением флага fRelease равным FALSE, то приложение ответственно за удаление этого объекта.

Если приложение получает отрицательное сообщение WM_DDE_ACK, отправленное в ответ на сообщение WM_DDE_ADVISE, то приложение должно удалить глобальный объект памяти, передаваемый с сообщением WM_DDE_ADVISE. Если приложение получает отрицательное сообщение WM_DDE_ACK в ответ на сообщение WM_DDE_DATA, WM_DDE_POKE или WM_DDE_EXECUTE, то приложение должно удалить глобальный объект памяти, передаваемый с сообщением WM_DDE_DATA, WM_DDE_POKE или WM_DDE_EXECUTE.

Приложение, которое получает сообщение WM_DDE_ACK, должно освободить параметр lparam с помощью функции FreeDDElParam.

WM_DDE_ADVISE

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

Для отправки сообщения исползуйте функцию PostMessage.

wparam содержит дескриптор окна клиента, пославшего сообщение.

Младшее слово lparam содержит дескриптор глобального объекта памяти, содержащего структуру DDEADVISE, определяющую как следует отправлять изменившиеся данные.

Старшее слово lparam содержит атом, который идентифицирует запрашиваемый элемент данных.

Если клиент поддерживает несколько форматов буфера обмена для одной темы и элемента управления (item), то он (клиент) может послать несколько сообщений WM_DDE_ADVISE для темы и элемента управления (item), определяя различные форматы буфера обмена в каждом сообщении. Заметьте, что сервер может поддерживать несолько форматов только для горячих каналов передачи данных (hot data links), но не для теплых каналов передачи данных (warm data links).

Клиентское приложение должно отправлять сообщение WM_DDE_ADVISE с помощью функции PostMessage, но не функцией SendMessage.

Клиентское приложение выделяет глобальный объект памяти с помощью с помощью функции GlobalAlloc. Атом создается с помощью функции GlobalAddAtom.

Клиентское приложение должно создавать или повторно использовать значение lparam сообщения WM_DDE_ADVISE путём вызова функции PackDDElParam или ReuseDDElParam.

Если сервер отвечает негативным сообщением WM_DDE_ACK, то приложение-отправитель должно удалить объект.

В сообщениях WM_DDE_ADVISE флаг fRelease не используется, но освобождение памяти осуществляется точно так же, как и в случае сообщений WM_DDE_DATA и WM_DDE_POKE, в которых флаг fRelease взведен.

Серверное приложение в ответ отправляет положительное или отрицательное сообщение WM_DDE_ACK. При его отправке приложение мождет повторно использовать атом, или оно должно удалить атом и создать вместо него новый. Если сообщение WM_DDE_ACK положительно, то приложение должно удалить глобальный объект памяти. В противном случае (при негативном сообщении WM_DDE_ACK) приложение не должно удалять объект.

Сервер создает или повторно использует значение lparam сообщения WM_DDE_ACK путём вызова функции PackDDElParam или ReuseDDElParam.

WM_DDE_DATA

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

Для отправки сообщения используйте функцию PostMessage.

wparam содержит дескриптор окна сервера, отправляющего сообщение.

Младшее слово lparam содержит дескриптор глобального объекта памяти (global memory object), содержащего структуру DDEDATA с данными и дополнительной информацией. Если сервер уведомляет клиента о том, что данные, находящиеся в теплом канале передачи данных (warm data link) были изменены, то значение младшего слова lparam должно быть равно NULL. Теплый канал передачи данных (warm link) устанавливается путем отправки клиентом сообщения WM_DDE_ADVISE с установленным битом fDeferUpd.

Старшее слово lparam содержит атом, который идентифицирует элемент данных (data item), для которого посылаются данные или уведомление.

Приложение сервер создает глобальный объект памяти с помощью функции GlobalAlloc. Атом создается с помощью функции GlobalAddAtom.

Для создания или повторного использования значения lparam сервер должен использовать функцию PackDDElParam или ReuseDDElParam.

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

Если сервер установил значение поля fRelease структуры DDEDATA в значение FALSE, то сервер отвечает за удаление объекта в случае положительного или негативного ответа от клиента.

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

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

Клиент должен создавать или повторно использовать значение lparam с помощью функции PackDDElParam или ReuseDDElParam.

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

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

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

· значение поля fRelease равно FALSE;
· значение поля fRelease равно TRUE, но клиент отвечает негативным сообщением WM_DDE_ACK.

WM_DDE_EXECUTE

Приложение клиент DDE отправляет это сообщение приложению серверу DDE, для передачи серверу строки, которую сервер должен обработать как последовательность команд. Сервер отвечает на это сообщение путем отправки ответного сообщения WM_DDE_ACK.

Для отправки сообщения используйте функцию PostMessage.

wparam содержит дескриптор клиентского окна, отправившего сообщение.

lparam содержит глобальный объект памяти (global memory object), который ссылается на командную ANSI или UNICODE строку, в зависимости от типа окон участвующих в обмене.

Командная строка представляет собой строку, заканчивающуюся нулем, состоящую из одной или более строковых команд, заключенных в скобки {[]}. Каждая строковая команда имеет нижеприведенных синтаксис, в котором список параметров является опциональным.

опкод параметры

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

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

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

[connect][download(query1,results.txt)][disconnect]

[query("sales per employee for each district")]

[open("sample.xlm")][run("r1c1")]

[quote_case("This is a "" character")]

[bracket_or_paren_case("()s or []s should be no problem.")]

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

[bracket_or_paren_case("(())s or [[]]s should be no problem.")]

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

Unicode строки следует использовать только тогда, когда и для окна клиента и для окна сервера функция IsWindowUnicode возвращает значение TRUE.

Приложение клиент создает глобальный объект памяти с помощью функции GlobalAlloc.

При обработке сообщения WM_DDE_ACK, которое прислал сервер в ответ на сообщение WM_DDE_EXECUTE, приложение клиент должно удалить объект, переданный в сообщении WM_DDE_ACK.

Приложение сервер должно отправить положительное или негативное сообщение WM_DDE_ACK. Сервер должен повторно использовать глобальный объект памяти (global memory object).

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

WM_DDE_FIRST

Сообщением не является. Данная константа используется для отбора сообщений, относящихся к механизму межпроцессной связи Dynamic Data Exchange (DDE).

WM_DDE_INITIATE

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

wparam содержит дескриптор окна, посылающего данное сообщение.

Младшее слово lparam содержит атом, который идентифицирует приложение, с которым запрашивается обмен. Имя приложения не должно содержать символов слеша (/) или обратного слеша (\). Эти символы зарезервированы для сетеввых реализаций. Если значение младшего слова lparam равно NULL, то запрашивается обмен со всеми приложениями.

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

Если значение младшего слова lparam равно NULL, то "отозваться" может любое серверное приложение. Если значение старшего слова lparam равно NULL, то любая тема является допустимой.

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

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

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

Клиентское приложение выделяет атомы с помощью функции GlobalAddAtom.

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

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

WM_DDE_LAST

Сообщением не является. Данная константа используется для отбора сообщений, относящихся к механизму межпроцессной связи Dynamic Data Exchange (DDE).

WM_DDE_POKE

Приложение клиент DDE отправляет это сообщение приложению серверу DDE для приёма сервером незапрошенных данных (unsolicited data item). Сервер ответит сообщением WM_DDE_ACK, говорящим о том принял он данные или нет.

Для отправки этого сообщения используется функция PostMessage.

wparam содержит дескриптор клиентского окна, отправившего сообщение.

Младшее слово lparam содержит дескриптор глобального объекта памяти (global memory object), содержащего структуру DDEPOKE с данными и дополнительной информацией.

Старшее слово lparam содержит глобальный атом, который идентифицирует элемент данных для которого отправляются данные или уведомление.

Приложение клиент должно выделять память для глобального объекта памяти с помощью функции GlobalAlloc. Приложение клиент должно удалить объект в одном из следующих случаев:

· приложение сервер отвечает негативным сообщением WM_DDE_ACK;
· значение поля fRelease равно FALSE, и приложение сервер ответило положительным или негативным сообщением WM_DDE_ACK.

Приложение клиент должно создавать атом с помощью функции GlobalAddAtom.

Приложение клиент должно создавать или повторно использовать значение lparam с помощью функции PackDDElParam или ReuseDDElParam.

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

Приложение сервер должно создавать или повторно использовать значение lparam сообщения WM_DDE_ACK с помощью функции PackDDElParam или ReuseDDElParam.

Для освобождения глобального объекта памяти сервер должен использовать функцию GlobalFree. Также, если используется формат данных CF_DSPMETAFILE или CF_METAFILE, то сервер также должен использовать функцию DeleteMetaFile с заданным дескриптором метафайла. Эти два формата имеют дополнительный уровень адресации; то есть, приложение должно заблокировать объект, получить указатель на дескриптор, затем заблокировать дескриптор, получить указатель на структуру METAFILEPICT, и, наконец, вызвать функцию DeleteMetaFile со значением дескриптора из поля hMF структуры METAFILEPICT.

Для освобождения объекта сервер должен вызвать функцию FreeDDElParam.

WM_DDE_REQUEST

Приложение клиент DDE отправляет это сообщение приложению серверу DDE для запроса значения элемента данных (data item).

Для отправки этого сообщения используйте функцию PostMessage.

wparam содержит дескриптор коиентского окна, отправившего сообщение.

Младшее слово lparam определяет стандартный или зарегистрированный формат буфера обмена. Стандартные форматы буфера обмена перечислены здесь.

Старшее слово lparam содержит атом, который идентифицирует элемент данных запрашиваемый у сервера.

Приложение клиент создает атом с помощью функции GlobalAddAtom.

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

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

WM_DDE_TERMINATE

Приложение DDE (клиент или сервер) отправляет данное сообщение для прекращения обмена.

Для отправки этого сообщения используйте функцию PostMessage.

wparam содержит дескриптор окна приложения, отправившего данное сообщение.

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

Во время ожидания обработки сообщения отправляющее приложение не должно отправлять какие-либо сообщения приложению, обрабатывающему сообщение WM_DDE_TERMINATE. Если отправляющее сообщение приложение получает какое-либо сообщение от приложения, с которым оно прекращает обмен, то первое приложение (отправитель WM_DDE_TERMINATE) должно удалить все атомы и глобальные объекты памяти соответствующих сообщений, за исключением глобальных объектов памяти, ассоциированных с сообщениями WM_DDE_POKE и WM_DDE_DATA.

Клиентское или серверное приложение должны отвечать на это сообщение путём отправки сообщения WM_DDE_TERMINATE.

WM_DDE_UNADVISE

Приложение клиент DDE отправляет данное сообщение для того, чтобы известить сервер DDE о том, что заданный элемент управления или отдельный формат буфера обмена для элемента управления более не нуждаютя в обновлении. Это уничтожает тёплый или горячий канал передачи данных (warm or hot data link) для заданного элемента управления.

Для отправки этого сообщения используйте функцию PostMessage.

wparam содержит дескриптор окна, отпавляющего данное сообщение.

Младшее слово lparam определяет формат буфера обмена элемента управления, обновления данных для которого более не нужны. Если его значение равно NULL, то отменяются все активные WM_DDE_ADVISE обмены для заданного элемента управления.

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

Клиентское приложение создает старшее слово lparam путём вызова функции GlobalAddAtom.

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

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


Параметры ввода (SPI_*)

SPI_GETBEEP

Определяет включено ли звуковое оповещение (warning beeper is on). Параметр pvParam должен указывать на переменную типа BOOL, в которую будет записано значение TRUE, если оповещение включено, или значение FALSE, если оно выключено.

SPI_GETBLOCKSENDINPUTRESETS

Определяет может ли приложение сбросить таймер экранной заставки, имитируя клавиатурный ввод или ввод от мыши с помощью функции SendInput. Параметр pvParam должен указывать на переменную типа BOOL, в которую будет записано значение TRUE, если имитация ввода запрещена, или значение FALSE, если она разрешена.

SPI_GETCONTACTVISUALIZATION

Возвращает текущую настройку визуализации прикосновений (contact visualization). Параметр pvParam должен указывать на переменную типа ULONG, в которую будет записана запрошенная настройка.

SPI_GETDEFAULTINPUTLANG

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

SPI_GETGESTUREVISUALIZATION

Возвращает текущую настройку визуализации жестов (gesture visualization). Параметр pvParam должен указывать на переменную типа ULONG, в которую будет записана запрошенная настройка.

SPI_GETKEYBOARDCUES

Определяет всегда ли подчеркнуты клавишы доступа к меню (menu access keys). Параметр pvParam должен указывать на переменную типа BOOL, в которую будет записано значение TRUE, если клавишы доступа к меню всегда подчеркнуты, или значение FALSE, еслиони подчеркнуты только тогда когда меню активировано с помощью клавиатуры.

SPI_GETKEYBOARDDELAY

Возвращает настройку задержки повторного клавиатурного ввода (keyboard repeat-delay setting), которая представляет собой число в интервале от 0 (приблизительно 250 миллисекундная задержка) до 3 (приблизительно 1 секундная задержка). Фактическая величина задержки, связанная с каждым значением может варьироваться в зависимости от аппаратуры. Параметр pvParam должен указывать на переменную целого типа (integer), в которую и будет записана запрошенная настройка.

SPI_GETKEYBOARDPREF

Определяет что пользователь предпочитает работать с клавиатурой, а не с мышкой, и ждёт, что приложения будут предоставлять ему соответствующий интерфейс. Параметр pvParam должен указывать на переменную типа BOOL, в которую будет записано значение TRUE, если пользователь предпочитает пользоваться клавиатурой, или значение FALSE, если это не так.

SPI_GETKEYBOARDSPEED

Возвращает настройку скорости повторения клавиатурного ввода (keyboard repeat-speed setting), которая представляет собой число в интервале от 0 (приблизительно 2,5 повторения в секунду) до 31 (приблизительно 30 повторений в секунду). Фактические значения скоростей зависят от аппаратуры и могут отличаться от линейной шкалы на 20%. Параметр pvParam должен указывать на переменную типа DWORD, в которую будет записана запрошенная настройка.

SPI_GETMOUSE

Возвращает два пороговых значения мыши (mouse threshold values) и ускорение мыши (mouse acceleration). Параметр pvParam должен указывать на массив трёх переменных типа integer, в который будут записаны запрошенные значения.

SPI_GETMOUSEHOVERHEIGHT

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

SPI_GETMOUSEHOVERTIME

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

SPI_GETMOUSEHOVERWIDTH

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

SPI_GETMOUSESPEED

Возвращает текущую скорость мыши. Скорость мыши определяет как далёко будет перемещен курсор мыши при перемещении самой мыши. Параметр pvParam должен указывать на целое число integer, в которое будет записано значение в интервале между 1 (самый медленный) и 20 (самый быстрый). Значением по умоолчанию является 10. Данное значение может быть изменено пользователем, или приложением с помощью флага SPI_SETMOUSESPEED.

SPI_GETMOUSETRAILS

Определяет включен или нет режим отслеживания перемещения курсора мыши (Mouse Trails feature). Эта функция на короткое время отрисовывает на экране путь перемещения курсора мыши, а затем стирает его. Параметр pvParam должен указывать на целочисленную переменную (integer), в которую будет записано значение настройки. Если это значение равно нулю или единице, то функция выключена. Если значение больше единицы, то функция включена и данное значение задаёт количество курсоров, отображаемых в пути. Параметр uiParam не используется.

Windows 2000: данный параметр не поддерживается.

SPI_GETMOUSEWHEELROUTING

Возвращает настройку маршрутизации ввода для колёсной кнопки мыши. Настройка маршрутизации определяет кому будет перенаправлен ввод от колёсной кнопки мыши: приложению, владеющему фокусом ввода, или приложению, расположенному под курсором мыши.

Параметр pvParam должен указывать на переменную типа DWORD, в которую будет записано значение настройки. Если значение равно нулю или MOUSEWHEEL_ROUTING_FOCUS, то ввод перенаправляется приложению, владеющему фокусом ввода. Если значение равно единице или MOUSEWHEEL_ROUTING_HYBRID (по умолчанию), то ввод перенаправляется приложению, владеющему фокусом ввода (приложения рабочего стола) или приложению, расположенному под курсором мыши (приложения Windows Store).

Параметр uiParam не используется.

SPI_GETSNAPTODEFBUTTON

Определяет включена ли функция привязки к кнопке по умолчанию. Если она включена, то курсор мыши автоматически перемещается к кнопке по умолчанию, например, OK или Apply, диалогового окна. Параметр pvParam должен указывать на переменную типа BOOL, в которую будет записано значение TRUE, функция включена, или значение FALSE, если она выключена.

SPI_GETSYSTEMLANGUAGEBAR

Появилось в Windows 8. Определяет доступна или нет системная панель выбора языка (system language bar). Параметр pvParam должен указывать на переменную типа BOOL, в которую будет записано значение TRUE, если панель доступна, или значение FALSE в противном случае.

SPI_GETTHREADLOCALINPUTSETTINGS

Появилось в Windows 8. Определяет являются ли активные настройки ввода локальными (для каждого потока, TRUE) или глобальными (для сеанса, FALSE). Параметр pvParam должен указывать на значение типа BOOL.

SPI_GETWHEELSCROLLCHARS

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

SPI_GETWHEELSCROLLLINES

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

SPI_SETBEEP

Включает или выключает звуковое оповещение (warning beeper). Параметр uiParam должен содержать значение TRUE для включения звукового оповещения, или значение FALSE, для его выключения.

SPI_SETBLOCKSENDINPUTRESETS

Определяет может ли приложение сбросить таймер экранной заставки, имитируя клавиатурный ввод или ввод от мыши с помощью функции SendInput. Параметр uiParam должен содержать значение TRUE, если заставка экрана (screensaver) не может быть прервана путём имитации ввода, или значение FALSE, если заставка экрана может быть прервана путём имитации ввода.

SPI_SETCONTACTVISUALIZATION

Устанавливает текущую настройку визуализации прикосновений. Параметр pvParam должен указывать на значение типа ULONG, которое описывает настройку.

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

SPI_SETDEFAULTINPUTLANG

Устанавливает язык ввода по умолчанию для оболочки системы (system shell) и приложений. Указанный язык должен отображаться с помощью текущего системного набора символов (system character set). Параметр pvParam должен указывать на переменную типа HKL, которая содержит идентификатор локали для яыка по умолчанию.

SPI_SETDOUBLECLICKTIME

Устанавливает новое значение интервала времени двойного щелчка (double-click time) мыши равным значению параметра uiParam. Если значение параметра uiParam больше чем 5000 миллисекунд, то система устанавливает длительность этого интервала равной 5000 миллисекундам.

Интервал времени двойного щелчка - это максимально количество миллисекунд, которые могут истечь между первым и вторым щелчком, при котором эти два щелчка воспринимаются системой как один двойной щелчок. Вы также можете использовать функцию SetDoubleClickTime для установки этого интервала. Для получения текущего значения длительности интервала двойного щелчка используйте функцию GetDoubleClickTime.

SPI_SETDOUBLECLKHEIGHT

Устанавливает новую высоту прямоугольника двойного щелчка (double-click rectangle). Новая высота передается в качестве значения параметра uiParam.

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

Получить высоту этого прямоугольника можно с помощью функции GetSystemMetrics с флагом SM_CYDOUBLECLK.

SPI_SETDOUBLECLKWIDTH

Устанавливает новую ширину прямоугольника двойного щелчка (double-click rectangle). Новая ширина передается в качестве значения параметра uiParam.

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

Получить ширину этого прямоугольника можно с помощью функции GetSystemMetrics с флагом SM_CXDOUBLECLK.

SPI_SETGESTUREVISUALIZATION

Устанавливает текущую настройку визуализации жестов. Параметр pvParam должен указывать на переменную типа ULONG, кторая содержит настройку.

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

SPI_SETKEYBOARDCUES

Устанавливает подчеркивание символов клавиш доступа к меню (menu access key). Параметр pvParam должен содержать значение типа BOOL. Оно должно быть равно TRUE, для того, чтобы клавишы доступа к меню всегда были подчеркнутыми, или значение FALSE для того, чтобы клавишы подчеркивались только тогда, когда меню активировано с помощью клавиатуры.

SPI_SETKEYBOARDDELAY

Устанавливает настройку задержки повторного клавиатурного ввода (keyboard repeat-delay setting). Параметр uiParam должен содержать значение 0,1,2 или 3, где значение 0 соответствует самой короткой задержке (приблизительно 250 миллисекунд), а значение 3 - самой длинной задержке (приблизительно 1 секунда). Фактическая величина задержки, связанная с каждым значением может варьироваться в зависимости от аппаратуры.

SPI_SETKEYBOARDPREF

Устанавливает предпочтительность клавиатуры. Параметр uiParam должен содержать значение TRUE, если пользователь предпочитает пользоваться клавиатурой, а не мышью и рассчитывает на соответствующий этому интерфейс. Если это не так, то параметр uiParam должен содержать значение FALSE.

SPI_SETKEYBOARDSPEED

Устанавливает настройку скорости повторения клавиатурного ввода (keyboard repeat-speed setting). Параметр uiParam должен содержать число в интервале от 0 (приблизительно 2,5 повторения в секунду) до 31 (приблизительно 30 повторений в секунду). Фактические значения скоростей зависят от аппаратуры и могут отличаться от линейной шкалы на 20%. Если значение параметра uiParam больше 31, то настройка устанавливается в значение 31.

SPI_SETLANGTOGGLE

Устанавливает горячую клавишу переключения языка ввода. Параметры uiParam и pvParam не используются. Новое значение горячей клавишы определяется путём нового считывания параметра реестра "HKEY_CURRENT_USER\Keyboard Layout\Toggle". Допустимые значения этого параметра перечислены ниже.

1 - Alt+Shift.

2 - Ctrl+Shift.

3 - не установлено.

SPI_SETMOUSE

Устанавливает два пороговых значения мыши и ускорения мыши. Параметр pvParam должен указывать на массив из трёх целых чисел с новыми значениями.

SPI_SETMOUSEBUTTONSWAP

Меняет местами или восстанавливает назначение левой и правой кнопок мыши. Параметр uiParam должен содержать значение TRUE для обмена значений кнопок, или значение FALSE для восстановлеия оригинального назначения кнопок.

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

SPI_SETMOUSEHOVERHEIGHT

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

SPI_SETMOUSEHOVERTIME

Устанавливает длительность интервала времени, в миллисекундах, в течение которого курсор мыши должен оставаться в заданном прямоугольнике для того, чтобы TrackMouseEvent сгенерировала сообщение WM_MOUSEHOVER. Это значение используется только если во время вызова функции TrackMouseEvent вы установили параметр dwHoverTime равным значению HOVER_DEFAULT.

Параметр uiParam должен содержать новую длительность интервала времени. Длительность интервала должна находиться в диапазоне от USER_TIMER_MINIMUM до USER_TIMER_MAXIMUM. Если значение uiParam меньше, чем USER_TIMER_MINIMUM, то система устанавливает значение настройки равным USER_TIMER_MINIMUM. Если значение параметра uiParam больше чем USER_TIMER_MAXIMUM, то система устанавливает значение настройки равным USER_TIMER_MAXIMUM.

Windows Server 2003 и Windows XP: операционная система не навязывает использование значений USER_TIMER_MINIMUM и USER_TIMER_MAXIMUM до Windows Server 2003 SP1 и Windows XP SP2.

SPI_SETMOUSEHOVERWIDTH

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

SPI_SETMOUSESPEED

Устанавливает новое значение скорости мыши. Параметр pvParam должен содержать целое число в интервале от 1 (самая низкая) до 20 (самая высокая). Значение по умолчанию - 10. Это значение обычно устанавливается в панели управления.

SPI_SETMOUSETRAILS

Включает или выключает режим отслеживания перемещения курсора мыши (Mouse Trails feature). Эта функция на короткое время отрисовывает на экране путь перемещения курсора мыши, а затем стирает его.

Для отключения этой функции установите значение параметра uiParam равным нулю или 1. Для включения функции установите значение параметра uiParam большим единицы. Значение параметра uiParam большее единицы задаёт количество курсоров, отображаемых в пути.

Windows 2000: данный параметр не поддерживается.

SPI_SETMOUSEWHEELROUTING

Устанавливает настройку маршрутизации ввода для колёсной кнопки мыши. Настройка маршрутизации определяет кому будет перенаправлен ввод от колёсной кнопки мыши: приложению, владеющему фокусом ввода, или приложению, расположенному под курсором мыши.

Параметр pvParam должен указывать на переменную типа DWORD, в которую будет записано значение настройки. Если значение равно нулю или MOUSEWHEEL_ROUTING_FOCUS, то ввод перенаправляется приложению, владеющему фокусом ввода. Если значение равно единице или MOUSEWHEEL_ROUTING_HYBRID (по умолчанию), то ввод перенаправляется приложению, владеющему фокусом ввода (приложения рабочего стола) или приложению, расположенному под курсором мыши (приложения Windows Store).

Установите значение параметра uiParam равным нулю.

SPI_SETSNAPTODEFBUTTON

Включает или выключает функцию привязки к кнопке по умолчанию. Если она включена, то курсор мыши автоматически перемещается к кнопке по умолчанию, например, OK или Apply, диалогового окна. Установите значение параметра uiParam равным TRUE для включения функции, или FALSE для её выключения. Приложения должны использовать функцию ShowWindow при отображении диалгового окна для того чтобы менеджер диалога (dialog manager) мог спозиционировать курсор мыши.

SPI_SETSYSTEMLANGUAGEBAR

Появилось в Windows 8. Изменяет доступность системной панели выбора языка (system language bar). Параметр pvParam должен указывать на переменную типа BOOL. Установите её значение равным TRUE, для того, чтобы сделать панель доступной, или FALSE для того, чтобы сделать панель недоступной.

Этот флаг поддерживается в Windows 8 где панель выбора языка заменена диспетчером ввода (Input Switcher) и поэтому по умолчанию отключена. Возмоэность включения панели оставлена для совместимости и никак не влияет на диспетчер ввода.

SPI_SETTHREADLOCALINPUTSETTINGS

Появилось в Windows 8. Определяет являются ли активные настройки ввода локальными (для каждого потока, TRUE) или глобальными (для сеанса, FALSE). Параметр pvParam должен указывать на значение типа BOOL и быть приведённым к типу PVOID.

SPI_SETWHEELSCROLLCHARS

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

SPI_SETWHEELSCROLLLINES

Устанавливает количество строк, прокручиваемых при перемещении вертикального колеса прокрутки. Новое количество строк должно содержаться в параметре uiParam. Количество строк является предлагаемым количеством строк прокручиваемым при повороте колёсика мыши без использования клавиш-модификаторов (modifier keys). Если количество строк равно нулю. то прокрутки не происходит. Если количество строк больше чем число отображаемых на экране строк, и в частности равно WHEEL_PAGESCROLL (объявлено как UINT_MAX), то операция прокрутки должна быть интерпретирована как одлинарный щелчок на области "страница вверх" или "страница вниз" полосы прокрутки.

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


Параметры заставки экрана (SPI_*)

SPI_GETSCREENSAVEACTIVE

Определяет доступна ли функция заставки экрана (dcreen saving). Параметр pvParam должен указывать на переменную типа BOOL, в которую будет записано значение TRUE, если заставка экрана доступна, или значение FALSE, если она не доступна.

Windows 7, Windows Server 2008 R2 и Windows 2000: функция возвращает значение TRUE даже если заставка экрана не доступна.

SPI_GETSCREENSAVERRUNNING

Определяет запущена ли экранная заставка на объекте Window Station, которому принадлежит вывзывающий процесс. Параметр pvParam должен указывать на переменную типа BOOL, в которую будет записано значение TRUE, если экранная заставка запущена, или значение FALSE, в противном случае. Заметьте, что только интерактивный Window Station, WinSta0, может иметь запущенную экранную заставку.

SPI_GETSCREENSAVESECURE

Определяет требует ли экранная заставка ввода пароля для отображения рабочего стола. Параметр pvParam должен указывать на переменную типа BOOL, в которую будет записано значение TRUE. если экранная заставка требует ввода пароля, или значение FALSE, в противном случае. Параметр uiParam игнорируется.

Windows Server 2003 и Windows XP/2000: данный параметр не поддерживается.

SPI_GETSCREENSAVETIMEOUT

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

SPI_SETSCREENSAVEACTIVE

Устанавливает состояние заставки экрана. Параметр uiParam должен содержать значение TRUE, для активации заставки экрана, или значение FALSE, для её деактивации.

Если машина вошла в энергосберегающий режим (power saving mode) или заблокирована (system lock state), то при использовании параметра SPI_SETSCREENSAVEACTIVE произойдет исключение ERROR_OPERATION_IN_PROGRESS.

SPI_SETSCREENSAVESECURE

Устанавливает нужно ли заставке экране запрашивать пароль при отображении рабочего стола. Параметр uiParam содержит значение типа BOOL. Параметр pvParam игнорируется. Установите параметр uiParam в значение TRUE для того, чтобы экранная заставка запрашивала пароль, или в значение FALSE для того, чтобы экранная заставка не запрашивала пароль.

Если машина вошла в энергосберегающий режим (power saving mode) или заблокирована (system lock state), то при использовании параметра SPI_SETSCREENSAVESECURE произойдет исключение ERROR_OPERATION_IN_PROGRESS.

Windows Server 2003 и Windows XP/2000: данный параметр не поддерживается.

SPI_SETSCREENSAVETIMEOUT

Устанавливает новое значение задержки заставки экрана, переданное в параметре uiParam. Эта задержка определяет время бездействия системы, в секундах, перед активацией заставки экрана.

Если машина вошла в энергосберегающий режим (power saving mode) или заблокирована (system lock state), то при использовании параметра SPI_SETSCREENSAVETIMEOUT произойдет исключение ERROR_OPERATION_IN_PROGRESS.

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


Параметры иконок (SPI_*)

SPI_GETICONMETRICS

Возвращает метрики, ассоциированные с иконками. Параметр pvParam должен указывать на структуру ICONMETRICS, в которую будет записана запрошенная информация. Установите значение поля cbSize этой структуры и значение параметра uiParam размером структуры следующим образом: sizeof(ICONMETRICS).

SPI_GETICONTITLELOGFONT

Возвращает информацию о логическом шрифте, используемом в качестве текущего шрифта подписи иконок (icon-title font). Параметр uiParam определяет размер структуры LOGFONT, а параметр pvParam должен указывать на эту структуру. В неё будет записана запрошенная информация.

SPI_GETICONTITLEWRAP

Определяет включена ли функция переноса на новую строку подписи у иконок. Параметр pvParam должен указывать на переменную типа BOOL, в которую будет записано значение TRUE, если строки подписи переносятся, или значение FALSE, если не переносятся.

SPI_ICONHORIZONTALSPACING

Устанавливает или возвращает необходимую ширину, в пикселях, ячейки под иконку (icon cell). Система использует этот прямоугольник для упорядочивания иконок при просмотре больших иконок.

Для установки нового значения этого параметра установите новое значение в параметре uiParam, в pvParam установите значение NULL. Устанавливаемое не может быть меньше параметра SM_CXICON.

Для получения значения этого параметра, параметр pvParam должен содержать указатель на целое число (integer), в которое и будет записана запрошенная информация.

SPI_ICONVERTICALSPACING

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

Для установки нового значения этого параметра - установите новое значение в параметре uiParam, в pvParam установите значение NULL. Устанавливаемое не может быть меньше параметра SM_CYICON.

Для получения значения этого параметра, параметр pvParam должен содержать указатель на целое число (integer), в которое и будет записана запрошенная информация.

SPI_SETICONMETRICS

Устанавливает метрики, ассоциированные с иконками. Параметр pvParam должен указывать на структуру ICONMETRICS, которая содержит новы параметры иконок. Установите значение поля cbSize этой структуры и значение параметра uiParam размером структуры следующим образом: sizeof(ICONMETRICS).

SPI_SETICONS

Перезагружает системные иконки. Установите значение параметра uiParam равным нулю, а параметра pvParam - NULL.

SPI_SETICONTITLELOGFONT

Устанавливает шрифт, используемый для подписи иконок. Параметр uiParam определяет размер структуры LOGFONT, а параметр pvParam должен указывать на неё.

SPI_SETICONTITLEWRAP

Включает или выключает перенос в подписях иконок. Параметр uiParam должен содержать значение TRUE для включения переноса, или значение FALSE, для его выключения.

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


Параметры интерфейса пользователя (SPI_*)

SPI_GETCOMBOBOXANIMATION

Определяет включен ли эффект слайдового открытия (slide-open effect) для комбинированного списка (Combo box). Параметр pvParam должен указывать на переменную типа BOOL, в которую будет записано значение TRUE, если эффект включен, или значение FALSE, если эффект выключен.

SPI_GETCURSORSHADOW

Определяет имеет ли курсор тень. Параметр pvParam должен указывать на переменную типа BOOL, в которую будет записано значение TRUE, если тень есть, или значение FALSE, если тени нет. Данный эффект возможен только тогда, когда система имеет глубину цвета большую, чем 256 цветов.

SPI_GETGRADIENTCAPTIONS

Определяет включен ли эффект градиента (gradient effect) для заголовков окон. Параметр pvParam должен указывать на переменную типа BOOL, в которую будет записано значение TRUE, если эффект включен, или значение FALSE, если он выключен.

SPI_GETHOTTRACKING

Определяет включено ли горячее отслеживание (hot tracking) элементов пользовательского интерфейса, таких как наименование пунктов меню (menu names) в полосе меню (menu bars). Параметр pvParam должен указывать на переменную типа BOOL, в которую будет записано значение TRUE, если горячее отслеживание включено, или значение FALSE, если оно выключено.

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

SPI_GETLISTBOXSMOOTHSCROLLING

Определяет включен ли эффект гладкой прокрутки (smooth-scrolling effect) для списков (list boxes). Параметр pvParam должен указывать на переменную типа BOOL, в которую будет записано значение TRUE, если эффект включен, или значение FALSE, если он выключен.

SPI_GETMENUANIMATION

Определяет включена ли функция анимации меню (menu animation). Этот главный параметр должен быть установлен для включения эффектов анимации меню. Параметр pvParam должен указывать на переменную типа BOOL, в которую будет записано значение TRUE, если функция включена, или значение FALSE, если она выключена.

Если анимация включена, то параметр SPI_GETMENUFADE определяет какая анимация (исчезающая (fade), или слайдовая (slide)) используется.

SPI_GETMENUUNDERLINES

То же самое что SPI_GETKEYBOARDCUES.

SPI_GETSELECTIONFADE

Определяет включен ли эффект исчезновения выбора (selection fade effect). Параметр pvParam должен указывать на переменную типа BOOL, в которую будет записано значение TRUE, если эффект включен, или значение FALSE, если эффект выключен.

Эффект исчезновения выбора приводит к тому, что пункт меню выбранный пользователем плавно теряет выделение (fading out) после освобождения меню (menu is dismissed).

SPI_GETTOOLTIPANIMATION

Определяет включена ли анимация вспывающих подсказок (ToolTip animation). Параметр pvParam должен указывать на переменную типа BOOL, в которую будет записано значение TRUE, если анимация включена, или значение FALSE, если она выключена.

Если анимация всплывающих подсказок включена, то параметр SPI_GETTOOLTIPFADE определяет какая анимация (исчезающая (fade) или слайдовая (slide)) используется.

SPI_GETTOOLTIPFADE

Если анимация всплывающих подсказок включена (SPI_GETTOOLTIPANIMATION), то параметр SPI_GETTOOLTIPFADE определяет какая анимация (исчезающая (fade) или слайдовая (slide)) используется. Параметр pvParam должен указывать на переменную типа BOOL, в которую будет записано значение TRUE, если используется исчезающая (fade) анимация, или значение FALSE, если используется слайдовая (slide) анимация.

SPI_GETUIEFFECTS

Определяет включены ли эффекты пользовательского интерфейса (UI effects). Параметр pvParam должен указывать на переменную типа BOOL, в которую будет записано значение TRUE, если все эффекты включены, или значение FALSE, если они выключены.

SPI_SETCOMBOBOXANIMATION

Включает или выключает эффект слайдового открытия (slide-open effect) для комбинированного списка (combo box). Установите параметр pvParam в значение TRUE для включения эффекта, или в значение FALSE для его выключения.

SPI_SETCURSORSHADOW

Включает или выключает тень вокруг курсора (shadow around the cursor). Установите параметр pvParam в значение TRUE для включения тени, или в значение FALSE для её выключения. Данный эффект возможен только тогда, когда система имеет глубину цвета большую, чем 256 цветов.

SPI_SETGRADIENTCAPTIONS

Включает или выключает эффект градиента (gradient effect) для заголовков окон. Установите параметр pvParam в значение TRUE для включения эффекта, или в значение FALSE для его выключения. Данный эффект возможен только тогда, когда система имеет глубину цвета большую, чем 256 цветов.

SPI_SETHOTTRACKING

Включает или выключает горячее отслеживание (hot tracking) элементов пользовательского интерфейса, таких как наименование пунктов меню (menu names) в полосе меню (menu bars). Установите параметр pvParam в значение TRUE для включения эффекта, или в значение FALSE для его выключения.

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

SPI_SETLISTBOXSMOOTHSCROLLING

Включает или выключает эффект гладкой прокрутки (smooth-scrolling effect) для списков (list boxes). Установите параметр pvParam в значение TRUE для включения эффекта, или в значение FALSE для его выключения.

SPI_SETMENUANIMATION

Включает или выключает анимацию меню (menu animation). Этот флаг должен быть установлен для любой анимации меню. Установите параметр pvParam в значение TRUE для включения анимации, или в значение FALSE для её выключения.

Если анимация включена, то параметр SPI_GETMENUFADE определяет какая анимация (исчезающая (fade), или слайдовая (slide)) используется.

SPI_SETMENUUNDERLINES

То же самое что SPI_SETKEYBOARDCUES.

SPI_SETSELECTIONFADE

Установите параметр pvParam в значение TRUE для включения эффекта исчезновения выбора (selection fade effect), или в значение FALSE для его выключения.

Эффект исчезновения выбора приводит к тому, что пункт меню выбранный пользователем плавно теряет выделение (fading out) после освобождения меню (menu is dismissed). Данный эффект возможен только тогда, когда система имеет глубину цвета большую, чем 256 цветов.

SPI_SETTOOLTIPANIMATION
Установите параметр pvParam в значение TRUE для включения анимации всплывающих подсказок (ToolTip animation), или в значение FALSE для её выключения.

Если анимация включена, вы можете использовать параметр SPI_SETTOOLTIPFADE для задания её типа (исчезающая (fade) или слайдовая (slide)).

SPI_SETTOOLTIPFADE

Если параметр SPI_SETTOOLTIPANIMATION установлен, то параметр SPI_SETTOOLTIPFADE используется для установки типа анимации (исчезающая (fade) или слайдовая (slide)). Установите параметр pvParam в значение TRUE для использования исчезающей анимации (fade animation), или в значение FALSE для использования слайдовой анимации (slide animation). Эффект исчезающей анимации всплывающих подсказок возможен только тогда, когда система имеет глубину цвета большую, чем 256 цветов.

SPI_SETUIEFFECTS

Включает или выключает эффекты пользовательского интерфейса (UI effects). Установите параметр pvParam в значение TRUE для включения всех эффектов пользовательского интерфейса, или в значение FALSE для их выключения.

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


Параметры меню (SPI_*)

SPI_GETMENUDROPALIGNMENT

Определяет какое выравнивание (по левому или по правому краю) имеет всплывающее меню (pop-up menus) по отношению к пункту меню (meu-bar item). Параметр pvParam должен указывать на переменную типа BOOL, в которую будет записано значение TRUE, если меню имеет выравнивание по правому краю, или значение FALSE, если - по левому краю.

SPI_GETMENUFADE

Определяет включена ли анимация исчезновения меню (menu fade animation). Параметр pvParam должен указыать на переменную типа BOOL, в которую будет записано значение TRUE, если анимация включена, или значение FALSE, если анимация выключена. Если анимация выключена, то меню использует слайдовую анимацию (slide animation). Данный флаг игнорируется если анимация меню выключена. Включить или выключить анимацию меню можно с помощью флага SPI_SETMENUANIMATION.

SPI_GETMENUSHOWDELAY

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

SPI_SETMENUDROPALIGNMENT

Устанавливает выравнивание (по левому или по правому краю) всплывающего меню (pop-up menus). Параметр uiParam должен содержать значение TRUE, для выравнивания по правому краю, или значение FALSE, для выравнивания по левому краю.

SPI_SETMENUFADE

Включает или выкючает анимацию исчезновения меню (menu fade animation). Параметр pvParam должен содержать значение TRUE для включения анимации, или значение FALSE для выключения анимации. Если анимация выключена, то меню использует слайдовую анимацию (slide animation). Анимация исчезновения меню доступна только если система имеет глубину цвета большую, чем 256 цветов. Данный флаг игнорируется если флаг SPI_SETMENUANIMATION не установлен.

SPI_SETMENUSHOWDELAY

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

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


Параметры окон (SPI_*)

SPI_GETACTIVEWINDOWTRACKING

Определяет включена или нет функция отслеживания активного окна (active window tracking) (активируется окно, над которым расположен курсор мыши). Параметр pvParam должен указывать на переменную типа BOOL, в которую будет записано значение TRUE, если функция включена, или значение FALSE, если она выключена.

SPI_GETACTIVEWNDTRKZORDER

Определяет было ли окно, активированное с помощью функции отслеживания активного окна, перемещено на вершину Z последовательности. Параметр pvParam должен указывать на переменную типа BOOL, в которую будет записано значение TRUE, если окно перемещено, или значение FALSE, в противном случае.

SPI_GETACTIVEWNDTRKTIMEOUT

Возвращает длительность, в миллисекундах, задержки отслеживания активного окна (active window tracking delay). Параметр pvParam должен указывать на переменную типа DWORD, в которую будет записано запрошенное значение.

SPI_GETANIMATION

Возвращает информацию об эффектах анимации, связанными с действиями пользователя. Параметр pvParam должен указывать на структуру ANIMATIONINFO, в которую будет записана запрошенная информация. Установите значение поля cbSize этой структуры и параметра uiParam в значение sizeof(ANIMATIONINFO).

SPI_GETBORDER

Возвращает множитель границы (border multiplier factor), который определяет ширину границы окна с изменяемыми размерами. Параметр pvParam должен указывать на целочисленную переменную (integer), в которую будет записано запрошенное значение.

SPI_GETCARETWIDTH

Возвращает ширину, в пикселях, каретки (caret) в поле ввода (edit controls). Параметр pvParam должен указывать на переменную типа DWORD, в которую будет записано запрошенное значение.

SPI_GETDOCKMOVING

Определяет должно ли окно пристыковываться (docked) при его перемещении к верхней, левой или правой границе монитора или набора мониторов. Параметр pvParam должен указывать на переменную типа BOOL, в которую будет записано значение TRUE, если закреплено, или значение FALSE, в противном случае.

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

Windows Server 2008, Windows Vista, Windows Server 2003, Windows XP/2000: данный параметр не поддерживается.

SPI_GETDRAGFROMMAXIMIZE

Определяет было ли развёрнутое окно восстановлено в размерах после перетаскивания его области заголовка. Параметр pvParam должен указывать на переменную типа BOOL, в которую будет записано значение TRUE, если это так, или значение FALSE, в противном случае.

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

Windows Server 2008, Windows Vista, Windows Server 2003, Windows XP/2000: данный параметр не поддерживается.

SPI_GETDRAGFULLWINDOWS

Определяет включено ли перетаскивание (dragging) всех окон. Параметр pvParam должен указывать на переменную типа BOOL, в которую будет записано значение TRUE, если включено, или значение FALSE, если выключено.

SPI_GETFOREGROUNDFLASHCOUNT

Возвращает, сколько раз будет мигать кнопка на панели задач (taskbar button) при отклонении запроса переключения на передний план (SetForegroundWindow). Параметр pvParam должен указывать на переменную типа DWORD, в которую будет записано запрошенное значение.

SPI_GETFOREGROUNDLOCKTIMEOUT

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

SPI_GETMINIMIZEDMETRICS

Возвращает метрики, связанные со свёрнутыми окнами. Параметр pvParam должен указывать на структуру MINIMIZEDMETRICS, в которую будет записана запрошенная информация. Установите значение поля cbSize этой структуры и параметра uiParam в значение sizeof(MINIMIZEDMETRICS).

SPI_GETMOUSEDOCKTHRESHOLD

Возвращает значение порога (threshold), в пикселях, при котором срабатывает стыковка (docking behavior is triggered) во время перемещения мышью окна к краю монитора или набора мониторов. Значение по умолчанию - 1. Параметр pvParam должен указывать на переменную типа DWORD, в которую будет записано запрошенное значение.

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

Windows Server 2008, Windows Vista, Windows Server 2003, Windows XP/2000: данный параметр не поддерживается.

SPI_GETMOUSEDRAGOUTTHRESHOLD

Возвращает значение порога (threshold), в пикселях, при котором срабатывает расстыковка (undocking behavior is triggered) во время перемещения мышью окна от края монитора или набора мониторов к центру. Значение по умолчанию - 20.

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

Windows Server 2008, Windows Vista, Windows Server 2003, Windows XP/2000: данный параметр не поддерживается.

SPI_GETMOUSESIDEMOVETHRESHOLD

Возвращает значение порога (threshold), в пикселях, от верхнего края монитора или набора мониторов, при котором вертикально развёрнутое окно восстанавливает свои размеры при перемещении этого окна мышью. Значение по умолчанию - 50.

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

Windows Server 2008, Windows Vista, Windows Server 2003, Windows XP/2000: данный параметр не поддерживается.

SPI_GETNONCLIENTMETRICS

Возвращает метрики, связанные с неклиентской области окна, размеры которого нельзя изменить. Параметр pvParam должен указывать на структуру NONCLIENTMETRICS, в которую записывается запрошенная информация. Установите значение поля cbSize этой структуры и параметра uiParam в значение sizeof(NONCLIENTMETRICS).

SPI_GETPENDOCKTHRESHOLD

Возвращает значение порога (threshold), в пикселях, при котором срабатывает стыковка (docking behavior is triggered) во время перетаскивания с помощью пера (pen) окна к краю монитора или набора мониторов. Значение по умолчанию - 30.

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

Windows Server 2008, Windows Vista, Windows Server 2003, Windows XP/2000: данный параметр не поддерживается.

SPI_GETPENDRAGOUTTHRESHOLD

Возвращает значение порога (threshold), в пикселях, при котором срабатывает расстыковка (undocking behavior is triggered) во время перетаскивания с помощью пера (pen) окна от края монитора или набора мониторов к его центру. Значение по умолчанию - 30.

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

Windows Server 2008, Windows Vista, Windows Server 2003, Windows XP/2000: данный параметр не поддерживается.

SPI_GETPENSIDEMOVETHRESHOLD

Возвращает значение порога, в пикселях, от верхнего края монитора или набора мониторов, при достижении которого вертикально развёрнутое окно восстанавливает свои размеры, при его перетаскивании пером (pen). Значение по умолчанию - 50.

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

Windows Server 2008, Windows Vista, Windows Server 2003, Windows XP/2000: данный параметр не поддерживается.

SPI_GETSHOWIMEUI

Определяет видимо ли окно состояния IME (IME status window) (для каждого пользователя). Параметр pvParam должен указывать на переменную типа BOOL, в которую будет записано значение TRUE, если это окно видимо, или значение FALSE, если оно не видимо.

SPI_GETSNAPSIZING

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

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

Windows Server 2008, Windows Vista, Windows Server 2003, Windows XP/2000: данный параметр не поддерживается.

SPI_GETWINARRANGING

Определяет включена ли функция упорядочивания окон (window arrangement). Параметр pvParam должен указывать на переменную типа BOOL, в которую бует записано значение TRUE, если функция включена, или значение FALSE, если она выключена.

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

Следующие параметры возвращают отдельные настройки упорядочивания окон:

SPI_GETDOCKMOVING,

SPI_GETMOUSEDOCKTHRESHOLD,

SPI_GETMOUSEDRAGOUTTHRESHOLD,

SPI_GETMOUSESIDEMOVETHRESHOLD,

SPI_GETPENDOCKTHRESHOLD,

SPI_GETPENDRAGOUTTHRESHOLD,

SPI_GETPENSIDEMOVETHRESHOLD,

SPI_GETSNAPSIZING.

Windows Server 2008, Windows Vista, Windows Server 2003, Windows XP/2000: данный параметр не поддерживается.

SPI_SETACTIVEWINDOWTRACKING

Включает или выключает функцию отслеживания активного окна (active window tracking) (активируется окно, над которым расположен курсор мыши). Установите значение параметра pvParam равным TRUE для включения функции, или равным FALSE для её выключения.

SPI_SETACTIVEWNDTRKZORDER

Устанавливает должно ли окно, активированное с помощью функции отслеживания активного окна, быть перемещено на вершину Z последовательности. Установите значение параметра pvParam равным TRUE для включения этой функции, или равным FALSE для её выключения.

SPI_SETACTIVEWNDTRKTIMEOUT

Устанавливает длительность, в миллисекундах, задержки отслеживания активного окна (active window tracking delay). Установите значение параметра pvParam равным длительности задержки, в миллисекундах, перед активацией окна расположенного под курсором мыши.

SPI_SETANIMATION

Устанавливает эффекты анимации, связанные с действиями пользователя. Параметр pvParam должен указывать на структуру ANIMATIONINFO, которая содержит новые параметры. Установите значение поля cbSize этой структуры и параметра uiParam в значение sizeof(ANIMATIONINFO).

SPI_SETBORDER

Устанавливает множитель границы (border multiplier factor), который определяет ширину границы окна с изменяемыми размерами. Новое значение множителя передаётся в параметре uiParam.

SPI_SETCARETWIDTH

Устанавливает ширину каретки (caret) в поле ввода (edit controls). Параметр pvParam должен содержать новое значение ширины, в пикселях. Значение по умолчанию и минимальное значение - 1.

SPI_SETDOCKMOVING

Устанавливает должно ли окно пристыковываться (docked) при его перемещении к верхней, левой или правой границе монитора или набора мониторов. Установите значение параметра pvParam равным TRUE, для включения этой функции, или FALSE, для её выключения.

Параметр SPI_GETWINARRANGING должен быть равен значению TRUE.

Windows Server 2008, Windows Vista, Windows Server 2003, Windows XP/2000: данный параметр не поддерживается.

SPI_SETDRAGFROMMAXIMIZE

Устанавливает должно ли развёрнутое окно восстанавливать свои размеры при перетаскивании области его заголовка. Установите параметр pvParam в значение TRUE, для включения этой функции, или в значение FALSE, для её выключения.

Параметр SPI_GETWINARRANGING должен быть равен значению TRUE.

Windows Server 2008, Windows Vista, Windows Server 2003, Windows XP/2000: данный параметр не поддерживается.

SPI_SETDRAGFULLWINDOWS

Включает или выключает возможность перетаскивания полных окон (full windows). Установите параметр uiParam в значение TRUE для включения такой возможности, или в значение FALSE для её выключения.

SPI_SETDRAGHEIGHT

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

SPI_SETDRAGWIDTH

Устанавливает ширину, в пикселях, прямоугольника, используемого для определения начала операции перетаскивания. Новое значение ширины передаётся в параметре uiParam. Для получения текущего значения ширины используйте функцию GetSystemMetrics с флагом SM_CXDRAG.

SPI_SETFOREGROUNDFLASHCOUNT

Устанавливает, сколько раз будет мигать кнопка на панели задач (taskbar button) при отклонении запроса переключения на передний план (SetForegroundWindow). Параметр pvParam должен содержать новое значение.

SPI_SETFOREGROUNDLOCKTIMEOUT

Устанавливает длительность, в миллисекундах, интервала времени после окончания пользовательского ввода, во время которого система не позволяет приложениям перемещать себя на передний план. Параметр pvParam должен содержать новое значение. Вызывающему потоку должно быть разрешено изменять окно переднего плана (foreground window), в противном случае вызов функции закончится ошибкой.

SPI_SETMINIMIZEDMETRICS

Устанавливает метрики свёрнутых окон. Параметр pvParam должен указывать на структуру MINIMIZEDMETRICS, которая содержит новые параметры. Установите значение поля cbSize этой структуры и параметра uiParam в значение sizeof(MINIMIZEDMETRICS).

SPI_SETMOUSEDOCKTHRESHOLD

Возвращает значение порога (threshold), в пикселях, при котором срабатывает стыковка (docking behavior is triggered) во время перемещения мышью окна к краю монитора или набора мониторов. Значение по умолчанию - 1. Параметр pvParam должен указывать на переменную типа DWORD, которая содержит новое значение порога.

Параметр SPI_GETWINARRANGING должен быть равен значению TRUE.

Windows Server 2008, Windows Vista, Windows Server 2003, Windows XP/2000: данный параметр не поддерживается.

SPI_SETMOUSEDRAGOUTTHRESHOLD

Устанавливает значение порога (threshold), в пикселях, при котором срабатывает расстыковка (undocking behavior is triggered) во время перемещения мышью окна от края монитора или набора мониторов к центру. Значение по умолчанию - 20. Параметр pvParam должен указывать на переменную типа DWORD, которая содержит новое значение порога.

Параметр SPI_GETWINARRANGING должен быть равен значению TRUE.

Windows Server 2008, Windows Vista, Windows Server 2003, Windows XP/2000: данный параметр не поддерживается.

SPI_SETMOUSESIDEMOVETHRESHOLD

Устанавливает значение порога (threshold), в пикселях, от верхнего края монитора или набора мониторов, при котором вертикально развёрнутое окно восстанавливает свои размеры при перемещении этого окна мышью. Значение по умолчанию - 50. Параметр pvParam должен указывать на переменную типа DWORD, которая содержит новое значение порога.

Параметр SPI_GETWINARRANGING должен быть равен значению TRUE.

Windows Server 2008, Windows Vista, Windows Server 2003, Windows XP/2000: данный параметр не поддерживается.

SPI_SETNONCLIENTMETRICS

Устанавливает метрики неклиентской области окна, размеры которого нельзя изменять. Параметр pvParam должен указывать на структуру NONCLIENTMETRICS, которая содержит новые параметры. Установите значение поля cbSize этой структуры и параметра uiParam в значение sizeof(NONCLIENTMETRICS). Также, поле IfHeight структуры LOGFONT должно иметь отрицательное значение.

SPI_SETPENDOCKTHRESHOLD

Устанавливает значение порога (threshold), в пикселях, при котором срабатывает стыковка (docking behavior is triggered) во время перетаскивания с помощью пера (pen) окна к краю монитора или набора мониторов. Значение по умолчанию - 30. Параметр pvParam должен указывать на переменную типа DWORD, которая содержит новое значение порога.

Параметр SPI_GETWINARRANGING должен быть равен значению TRUE.

Windows Server 2008, Windows Vista, Windows Server 2003, Windows XP/2000: данный параметр не поддерживается.

SPI_SETPENDRAGOUTTHRESHOLD

Устанавливает значение порога (threshold), в пикселях, при котором срабатывает расстыковка (undocking behavior is triggered) во время перетаскивания с помощью пера (pen) окна от края монитора или набора мониторов к его центру. Значение по умолчанию - 30. Параметр pvParam должен указывать на переменную типа DWORD, которая содержит новое значение порога.

Параметр SPI_GETWINARRANGING должен быть равен значению TRUE.

Windows Server 2008, Windows Vista, Windows Server 2003, Windows XP/2000: данный параметр не поддерживается.

SPI_SETPENSIDEMOVETHRESHOLD

Устанавливает значение порога, в пикселях, от верхнего края монитора, при достижении которого вертикально развёрнутое окно восстанавливает свои размеры, при его перетаскивании пером (pen). Значение по умолчанию - 50. Параметр pvParam должен указывать на переменную типа DWORD, которая содержит новое значение порога.

Параметр SPI_GETWINARRANGING должен быть равен значению TRUE.

Windows Server 2008, Windows Vista, Windows Server 2003, Windows XP/2000: данный параметр не поддерживается.

SPI_SETSHOWIMEUI

Устанавливает, применительно к пользователю, видимо ли окно состояния IME (IME status window). Параметр uiParam должен содержать значение TRUE, для того чтобы сделать окно стало видимым, или значение FALSE, для того чтобы оно стало невидимым.

SPI_SETSNAPSIZING

Определяет разворачивается ли окно по вертикали (vertically maximized) при изменении его размера до верхней или нижней границы монитора. Параметр pvParam должен содержать значение TRUE, если окно должно разворачиваться, или значение FALSE, если оно не должно разворачиваться.

Параметр SPI_GETWINARRANGING должен быть равен значению TRUE.

Windows Server 2008, Windows Vista, Windows Server 2003, Windows XP/2000: данный параметр не поддерживается.

SPI_SETWINARRANGING

Включает или выключает функцию упорядочивания окон (window arrangement). Параметр pvParam должен содержать значение TRUE, для включения функции, или значение FALSE, для её выключения.

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

Следующие параметры устанавливают отдельные настройки упорядочивания окон:

SPI_SETDOCKMOVING,

SPI_SETMOUSEDOCKTHRESHOLD,

SPI_SETMOUSEDRAGOUTTHRESHOLD,

SPI_SETMOUSESIDEMOVETHRESHOLD,

SPI_SETPENDOCKTHRESHOLD,

SPI_SETPENDRAGOUTTHRESHOLD,

SPI_SETPENSIDEMOVETHRESHOLD,

SPI_SETSNAPSIZING.

Windows Server 2008, Windows Vista, Windows Server 2003, Windows XP/2000: данный параметр не поддерживается.

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


Параметры питания (SPI_*)

SPI_GETLOWPOWERACTIVE

Данный параметр не поддерживается.

Windows Server 2003 и Windows XP/2000: Определяет доступен ли режим пониженного энергопотребления для монитора. Параметр pvParam должен указывать на переменную типа BOOL, в которую будет записано значение TRUE, если он доступен, или значение FALSE, если данный режим не доступен.

Данный флаг поддерживается только для 32-разрядных приложений.

SPI_GETLOWPOWERTIMEOUT

Данный параметр не поддерживается.

Windows Server 2003 и Windows XP/2000: возвращает длительность задержки для режима пониженного энергопотребления экрана. Параметр pvParam должен указывать на целое число (integer), в которое будет записана запрошенная величина.

Данный флаг поддерживается только для 32-разрядных приложений.

SPI_GETPOWEROFFACTIVE

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

Windows Server 2003 и Windows XP/2000: определяет доступен ли режим выключенного питания для монитора. Параметр pvParam должен указывать на переменную типа BOOL, в кторую будет записано значение TRUE, если режим доступен, или значение FALSE если он не доступен. Данный флаг поддерживается только для 32-разрядных приложений.

SPI_GETPOWEROFFTIMEOUT

Данный параметр не поддерживается. Вместо него проверяйте значение настройки питания GUID_VIDEO_POWERDOWN_TIMEOUT.

Windows Server 2003 и Windows XP/2000: возвращает значение длительность задержки для режима выключенного питания экрана. Параметр pvParam должен указывать на целое число (integer), в которое будет записана запрошенная величина.

Данный флаг поддерживается только для 32-разрядных приложений.

SPI_SETLOWPOWERACTIVE

Данный параметр не поддерживается.

Windows Server 2003 и Windows XP/2000: активирует или деактивирует режим пониженного энергопотребления для монитора. Установите значение параметра uiParam равным 1 для активации режима, или нулю, для его деактивации. Значение параметра pvParam должно быть равно NULL.

Данный флаг поддерживается только для 32-разрядных приложений.

SPI_SETLOWPOWERTIMEOUT

Данный параметр не поддерживается.

Windows Server 2003 и Windows XP/2000: устанавливает длительность задержки, в секундах, для режима пониженного энергопотребления экрана. Параметр uiParam должен содержать новое значение длительности. Значение параметра pvParam должно быть равно NULL

Данный флаг поддерживается только для 32-разрядных приложений.

SPI_SETPOWEROFFACTIVE

Данный параметр не поддерживается. Вместо него установите значение настройки питания GUID_VIDEO_POWERDOWN_TIMEOUT.

Windows Server 2003 и Windows XP/2000: активирует или деактивирует режим выключенного питания для монитора. Установите значение параметра uiParam равным 1 для активации режима, или нулю для его деактивации. Значение параметра pvParam должно быть равно NULL.

Данный флаг поддерживается только для 32-разрядных приложений.

SPI_SETPOWEROFFTIMEOUT

Данный параметр не поддерживается. Вместо него установите значение настройки питания GUID_VIDEO_POWERDOWN_TIMEOUT равным новой величине задержки.

Windows Server 2003 и Windows XP/2000: устанавливает значение длительности задержки, в секундах, для режима выключенного питания экрана. Параметр uiParam должен содержать новое значение задержки. Значение параметра pvParam должно быть равно NULL.

Данный флаг поддерживается только для 32-разрядных приложений.

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


Параметры рабочего стола (SPI_*)

SPI_GETCLEARTYPE

Оределяет включено ли сглаживание текста ClearType. Параметр pvParam должен указывать на переменную типа BOOL, в которую будет записано значение TRUE, если ClearType включен, или значение FALSE в пртивном случае. ClearType - это программная технология, которая улучшает читаемость текста на жидкокристаллических (LCD) мониторах.

Windows Server 2003 и Windows XP/2000: данный параметр не поддерживается.

SPI_GETDESKWALLPAPER

Возвращает полный путь к растровому файлу обоев рабочего стола. Параметр pvParam должен указывать на буфер, в который будет записана строка с нулём на конце. Параметр uiParam должен содержать размер этого буфера в символах. Возвращаемая строка не превышает MAX_PATH символов. Если на рабочем столе нет обоев, то возвращается пустая строка.

SPI_GETDROPSHADOW

Определяет доступен ли эффект тени (drop shadow effect). Параметр pvParam должен указывать на переменную типа BOOL, в которую будет записано значение TRUE, если этот режим доступен, или значение FALSE, если он не доступен.

Windows 2000: данный параметр не поддерживается.

SPI_GETFLATMENU

Определяет, имеют пользовательские меню (native User menus) плоское отображение меню (flat menu appearance). Параметр pvParam должен указывать на переменную типа BOOL, в которую будет записано значение TRUE, если установлено плоское отображение меню, или значение FALSE в противном случае.

Windows 2000: данный параметр не поддерживается.

SPI_GETFONTSMOOTHING

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

Параметр pvParam должен указывать на переменную типа BOOL, в которую будет записано значение TRUE, если функция доступна, или значение FALSE если она не доступна.

SPI_GETFONTSMOOTHINGCONTRAST

Возвращает значение контрастности, которое используется в сглаживании ClearType. Параметр pvParam должен указывать на переменную типа UINT, в которую будет записана запрошенная информация. Допустимые значения контрастности находятся в интервале от 1000 до 2200. Значение по умолчанию - 1400.

Windows 2000: Данный параметр не поддерживается.

SPI_GETFONTSMOOTHINGORIENTATION

Возвращает ориентацию сглаживания шрифтов. Параметр pvParam должен содержать указатель на переменную типа UINT, в которую будет записана запрошенная информация. Допустимыми значениями являются: FE_FONTSMOOTHINGORIENTATIONBGR (синий-зелёный-красный) и FE_FONTSMOOTHINGORIENTATIONRGB (красный-зелёный-синий).

Windows XP/2000: данный параметр не поддерживается до Windows XP SP 2.

SPI_GETFONTSMOOTHINGTYPE

Возвращает тип сглаживания шрифтов. Параметр pvParam должен указывать на переменную типа UINT, в которую будет записана запрошенная информация. Допустимыми значениями являются: FE_FONTSMOOTHINGSTANDARD и FE_FONTSMOOTHINGCLEARTYPE.

Windows 2000: данный параметр не поддерживается.

SPI_GETWORKAREA

Возвращает размер рабочей области на основном мониторе. Рабочая область - это часть экрана, не закрытая панелью задач или панелями инструментов рабочего стола (application desktop toolbars). Параметр pvParam должен указывать на структуру RECT, в которую будут записаны координаты рабочей области, выраженные в координатах виртуального экрана.

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

SPI_SETCLEARTYPE

Включает или выключает ClearType. Параметр pvParam содержит значение типа BOOL. Установити в значение TRUE для включения ClearType, или в значение FALSE для выключения ClearType.

ClearType - это программная технология, которая улучшает читаемость текста на жидкокристаллических (LCD) мониторах.

Windows Server 2003 и Windows XP/2000: данный параметр не поддерживается.

SPI_SETCURSORS

Перезагружает системные курсоры. Установите параметр uiParam в значение нуль, а параметр pvParam в значение NULL.

SPI_SETDESKPATTERN

Устанавливает текущий фоновый рисунок рабочего стола, путь к которому Windows читает в параметре Pattern файла WIN.INI.

SPI_SETDESKWALLPAPER

Когда используется флаг SPI_SETDESKWALLPAPER, функция SystemParametersInfo возвращает значение TRUE, если нет ошибки (например, когда указанный файл не найден).

SPI_SETDROPSHADOW

Включает или выключает эффект тени. Установите параметр pvParam в значение TRUE для включения эффекта тени, или в значение FALSE для его выключения. Вы также должны определить стиль CS_DROPSHADOW в оконном классе.

Windows 2000: данный параметр не поддерживается.

SPI_SETFLATMENU

Включает или выключает плоское отображение меню для пользовательских меню. Установите значение параметра pvParam в значение TRUE для включения плоского отображения меню, или в значение FALSE для его выключения.

Когда плоское отображение включено, полоса меню (menu bar) использует цвет COLOR_MENUBAR для цвета фона полосы меню, COLOR_MENU для фона всплывающего меню (menu-popup), COLOR_MENUHILIGHT для выделения текущего выбора меню (current menu selection) и COLOR_HILIGHT для обрисовки (outline) текущего выбора меню. Если плоское отображение выключено, то меню отрисовываются с теми же метриками и цветами, что и в Windows 2000.

Windows 2000: данный параметр не поддерживается.

SPI_SETFONTSMOOTHING

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

Для включения этой функции установите значение параметра uiParam равным TRUE. Для выключения этой функции установите uiParam равным FALSE.

SPI_SETFONTSMOOTHINGCONTRAST

Устанавливает значение контрастности, используемое сглаживанием ClearType. Параметр pvParam содержит новое значение контрастности. Допустимые значения контрастности находятся в интервале от 1000 до 2200. Значение по умолчанию - 1400. SPI_SETFONTSMOOTHINGTYPE также должен быть установлен в значение FE_FONTSMOOTHINGCLEARTYPE.

Windows 2000: данный параметр не поддерживается.

SPI_SETFONTSMOOTHINGORIENTATION

Устанавливает ориентацию сглаживания шрифтов. Параметр pvParam должен содержать значение FE_FONTSMOOTHINGORIENTATIONBGR (синий-зелёный-красный) или FE_FONTSMOOTHINGORIENTATIONRGB (красный-зелёный-синий).

Windows XP/2000: данный параметр не поддерживается до Windows XP SP 2.

SPI_SETFONTSMOOTHINGTYPE

Устанавливает тип сглаживания шрифтов. Параметр pvParam должен содержать значение FE_FONTSMOOTHINGSTANDARD (используется стандартное сглаживание), или FE_FONTSMOOTHINGCLEARTYPE (используется ClearType). Значение по умолчанию - FE_FONTSMOOTHINGSTANDARD. Также должен быть установлен параметр SPI_SETFONTSMOOTHING.

Windows 2000: данный параметр не поддерживается.

SPI_SETWORKAREA

Устанавливает размер рабочей области (work area). Рабочая область - это часть экрана, не закрытая панелью задач или панелями инструментов рабочего стола (application desktop toolbars). Параметр pvParam должен указывать на структуру RECT, которая описывает новый прямоугольник рабочей области, выраженный в координатах вирутального экрана. В системах с несколькими мониторами функция устанавливает рабочую область монитора, который содержит заданный прямоугольник.

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


Параметры сообщения WM_SHELLHOOKMESSAGE (HSHELL_*)

HSHELL_ACTIVATESHELLWINDOW

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

HSHELL_APPCOMMAND

lParam содержит команду, которая не была обработана приложением или каким-либо другим перехватчиком. Более подрробно см. описание оконного сообщения WM_APPCOMMAND. Для получения значения этого параметра используйте макрос GET_APPCOMMAND_LPARAM. В заголовочном файле winuser константа HSHELL_APPCOMMAND не описана.

HSHELL_ENDTASK

lParam содержит дескриптор окна, которое должно быть закрыто (should be forced to exit). В заголовочном файле winuser она не описана.

HSHELL_FLASH

lParam содержит дескриптор окна, которое должно быть высвечено (to be flashed).

HSHELL_LANGUAGE

Данная константа описана в заголовочном файле winuser. Однако, в msdn она не упоминается. О её назначении можно только гадать.

HSHELL_MONITORCHANGED

Не описана ни в msdn, ни в заголовочном файле winuser. По слухам появилась в Windows 8 и служит для определения момента, когда главное окно приложения было перемещено на второй монитор. Численно равна 16.

HSHELL_GETMINRECT

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

HSHELL_RUDEAPPACTIVATED

lParam содержит дескриптор активированного окна. В заголовочном файле winuser она не описана.

HSHELL_TASKMAN

Может быть проигнорировано.

HSHELL_REDRAW

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

HSHELL_WINDOWACTIVATED

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

HSHELL_WINDOWCREATED

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

HSHELL_WINDOWDESTROYED

lParam содержит дескриптор окна, которое скоро будет разрушено.

HSHELL_WINDOWREPLACED

lParam содержит дескриптор окна, который будет замещен. В заголовочном файле winuser она не описана.

HSHELL_WINDOWREPLACING

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

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


Параметры специальных возможностей (SPI_*)

SPI_GETACCESSTIMEOUT

Возвращает информацию о таймауте настроек доступа. Параметр pvParam долженуказывать на структуру ACCESSTIMEOUT, в которую и помещается запрашиваемая информация. Установите значение поля cbSize этой структуры и значение параметра uiParam размером структуры следующим образом: sizeof(ACCESSTIMEOUT).

SPI_GETAUDIODESCRIPTION

Определяет доступны или нет аудио описания (audio descriptions). Параметр pvParam должен указывать на структуру AUDIODESCRIPTION. Установите значение поля cbSize этой структуры и параметра uiParam в значение sizeof(AUDIODESCRIPTION).

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

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

Windows Server 2003 и Windows XP/2000: данный флаг не поддерживается.

SPI_GETCLIENTAREAANIMATION

Определяет доступны или нет анимации (animations). Параметр pvParam должен содержать указатель на значение типа BOOL, в которое будет записано значение TRUE, если анимации доступны, или значение FALSE, если анимации не доступны.

Такие возможности отображения как: подсвечивание (flashing), мигание (blinking), мерцание (flickering) и движущееся содержимое окна (moving content) могут вызывать приступы у пользователей со зрительно-чувствительной эпилепсией (photo-sensitive epilepsy).

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

Windows Server 2003 и Windows XP/2000: данный флаг не поддерживается.

SPI_GETDISABLEOVERLAPPEDCONTENT

Определяет доступны или нет перекрывающиеся элементы (overlapped content). Параметр pvParam должен содержать указатель на значение типа BOOL, в которое будет записано значение TRUE, если перекрывание доступно, или значение FALSE, если оно не доступно.

Такие возможности отображения как: фоновые изображения (background images), текстурированный фон (textured background), водяные знаки (water marks) на документах, наложение полупрозрачного изображения на другое изображение (alpha blending) и прозрачность (transparency) могут уменьшать констраст между основным содержимым и фоном, усложняя восприятие информации для пользователей с плохим зрением (low vision).

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

Windows Server 2003 и Windows XP/2000: данный флаг не поддерживается.

SPI_GETFILTERKEYS

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

SPI_GETFOCUSBORDERHEIGHT

Возвращает высоту в пикселях, верхней и нижней границы прямоугольника, рисуемого функцией DrawFocusRect. Параметр pvParam должен указывать на значение типа UINT.

Windows 2000: данный флаг не поддерживается.

SPI_GETFOCUSBORDERWIDTH

Возвращает ширину, в пикселях, левой и правой границы прямоугольника, рисуемого функцией DrawFocusRect. Параметр pvParam должен указывать на значение типа UINT.

Windows 2000: данный флаг не поддерживается.

SPI_GETHIGHCONTRAST

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

SPI_GETLOGICALDPIOVERRIDE

Возвращает значение, которое определяет будет ли Windows 8 отображать приложения, используя масштабирующее плато (scaling plateau) предусмотренное по умолчанию для устройства, или же она перейдет к следующему, более высокому плато (higher plateau). Это значение основывается на настройке "Увеличивать всё на экране" ("Make everything on your screen bigger"), расположеннной в разделе "Ease of Access" "PC settings": 1 включено, 0 - выключено.

Приложения могут предоставлять текстовые и графические ресурсы для каждого масштабирующего плато: 100%, 140% или 180%. Предоставляемые отдельные ресурсы оптимизированы для конкретного масштаба. Это позволяет избежать искажений из-за изменения размеров. Windows 8 выбирает соответствующее масштабирующее плато, основываясь на нескольких факторах, среди которых: размер экран и глубина пикселя.

Когда настройка "Увеличивать всё на экране" выбрана, флаг SPI_GETLOGICALDPIOVERRIDE возвращает значение 1. При этом Windows использует ресурсы из следующего более высокого плато. Например, в случае аппаратных средств, для которых Windows должна использовать масштаб SCALE_100_PERCENT, данная настройка вызовет переопределение масштаба, и Windows будет использовать масштаб SCALE_140_PERCENT, при условии, что этот выбор не нарушает никаких других ограничений.

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

Настольные приложения должны использовать лоический DPI рабочего стола (desktop logical DPI), а не масштабный коэффициент (scale factor). Получить логический DPI рабочего стола можно с помощью функции GetDeviceCaps.

SPI_GETMESSAGEDURATION

Возвращает длительность, в секундах, интервала времени, в течение которого должны отображаться высплывающие окна (pop-ups). Параметр pvParam должен содержать указатель на значение типа ULONG, в которое и будет записана длительность.

Пользователям с нарушениями зрения или когнитивных способностей, такими как СДВГ (синдром дефицита внимания с гиперактивностью (ADHD)) и дислексия (dyslexia), возможно, потребуется больше времени, чтобы читать текст в уведомлениях.

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

Windows Server 2003 и Windows XP/2003: данный флаг не поддерживается.

SPI_GETMOUSECLICKLOCK

Возвращает состояние настройки блокировки щелчка мыши (Mouse ClickLock feature). Параметр pvParam должен содержать указатель на значение типа BOOL, в которое будет записано значение TRUE, если настройка доступна, или значение FALSE в противном случае.

Windows 2000: данный флаг не поддерживается.

SPI_GETMOUSECLICKLOCKTIME

Возвращает время задержки (time delay), в миллисекундах, перед блокировкой основной кнопки мыши (primary mouse button). Параметр pvParam должен указывать на значение типа DWORD, в которое будет записано время задержки. Данная настройка доступна только если значение параметра SPI_SETMOUSECLICKLOCK равно TRUE.

Windows 2000: данный флаг не поддерживается.

SPI_GETMOUSEKEYS

Возвращает информацию о режиме управления курсором мыши (MouseKeys accessibility feature). Параметр pvParam должен указывать на структуру MOUSEKEYS, в которую будет записана запрошенная информация. Поле cbSize этой структуры и значение параметра uiParam должны быть установлены в значение sizeof(MOUSEKEYS).

SPI_GETMOUSESONAR

Возвращает состояние сонара мыши (Mouse Sonar). Параметр pvParam должен указывать на значение типа BOOL, в которое будет заисано значение TRUE, если он доступен (enabled), или значение FALSE, если он не доступен.

Windows 2000: данный флаг не поддерживается.

SPI_GETMOUSEVANISH

Возвращает состояние функции скрытия курсора мыши (Mouse Vanish feature). Параметр pvParam должен указывать на значение типа BOOL, в которое будет записано значение TRUE, если функция доступна (enabled), или значение FALSE, если она не доступна.

Windows 2000: данный флаг не поддерживается.

SPI_GETSCREENREADER

Определяет запущена ли утилита рецензента экрана (screen reviewer utility). Утилита рецензента экрана направляет текстовую информацию в такое устройство вывода как синтезатор речи (speech synthesizer) или монитор Брайля (Braille display). Когда этот флаг установлен приложение должно предоставлять информацию в текстовом виде, даже в тех случаях, когда при прочих условиях она представлялась бы в графическом виде.

Параметр pvParam должен указывать на значение типа BOOL, в которое будет записано значение TRUE, если утилита запущена, или значение FALSE, если это не так.

Рассказчик (Narrator), читатель экрана (screen reader), который входит в состав Windows не устанавливается флагами SPI_SETSCREENREADER или SPI_GETSCREENREADER.

SPI_GETSERIALKEYS

Данный параметр не поддерживается.

Windows Server 2003 и Windows XP/2000: пользователь должен использовать панель управления для управления этой настройкой.

SPI_GETSHOWSOUNDS

Определяет состояние флага отображения звуков (Show Sounds). Если этот флаг установлен, то пользователь запрашивает приложения графически отображать информацию (present information visually), которая при прочих условиях представлялась бы только в звуковой форме (audible form). Параметр pvParam должен указывть на значение типа BOOL, в которое будет записано значение TRUE, если отображение звуков включено, или значение FALSE, если оно выключено.

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

SPI_GETSOUNDSENTRY

Возвращает информацию о доступности функции сторожа звука (SoundSentry accessibility featute). Параметр pvParam должен указывать на структуру SOUNDSENTRY, в которую будет записана информация. Поле cbSize этой структуры и значение параметра uiParam должны быть установлены в значение sizeof(SOUNDSENTRY).

SPI_GETSTICKYKEYS

Возвращает информацию о доступности функции залипания клавиш (StickyKeys accessibility feature). Параметр pvParam должен указывать на структуру STICKYKEYS, в которую будет записана запрошенная информация. Поле cbSize этой структуры и значение параметра uiParam должны быть установлены в значение sizeof(STICKYKEYS).

SPI_GETTOGGLEKEYS

Возвращает информацию о доступности режима озвучивания переключения режимов (ToggleKeys accessibility feature). Параметр pvParam должен указывать на структуру TOGGLEKEYS, в которую записывается запрошенная информация. Поле cbSize этой структуры и значение параметра uiParam должны быть установлены в значение sizeof(TOGGLEKEYS).

SPI_SETACCESSTIMEOUT

Устанавливает период таймаута (time-out period) настроек доступа. Параметр pvParam должен указывать на структуру ACCESSTIMEOUT, которая содержит новые настройки. Поле cbSize этой структуры и значение параметра uiParam должны быть установлены в значение sizeof(ACCESSTIMEOUT).

SPI_SETAUDIODESCRIPTION

Включает или выключает функцию аудиоописаний (sudio descriptions feature). Параметр pvParam должен указывать на структуру AUDIODESCRIPTION.

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

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

Windows Server 2003 и Windows XP/2000: данный флаг не поддерживается.

SPI_SETCLIENTAREAANIMATION

Включает или выключает анимацию клиентской области. Параметр pvParam должен содержать значение типа BOOL. Установите его значение равным TRUE для включения анимации и других переходных эффектов в клиентской области, или равным FALSE для их выключения.

Такие возможности отображения как подсвечивание (flashing), мигание (blinking), мерцание (flickering) и движущееся содержимое окна (moving content) могут вызывать приступы у пользователей со зрительно-чувствительной эпилепсией (photo-sensitive epilepsy).

Данный флаг позволяет вам включать или выключать такие эффекты.

Windows Server 2003 и Windows XP/2000: данный флаг не поддерживается.

SPI_SETDISABLEOVERLAPPEDCONTENT

Включает или выключает перекрывающиеся элементы (такие как фоновые изображения и водяные знаки). Параметр pvParam должен содержать значение типа BOOL. Установите его значение равным TRUE, для отключения перекрывающихся элементов, или равным FALSE для их включения.

Такие возможности отображения как: фоновые изображения (background images), текстурированный фон (textured background), водяные знаки (water marks) на документах, наложение полупрозрачного изображения на другое изображение (alpha blending) и прозрачность (transparency) могут уменьшать констраст между основным содержимым и фоном, усложняя восприятие информации для пользователей с плохим зрением (low vision).

Данный флаг позволяет вам включать или выключать такие перекрывающиеся элементы.

Windows Server 2003 и Windows XP/2000: данный флаг не поддерживается.

SPI_SETFILTERKEYS

Устанавливает параметры фильтрации клавиш. Параметр pvParams должен указывать на структуру FILTERKEYS, которая содержит новые параметры. Поле cbSize этой структуры и значение параметра uiParam должны быть установлены в значение sizeof(FILTERKEYS).

SPI_SETFOCUSBORDERHEIGHT

Устанавливает высоту верхней и нижней границы прямоугольника, рисуемого функцией DrawFocusRect. Параметр pvParam должен содержать новое значение высоты.

Windows 2000: данный флаг не поддерживается.

SPI_SETFOCUSBORDERWIDTH

Устанавливает ширину левой и правой границы прямоугольника, рисуемого функцией DrawFocusRect. Параметр pvParam должен содержать новое значение ширины.

Windows 2000: данный флаг не поддерживается.

SPI_SETHIGHCONTRAST

Устанавливает параметры режима высокой контрастности. Параметр pvParam должен указывать на структуру HIGHCONTRAST, которая содержит новые параметры. Поле cbSize этой структуры и значение параметра uiParam должны быть установлены в значение sizeof(HIGHCONTRAST).

SPI_SETLOGICALDPIOVERRIDE

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

SPI_SETMESSAGEDURATION

Устанавливает продолжительность, в секундах, промежутка времени, в течение которого должны показываться высплывающие окна (pop-ups). Параметр pvParam должен содержать новую длительность.

Пользователям с нарушениями зрения или когнитивных способностей, такими как СДВГ (синдром дефицита внимания с гиперактивностью (ADHD)) и дислексия (dyslexia), возможно, потребуется больше времени, чтобы читать текст в уведомлениях.

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

Windows Server 2003 и Windows XP/2000: данный флаг не поддерживается.

SPI_SETMOUSECLICKLOCK

Включает или выключает блокировку щелчка мыши (Mouse ClickLock feature). Эта функция временно блокирует (locks down) основную кнопку мыши (primary mouse button) когда эта кнопка была нажата на время, заданное параметром SPI_SETMOUSECLICKLOCKTIME. Параметр pvParam должен содержать значение TRUE для включения этой функции, или значение FALSE для её выключения. По умолчанию она выключена.

Windows 2000: данный флаг не поддерживается.

SPI_SETMOUSECLICKLOCKTIME

Устанавливает время задержки (time delay) перед блокированием основной кнопки мыши. Значение параметра uiParam должно быть равно нулю. Параметр pvParam указывает на значение типа DWORD, которое определяет время задержки в миллисекундах. Например, задайте значение 1000 для задержки в 1 секунду. По умолчанию величина задержки составляет 1200 миллисекунд.

Windows 2000: данный флаг не поддерживается.

SPI_SETMOUSEKEYS

Устанавливает параметры режима управления курсором мыши (MouseKeys accessibility feature). Параметр pvParam должен указывать на структуру MOUSEKEYS, которая содержит новые параметры. Поле cbSize этой структуры и значение параметра uiParam должны быть установлены в значение sizeof(MOUSEKEYS).

SPI_SETMOUSESONAR

Включает или выключает функцию сонара (Sonar accessibility feature). Эта функция в течение короткого промежутка времени отображает несколько концентрических окружностей вокруг указателя мыши когда пользователь нажимает и отпускает клавишу Ctrl. Значение параметра pvParam должно быть равно TRUE, для включения сонара, или FALSE, для его выключения. По умолчанию он выключен.

Windows 2000: данный флаг не поддерживается.

SPI_SETMOUSEVANISH

Включает или выключает функцию скрытия (Vanish feature). Данная функция скрывает курсор мыши, когда пользователь печатает, и вновь отображает указатель мыши при перемещении мыши. Параметр pvParam должен содержать значение TRUE для включения этой функции, или FALSE, для её отключения. По умолчанию она выключена.

Windows 2000: данный флаг не поддерживается.

SPI_SETSCREENREADER

Включает или выключает утилиту рецензента экрана (screen review utility). Значение параметра uiParam содержит значение TRUE для её включения, или значение FALSE для её выключения.

Рассказчик (Narrator), читатель экрана (screen reader), который входит в состав Windows не устанавливается флагами SPI_SETSCREENREADER или SPI_GETSCREENREADER.

SPI_SETSERIALKEYS

Данный флаг не поддерживается.

Windows Server 2003 и Windows XP/2000: пользователь должен использовать панель управления для управления этой настройкой.

SPI_SETSHOWSOUNDS

Включает или выключает функцию отображения звуков (ShowSounds feature). Параметр uiParam должен содержать значение TRUE, для включения этой функции, или значение FALSE для её выключения.

SPI_SETSOUNDSENTRY

Устанавливает параметры функции сторожа звука (SoundSentry accessibility feature). Параметр pvParam должен указывать на структуру SOUNDSENTRY, которая содержит новые параметры. Поле cbSize этой структуры и значение параметра uiParam должны быть установлены в значение sizeof(SOUNDSENTRY).

SPI_SETSTICKYKEYS

Устанавливает параметры функции залипания клавиш (StickyKeys accessibility feature). Параметр pvParam должен указывать на структуру STICKYKEYS, которая содержит новые параметры. Поле cbSize этой структуры и значение параметра uiParam должны быть установлены в значение sizeof(STICKYKEYS).

SPI_SETTOGGLEKEYS

Устанавливает параметры режима озвучки переключений режимов (ToggleKeys accessibility feature). Параметр pvParam должен указывать на структуру TOGGLEKEYS, которая содержит новые параметры. Поле cbSize этой структуры и значение параметра uiParam должны быть установлены в значение sizeof(TOGGLEKEYS).

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


Параметры функции BitBlt

BLACKNESS

Заполняет целевой прямоугольник цветом, ассоциированным с нулем в физической палитре. (Для физической палитры по умолчанию это черный цвет).

CAPTUREBLT

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

DSTINVERT

Инвертирует целевой прямоугольник.

MERGECOPY

Объединяет цвета исходного прямоугольника с цветами кисти, выбранной в hdcDest, с помощью логической операции И.

MERGEPAINT

Объединяет с помощью логической операции ИЛИ цвета исходного инвертированного прямоугольника с цветами целевого прямоугольника.

NOMIRRORBITMAP

Предохраняет растровое изображение от зеркалирования.

NOTSRCCOPY

Копирует исходный инвертированный прямоугольник в целевой.

NOTSRCERASE

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

PATCOPY

Копирует в целевое изображение кисть, выбранную в hdcDest.

PATINVERT

Объединяет цвета кисти, выбранной в hdcDest, и цвета целевого прямоугольника с помощью логической операции ИСКЛЮЧАЮЩЕЕ ИЛИ.

PATPAINT

Объединяет цвета кисти, выбранной в hdcDest, с цветами инвертированного исходного прямоугольника с помощью логической операции ИЛИ. Результат этой операции затем объединяется с цветами целевого прямоугольника с помощью логической операции ИЛИ.

SRCAND

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

SRCCOPY

Копирует исходный прямоугольник напрямую в целевой прямоугольник.

SRCERASE

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

SRCINVERT

Объединяет цвета исходного и целевого прямоугольников с помощью логической операции ИСКЛЮЧАЮЩЕЕ ИЛИ.

SRCPAINT

Объединяет цвета исходного и целевого прямоугольников с помощью логической операции ИЛИ.

WHITENESS

Заполняет целевой прямоугольник цветом, ассоциированным с номером 1 в физической палитре. (Для физической палитры по умолчанию это белый цвет).

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


Параметры функции GetDeviceCaps

ASPECTX

Относительная ширина пикселя устройства, используемая при рисовании линий.

ASPECTXY

Ширина диагонали пикселя устройства, используемая при рисовании линий.

ASPECTY

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

BITALIGNMENT

Предпочтительное горизонтальное выравнивание при рисовании, выраженное в множителе (multiple) для пикселей. Для наилучшего рисования, окна должны быть выровнены на величину, кратную значению этого параметра. Значение равное нулю, говорит о том, что устройство ускорено (accelerated) и может быть использовано любое выравнивание.

BITSPIXEL

Количество смежных цветовых битов для каждого пикселя.

CLIPCAPS

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

COLORMGMTCAPS

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

COLORRES

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

CURVECAPS

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

DRIVERVERSION

Версия драйвера устройства.

HORZRES

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

HORZSIZE

Ширина физического экрана в миллиметрах.

LINECAPS

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

LOGPIXELSX

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

LOGPIXELSY

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

NUMBRUSHES

Количество кистей специфичных для устройства.

NUMCOLORS

Если устройство имеет глубину цвета не более чем 8 бит на пиксель, то возвращается количество элементов в цветовой таблице устройства. Для устройств с большей глубиной цвета возвращается значение 1.

NUMFONTS

Количество шрифтов специфичных для устройства.

NUMPENS

Количество перьев специфичных для устройства.

NUMRESERVED

Количество зарезервированных элементов в системной палитре. Данный параметр допустим только в том случае, если в параметре RASTERCAPS установлен флаг RC_PALETTE и драйвер совместим с 16-разрядными версиями Windows.

PDEVICESIZE

Зарезервировано.

PHYSICALHEIGHT

Для печатающих устройств: высота физической страницы, в единицах устройства. Например, принтер настроенный на печать 600dpi на листе бумаги размером 8,5 на 11 дюймов имеет высоту физического листа равную 6600 единиц устройства. Учтите, что физическая страница почти всегда больше печатаемой области листа, и никогда не бывает меньше ее.

PHYSICALOFFSETX

Для печатающих устройств: расстояние от левого края физического листа до левого края печатаемой области, в единицах устройства. Например, для принтера настроенного на печать 600 dpi на бумаге размером 8,5 на 11 дюймов, который не может печатать на расстоянии менее 0,25 дюйма от левого края листа, значение данного параметра равно 150 единиц устройства.

PHYSICALOFFSETY

Для печатающих устройств: расстояние от верхней границы физического листа до верхней границы печатаемой области, в единицах устройства. Например, для принтера настроенного на печать 600 dpi на бумаге размером 8,5 на 11 дюймов, который не может печатать на расстоянии менее 0,5 дюйма от верхнего края листа, значение данного параметра равно 300 единиц устройства.

PHYSICALWIDTH

Для печатающих устройств: ширина физической страницы, в единицах устройства. Например, принтер настроенный на печать 600dpi на листе бумаги размером 8,5 на 11 дюймов имеет ширину физического листа равную 5100 единиц устройства. Учтите, что физическая страница почти всегда больше печатаемой области листа, и никогда не бывает меньше ее.

PLANES

Количество цветовых плоскостей.

POLYGONALCAPS

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

RASTERCAPS

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

SCALINGFACTORX

Масштабный коэффициент для горизонтальной оси принтера.

SCALINGFACTORY

Масштабный коэффициент для вертикальной оси принтера.

SHADEBLENDCAPS

Возможности затенения (shading) и смешивания (blending) устройства. Допустимые значения перечислены здесь.

SIZEPALETTE

Количество элементов в системной палитре. Данный параметр допустим только в том случае, если в параметре RASTERCAPS установлен флаг RC_PALETTE и драйвер совместим с 16-разрядными версиями Windows.

TECHNOLOGY

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

Если параметр hdc содержит описатель контекста устройства улучшенного (enhanced) метафайла, то его технология соответствует устройству заданному в функции CreateEnhMetaFile. Для определения того соответствует ли описатель расширенному метафайлу используйте функцию GetObjectType.

TEXTCAPS

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

VERTRES

Высота экрана в растровых линиях; или, для принтеров, высота печатаемой области листа, в пикселях.

VERTSIZE

Высота физического экрана в миллиметрах.

VREFRESH

Для дисплейных устройств: текущая частота вертикальной равертки (частота обновления экрана) в герцах.

Значение частоты 0 или 1 соответствует частоте по умолчанию для данного дисплейного устройства. Частота по умолчанию обычно устанавливается при включении видеокарты или материнсксой платы компьютера, или же программой конфигурирования, которая не использует такие функции как ChangeDisplaySettings.

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


Параметры функции GetWindow (GW_*)

GW_CHILD

Возвращает дескриптор дочернего окна расположенного на вершине Z-последовательности, если окно hWnd является родительским окном. Если заданное окно не является родительским, то функция возвращает значение NULL. Функция проверяет только дочерние окна окна hWnd. Другие окна-потомки не проверяются.

GW_ENABLEDPOPUP

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

GW_HWNDFIRST

Возвращает дескриптор окна того же типа, что и окно hWnd, находящееся на вершине Z-последовательности.

Если окно hWnd - это topmost окно, то возвращаемый функцией дескриптор принадлежит topmost окну. Если окно hWnd - это окно верхнего уровня, то возвращаемый функцией дескриптор принадлежит окну верхнего уровня. Если окно hWnd - это дочернее окно, то возвращаемый функцией дескриптор принадлежит "братскому" (sibling) окну.

GW_HWNDLAST

Возвращает дескриптор окна того же типа, что и окно hWnd, находящееся в самом низу Z-последовательности.

Возвращает дескриптор окна того же типа, что и окно hWnd, находящееся на вершине Z-последовательности.

Если окно hWnd - это topmost окно, то возвращаемый функцией дескриптор принадлежит topmost окну. Если окно hWnd - это окно верхнего уровня, то возвращаемый функцией дескриптор принадлежит окну верхнего уровня. Если окно hWnd - это дочернее окно, то возвращаемый функцией дескриптор принадлежит "братскому" (sibling) окну.

GW_HWNDNEXT

Возвращает дескриптор окна, расположенного в Z-последовательности под окном hWnd.

Если окно hWnd - это topmost окно, то возвращаемый функцией дескриптор принадлежит topmost окну. Если окно hWnd - это окно верхнего уровня, то возвращаемый функцией дескриптор принадлежит окну верхнего уровня. Если окно hWnd - это дочернее окно, то возвращаемый функцией дескриптор принадлежит "братскому" (sibling) окну.

GW_HWNDPREV

Возвращает дескриптор окна, расположенного в Z-последовательности над окном hWnd.

Если окно hWnd - это topmost окно, то возвращаемый функцией дескриптор принадлежит topmost окну. Если окно hWnd - это окно верхнего уровня, то возвращаемый функцией дескриптор принадлежит окну верхнего уровня. Если окно hWnd - это дочернее окно, то возвращаемый функцией дескриптор принадлежит "братскому" (sibling) окну.

GW_OWNER

Возвращает дескриптор окна, владеющего окном hWnd, если таковое есть.

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


Позиции курсора мыши (HT*)

HTBORDER

на рамке окна с неизменяемыми размерами.

HTBOTTOM

на нижней горизонтальной рамке окна с изменяемыми размерами.

HTBOTTOMLEFT

в левом нижнем угле окна с изменяемыми размерами.

HTBOTTOMRIGHT

в правом нижнем угле окна с изменяемыми размерами.

HTCAPTION

над заголовком окна.

HTCLIENT

в клиентской части окна.

HTCLOSE

над кнопкой "Close".

HTERROR

на фоне экрана или над разделительной линией между окнами.

HTGROWBOX

в блоке управления размером.

HTHELP

над кнопкой "Help".

HTHSCROLL

над горизонтальной полосой прокрутки (scroll bar).

HTLEFT

над левой границей окна с изменяемыми размерами.

HTMENU

над меню.

HTMAXBUTTON

над кнопкой "Maximize".

HTMINBUTTON

над кнопкой "Minimize".

HTNOWHERE

над фоном экрана или над разделительной линией между окнами.

HTREDUCE

то же самое что HTMINBUTTON.

HTRIGHT

над правой границей окна с изменяемыми размерами.

HTSIZE

то же самое что HTGROWBOX.

HTSYSMENU

над меню окна или над кнопкой "Close" дочернего окна.

HTTOP

над верхней горизонтальной границей окна.

HTTOPLEFT

над левым верхним углом границы окна.

HTTOPRIGHT

над правым верхним углом границы окна.

HTTRANSPARENT

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

HTVSCROLL

над вертикальной полосой прокрутки (scroll bar).

HTZOOM

то же самое что HTMAXBUTTON.

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


Порядок выбора шрифта (OUT_*_PRECIS)

OUT_CHARACTER_PRECIS

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

OUT_DEFAULT_PRECIS

Определяет поведение по умолчанию.

OUT_DEVICE_PRECIS

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

OUT_OUTLINE_PRECIS

Указывает выбрать шрифт формата TrueType или какой-либо другой контурный шрифт.

OUT_PS_ONLY_PRECIS

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

OUT_RASTER_PRECIS

Указывает выбрать растровый шрифт при наличии нескольких шрифтов с одинаковым наименованием.

OUT_STRING_PRECIS

Данное значение не используется, но возвращается при перечислении растровых шрифтов.

OUT_STROKE_PRECIS

Данное значение не используется, но возвращается при перечислении векторных, контурных шрифтов и шрифтов формата TrueType.

OUT_TT_ONLY_PRECIS

Указывает выбрать шрифт формата TrueType. Если эти шрифты не установлены, то система ведет себя по умолчанию.

OUT_TT_PRECIS

Указывает системе выбрать шрифт формата TrueType при наличии нескольких шрифтов с одинаковым наименованием.

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


Растровые возможности (RC_*)

RC_BANDING

Требует поддержки связи (banding).

RC_BITBLT

Допускает перемещение битовых карт (bitmaps).

RC_BITMAP64

Допускает поддержку битовых карт размером более 64 килобайт.

RC_DI_BITMAP

Допускает поддержку функций SetDIBits и GetDIBits.

RC_DIBTODEV

Допускает поддержку функции SetDIBitsToDevice.

RC_FLOODFILL

Допускает выполнение заливок (flood fills),

RC_PALETTE

Описывает устройство основанное на палитре.

RC_SCALING

Допускает масштабирование (scaling).

RC_STRETCHBLT

Допускает выполнение функции StretchBlt.

RC_STRETCHDIB

Допускает выполнение функции StretchDIBits.

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


Расширенные стили окна (WS_EX_*)

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)


Результаты GetFontLanguageInfo (GCP_*)

FLI_GLYPHS

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

GCP_DBCS

Двухбатовый набор символов.

GCP_DIACRITIC

Шрифт/язык содержит глифы для диакритических знаков.

GCP_GLYPHSHAPE

Шрифт/язык содержит несколько глифов на кодовую точку или на комбинацию кодовых точек (поддерживается изменение формы и/или лигатуры). Шрифт также содержит расширенную таблицу глифов, предоставляя дополнительные глифы для дополнительных форм. Если возвращается это значение, то GetCharacterPlacement должна использовать массив lpGlyphs, а при отрисовке строки в функцию ExtTextOut должен передаваться флаг ETO_GLYPHINDEX,

GCP_KASHIDA

Шрифт/язык содержит кашиды (протяжки в арабском письме).

GCP_LIGATE

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

GCP_REORDER

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

GCP_USEKERNING

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

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


Результаты WM_NCCALCSIZE (WVR_*)

WVR_ALIGNBOTTOM

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

WVR_ALIGNLEFT

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

WVR_ALIGNRIGHT

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

WVR_ALIGNTOP

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

WVR_HREDRAW

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

WVR_REDRAW

WVR_HREDRAW | WVR_VREDRAW.

WVR_VALIDRECTS

Указывает, что по завершении обработки сообщения WM_NCCALCSIZE прямоугольные области описываемые элементами rgrc[1] и rgrc[2] структуры NCCALCSIZE_PARAMS содержат верную информацию.

WVR_VREDRAW

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

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


Режимы растяжения

BLACKONWHITE

(1)

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

COLORONCOLOR

(3)

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

HALFTONE

(4)

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

STRETCH_ANDSCANS

Аналогично BLACKONWHITE.

STRETCH_DELETESCANS

Аналогично COLORONCOLOR.

STRETCH_HALFTONE

Аналогично HALFTONE.

STRETCH_ORSCANS

Аналогично WHITEONBLACK.

WHITEONBLACK

(2)

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

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


Семейства шрифтов (FF_*)

FF_DECORATIVE

Недавно введенные шрифты. Например, Old English.

FF_DONTCARE

Использовать шрифт по умолчанию.

FF_MODERN

Шрифты с постоянной шириной, с засечками или без них. Например, Pica, Elite и CourierNew.

FF_ROMAN

Шрифты с переменной шириной (пропорциональной) и с засечками. Например, MS Serif.

FF_SCRIPT

Шрифты, разработанные, чтобы выглядеть подобно рукописным. Например, Script и Cursive.

FF_SWISS

Шрифты с переменной шириной (пропорциональной) и без засечек. Например, MS Sans Serif.

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


Системные команды (SC_*)

SC_CLOSE

Закрыть окно.

SC_CONTEXTHELP

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

SC_DEFAULT

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

SC_HOTKEY

Активировать окно ассоциированное с определенной приложением горячей клавишей. Параметр lparam задает активируемое окно.

SC_HSCROLL

Прокрутка по горизонтали.

SC_KEYMENU

Получает меню окна в результате нажатия клавишы.

SC_MAXIMIZE

Развернуть окно.

SC_MINIMIZE

Свернуть окно.

SC_MONITORPOWER

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

-1 - монитор переходит в нормальный режим работы.

1 - монитор переходит в режим с пониженным энергопотреблением.

2 - монитор выключается.

SC_MOUSEMENU

Возвращает меню окна вызванное в результате клика мышью.

SC_MOVE

Перемещает окно.

SC_NEXTWINDOW

Перемещает к следующему окну.

SC_PREVWINDOW

Перемещает к предыдущему окну.

SC_RESTORE

Восстанавливает окно в его нормальном положении и размере.

SC_SCREENSAVE

Вызывает приложение заставки определенное в секции [boot] файла System.ini.

SC_SIZE

Изменяет размер окна.

SC_TASKLIST

Активирует меню "Пуск".

SC_VSCROLL

Прокрутка по вертикали.

SCF_ISSECURE

Указывает, что заставка является безопасной.

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


События управления питанием (PBT_*)

PBT_APMPOWERSTATUSCHANGE

Было изменено состояние энергопотребления.

PBT_APMRESUMEAUTOMATIC

Операция автоматически возобновляется из состояния с пониженным энергопотреблением. Это сообщение отправляется каждый раз при пробуждении системы.

PBT_APMRESUMESUSPEND

Операция возобновляется из состояния с пониженным энергопотреблением. Это сообщение отправляется после PBT_APMRESUMEAUTOMATIC если пробуждение вызвано пользовательским вводом (например, нажатием на клавишу клавиатуры).

PBT_APMSUSPEND

Система приостанавливает операции.

PBT_POWERSETTINGCHANGE

Получено событие изменения настройки питания.

В Windows Server 2003 и Windows XP также поддерживаются следующие значения:

PBT_APMBATTERYLOW

Низкий уровень заряда аккумулятора.

PBT_APMOEMEVENT

Произошло OEM-описанное событие. Windows Server 2008 и Windows Vista не поддерживают эти события, так как эти системы поддерживают только ACPI. События APM BIOS не поддерживаются.

PBT_APMQUERYSUSPEND

Запрос на переход в спящий режим.

PBT_APMQUERYSUSPENDFAILED

Запрос на переход в спящий режим больше не актуален.

PBT_APMRESUMECRITICAL

Операция возобновляется после экстренного перехода в спящий режим.

Заголовочный файл: winuser.h (включен в windows.h)


Сообщения окна (WM_*)

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_OWNERDISPLAY.

Окно получает это сообщение с помощью своей оконной процедуры WindowProc.

wparam содержит размер, в символах, буфера, на который указывает параметр lparam.

lparam содержит указатель на буфер, в который должно быть записано имя формата буфера обмена.

Если приложение обрабатывает это сообщение, то оно должно вернуть знаяение нуль.

При обработке этого сообщения владелец буфера обмена должен скопировать имя формата, непревышающее размера, указанного в wparam, в указанный буфер.

Окно просмотрщика буфера обмена посылает это сообщение владельцу буфера обмена для определения имени формата CF_OWNERDISPLAY - например, при инициализации списка доступных форматов.

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.

Параметр 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

Приложение рассылает это сообщение всем окнам верхнего уровня после изменения пула (pool) шрифтов.

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_MENUCOMMAND

Отправляется когда пользователь выбирает пункт меню.

wparam содержит порядковый номер выбранного пункта. Нумерация начинается с нуля.

lparam содержит описатель меню, которому принадлежит выбранный пункт.

Сообщение WM_MENUCOMMAND передает приложению описатель меню - посредством его вы можете получить доступ к данным меню, хранящимся в структуре MENUINFO - также, вы получаете порядковый номер выбранного пункта, который обычно и нужен приложению. В отличие от сообщения WM_MENUCOMMAND, сообщение WM_COMMAND передает идентификатор пункта меню.

Сообщение WM_MENUCOMMAND отправляется только для меню, у которого в поле dwStyle структуры MENUINFO установлен стиль MNS_NOTIFYBYPOS.

WM_MENUDRAG

Отправляется владельцу меню, поддерживающего операцию drag-and-drop, когда пользователь перетаскивает пункт меню.

wparam содержит положение пункта меню, для которого начата операция перетаскивания.

lparam содержит описатель меню, которому принадлежит перетаскиваемый пункт.

В ответ на это сообщение приложение должно вернуть одно из значений, перечисленных ниже.

MND_CONTINUE (0) - меню должно остаться активным. Если кнопка мыши отпущена (mouse released), то оно должно игнорироваться.

MND_ENDMENU (1) - меню должно быть закрыто.

В ответ на это сообщение приложение может вызвать функцию DoDragDrop.

Для создания меню, поддерживающего операцию drag-and-drop, вызовите функцию SetMenuInfo с флагом MNS_DRAGDROP.

WM_MENUGETOBJECT

Отправляется владельцу меню, поддерживающего операции drag-and-drop, когда курсор мыши входит в пункт меню или перемещается от его центра к верхней или нижней границе.

wparam не используется.

lparam содержит указатель на структуру MENUGETOBJECTINFO.

В овтет на это сообщение приложение должно вернуть одно из значений, перечисленных ниже.

MNGO_NOERROR (0x00000001) - указатель на интерфейс был записан в поле pvObj структуры MENUGETOBJECTINFO.

MNGO_NOINTERFACE (0x00000000) - интерфейс не поддерживается.

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)


Состояния пункта меню (MFS_*)

MFS_CHECKED

0x00000008L

Пункт меню выбран. Дополнительная информация о выбранных пунктах меню хранится в поле hbmpChecked.

MFS_DEFAULT

0x00001000L

Пункт меню является пунктом меню по умолчанию. Меню может иметь только один пункт по умолчанию, который отображается полужирным шрифтом.

MFS_DISABLED

0x00000003L

Пункт меню недоступен и закрашен серым цветом.Это значит, что данный пункт не может быть выбран пользователем. Данный флаг аналогичен флаг MFS_GRAYED.

MFS_ENABLED

0x00000000L

Пункт меню доступен и может быть выбран. Это состояние по умолчанию.

MFS_GRAYED

0x00000003L

Пункт меню недоступен и закрашен серым цветом.Это значит, что данный пункт не может быть выбран пользователем. Данный флаг аналогичен флаг MFS_DISABLED.

MFS_HILITE

0x00000080L

Пункт меню подсвещен.

MFS_UNCHECKED

0x00000000L

Пункт меню не выбран. Дополнительная информация о невыбранных пунктах меню хранится в поле hbmpChecked.

MFS_UNHILITE

0x00000000L

Удаляет подсветку пункта меню. Это состояние по умолчанию.

Заголовочный файл: winuser.h (включен в windows.h)


Состояния элемента (CDIS_*)

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


Стартовые позиции свернутого окна (ARW_*)

ARW_BOTTOMLEFT

Начало в левом нижнем углу экрана. Используется как значение по умолчанию.

ARW_BOTTOMRIGHT

Начало в правом нижнем углу экрана. Аналогично значению ARW_STARTRIGHT.

ARW_STARTMASK

Аналогично ARW_TOPRIGHT. В msdn не описана.

ARW_STARTRIGHT

Аналогично ARW_BOTTOMRIGHT.

ARW_STARTTOP

Аналогично ARW_TOPLEFT.

ARW_TOPLEFT

Начало в левом верхнем углу экрана. Аналогично значению ARW_STARTTOP.

ARW_TOPRIGHT

Начало в правом верхнем углу экрана. Аналогично значению (ARW_STARTTOP | ARW_STARTRIGHT),

Заголовочный файл: winuser.h (включен в windows.h)


Стили диалогового окна (DS_*)

DS_3DLOOK

Устаревший. Система автоматически применяет трехмерное отображение к диалоговому окну.

DS_ABSALIGN

Указывает, что координаты диалогового окна являются экранными координатами. Если этот стиль не указан, то координаты являются клиентскими.

DS_CENTER

Располагает диалоговое окно в центре рабочей области монитора.

DS_CENTERMOUSE

Располагает диалоговое окно так, чтобы курсор мыши располагался в его центре.

DS_CONTEXTHELP

Включает знак вопроса в заголовок диалогового окна. Когда пользователь нажимает на эту кнопку курсор мыши принимает форму знака вопроса. Если после этого пользователь кликнет по элементу управления, то данный элемент управления получит сообщение WM_HELP.

DS_CONTROL

Создается далоговое окно, которое является дочерним окном другого диалогового окна, как например вкладка в наборе вкладок. Это позволяет пользователю перемещаться между окнами с помощью горячих клавиш.

DS_FIXEDSYS

Указывает диалоговому окну использовать фиксированный системный шрифт (SYSTEM_FIXED_FONT) вместо системного шрифта по умолчанию (SYSTEM_FONT). Это моноширинный шрифт совместимый с системным шрифтом в 16-разрядных версиях Windows до версии 3.0.

DS_LOCALEDIT

Применяется только в 16-разрядных приложениях. Этот стиль указывает полям ввода диалогового окна выделять память из сегмента данных приложения.В противном случае поля ввода выделяют память из глобальной области.

DS_MODALFRAME

Создается диалоговое окно с модальной рамкой, которая может быть объединена с заголовком и меню окна путем определения стилей WS_CAPTION и WS_SYSMENU.

DS_NOFAILCREATE

Создает окно даже если произошла ошибка - например, если дочернее окно не может бытьсоздано, или если система не может создать специальный сегмент данных для поля ввода.

DS_NOIDLEMSG

Подавляет сообщения WM_ENTERIDLE, которые система отправляет владельцу диалогового окна пока оно отбражается.

DS_SETFONT

Указывает, что заголовок шаблона диалогового окна (стандартный или расширенный) содержит дополнительные данные, определяющие шрифт, используемый для текста в клиентской области и элементах управления диалогового окна. Если это возможно, система старается выбрать шрифт согласно указанным данным шрифта. Система передает диалоговому окну описатель шрифта путем отправки каждому элементу управления сообщения WM_SETFONT.

Если не указан ни DS_SETFONT, ни DS_SHELLFONT, то шаблон диалогового окна не содержит данных о шрифте.

DS_SETFOREGROUND

Указывает системе использовать функцию SetForegroundWindow, для отображения диалогового окна поверх других окон. Этот стиль используется для модальных диалоговых окон, которые требуют немедленного внимания со стороны пользователя.

DS_SHELLFONT

Указывает, что диалоговое окно должно использовать системный шрифт.

DS_SYSMODAL

Этот стиль устарел и используется для совместимости с 16-разрядными версиями Windows. Если вы указываете этот стиль, то система создает диалоговое окно с установленным стилем WS_EX_TOPMOST. Не используйте этот стиль совместно со стилем DS_CONTROL.

Заголовочный файл: winuser.h (включен в windows.h)


Стили кисти (BS_*)

BS_DIBPATTERN

(5)

Шаблон кисти описывается в виде независимой от устройства битовой карты (DIB). Если значения поля lbStyle равно BS_DIBPATTERN, то поле lbHatch содержит описатель упакованного DIB.

BS_DIBPATTERN8X8

(8)

Аналогично BS_DIBPATTERN.

BS_DIBPATTERNPT

(6)

Шаблон кисти описывается в виде независимой от устройства битовой карты (DIB). Если значение поля lbStyle равно BS_DIBPATTERNPT, то поле lbHatch содержит указатель на упакованный DIB.

BS_HATCHED

(2)

Заштрихованная кисть.

BS_HOLLOW

(BS_NULL)

Пустая (hollow) кисть.

BS_NULL

(1)

Тоже самое что BS_HOLLOW.

BS_PATTERN

(3)

Шаблон кисти описывается битовой картой в памяти (memory bitmap).

BS_PATTERN8X8

(7)

Аналогично BS_PATTERN.

BS_SOLID

(0)

Сплошная (solid) кисть.

Заголовочный файл: wingdi.h (включен в windows.h)


Стили окна (WS_*)

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)


Стили оконного класса (CS_*)

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)


Стили пера (PS_*)

PS_ALTERNATE

(8)

Для функции ExtCreatePen. Перо устанавливает каждый второй пиксель (применим только для косметических перьев).

PS_DASH

(1)

Перо является пунктирным (dashed). Данный стиль допустим только если ширина пера равна одной единице устройства, или меньше.

PS_DASHDOT

(3)

В пере тире и точки чередуются друг с другом. Данный стиль допустим только если ширина пера равна одной единице устройства, или меньше.

PS_DASHDOTDOT

(4)

В пере чередуются тире и две точки. Данный стиль допустим только если ширина пера равна одной единице устройства, или меньше.

PS_DOT

(2)

Перо является точечным (dotted). Данный стиль допустим только если ширина пера равна одной единице устройства или меньше.

PS_INSIDEFRAME

(6)

Перо сплошное (solid). Когда это перо используется в какой-либо функции GDI, рисующей с учетом ограничивающего прямоугольника, размеры фигуры уменьшаются так, чтобы она полностью поместилась в ограничивающий прямоугольник с учетом ширины пера. Этот стиль влияет только на геометрические перья.

PS_NULL

(5)

Перо невидимо.

PS_SOLID

(0)

Перо сплошное (solid).

PS_USERSTYLE

(7)

Только для функции ExtCreatePen. Перо использует стилистический массив, предоставленный пользователем.

Заголовочный файл: wingdi.h (включен в windows.h)


Технологии устройств (DT_*)

DT_CHARSTREAM

Поток символов.

DT_DISPFILE

Дисплейный файл (display file) (используется для хранения информации выдаваемой на экран).

DT_METAFILE

Метафайл.

DT_PLOTTER

Векторный плоттер (plotter).

DT_RASCAMERA

Растровая камера.

DT_RASDISPLAY

Растровый дисплей.

DT_RASPRINTER

Растровый принтер.

Заголовочный файл: wingdi.h (включен в windows.h)


Типы ввода (DLGC_*)

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)


Типы объектов (OBJ_*)

OBJ_BITMAP

Растровое изображение (bitmap).

OBJ_BRUSH

Кисть.

OBJ_COLORSPACE

Пространство цветов.

OBJ_DC

Контекст устройства.

OBJ_ENHMETADC

Расширенный (enhanced) метафайл DC.

OBJ_ENHMETAFILE

Расширенный метафайл.

OBJ_EXTPEN

Расширенное перо.

OBJ_FONT

Шрифт.

OBJ_MEMDC

Контекст контекста устройства памяти (memory DC).

OBJ_METAFILE

Метафайл.

OBJ_METADC

Метафайл DC.

OBJ_PAL

Палитра.

OBJ_PEN

Перо.

OBJ_REGION

Регион.

Заголовочный файл: wingdi.h (включен в windows.h)


Типы пунктов меню (MFT_*)

MFT_BITMAP

0x00000004L

Пункт меню отрисовывается с использованием растрового изображения (bitmap). Младшее слово поля dwTypeData содержит описатель растрового изображения, значение поля cch игнорируется.

Данный флаг замещается флагом MIIM_BITMAP в поле hbmpItem.

MFT_MENUBARBREAK

0x00000020L

Пункт меню размещается на новой строке (для полоски меню) или в новой колонке (для раскрывающегося меню, подменю, или контекстного меню). В раскрывающемся меню, подменю, и контекстном меню новая колонка отделяется от старой с помощью вертикальной линии.

MFT_MENUBREAK

0x00000040L

Пункт меню размещается на новой строке (для полоски меню) или в новой колонке (для раскрывающегося меню, подменю, или контекстного меню). В раскрывающемся меню, подменю, и контекстном меню новая колонка не отделяется от старой с помощью вертикальной линии.

MFT_OWNERDRAW

0x00000100L

Предоставляет окну, которому принадлежит меню, возможность самостоятельно отрисовывать пункт меню. Перед первым отображением меню, окно получит сообщение WM_MEASUREITEM. В последующем, при каждом обновлении отображения пункта меню, окну будет отправляться сообщение WM_DRAWITEM.

Если задан флаг MFT_OWNERDRAW, то поле dwTypeData содержит определенное приложением значение.

MFT_RADIOCHECK

0x00000200L

Если значение поля hbmpChecked равно NULL, то выбранные пункты меню отображаются с использованием переключателя (radio-button mark), а не флажка (check mark).

MFT_RIGHTJUSTIFY

0x00004000L

Пункт меню и все последующие пункты выравниваются по правому краю. Данный флаг допустим только в том случае, если пункт меню принадлежит полоске меню.

MFT_RIGHTORDER

0x00002000L

Указывает, что меню располагаются справа налево (по умолчанию, слева направо). Этот флаг используется для поддержки языков, в которых текст пишется справа налево. Это такие языки, как арабский и иврит.

MFT_SEPARATOR

0x00000800L

Указывает, что пункт меню является разделителем. Пункт меню отображается как горизонтальная разделительная линия. Значения полей dwTypeData и cch игнорируются. Флаг MFT_SEPARATOR допустим только для раскрывающегося меню, подменю или контекстного меню.

MFT_STRING

0x00000000L

Пункт меню отображается с использованием текстовой строки. Поле dwTypeData содержит указатель на завершающуюся NULL символом строку. Поле cch хранит длину строки.

Флаг MFT_STRING замещается флагом MIIM_STRING.

Заголовочный файл: winuser.h (включен в windows.h)


Типы ресурсов (RT_*)

RT_ACCELERATOR

MAKEINTRESOURCE(9)

Таблица сочетаний клавиш (accelerator table).

RT_ANICURSOR

MAKEINTRESOURCE(21)

Анимированный курсор.

RT_ANIICON

MAKEINTRESOURCE(22)

Анимированная иконка.

RT_BITMAP

MAKEINTRESOURCE(2)

Растровое изображение (bitmap).

RT_CURSOR

MAKEINTRESOURCE(1)

Зависимый от устройства курсор.

RT_DIALOG

MAKEINTRESOURCE(5)

Диалоговое окно.

RT_DLGINCLUDE

MAKEINTRESOURCE(17)

Позволяет инструменту редактирования ресурсов ассоциировать строку с .rc файлом. Обычно, эта строка содержит имя заголовочного файла, в котором даны имена ресурсов. Компилятор ресурсов разбирает строку, но игнорирует её значение. Пример:

1 DLGINCLUDE "MyFile.h"

RT_FONT

MAKEINTRESOURCE(8)

Шрифт.

RT_FONTDIR

MAKEINTRESOURCE(7)

Каталог шрифтов.

RT_GROUP_CURSOR

MAKEINTRESOURCE((ULONG_PTR)(RT_CURSOR) + 11)

Независимый от устройства курсор (группа курсоров).

RT_GROUP_ICON

MAKEINTRESOURCE((ULONG_PTR)(RT_ICON) + 11)

Независимая от устройства иконка (группа иконок).

RT_HTML

MAKEINTRESOURCE(23)

HTML.

RT_ICON

MAKEINTRESOURCE(3)

Зависимая от устройства иконка.

RT_MANIFEST

MAKEINTRESOURCE(24)

Манифест "как есть".

RT_MENU

MAKEINTRESOURCE(4)

Меню.

RT_MESSAGETABLE

MAKEINTRESOURCE(11)

Запись таблицы сообщений.

RT_PLUGPLAY

MAKEINTRESOURCE(19)

Ресурс Plug and Play.

RT_RCDATA

MAKEINTRESOURCE(10)

Определенный приложением ресурс ("сырые" данные).

RT_STRING

MAKEINTRESOURCE(6)

Запись таблицы строк.

RT_VERSION

MAKEINTRESOURCE(16)

Информация о версии

RT_VXD

MAKEINTRESOURCE(20)

Виртуальный драйвер устройства (VXD).

Заголовочный файл: winuser.h (включен в windows.h)


Типы сжатия растрового изображения (BI_*)

BI_BITFIELDS

Указывает, что изображение не сжато и таблица цветов состоит из трёх цветовых масок типа размером в двойное слово, которые определяют величину красного, зелёного и синего цветов для каждого пикселя. Это используется при работе с изображениями с 16 и 32 битами на пиксель.

BI_JPEG

Указывает, что изображение имеет формат JPEG.

BI_PNG

Указывает, что изоюражение имеет формат PNG.

BI_RGB

Формат без сжатия.

BI_RLE4

Формат кодирования длин серий (RLE) для изображений с 4 битами на пиксель.

BI_RLE8

Формат кодирования длин серий (RLE) для изображений с 8 битами на пиксель.

Заголовочный файл: wingdi.h (включен в windows.h)


Типы символов

Биты типа символов разделяют символы на несколько уровней. Информация для одного уровня может быть получена одним вызовом функции. Каждый уровень ограничен 16 информационными битами, поэтому другие отображающие функции, которые также ограничиваются 16 битами на символ, так же могут вернуть информацию о типе символа.

Ctype1

Эти типы поддерживают функции печсатания символов из ANSI C и POSIX (LC_CTYPE). Если значение параметра dwinfoType равно CT_TYPE1, то в массив с выходными данными заносятся значения, полученные поразрядной операцией ИЛИ над значениями перечисленными в таблице ниже. Для двухбайтовых наборов символов, атрибуты типов применимы и к "узким", и к широким символам. Все символы японской хираганы и катаканы (виды японской азбуки), а также иероглифы кандзи имеют атрибут C1_ALPHA.

Наименование | Значение | Описание
C1_UPPER | 0x0001 | символ в верхнем регистре
C1_LOWER | 0x0002 | символ в нижнем регистре
C1_DIGIT | 0x0004 | десятичная цифра
C1_SPACE | 0x0008 | пробельный (space) символ
С1_PUNCT | 0x0010 | знак пунктуации
C1_CNTRL | 0x0020 | управляющий символ
C1_BLANK | 0x0040 | пробельный (blank) символ
C1_XDIGIT | 0x0080 | цифра шестнадцатеричной системы счисления
C1_ALPHA | 0x0100 | любой лингвитсический символ: буква, слог (в слоговом письме) или иероглиф
С1_DEFINED | 0x0200 | известный символ, не принадлежащий какой-либо другой группе C1_*

Типы символов из таблицы ниже основаны на базовых типах из таблицы выше и не поддерживаются функцией.

Тип | Описание
Alphanumeric | буквы и цифры (C1_ALPHA и C1_DIGIT)
Printable | графические и пробельные символы (все типы C1_* кроме C1_CNTRL)

Ctype2

Данные типы обеспечивают надлежащую расстановку (layout) текста Unicode. Для локалей с двухбайтовым набором символов (DBCS), типы символов применяются как к "узким", так и к широким символам. Атрибуты направления позволяют получать корректные результаты при реализации возможности различного направления чтения текста, стандартизованного в Unicode. Эти типы являбтся взаимно исключающими. ДополнительнАЯ информация об использовании этих атрибутов приведена в стандарте Unicode.

Наименование | Значение | Описание
Строгий (Strong) |  |
C2_LEFTTORIGHT | 0x0001 | слева направо
C2_RIGHTTOLEFT | 0x0002 | справа налево
Нестрогий (Weak) |  |
C2_EUROPENUMBER | 0x0003 | европейские числа и цифры
C2_EUROPESEPARATOR | 0x0004 | разделитель европейских чисел
C2_EUROPETERMINATOR | 0x0005 | символ, завершающий европейское число
C2_ARABICNUMBER | 0x0006 | арабское число
C2_COMMONSEPARATOR | 0x0007 | Общий разделитель чисел
Нейтральный (Neutral) |  |
C2_BLOCKSEPARATOR | 0x0008 | разделитель блоков
С2_SEGMENTSEPARATOR | 0x0009 | разделитель сегментов
C2_WHITESPACE | 0x000A | пробел (White space)
С2_OTHERNEUTRAL | 0x000B | другие нейтрали (neutrals)
Не применяется |  |
C2_NOTAPPLICABLE | 0x0000 | явно не отображается (например, управляющие коды)

Ctype3

Эти типы предназначены для того, чтобы служить заполнителями для расширений типов POSIX, необходимых для основной обработки текстов или для функций стандартной библиотеки C. Значение, полученное поразрядной операцией ИЛИ над значениями перечисленными в таблице ниже, возвращается при установке в параметре dwInfoType значения CT_CTYPE3. Для локалей двухбайтовых наборов символов данные атрибуты применяются к "узким" и широким символам.Все символы японской хираганы, катаканы, а также иероглифы кандзи имеют атрибут C3_ALPHA.

Наименование | Значение | Описание
C3_NONSPACING | 0x0001 | непробельная метка
C3_DIACRITIC | 0x0002 | непробельный диакритический знак
C3_VOWELMARK | 0x0004 | непробельная огласовка (дополнительный знак в консонантном письме, указывающий на гласный звук)
С3_SYMBOL | 0x0008 | символ
C3_KATAKANA | 0x0010 | символ катаканы
C3_HIRAGANA | 0x0020 | символ хираганы
С3_HALFWIDTH | 0x0040 | "узкий" (в половину ширины) (half-width)символ
С3_FULLWIDTH | 0x0080 | широкий символ
C3_IDEOGRAPH | 0x0100 | идеографический символ
C3_KASHIDA | 0x0200 | символ арабской кашиды
C3_LEXICAL | 0x0400 | знак пунктуации, принимаемый как часть слова (кашида, дефис, женские/мужские индикаторы (ordinal indicators), знак равенства и другие)
C3_ALPHA | 0x8000 | все лингвистические символы (буквы, слоги, идеографические символы)
C3_HIGHSURROGATE | 0x0800 | Windows Vista: старшая суррогатная единица кода (high surrogate code unit)
C3_LOWSURROGATE | 0x1000 | Windows Vista: младшая суррогантная единица кода (low surrogate code unit)
Не применяется |  |
C3_NOTAPPLICABLE | 0x0000 | не применяется

Значения C3_HIGHSURROPGATE и C3_LOWSURROGATE перечислены только для полноты (completeness). Они не должны передаваться в функцию. Они относятся только к Unicode.

Заголовочный файл: Stringapiset.h (включен в windows.h)


Уведомления IME (IMN_*)

IMN_CHANGECANDIDATE

Уведомляет приложение о том, что система IME собирается изменить содержимое кандидатного окна.

В lparam содержится набор флагов списка кандидатных окон. Каждый бит соответствует кандидатному окну: бит 0 первому кандидатному окну; бит 1 второму кандидатному окну и так далее. Если определенный бит взведен, то соответствующее ему кандидатное окно скоро будет изменено.

Данное уведомление не возвращает никаких значений.

Если приложение самостоятельно отображает кандидатные окна, то оно должно обрабатывать это уведомление.

Во время обработки этого уведомления приложение обычно изменяет внешний вид кандидатного окна.

IMN_CLOSECANDIDATE

Уведомляет приложение о том, что система IME собирается закрыть кандидатное окно.

В lparam содержится набор флагов списка кандидатных окон. Каждый бит соответствует кандидатному окну: бит 0 первому кандидатному окну; бит 1 второму кандидатному окну и так далее. Если определенный бит взведен, то соответствующее ему кандидатное окно скоро будет закрыто.

Данное уведомление не возвращает никаких значений.

Если приложение самостоятельно отображает кандидатные окна, то оно должно обрабатывать это уведомление.

По умолчанию система IME разрушает кандидатное окно во время обработки этого уведомления.

IMN_CLOSESTATUSWINDOW

Уведомляет приложение о том, что система IME собирается закрыть окно состояния (status window).

lparam не используется.

Данное уведомление не возвращает никаких значений.

Если приложение самостоятельно отображает окно состояния, то оно должно обрабатывать это уведомление.

По умолчанию система IME закрывает окно состояния во время обработки этого уведомления.

IMN_GUIDELINE

Уведомляет приложение о том, что система IME собирается отобразить на экране сообщение об ошибке или другую информацию.

lparam не используется.

Данное уведомление не возвращает никаких значений.

Приложение обрабатывает это уведомление путём вызова функции ImmGetGuideLine, которая получает информационное сообщение или сообщение об ошибке от системы IME.

IME окно отображает текст информационного сообщения или сообщения об ошибке в информационном окне.

IMN_OPENCANDIDATE

Уведомляет приложение о том, что система IME собирается открыть кандидатное окно.

В lparam содержится набор флагов списка кандидатных окон. Каждый бит соответствует кандидатному окну: бит 0 первому кандидатному окну; бит 1 второму кандидатному окну и так далее. Если определенный бит взведен, то соответствующее ему кандидатное окно скоро будет открыто.

Данное уведомление не возвращает никаких значений.

Если приложение самостоятельно отображает кандидатные окна, то оно должно обрабатывать это уведомление. Приложение может получить список отображаемых кандидатных окон с помощью функции ImmGetCandidateList.

По умолчанию, система IME создает кандидатное окно во время обработки этого уведомления.

IMN_OPENSTATUSWINDOW

Уведомляет приложение о том, что система IME собирается создать окно состояния.

lparam не используется.

Данное уведомление не возвращает никаких значений.

Если приложение самостоятельно отображает окно состояния для IME, то оно должно обрабатывать это уведомление.

Окно IME создает окно состояния во время обработки этого уведомления. Приложение может получить информацию об окне состояния с помощью функции ImmGetConversionStatus.

IMN_SETCANDIDATEPOS

Уведомляет приложение о том, что система IME собирается переместить кандидатное окно.

В lparam содержится набор флагов списка кандидатных окон. Каждый бит соответствует кандидатному окну: бит 0 первому кандидатному окну; бит 1 второму кандидатному окну и так далее. Если определенный бит взведен, то соответствующее ему кандидатное окно скоро будет перемещено.

Данное уведомление не возвращает никаких значений.

Если приложение самостоятельно отображает кандидатные окна, то оно должно обрабатывать это уведомление.

По умолчанию система IME перемещает кандидатное окно во время обработки этого уведомления.

IMN_SETCOMPOSITIONFONT

Уведомляет приложение о том, что шрифт контекста ввода был изменен.

lparam не используется.

Данное уведомление не возвращает никаких значений.

Приложение может получить информацию о шрифте с помощью функции ImmGetCompositionFont. После этого уведомления окно IME использует новый шрифт для отображения составной (композитной) строки.

IMN_SETCOMPOSITIONWINDOW

Уведомляет приложение о том, что стиль или положение композитного окна было изменено.

lparam не используется.

Данное уведомление не возвращает никаких значений.

Приложение может получить информацию о композитном окне с помощью команды IMC_GETCOMPOSITIONWINDOW.

IMN_SETCONVERSIONMODE

Уведомляет приложение о том, что режим конвертирования контекста ввода был изменен.

lparam не используется.

Данное уведомление не возвращает никаких значений.

Приложение может получить информацию о режиме конвертирования с помощью функции ImmGetConversionStatus.

IMN_SETOPENSTATUS

Уведомляет приложение о том, что состояние открытия контекста ввода было изменено.

lparam не используется.

Данное уведомление не возвращает никаких значений.

Приложение может получить информацию о состоянии открытия с помощью функции ImmGetOpenStatus.

IMN_SETSENTENCEMODE

Уведомляет приложение о том, что режим формирования фраз в контексте ввода был изменен.

lparam не используется.

Данное уведомление не возвращает никаких значений.

Приложение может получить информацию о режиме формирования фраз с помощью функции ImmGetConversionStatus.

IMN_SETSTATUSWINDOWPOS

Уведомляет приложение о том, что положение окна состояния было изменено.

lparam не используется.

Данное уведомление не возвращает никаких значений.

Приложение может получить информацию о положении окна состояния с помощью команды IMC_GETSTATUSWINDOWPOS.

Заголовочный файл: imm.h


Флаги меню (MF_*)

MF_BITMAP

0x00000004L

Пункт меню отображает растровое изображение.

MF_CHECKED

0x00000008L

Рядом с пунктом меню отображается галочка. Если приложение предоставляет свои изображения галочек (см. функцию SetMenuItemBitmaps), то при данном флаге рядом с пунктом отображается предоставленное изображение.

Пункт меню выбран пользователем.

MF_DISABLED

0x00000002L

Пункт меню недоступен. Он не может быть выбран, но функция не окрашивает его в серый цвет.

MF_ENABLED

0x00000000L

Пункт меню доступен. Он может быть выбран пользователем.

MF_GRAYED

0x00000001L

Пункт меню недоступен и закрашен серым цветом.

MF_HILITE

0x00000080L

Пункт меню подсвечивается.

MF_MENUBARBREAK

0x00000020L

Аналогично флагу MF_MENUBREAK для строки меню. Для раскрывающегося (drop-down) меню, подменю, или контекстного меню, новая колонка отделяется от старой колонки вертикальной линией.

MF_MENUBREAK

0x00000040L

Размещает пункт меню на новой строке (для полоски меню) или в новой колонке (для раскрывающегося меню, подменю, или контекстного меню) без разделительных колонок.

MF_MOUSESELECT

0x00008000L

Пункт меню выбран с помощью мыши.

MF_OWNERDRAW

0x00000100L

Пункт меню является самостоятельно перерисовываемым. Перед тем, как меню впервые отображается на экране, окно владеющее меню получает сообщение WM_MEASUREITEM, с которым передается ширина и высота пункта меню. Затем оконная процедура этого окна будет получать сообщение WM_DRAWITEM всякий раз, когда требуется обновить отображение пункта меню.

MF_POPUP

0x00000010L

Пункт меню раскрывает выскакивающее меню или подменю. Параметр uIDNewItem (функции AppendMenu) задает описатель меню или подменю. Данный флаг используется для добавления наименований меню в полосу меню, или пунктов меню, раскрывающих выскакивающее меню, подменю или контекстное меню.

MF_SEPARATOR

0x00000800L

Отображает горизонтальную разделительную линию. Данный флаг используется только в раскрывающихся меню, подменю, или контекстном меню. Линия не может быть закрашена серым цветом, стать недоступной, или подсвеченной. Параметры lpNewItem и uIDNewItem (функции AppendMenu) игнорируются.

MF_STRING

0x00000000L

Определяет, что пункт меню является текстовой строкой. Параметр lpNewItem (функции AppendMenu) содержит указатель на строку.

MF_SYSMENU

0x00002000L

Пункт меню входит в состав системного меню окна.

MF_UNCHECKED

0x00000000L

Не располагает галочку рядом с пунктом меню. Если приложение предоставляет свои изображения галочек (см. функцию SetMenuItemBitmaps), то при данном флаге рядом с пунктом меню отображается пустое изображение (clear bitmap).

Заголовочный файл: winuser.h (включен в windows.h)


Флаги отрисовки (PRF_*)

PRF_CHECKVISIBLE

Отрисовывает окно только если оно видимо.

PRF_CHILDREN

Отрисовывает все видимые дочерние окна.

PRF_CLIENT

Отрисовывает клиентскую область окна.

PRF_ERASEBKGND

Перед отрисовкой окна его фон очищается.

PRF_NONCLIENT

Отрисовывает неклиентскую область окна.

PRF_OWNED

Отрисовываются все окна, находящиеся в собственности.

Заголовочный файл: winuser.h (включен в windows.h)


Флаги структуры FILTERKEYS (FKF_*)

FKF_AVAILABLE

Фильтрация клавиш (FilterKeys) включена.

FKF_CLICKON

Компьютер воспроизводит звук щелчка при нажатии или принятии клавишы. Если включены медленные клавишы (SlowKeys), звук щелчка генерируется при нажатии кавишы и снова при принятии последовательности нажатий (keystroke is accepted).

FKF_CONFIRMHOTKEY

Windows 95/98, Windows 2000: при активации фильтрации клавиш с помощью горячей клавишы (hot key) появится диалоговое окно подтверждения (confirmation dialog box).

FKF_FILTERKEYSON

Включает фильтрацию клавиш.

FKF_HOTKEYACTIVE

Пользователь может включить или выключить фильтрацию клавиш путём удержания в течение 8 секунд клавиша "правый Shift" в нажатом состоянии.

FKF_HOTKEYSOUND

Если этот флаг установлен, то каждый раз когда пользователь включает или выключает фильтрацию клавиш с помощью горячей клавишы, сомпьютер будет воспроизводить звуковой сигнал.

FKF_INDICATOR

Windows 95, Windows 2000: при включенной фильтрации клавиш отображается соответствующий значок.

Заголовочный файл: winuser.h (включен в windows.h)


Флаги структуры HIGHCONTRAST (HCF_*)

HCF_AVAILABLE

Функция высокой контрастности доступна.

HCF_CONFIRMHOTKEY

При активации высокой контрастности с помощью горячей клавишы (hot key) появится диалоговое окно подтверждения (confirmation dialog box).

HCF_HIGHCONTRASTON

Включает высокую контрастность.

HCF_HOTKEYACTIVE

Пользователь включил или выключил высокую контрастность одновременным нажатием клавиш: левый Alt, левый Shift и PrintScreen.

HCF_HOTKEYAVAILABLE

Для высокой контрастности предусмотрена горячая клавиша. Приложение может проверить наличие этого флага, но не изменить его состояние.

HCF_HOTKEYSOUND

При включении или выключении пользователем высокой контрастности с помощью горячей клавишы будет воспроизводиться звуковой сигнал.

HCF_INDICATOR

При включенной высокой контрастности отображается соответствующий значок. На текущий момент данный флаг не используется и игнорируется.

Заголовочный файл: winuser.h (включен в windows.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


Флаги структуры MENUITEMINFO (MIIM_*)

MIIM_BITMAP

0x00000080

Возвращает или устанавливает значение поля hbmpItem.

MIIM_CHECKMARKS

0x00000008

Возвращает или устанавливает значения полей hbmpChecked и hbmpUnchecked.

MIIM_DATA

0x00000020

Возвращает или устанавливает значение поля dwItemData.

MIIM_FTYPE

0x00000100

Возвращает или устанавливает значение поля fType.

MIIM_ID

0x00000002

Возвращает или устанавливает значение поля wID.

MIIM_STATE

0x00000001

Возвращает или устанавливает значение поля fState.

MIIM_STRING

0x00000040

Возвращает или устанавливает значение поля dwTypeData.

MIIM_SUBMENU

0x00000004

Возвращает или устанавливает значение поля hSubMenu.

MIIM_TYPE

0x00000010

Возвращает или устанавливает значения полей fType и dwTypeData. Флаг MIIM_TYPE может быть заменен флагами MIIM_BITMAP, MIIM_FTYPE и MIIM_STRING.

Заголовочный файл: winuser.h (включен в windows.h)


Флаги структуры MOUSEINPUT (MOUSEEVENTF_*)

MOUSEEVENTF_ABSOLUTE

(0x8000)

Поля dx и dy содержат нормализованные абсолютные координаты. Если данный флаг не установлен, то поля dx и dy содержат относительные данные (изменение по отношению к последнему запрошенному положению). Этот флаг может устанавливаться или не устанавливаться вне зависимости от типа мыши или указывающего устройства, подключенного к системе.

MOUSEEVENTF_HWHEEL

(0x01000)

Если у мыши есть колёсико, то оно перемещено в горизонтальном направлении. Величина перемещения задается в поле mouseData.

Windows XP/2000: данный флаг не поддерживается.

MOUSEEVENTF_LEFTDOWN

(0x0002)

Нажата левая кнопка мыши.

MOUSEEVENTF_LEFTUP

(0x0004)

Левая кнопка мыши отпущена.

MOUSEEVENTF_MIDDLEDOWN

(0x0020)

Нажата средняя кнопка мыши.

MOUSEEVENTF_MIDDLEUP

(0x0040)

Средняя кнопка мыши отпущена.

MOUSEEVENTF_MOVE

(0x0001)

Произошло перемещение.

MOUSEEVENTF_MOVE_NOCOALESCE

(0x2000)

Сообщение WM_MOUSEMOVE не будет отправлено. По умолчанию оно отправляется.

Windows XP/2000: данный флаг не поддерживается.

MOUSEEVENTF_RIGHTDOWN

(0x0008)

Нажата правая кнопка мыши.

MOUSEEVENTF_RIGHTUP

(0x0010)

Правая кнопка мыши отпущена.

MOUSEEVENTF_VIRTUALDESK

(0x4000)

Отображает координаты на рабочий стол (desktop). Должен использоваться совместно с MOUSEEVENTF_ABSOLUTE.

MOUSEEVENTF_WHEEL

(0x0800)

Если мышь имеет колёсико, то оно перемещено. Величина перемещения задана в поле mouseData.

MOUSEEVENTF_XDOWN

(0x0080)

Нажата дополнительная кнопка.

MOUSEEVENTF_XUP

(0x0100)

Отпущена дополнительная кнопка.

Заголовочный файл: winuser.h (включен в windows.h)


Флаги структуры MOUSEKEYS (MKF_*)

MKF_AVAILABLE

Если этот флаг установлен, то доступен режим управления указателем мыши (MouseKeys feature) (этот режим позволяет перемещать указатель с помощью клавиш цифровой панели клавиатуры).

MKF_CONFIRMHOTKEY

Windows 95/98, Windows 2000: когда режим управления указателем мыши (MouseKeys feature) активируется с помощью горячей клавишы появляется диалоговое окно подтверждения (confirmation dialog box).

MKF_HOTKEYACTIVE

Если этот флаг установлен, то пользователь может включать и выключать режим управления указателем мыши, с помощью комбинации клавиш: левый Alt, левый Shift и NumLock.

MKF_HOTKEYSOUND

Если этот флаг установлен, то при включении или выключении режима управления указателем мыши с помощью горячей клавишы, система будет воспроизводить звуковой сигнал (siren sound).

MKF_INDICATOR

Windows 95/98, Windows 2000: когда режим управления указателем мыши активирован, отображется специальный значок (visual indicator).

MKF_LEFTBUTTONDOWN

Windows 95/98, Windows 2000: левая кнопка мыши находится в нажатом состоянии ("down" state).

MKF_LEFTBUTTONSEL

Windows 95/98, Windows 2000: пользователь выбрал левую кнопку мыши в качестве активной кнопки мыши (mouse-button actions).

MKF_MODIFIERS

Windows 95/98, Windows 2000: клавиша Ctrl увеличивает скорость курсора (cursor speed) на величину, указанную в поле iCtrlSpeed, и клавиша Shift заставляет курсор приостановиться (delay briefly) после перемещения на один пиксель, позволяя тем самым точно позиционировать (fine positioning) курсор. Если этот флаг не задан, то клавишы Ctrl и Shift игнорируются при перемещении курсора с помощью клавиш.

MKF_MOUSEKEYSON

Если этот флаг задан, то включается режим управления указателем мыши.

MKF_MOUSEMODE

Windows 95/98, Windows 2000: система обрабатывает нажатия клавиш цифровой панели клавиатуры как команды мыши (mouse commands).

MKF_REPLACENUMBERS

Windows 95/98, Windows 2000: клавишы цифровой панели клавиатуры перемещают курсор мыши когда клавиша NumLock включена. Если этот флаг не задан, то клавишы цифровой панели клавиатуры перемещают курсор мыши когда клавиша NumLock выключена.

MKF_RIGHTBUTTONDOWN

Windows 95/98, Windows 2000: правая кеопка мыши находится в нажатом состоянии ("down" state).

MKF_RIGHTBUTTONSEL

Windows 95/98, Windows 2000: пользователь выбрал правую кнопку мыши в качестве активной кнопки мыши (mouse-button actions).

Заголовочный файл: winuser.h (включен в windows.h)


Флаги структуры PIXELFORMATDESCRIPTOR(PFD_*)

PFD_DOUBLEBUFFER

Производится двойная буферизация. В текущей основной реализации данный флаг исключает PFD_SUPPORT_GDI.

PFD_DRAW_TO_BITMAP

Буфер может отрисовываться в растровое изображение в памяти.

PFD_DRAW_TO_WINDOW

Буфер может отрисовываться в окно или поверхность устройства.

PFD_GENERIC_ACCELERATED

Формат пикселя поддерживается драйвером устройства, который ускоряет основную реализацию. Если этот флаг сброшен, но взведен PFD_GENERIC_FORMAT, формат пикселя поддерживается только основной реализацией (generic implementation).

PFD_GENERIC_FORMAT

Формат пикселя поддерживается программной реализацией подсистемы GDI, которую также называют основной реализацией. Если этот флаг сброшен, то формат пикселя поддерживается драйвером устройства или аппаратным обеспечением.

PFD_NEED_PALETTE

Буфер использует пиксели формата RGBA на устройстве управляющим палитрой. Палитра нужна для получения наилучших результатов для пикселей этого типа. Цвета в палитре должны задаваться согласно значениям в полях cRedBits, cRedShift, cGreenBits, cGreenShift, cBlueBits, и cBlueShift. Палитра должна быть создана и реализована в контексте устройства до вызова функции wglMakeCurrent.

PFD_NEED_SYSTEM_PALETTE

Задает в формате пикселя описатели аппаратуры, которые поддерживают только одну аппаратную палитру в режиме 256 цветов. Для таких систем используйте аппаратное ускорение, аппаратная палитра должна иметь фиксированный порядок (например, 3-3-2) в режиме RGBA, или же должна соответствовать логической палитре в режиме индексирования цветов.

Если этот флаг установлен, вы должны вызвать в своей программе функцию SetSystemPaletteUse для принудительного отображения логической и системной палитр. Если ваше устройство OpenGL поддерживает несколько аппаратных палитр и драйвер устройства может обходиться без аппаратных палитр при работе с OpenGL, данный флаг обычно сбрасывают.

Флаг PFD_NEED_SYSTEM_PALETTE не устанавливается в обычных форматах пикселя.

PFD_STEREO

Буфер является стереоскопическим. В текущей основной реализации данный флаг не поддерживается.

PFD_SUPPORT_GDI

Буфер поддерживает рисование средствами GDI. В текущей реализации данный флаг исключает PFD_DOUBLEBUFFER.

PFD_SUPPORT_OPENGL

Буфер поддерживает рисование средствами OpenGL.

PFD_SWAP_LAYER_BUFFERS

Указывает может ли устройство подкачивать отдельные плоскости с форматами пикселей, включающими в себя двойную буферизацию или более низкие плоскости (underlay planes). В противоположность этому все плоскости подкачиваются вместе как группа. Когда этот флаг установлен поддерживается функция wglSwapLayerBuffers.

При использовании функции ChoosePixelFormat вы можете дополнительно использовать следующие флаги.

PFD_DEPTH_DONTCARE

Формат пикселя может иметь или не иметь буфер глубины. При выборе формата пикселя без буфера глубины вы должны задавать этот флаг. Несмотря на то, что учитываются только форматы пикселей с буфером глубины.

PFD_DOUBLEBUFFER_DONTCARE

Формат пикселя может иметь одиночную или двойную буферизацию.

PFD_STEREO_DONTCARE

Формат пикселя может быть плоским или объемным.

При использовании расширения функции glAddSwapHintRectWIN используется еще два флага.

PFD_SWAP_COPY

Определяет содержимое заднего буфера в главной цветовой плоскости в системе с двойной буферизацией после подкачки. Подкачка цветовых буферов приводит к тому, что содержимое заднего буфера копируется в передний. Содержимое заднего буфера не изменяется подкачкой. PFD_SWAP_COPY является рекомендацией и может не исполняться драйвером.

PFD_SWAP_EXCHANGE

Определает содержимое заднего буфера в главной цветовой плоскости системы двойной буферизации после подкачки. Подкачка цветовых буферов приводит к тому, что содержимое заднего буфера меняется местами с содержимым переднего буфера. После подкачки, в заднем буфере находится содержимое переднего буфера до подкачки. PFD_SWAP_EXCHANGE является рекомендацией и может не исполняться драйвером.

Заголовочный файл: wingdi.h


Флаги структуры STICKYKEYS (SKF_*)

SKF_AUDIBLEFEEDBACK

Если это флаг установлен, то система воспроизводит звуковой сигнал каждый раз когда пользователь с помощью функции залипания клавиш (StickyKeys) защелкивает (latches), блокирует (locks) или освобождает (releases) клавишы.

SKF_AVAILABLE

Если этот флаг установлен, то функция залипания клавиш доступна.

SKF_CONFIRMHOTKEY

Windows 95/98, Windows 2000: при включении пользователем режима залипающих клавиш с помощью горячей клавишы появится диалоговое окно подтверждения.

SKF_HOTKEYACTIVE

Если это флаг установлен, то пользователь может вклюичть или выключить режим залипания клавиш путём пятикратного нажатия на клавишу Shift.

SKF_HOTKEYSOUND

Если этот флаг установлен, то система будет воспроизводить звуковой сигнал всякий раз когда пользователь включает или выключает режим залипания клавиш с полмощью горячей клавишы.

SKF_INDICATOR

Windows 95/98, Windows 2000: при включенном режиме залипания клавиш будет отображаться специальный значок.

SKF_LALTLATCHED

Windows 98, Windows 2000: клавиша левый Alt защелкнута (is latched).

SKF_LALTLOCKED

Windows 98, Windows 2000: клавиша левый Alt заблокирована (is locked).

SKF_LCTLLATCHED

Windows 98, Windows 2000: клавиша левый Ctrl защелкнута (is latched).

SKF_LCTLLOCKED

Windows 98, Windows 2000: клавиша левый Ctrl заблокирована (is locked).

SKF_LSHIFTLATCHED

Windows 98, Windows 2000: клавиша левый Shift защелкнута (is latched).

SKF_LSHIFTLOCKED

Windows 98, Windows 2000: клавиша левый Shift заблокирована (is locked).

SKF_LWINLATCHED

Windows 98, Windows 2000: клавиша левый Win защелкнута (is latched).

SKF_LWINLOCKED

Windows 98, Windows 2000: клавиша левый Win заблокирована (is locked).

SKF_RALTLATCHED

Windows 98, Windows 2000: клавиша правый Alt защелкнута (is latched).

SKF_RALTLOCKED

Windows 98, Windows 2000: клавиша правый Alt заблокирована (is locked).

SKF_RCTLLATCHED

Windows 98, Windows 2000: клавиша правый Ctrl защелкнута (is latched).

SKF_RCTLLOCKED

Windows 98, Windows 2000: клавиша правый Ctrl заблокирована (is locked).

SKF_RSHIFTLATCHED

Windows 98, Windows 2000: клавиша правый Shift защелкнута (is latched).

SKF_RSHIFTLOCKED

Windows 98, Windows 2000: клавиша правый Shift заблокирована (is locked).

SKF_RWINLATCHED

Windows 98, Windows 2000: клавиша правый Win защелкнута (is latched).

SKF_RWINLOCKED

Windows 98, Windows 2000: клавиша правый Win заблокирована (is locked).

SKF_STICKYKEYSON

Если этот флаг установлен, то включен режим залипания клавиш.

SKF_TRISTATE

Если этот флаг установлен, то двойное нажатие клавишы-модификатора (modifier key) блокирует клавишу до тех пор пока пользователь не нажмет на неё в третий раз.

SKF_TWOKEYSOFF

Если этот флаг установлен, то отпускание клавишы-модификатора, которая была нажата в сочетании с любой другой клавишей, выключает режим залипания клавиш.

Заголовочный файл: winuser.h (включен в windows.h)


Флаги структуры TOGGLEKEYS (TKF_*)

TKF_AVAILABLE

Если этот флаг установлен, то режим озвучивания переключения режимов (ToggleKeys) доступен.

TKF_CONFIRMHOTKEY

Windows 95/98, Windows 2000: когда режим озвучивания переключения режимов активируется с помощью горячей клавишы, появляется диалоговое окно подтверждения.

TKF_HOTKEYACTIVE

Если этот флан установлен, то пользователь может включать и выключать режим озвучивания переключения режимов путём удержания в течение 8 (на моём комьютере 5) секунд в нажатом состоянии клавишы NumLock.

TKF_HOTKEYSOUND

Если этот флаг установлен, то система каждый раз при включении или выключении режима озвучивания переключения режимов с помощью горячей клавишы будет воспроизводить звуковой сигнал.

TKF_INDICATOR

Данный флаг не реализован.

TKF_TOGGLEKEYSON

Если этот флаг установлен, то режим озвучивания переключения режимов включен.

Заголовочный файл: winuser.h (включен в windows.h)


Флаги структуры WINDOWPLACEMENT (SW_*)

SW_HIDE

Окно скрыто. Активным является другое окно.

SW_MAXIMIZE

Заданное окно развернуто.

SW_MINIMIZE

Заданное окно свёрнуто, активировано следующее в Z-последовательности окно.

SW_RESTORE

Окно активно и отображается на экране. Если окно свёрнуто или развёрнуто, система восстановит его в его оригинальном размере и положении. Приложение должно определить этот флаг при восстановлении свёрнутого окна.

SW_SHOW

Активировать окно и отображает его в его текущем размере и положении.

SW_SHOWMAXIMIZED

Активировать окно и отобразить его в развёрнутом состоянии.

SW_SHOWMINIMIZED

Активировать окно и отобразить его в свёрнутом состоянии.

SW_SHOWMINNOACTIVE

Отобразить окно в свёрнутом состоянии. Этот флаг аналогичен флагу SW_SHOWMINIMIZED с той лишь разницей, что окно не активируется.

SW_SHOWNA

Отобразить окно в его текущем размере и положении. Этот флаг аналогичен флагу SW_SHOW с той лишь разницей, что окно не активируется.

SW_SHOWNOACTIVATE

Отобразить окно в его последнем (recent) размере и положении. Этот флаг аналогичен флагу SW_SHOWNORMAL с той лишь разницей, что окно не активируется.

SW_SHOWNORMAL

Активировать и отобразить окно. Если окно свёрнуто или развёрнуто, то система восстанавливает его оригинальные размер и положение. Приложения должны задавать этот флаг когда впервые отображают окно.

Заголовочный файл: winuser.h (включен в windows.h)


Флаги типа оцифровщика (NID_*)

Появились в Windows 7 и Windows Server 2008 R2.

NID_EXTERNAL_PEN (0x08)

Устройство имеет внешний оцифровщик пера (pen digitizer).

NID_EXTERNAL_TOUCH (0x02)

Устройство имеет внешний сенсорный оцифровщик (touch digitizer).

NID_INTEGRATED_PEN (0x04)

Устройство имеет встроенный оцифровщик пера (pen digitizer).

NID_INTEGRATED_TOUCH (0x01)

Устройство имеет встроенный сенсорный оцифровщик (touch digitizer).

NID_MULTI_INPUT (0x40)

Устройство поддерживает несколько источников оцифрованного ввода (digitizer input).

NID_READY (0x80)

Устройство готово к получению оцифрованного ввода (digitizer input).

Заголовочный файл: winuser.h (включен в windows.h)


Флаги функции AnimateWindow (AW_*)

AW_ACTIVATE

Активировать окно. Не может быть использован совместно с флагом AW_HIDE.

AW_BLEND

Окно исчезает (появляется) путем постепенного снижения (повышения) четкости до полного исчезновения. Данный флаг может бытьиспользован только если окно hwnd является окно верхнего уровня.

AW_CENTER

Окно исчезает по направлению от краев к центру. При появлении окно оно отрисовывается по направлению от центра к краям.

AW_HIDE

Скрыть окно.

AW_HOR_NEGATIVE

Окно исчезает (повляется) в направении с права на лево. Этот флаг игнорируется если используется совместно с флагом AW_CENTER или AW_BLEND.

AW_HOR_POSITIVE

Окно исчезает (появляется) в направлении слева на право. Этот флаг игнорируется если используется совместно с флагом AW_CENTER или AW_BLEND.

AW_SLIDE

Окно при исчезновении перемещается в заданном направлении. Этот флаг игнорируется если используется совместно с флагом AW_CENTER.

AW_VER_NEGATIVE

Окно исчезает (появляется) в направлени с низу вверх. Данный флаг игнорируется если используется совместно с флагом AW_CENTER или AW_BLEND.

AW_VER_POSITIVE

Окно исчезает (появляется) в направлении с верху в низ. Данный флаг игнорируется если используется совместно с флагом AW_CENTER или AW_BLEND.

Заголовочный файл: winuser.h (включен в windows.h)


Флаги функции BroadcastSystemMessage (BSF_*)

BSF_ALLOWSFW

Разрешает получателю сообщения устанавливать окно переднего плана (foreground window) во время обработки сообщения.

BSF_FLUSHDISK

Сбрасывает (Flushes) диск после каждой обработки сообщения отдельным получателем.

BSF_FORCEIFHUNG

Продолжать рассылку сообщения несмотря на то, что истек период ожидания или один из получателей "не отвечает".

BSF_IGNORECURRENTTASK

Не отправлять сообщение окнам, которые принадлежат текущему процессу. Это защишает приложение от необходимости обработки своего собственного сообщения.

BSF_LUID

Только для функции BroadcastSystemMessageEx. Если этот флаг установлен, то сообщение будет отправлено только окну, LUID которого равен luid указанному в структуре BSMINFO.

Windows 2000: данный флаг не поддерживается.

BSF_NOHANG

Если один из получателей "не отвечает" в течение определенного промежутка времени, то рассылка сообщения прерывается.

BSF_NOTIMEOUTIFNOTHUNG

Ожидает от получателя ответа на сообщение без каких-либо ограничений по времени ожидания.

BSF_POSTMESSAGE

Отправляет (post) сообщение без ожидания его обработки. Не используется совместно с флагом BSF_QUERY.

BSF_QUERY

Отправляет (send) сообщение одному получателю за раз. Следующему получателю сообщение отправляется только если текущий получатель вернул значение TRUE.

BSF_RETURNHDESK

Только для функции BroadcastSystemMessageEx. Если этот флаг установлен совместино с флагом BSF_QUERY, то в структуру BSMINFO будет записан дескриптор рабочего стола и дескриптор окна. Если установлен только флаг BSF_QUERY, то в структуру BSMINFO будет записан только дескриптор окна.

Windows 2000: данный флаг не поддерживается.

BSF_SENDNOTIFYMESSAGE

Сообщение отправляется с помощью функции SendNotifyMessage. Не используется совместно с флагом BSF_QUERY.

Заголовочный файл: winuser.h (включен в windows.h)


Флаги функции CalculatePopupWindowPosition (TPM_*)

по горизонтали

TPM_CENTERALIGN

Всплывающее окно (pop-up window) выравнивается по центру относительно координаты, заданной в anchorPoint->x.

TPM_LEFTALIGN

Всплывающее окно размещается так, чтобы его левый край был выровнен по координате, заданной в anchorPoint->x.

TPM_RIGHTALIGN

Всплывающее окно размещается так, чтобы его правый край был выровнен по координате, заданной в anchorPoint->x.

по вертикали

TPM_BOTTOMALIGN

Всплывающее окно размещается так, чтобы его нижний край был выровнен по координате, заданной в anchorPoint->y.

TPM_TOPALIGN

Всплывающее окно размещается так, чтобы его верхний край был выровнен по координате, заданной в anchorPoint->y.

TPM_VCENTERALIGN

Всплывающее окно выравнивается по центру относительно координаты, заданной в anchorPoint->y.

по горизонтали или вертикали

TPM_HORIZONTAL

Если всплывающее окно не может быть отображено в заданном месте (location) без перекрытия (overlapping) исключаемого прямоугольника (excluded rectangle), система сначала выравнивает окно по горизонтали, а уже потом по вертикали.

TPM_VERTICAL

Если всплывающее окно не может быть отображено в заданном месте (location) без перекрытия (overlapping) исключаемого прямоугольника (excluded rectangle), система сначала выравнивает окно по вертикали, а уже потом по горизонтали.

начиная с Windows 7

TPM_WORKAREA

Ограничивает положение окна рабочей областью экрана. Если этот флаг не указан, то положение окна ограничивается рабочей областью экрана только если заданная точка (input point) размещена внутри рабочей области. Более подробно смотри описание полей rcWork и rcMonitor структуры MONITORINFO.

Заголовочный файл: winuser.h (включен в windows.h)


Флаги функции CompareStringEx

LINGUISTIC_IGNORECASE

(0x00000010)

Игнорировать регистр.

LINGUISTIC_IGNOREDIACRITIC

(0x00000020)

Игнорировать непробельные дополнительные символы.

Учтите, что данный флаг не всегда приводит к предсказуемому результату при работе с расщепленными (decomposed) символаи, то есть, символами, в которых базовый и один или несколько дополнительных символов представлены отдельными кодовыми точками (code point values).

NORM_IGNORECASE

(0x00000001)

Игнорировать регистр. Для большинства скриптов (особенно латинских скриптов), флаг NORM_IGNORECASE совпадает с флагом LINGUISTIC_IGNORECASE.

Учтите, что флаг NORM_IGNORECASE игнорирует любые третичные различия в символах (tertiary distinction), вне зависимости от того, является ли это лингвистическим случаем или нет. Например, в арабских и индийских скриптах, флаг различает различные формы символов, но эти различия не являются лингвистическим случаем. Флаг LINGUISTIC_IGNORECASE заставляет функцию игнорировать только фактические лингвистические случаи, а не третий критерий упорядочивания.

Учтите, что с данным флагом функция игнорирует различия между широкими и узкими формами совместимых символов CJK (Киттай - Япония - Корея).

NORM_IGNOREKANATYPE

(0x00010000)

Не различать символы хираганы и катаканы. Символы хираганы и катаканы считаются идентичными.

NORM_IGNORENONSPACE

(0x00000002)

Игнорировать непробельные символы. Для многих скриптов (особенно латинских сриптов), флаг NORM_IGNORENONSPACE аналогичен флагу LINGUISTIC_IGNOREDIACRITIC.

Учтите, что флаг NORM_IGNORENONSPACE игнорирует все остальные различия, вне зависимости от того, являются ли они диакритическими или нет. Скрипты для корейского, японского, китайского и индийского языков, среди прочего, используют это различие для целей, отличных от целей диакритических знаков. Флаг LINGUISTIC_IGNOREDIACRITIC заставляет функцию игнорировать только диакритические знаки, вместо того, чтобы игнорировать вторичные признаки упорядочивания.

Учтите, что флаг NORM_INGNORENONSPACE работает только для локалей, в которых символы со знаком ударения упорядочиваются иначе чем основные символы без знака ударения. Обычно все символы в строке первоначально сравниваются вне зависимости от знака ударения и, если строки идентичны, они сравниваются с учетом знаков ударения. Если данный флаг установлен, то вторичное сравнение не выполняется. Для локалей, в которых знаки ударения сравниваются при первом сравнении, данный флаг не оказывает никакого влияния.

NORM_IGNORESYMBOLS

(0x00000004)

Игнорировать символы и знаки пунктуации.

NORM_IGNOREWIDTH

(0x00020000)

Игнорировать разницу между полуширинными (half-width) и полноширинными (full-width) символами. Например, строка "C a t" равна строке "cat".Полноширинная форма является форматным различием, используемым в китайских и японских скриптах.

NORM_LINGUISTIC_CASING

(0x08000000)

Вместо правил файловой системы (по умолчанию) использовать лингвистические правила.

SORT_DIGITSASNUMBERS

(0x00000008)

Windows 7: во время сравнения интерпретировать цифры как числа, например, строка "2" размещается до строки "10".

SORT_STRINGSORT

(0x00001000)

Интерпретировать знаки пунктуации также, как и обычные символы.

Заголовочный файл: winnls.h (включен в windows.h)


Флаги функции ExtTextOut (ETO_*)

ETO_CLIPPED

Текст будет обрезан до прямоугольника.

ETO_GLYPH_INDEX

Массив lpString ссылается на массив, возвращенный функцией GetCharacterPlacement и должен обрабатываться непосредственно подсистемой GDI, так как дополнительная обработка с учетом языка не требуется. Индексация глифа применяется только для шрифтов TrueType, но данный флаг может использоваться для растровых и векторных шрифтов, которым не требуется обработка с учетом языка и подсистема GDI может обработать саму строку. Учтите, что все глифы проиндексированы 16-разрядными значениями даже если строка, как предполагается, является массивом 8-разрядных значений для растровых шрифтов.

Для функции ExtTextOutW индексы глифов хранятся в метафайле. Тем не менее, для корректного отображения символов метафайл должен воспроизводиться тем же шрифтом. Для функции ExtTextOutA индексы глифов не сохраняются.

ETO_IGNORELANGUAGE

Зарезервировано для использования системой. Если приложение устанавливает этот флаг,то оно теряет поддержку международных скриптов и в некоторых случаях оно вообще не сможет вывести текст.

ETO_NUMERICSLATIN

При отображении чисел использовать европейские цифры (European digits).

ETO_NUMERICSLOCAL

При отображении чисел использовать цифры соответствующие текущей локали.

ETO_OPAQUE

Текущий цвет фона должен использоваться для заполнения прямоугольника.

ETO_PDY

Если он установлен, то массив lpDx содержит пары значений. Обычно, первое значение пары задает расстояние между оригинальной и прилегающей к ней ячейки текста, второе значение в паре задает смещение вдоль вертикального направления шрифта.

ETO_RTLREADING

Среднеазиатские редакции Windows. Если установлен данный флаг и в контексте устройства выбран еврейский или арабский шрифт, то при выводе текста используется порядок чтения справа налево. Если флаг не установлен, то используется порядок чтения слева направо. Такого же эффекта можно добиться путем установки функцией SetTextAlign флага TA_RTLREADING. Данное значение сохраняется для обратной совместимости.

Заголовочный файл: wingdi.h (включен в windows.h)


Флаги функции FoldString (MAP_*)

MAP_COMPOSITE

(0x00000040)

Отображает символы с диакритическими знаками (accented characters) в отдельные символы, то есть, в последовательность базового и одного или нескольких непробельных символов, имеющих отдельные кодовые точки. Например, символ A представляется в виде последовательности латинской большой "A" (U+0041) и символ объединяющей диерезы (combining diaeresis) (U+0308). Данный флаг эквивалентен форме нормализации D в Windows Vista. Учтите, что он не может использоваться совместно с флагом MB_PRECOMPOSED.

MAP_EXPAND_LIGATURES

(0x00002000)

Разбивать все лигатуры (наборный знак из двух соединенных букв) так, чтобы они отображались в виде двух символов. Например, лигатура "æ" (U+00e6) разбивается на два символа "a" (U+0061) и "e" (U+0065). Данный флаг не может сочетаться с флагами MAP_PRECOMPOSED и MAP_COMPOSITE.

MAP_FOLDCZONE

(0x00000010)

Сворачивает символы в стандартные эквиваленты Unicode. Если данный флаг используется совместно с флагом MAP_COMPOSITE, то преобразование строки аналогично ее приведению к форме нормализации KD в Windows Vista. Если флаг MAP_COMPOSITE не установлен (по умолчанию), то преобразование строки эквивалентно ее приведению к форме нормализации KC в Windows Vista.

MAP_FOLDDIGITS

(0x00000080)

Отображает все цифры в символы Unicode "0" - "9".

MAP_PRECOMPOSED

(0x00000020)

Отображает символы с диакритическими знаками (accented characters) в составные символы, в которых диакритический знак и базовый символ объединены в один символ. При использовании этого флага строка приводится к форме нормализации C в Windows Vista. Данный флаг не может сочетаться с флагом MAP_COMPOSITE.

Заголовочный файл: winnls.h (включен в windows.h)


Флаги функции GetCharacterPlacement (GCP_*)

GCP_CLASSIN

Массив lpClass содержит существующие классификации символов. Класификации могут совпадать с возвращаемыми классификациями. Если классификация для символа неизвестна, то сответствующий элемент массива должен быть равен нулю. Дополнительная информация о классификациях приведена в описании структуры GCP_RESULTS. Флаг GCP_CLASSIN имеет смысл только если функция GetFontLanguageInfo возвращает флаг GCP_REORDER.

GCP_DIACRITIC

Определяет как следует обрабатывать диакритические знаки. Если данный флаг не установлен, то диакритические знаки интерпретируются как символы нулевой ширины. Например, строка на иврите может содержать диакритичнские знаки, но вы можете захотеть не отображать их.

Для определения поддержки шрифтом диакритических знаков используйте функцию GetFontLanguageInfo. Ели они поддерживаются, то (не)используйте флаг GCP_DIACRITIC в функции GetCharacterPlacement в зависимости от требований вашего приложения.

GCP_DISPLAYZWG

В кодовых страницах языков, которым нужно переупорядочивание или различные формы глифов в зависимости от положения символов, часто имеются неотображаемые символы. Например, в кодовой странице иврита имеются маркеры направаления (слева направо и справа налево), помогающие определить конечное положение символов в выходной строке. Обычно они не отображаются на экране и удаляются из массивов lpGlyphs и lpDx (структуры GCP_RESULTS). Вы можете использовать флаг GCP_DISPLAYZWG для отображения этих символов.

GCP_GLYPHSHAPE

Некоторые или все символы строки отображаются на экране с использованием форм, отличных от стандартных форм, заданных в текущем шрифте для текущей кодовой страницы. Некоторые языки, например арабский, не поддерживают создание глифа, если этот флаг не задан. Как правило, если функция GetFontLanguageInfo возвращает данный флаг для строки, то он должен быть передан в функцию GetCharacterPlacement.

GCP_JUSTIFY

Настраивает расстояния в массиве lpDx таким образом, чтобы длина строки совпадала со значением nMaxExtent. Данный флаг может использоваться только совместно с флагом GCP_MAXEXTENT.

GCP_KASHIDA

Использование кашид (кашида- протяжка в арабском письме) совместно с (или вместо) настройки ширины символов позволяет изменить длину строки так, чтобы она совпадала со значением nMaxExtent. В массиве lpDx кашида хранится как отрицательный индекс выравнивания. Данный флаг может использоваться только совместно с флагом GCP_JUSTIFY и только для шрифта (и языка), поддерживающего кашиды. Для определения того поддерживает ли кашиды текущий шрифт используйте функцию GetFontLanguageInfo.

При использовании кашид требуемое количество глифов будет больше, чем количество символов в исходной строке. Из-за этого, при использоании кашид, приложение не должно рассчитывать на то, что размеры массивов, установаленные по размеру исходной строки, будут достаточными. (Возможный максимум должен быть приблизительно равен отношению dxPageWidth/dxAveCharWidth, где dxPageWidth - ширина документа, а dxAveCharWidth - средняя ширина символа, возвращенная функцией GetTextMetrics).

Учтите, что если функция GetFontLanguageInfo возвращает флаг GCP_KASHIDA, то это не значит, что данный флаг должен быть передан в функцию GetCharacterPlacement. Это значит лишь, что у вас есть возможность использовать кашиды.

GCP_LIGATE

Использовать лигатуры в местах сшовки символов. При использовании лигатур один глиф используется для отрисовки двух или более символов. Например, буквы a и e могут быть представлены в виде лигатуры æ. Для использования этой функциональности необходимо, чтобы и язык и шрифт поддерживали соответствующие глифы.(например, по умолчанию они не обрабатываются в английском языке).

Для определения того, поддерживает ли текущий шрифт лигатуры используйте функцию GetFontLanguageInfo. Если они поддерживаются, то укажите максимальное количество символов, образующих лигатуры в первом элементе массива lpGlyphs. Если требуются стандартнын лигатуры, установите там значение нуль. Если флаг GCP_LIGATE не задан, то лигатуры не используются. Дополнительная информация приведена в описании структуры GCP_RESULTS.

Если флаг GCP_REORDER, необходимый для наборов символов, не задан, то результирующие данные будут бессмысленными до тех пор, пока строке не будет придан надлежащий порядок символов (то есть результат занесенный в буфер lpGcpResults->LpOutString первым вызовом функции GetCharacterPlacement будет исходной строкой для второго вызова функции GetCharacterPlacement).

Учтите, что если функция GetFontLanguage возвращает флаг GCP_LIGATE, то это не значит, что он должен быть передан в функцию GetCharacterPlacement. Это означает лишь, что у вас есть возможность использования лигатур.

GCP_MAXEXTENT

Вычисляет размер строки, в логических единицах, до тех пор, пока он не превысит значение, заданное в параметре nMaxExtent.

GCP_NEUTRALOVERRIDE

Только для некоторых языков. Отменяет стандартную обработку нейтралей и интерпретирует их как самостоятельные символы, соответствующие порядку чтения строки. Применим только совместно с флагом GCP_REORDER.

GCP_NUMERICOVERRIDE

Только для некоторых языков. Отменяет обычную обработку цифр и интерпретирует их как самостоятельные символы в составе строки с заданным направлением чтения. Применим только совместно с флагом GCP_REORDER.

GCP_NUMERICSLATIN

Только для тайского и арабского языков. Использовать для чисел стандартные латинские глифы и отменить системные значения по умолчанию. Для определения того, доступна эта опция или нет используйте функцию GetStringTypeEx, которая позволит определить: поддерживает ли данный язык более одного формата записи чисел.

GCP_NUMERICSLOCAL

Только для тайского и арабского языков. Использовать для чисел локальные глифы и отменить системные значения по умолчанию. Для проверки доступности даной опции используйте функцию GetStringTypeEx, которая позволи определить: поддерживает ли данный язык более одного формата записи чисел.

GCP_REORDER

Переупорядочивает строку. Используется для языков, которые не используют двухбайтный набор символов (DBCS) и порядок чтения слева направо. Если этот флаг не задан, то строка уже соответствует тому порядку, в котором должна отображаться.

Если флаг установлен для языка семитской группы и используется масив lpClass, то первые два элемента массива используются для указания направления чтения. Для указания направления могут использоваться значения GCP_CLASS_PREBOUNDRTL и GCP_CLASS_PREBOUNDLTR. Если предустановленный порядок не требуется, то установите в этом параметре значение нуль. При устанволенном флаге GCP_CLASSIN данные значения могут комбинироваться с другими значениями.

Если флаг GCP_REORDER не задан,то параметр lpString имеет порядок, соответствующий порядку отображения строки на экранедля данного языка, а поля lpOutString и lpOrder (структуры GCP_RESULTS) игнорируются.

Для определения того, поддерживает литекущий шрифт переупорядочивание используйте функцию GetFontLanguageInfo.

GCP_SYMSWAPOFF

Только для языков семитской группы. Символы, зависящие от направления чтения не сбрасываются. Например, в строке с направлением чтения справа налево символы '(' и ')' не изменяются на противоположные.

GCP_USEKERNING

При создании массива размеров символов использовать пары символов с уменьшенным расстоянием между ними (kerning pairs). Для определения того, поддерживает ли шрифт пары символов с уменьшенным расстоянием между ними используйте функцию GetFontLanguageInfo.

Учтите, что если функция GetFontLanguageInfo возвращает флаг GCP_USEKERNING, это не значит, что данный флаг должен быть передан в функцию GetCharacterPlacement. Это означает лишь то, что вы можете использовать уменьшенное расстояние между символами. Большинство шрифтов TrueType имеют таблицу кернинга, но вы можете и не использовать их.

Заголовочный файл: wingdi.h (включен в windows.h)


Флаги функции GetClassLong (GCL_*)

GCL_CBCLSEXTRA

Возвращает размер, в байтах, дополнительной памяти класса.

GCL_CBWNDEXTRA

Возвращает размер, в байтах, допонительной памяти окна, которая предоставляется каждому окну данного класса. Для информации о том, как получить доступ к этой памяти см. описание функции GetWindowLong.

GCL_HBRBACKGROUND

Возвращает дескриптор фоновой кисти (background brush) класса.

GCL_HCURSOR

Вовращает дескриптор курсора класса.

GCL_HICON

Возвращает дескриптор иконки класса.

GCL_HICONSM

Возвращает дескриптор маленькой иконки класа.

GCL_HMODULE

Возвращает дескриптор модуля, который зарегистрировал данный класс.

GCL_MENUNAME

Возвращает адрес строки с наименованием меню. Данная строка идентифицирует ресурс меню класса.

GCL_STYLE

Возвращает набор бит, определяющих стили класса.

GCL_WNDPROC

Возвращает адрес оконной процедуры, или описатель представления адреса оконной процедуры. Вы должны использовать функцию CallWindowProc для вызова оконной процедуры.

GCW_ATOM

Возвращает занчение атома, который идентифицирует оконный класс. Это тот же самый атом, который возвращает функция RegisterClassEx.

Заголовочный файл: winuser.h (включен в windows.h)


Флаги функции GetDCEx (DCX_*)

DCX_CACHE

Возвращает контекст устройства (DC) из кеша, а не извлекает его из OWNDC или CLASSDC окна. По факту отменяет стили CS_OWNDC и CS_CLASSDC.

DCX_CLIPCHILDREN

Исключает видимые области всех дочерних окон, расположенных под окном идентифицируемым параметром hWnd.

DCX_CLIPSIBLINGS

Исключает видимые области всех окон одного уровня, расположенных над окном заданным в параметре hWnd.

DCX_EXCLUDERGN

Область отсечения идентифицируемая параметром hrgnClip исключается из видимой области возвращаемого DC.

DCX_INTERSECTRGN

Область отсечения идетифицируемая параметром hrgnClip пересекается с видимой областью возвращаемого DC.

DCX_INTERSECTUPDATE

Зарезервировано. Не используется.

DCX_LOCKWINDOWUPDATE

Позволяет рисовать на окне даже если был осуществлен вызов функции LockWindowUpdate, который запрещает рисование в окне. Используется для рисования во время отслеживания (tracking).

DCX_NORESETATTRS

Не сбрасывать атрибуты DC к значениям по умолчанию при его освобождении.

DCX_PARENTCLIP

Использует видимую область родительского окна. Родительские флаги WS_CLIPCHILDREN и CS_PARENTDC игнорируются. Начало области устанавливается в левый верхний угол окна, идентифицируемого параметром hWnd.

DCX_VALIDATE

Зарезервировано. Не используется.

DCX_WINDOW

Возвращает контекст устройства (DC) соответствующий прямоугольнику окна, а не клиентской области окна.

Заголовочный файл: winuser.h (включен в windows.h)


Флаги функции GetGlyphOutline (GGO_*)

GGO_BEZIER

Функция возвращает данные кривой в виде кубического сплайна Безье (не квадратного).

GGO_BITMAP

Функция возвращает битовую карту глифа (bitmap). Информация о выделении памяти приведена в комментариях к функции GetGlyphOutline.

GGO_GLYPH_INDEX

Указывает, что параметр uChar задает индекс глифа шрифта TrueType, а не код символа. Дополнительная информация об индексах глифов приведена в описании функции ExtTextOut.

GGO_GRAY2_BITMAP

Функция возвращает битовую карту глифа, имеющую 5 уровней серого.

GGO_GRAY4_BITMAP

Функция возвращает битовую карту глифа, имеющую 17 уровней серого.

GGO_GRAY8_BITMAP

Функция возвращает битовую карту глифа, имеющую 65 уровней серого.

GGO_METRICS

Функция возвращает только структуру GLYPHMETRICS, заданную в параметре lpgm. Значение параметра lpvBuffer игнорируется.

GGO_NATIVE

Функция возвращает точки кривой в родном (native) для растеризатора формате. В качестве единицы измерения используются единицы шрифта (font's design units).

GGO_UNHINTED

Функция возвращает только непрозрачные очертания (unhinted outlines). Данный флаг работает только совместно с флагами GGO_BEZIER и GGO_NATIVE.

Заголовочный файл: wingdi.h (включен в windows.h)


Флаги функции GetQueueStatus (QS_*)

QS_ALLEVENTS

(QS_INPUT | QS_POSTMESSAGE | QS_TIMER | QS_PAINT | QS_HOTKEY)

Сообщения ввода, WM_TIMER, WM_PAINT, WM_HOTKEY, или сообщения, помещенные (posted) в очередь.

QS_ALLINPUT

(QS_INPUT | QS_POSTMESSAGE | QS_TIMER | QS_PAINT | QS_HOTKEY | QS_SENDMESSAGE)

Любые сообщения в очереди.

QS_ALLPOSTMESSAGE

Сообщения, помещенные (posted) в очередь (оличные от тех, для которых предусмотрены отдельные флаги).

QS_HOTKEY

Сообщение WM_HOTKEY в очереди.

QS_INPUT

(QS_MOUSE | QS_KEY | QS_RAWINPUT)

Сообщения ввода в очереди.

QS_KEY

Сообщения WM_KEYUP, WM_KEYDOWN, WM_SYSKEYUP, или WM_SYSKEYDOWN в очереди.

QS_MOUSE

(QS_MOUSEMOVE | QS_MOUSEBUTTON)

Сообщение WM_MOUSEMOVE или какое-либо сообщение связанное с кнопками мыши (WM_LBUTTONUP, WM_RBUTTONDOWN и т.д.).

QS_MOUSEBUTTON

Сообщение связанное с кнопками мыши (WM_LBUTTONUP, WM_RBUTTONDOWN и т.д.).

QS_MOUSEMOVE

Сообщение WM_MOUSEMOVE в очереди.

QS_PAINT

Сообщение WM_PAINT в очереди.

QS_POSTMESSAGE

Сообщения, помещенные (posted) в очередь (оличные от тех, для которых предусмотрены отдельные флаги).

QS_RAWINPUT

В очереди сообщения, связанные с сырым вводом.

Windows 2000: данный флаг не поддерживается.

QS_SENDMESSAGE

В очереди сообщения отправленные (sent by) другим потоком, или приложением.

QS_TIMER

В очереди сообщение WM_TIMER.

Заголовочный файл: winuser.h (включен в windows.h)


Флаги функции GetStockObject

ANSI_FIXED_FONT

(11)

Системный моноширинный шрифт.

ANSI_VAR_FONT

(12)

Системный шрифт переменной ширины.

BLACK_BRUSH

(4)

Черная кисть.

BLACK_PEN

(7)

Черное перо.

DC_BRUSH

(18)

Сплошная (solid) цветная кисть. Цвет по умолчанию - белый. Цвет может быть изменен с помощью функции SetDCBrushColor.

DC_PEN

(19)

Цвет сплошного пера. Цвет по умолчанию - белый. Цвет может быть изменен с помощью функции SetDCPenColor.

DEFAULT_GUI_FONT

(17)

Шрифт по умолчанию для таких объектов пользовательского интерфейса как меню и диалоговые окна. Использование флагов DEFAULT_GUI_FONT и SYSTEM_FONT не рекомендуется для получения шрифта используемого в диалогах и окнах.

DEFAULT_PALETTE

(15)

Палитра по умолчанию. Данная палитра состоит из постоянных цветов системной палитры.

DEVICE_DEFAULT_FONT

(14)

Шрифт, зависящий от устройства.

DKGRAY_BRUSH

(3)

Темно-серая кисть.

GRAY_BRUSH

(2)

Серая кисть.

HOLLOW_BRUSH

(NULL_BRUSH)

Пустая (hollow) кисть (то же самое что и NULL_BRUSH).

LTGRAY_BRUSH

(1)

Светло-серая кисть.

NULL_BRUSH

(5)

Пустая (NULL) кисть (то же самое что и HOLLOW_BRUSH).

NULL_PEN

(8)

Пустое (null) перо. Такое перо ничего не рисует.

OEM_FIXED_FONT

(10)

Моноширинный шрифт OEM.

SYSTEM_FIXED_FONT

(16)

Стистемный моноширинный шрифт. Данный объект педоставляется только в целях совместимости с 16-разрядными версиями Windows до релиза 3.0.

SYSTEM_FONT

(13)

Системный шрифт. По умолчанию, данный шрифт используется при отрисовке меню, элементов управления диалоговых окон и текста. Использование флагов DEFAULT_GUI_FONT и SYSTEM_FONT не рекомендуется для получения шрифта используемого в диалогах и окнах.

Системным шрифтом по умолчанию является шрифт Tahoma.

WHITE_BRUSH

(0)

Белая кисть.

WHITE_PEN

(6)

Белое перо.

Заголовочный файл: wingdi.h (включен в windows.h)


Флаги функции GetSysColor (COLOR_*)

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)


Флаги функции GetSystemMetrics (SM_*)

SM_ARRANGE

Набор флагов, который определяет как система упорядочивает свернутые окна. Он редставляет сочетание фланов из двух наборов.

Первый набор флагов определяет стартовую позицию свернутых окон. Флаги из этого набора перечислены здесь.

Второй набор флагов определяет направление следования свернутых окон. Флаги из этого набора перечислены здесь.

SM_CLEANBOOT

Значение, которое определяет в каком режиме была загружена система:

0 - обычная загрузка;

1 - безопасный режим;

2 - безопасный режим с поддержкой сетевых соединений.

Безопасный режим игнорирует пользовательские файлы запуска.

SM_CMONITORS

Число отображаемых на рабочем столе мониторов. Оно отображает только видимые мониторы. В этом состоит отличие от функции EnumDisplayMonitors, которая перечисляет как видимые мониторы (visible display monitors), так и невидимые псевдомониторы (invisible pseudo-monitors), которые ассоциированы с драйверами зеркалирования (mirroring drivers). Невидимые псевдомониторы ассоциированы с псевдоустройствами, используемыми для зеркального отображения изображений для удаленных работ и других задач.

SM_CMOUSEBUTTONS

Число кнопок на мыше, или нуль, если нет ни одной установленной мыши.

SM_CONVERTIBLESLATEMODE

Отражает состояние режима ноутбука или планшета (laptop or slate mode). Когда данная настройка изменяется, система рассылает сообщение WM_SETTINGCHANGE с lparam, указывающим на строку "ConvertibleSlateMode".

SM_CXBORDER

Ширина в пикселях рамки окна. Это значение эквивалентно значению SM_CXEDGE для окон с трехмерным видом (windows with 3-D look).

SM_CXCURSOR

Ширина в пикселях курсора. Система не может создавать курсоры других размеров.

SM_CXDLGFRAME

То же самое что и SM_CXFIXEDFRAME.

SM_CXDOUBLECLK

Ширина в пикселях прямоугольника вокруг места первого щелчка мыши, внутри которого должен быть произведен второй щелчок мыши во время двойного щелчка мыши. Второй щелчок должен быть произведен внутри прямоугольника ограниченного SM_CXDOUBLECLK и SM_CYDOUBLECLK для систем, воспринимающих два щелчка мыши как один двойной щелчок. Два щелчка также должны быть произведены в течение фиксированного промежутка времени.

Для установления ширины этого прямоугольника используйте функцию SystemParameterInfo с флагом SPI_SETDOUBLECLKWIDTH.

SM_CXDRAG

Число пикселей на каждую сторону, перемещение на которое нажатой мыши не инициирует начало операции перетаскивания (drag operation). Это позволяет пользователю нажимать и отпускать клавишу мыши без инициирования операции перетаскивания. Если значение отрицательно, то его вычитают из левой нижней точки положения мыши и добавляют к правой.

SM_CXEDGE

Ширина в пикселях трехмерной границы (3-D border). Этот параметр является трехмерным аналогом параметра SM_CXBORDER.

SM_CXFIXEDFRAME

Толщина в пикселях рамки вокруг периметра окна, которое имеет заголовок, но размеры которого не изменяются.

SM_CXFIXEDFRAME задает высоту горизонтальной границы.

SM_CYFIXEDFRAME задает ширину вертикальной границы.

Значение SM_CXFIXEDFRAME аналогично значению SM_CXDLGFRAME.

SM_CXFOCUSBORDER

Ширина левой и правой границ прямоугольника, который отрисовывается функцией DrawFocusRect. Значение задается в пикселях. В Windows 2000 данное значение не поддерживается.

SM_CXFRAME

Тоже самое, что и SM_CXSIZEFRAME.

SM_CXFULLSCREEN

Ширина в пикселях клиентской области окна развернутого на весь экран на основном мониторе. Для получения координат части экрана, которая не перекрывается системной панелью задач или приложением панели инструментов, используйте функцию SystemParametersInfo с флагом SPI_GETWORKAREA.

SM_CXHSCROLL

Ширина в пикселях, изображения стрелки на горизонтальной полосе прокрутки.

SM_CXICON

Ширина иконки по умолчанию в пикселях. Функция LoadIcon может загрузить только иконки с размерами заданными в SM_CXICON и SM_CYICON.

SM_CXICONSPACING

Ширина в пикселях ячейки сетки для больших иконок. Каждая такая ячейка ограничена прямоугольником заданным в CM_CXICONSPACING и CM_CYICONSPACING. Это значение всмега больше или равно значению SM_CXICON.

SM_CXMAXIMIZED

Ширина по умолчанию в пикселях, развернутого на весь экран окна верхнего уровня на основном мониторе.

SM_CXMAXTRACK

Максимальная ширина по умолчанию окна, которое имеет заголовок и размер которого может изменяться. Это значение относится ко всему рабочему столу. Пользователь не может перетаскивать окно, размер которого больше, чем данное значение. Окно может переопределить это значение во время обработки сообщения WM_GETMINMAXINFO.

SM_CXMENUCHECK

Ширина по умолчанию рисунка метки меню. В пикселях.

SM_CXMENUSIZE

Ширина в пикселях кнопок области меню, таких как кнопка закрытия дочернего окна в многодокументальном интерфейсе (MDI).

SM_CXMIN

Минимальная ширина окна в пикселях.

SM_CXMINIMIZED

Ширина свёрнутого окна в пикселях.

SM_CXMINSPACING

Ширина в пикселях ячейки таблицы свёрнутых окон. Каждое свёрнутое окно помещается в прямоугольник данного размера. Данное значение всегда больше или равно значению SM_CXMINIMIZED.

SM_CXMINTRACK

Минимальная отслеживаемая ширина окна в пикселях. Пользователь не может перемещать окно, размер которого меньше данного значения. Окно может переопределить это значение во время обработки сообщения WM_GETMINMAXINFO.

SM_CXPADDEDBORDER

Сумма в пикселях дополнений границы для озаглавленных окон.

Windows XP/2000: не поддержвается.

SM_CXSCREEN

Ширина экрана в пикселях на основном мониторе. Это же значение возвращает функция GetDeviceCaps, вызванная следующим образом: GetDevceCaps(hdcPrimaryMonitor,HORZRES).

SM_CXSIZE

Ширина, в пикселях, кнопки в заголовке окна.

SM_CXSIZEFRAME

Толщина в пикселях границы вокруг окна, размеры которого могут быть изменены.

SM_CXSIZEFRAME задает ширину горизонтальной границы.

SM_CYSIZEFRAME задает высоту вертикальной границы.

Данное значение аналогично значению SM_CXFRAME.

SM_CXSMICON

Рекомендуемая ширина маленькой иконки в пикселях. Маленькие иконки обычно используются в заголовках окон.

SM_CXSMSIZE

Ширина маленьких кнопок заголовка в пикселях.

SM_CXTHUMB

Ширина в пикселях бегунка на горизонтальной полосе прокрутки.

SM_CXVIRTUALSCREEN

Ширина в пикселях виртуального экрана. Виртуальным экраном является ограничивающий прямоугольник для всех мониторов. Параметр CM_XVIRTUALSCREEN задает координаты левой стороны виртуального экрана.

SM_CXVSCROLL

Ширина в пикселях вертикальной полосы прокрутки.

SM_CYBORDER

Высота в пикселях границы окна. Это значение эквивалентно значению SM_CYEDGE для окон с трехмерным видом (windows with 3-D look).

SM_CYCAPTION

Высота в пикселях области заголовка окна.

SM_CYCURSOR

Высота в пикселях курсора. Система не может создать курсор другого размера.

SM_CYDLGFRAME

То же самое что SM_CYFIXEDFRAME.

SM_CYDOUBLECLK

Высота в пикселях прямоугольника вокруг места первого щелчка мыши, внутри которого должен быть произведен второй щелчок мыши во время двойного щелчка мыши. Второй щелчок должен быть произведен внутри прямоугольника ограниченного SM_CXDOUBLECLK и SM_CYDOUBLECLK для систем, воспринимающих два щелчка мыши как один двойной щелчок. Два щелчка также должны быть произведены в течение фиксированного промежутка времени.

Для установления высоты этого прямоугольника используйте функцию SystemParameterInfo с флагом SPI_SETDOUBLECLKHEIGHT.

SM_CYDRAG

Число пикселей над и под текущим положением курсора мыши, перемещение на которое нажатой мыши не инициирует начало операции перетаскивания (drag operation). Это позволяет пользователю нажимать и отпускать клавишу мыши без инициирования операции перетаскивания. Если значение отрицательно, то его вычитают из левой верхней точки положения мыши и добавляют к нижней.

SM_CYEDGE

Высота трехмерной границы в пикселях. Этот параметр является трехмерным аналогом параметра SM_CYBORDER.

SM_CYFIXEDFRAME

Толщина в пикселях рамки вокруг окна, который имеет заголовок но размер которого, не может изменяться.

SM_CXFIXEDFRAME задает высоту горизонтальной границы.

SM_CYFIXEDFRAME задает ширину вертикальной границы.

Данное значение аналогично значению SM_CYDLGFRAME.

SM_CYFOCUSBORDER

Высота верхней и нижней границы прямоугольника, нарисованного функцией DrawFocusRect. Значение задается в пикселях.

Windows 2000: данное значение не поддерживается.

SM_CYFRAME

То же самое что и SM_CYSIZEFRAME.

SM_CYFULLSCREEN

Высота в пикселях клиентской области развернутого на весь экран окна на основном мониторе. Для получения координат части экрана, которая не перекрывается системной панелью задач или приложением панели инструментов, используйте функцию SystemParametersInfo с флагом SPI_GETWORKAREA.

SM_CYHSCROLL

Высота в пикселях горизонтальной полосы прокрутки.

SM_CYICON

Ширина иконки по умолчанию. Значение задается в пикселях. Функция LoadIcon может загрузить только иконки с размерами SM_CXICON и SM_CYICON.

SM_CYICONSPACING

Высота в пикселях ячейки таблицы для просмотра больших иконок. Каждый элемент этой таблицы размещается в прямоугольнике размером SM_CXICONSPACING на SM_CYICONSPACING. Значение этого параметра всегда больше или равно значения SM_CYICON.

SM_CYKANJIWINDOW

Для систем с двухбайтным набором символов, залает высоту в пикселях окна кандзи (китайские иероглифы) в нижней части экрана.

SM_CYMAXIMIZED

Высота по умолчанию развернутого на весь экран окна на основном мониторе. Значение задается в пикселях.

SM_CYMAXTRACK

Максимальная высота окна, которое имеет заголовок и размеры которого могут изменяться. Значение задается в пикселях. Это значение относится ко всему рабочему столу. Пользователь не может перетаскивать окно, размер которого больше, чем данное значение. Окно может переопределить это значение во время обработки сообщения WM_GETMINMAXINFO.

SM_CYMENU

Высота в пикселях однострочного меню (single-line menu bar).

SM_CYMENUCHECK

Высота по умолчанию рисунка метки меню. В пикселях.

SM_CYMENUSIZE

Высота в пикселях кнопок области меню, таких как кнопка закрытия дочернего окна в многодокументальном интерфейсе (MDI).

SM_CYMIN

Минимальная высота окна в пикселах.

SM_CYMINIMIZED

Высота свёрнутого окна в пикселах.

SM_CYMINSPACING

Высота в пикселях ячейки таблицы свёрнутых окон. Каждое свёрнутое окно помещается в прямоугольник данного размера. Данное значение всегда больше или равно значению SM_CYMINIMIZED.

SM_CYMINTRACK

Минимальная отслеживаемая высота окна в пикселях. Пользователь не может перемещать окно, размер которого меньше данного значения. Окно может переопределить это значение во время обработки сообщения WM_GETMINMAXINFO.

SM_CYSCREEN

Высота в пикселях экрана основного монитора. То же самое значение возвращает функция GetDeviceCaps, вызванная следующим образом: GetDeviceCaps(hdcPrimaryMonitor, VERTRES).

SM_CYSIZE

Высота кнопки в пикселах в заголовке окна.

SM_CYSIZEFRAME

Толщина в пикселях границы вокруг окна, размеры которого могут быть изменены.

SM_CXSIZEFRAME задает ширину горизонтальной границы.

SM_CYSIZEFRAME задает высоту вертикальной границы.

Данное значение аналогично значению SM_CYFRAME.

SM_CYSMCAPTION

Высота маленького заголовка в пикселях.

SM_CYSMICON

Рекомендуемая высота маленькой иконки в пикселях. Маленькие иконки обычно используются в заголовке окна.

SM_CYSMSIZE

Высота кнопок маленького заголовка в пикселях.

SM_CYVIRTUALSCREEN

Высота в пикселях виртуального экрана. Виртуальным экраном является ограничивающий прямоугольник для всех мониторов. Параметр CM_YVIRTUALSCREEN задает координаты верхней стороны виртуального экрана.

SM_CYVSCROLL

Высота в пикселях изображения стрелки на вертикальной полосе прокрутки.

SM_CYVTHUMB

Высота в пикселях бегунка на вертикальной полосе прокрутке.

SM_DBCSENABLED

Ненулевое значение, если библиотека User32.dll поддерживает DBCS (набор двухбайтовых символов). В противном случае значение нуль.

SM_DEBUG

Ненулевое значение если установлена отладочная версия User.exe. В противном случае значение нуль.

SM_DIGITIZER

Ненулевое значение если текущей операционной системой является Windows 7 или Windows Server 2008 R2 и запущена служба Tablet PC Input. В противном случае значение нуль. Вовзращаемое значение представляет собой битовую маску, которая определяет тип поддерживаемого устройством оцифровщика. Допустимые флаги этой маски перечислены здесь.

Windows Server 2008, Windows Vista и Windows XP/2000: данное значение не поддерживается.

SM_IMMENABLED

Ненулевое значение если доступен редактор метода ввода (IME). В пртивном случае значение нуль.

Данный параметр указывает на то, что система готова использовать IME на основе Unicode для Unicode приложений. Для того, чтобы убедиться в том, что IME работает, проверьте параметр SM_DBCSENABLED и системную кодовую страницу ANSI. В противном случае преобразование ANSI в Unicode может происходить некорректно, или некоторые компоненты такие как шрифты могут отсутствовать.

SM_MAXIMUMTOUCHES

Отлично от нуля если присутствует оцифровщик. В пртивном случае значение равно нулю.

Данный параметр возвращает максимальное количество одновременных прикосновений, поддерживаемых одним устройством среди всех оцифровщиков доступных в системе. Если система имеет только оцифровщики, подержвающие единичное прикосновение (single-touch digitizers), то возвращаемое значение равно единице. Если же система имеет оцифровщики, поддерживающие множественные прикосновения (multi-touch doigitizers), то возвращемое значение представляет собой максимальное поддерживаемое количество одновременных прикосновений к отдельному устройству.

Windows Server 2008, Windows Vista и Windows XP/2000: данное значение не поддерживается.

SM_MEDIACENTER

Ненулевое значение, если текущей операционной системой является Windows XP Media Center Edition. В противном случае значение нуль.

SM_MENUDROPALIGNMENT

Ненулевое значение, если раскрывающиеся меню (drop-down menus) выравниваются по правому краю сответствующего элемента полосы меню. Нуль, если меню выравнивается по левому краю.

SM_MIDEASTENABLED

Ненулевое значение, если система может работать с ивритом и арабским языком. В противном случае - нуль.

SM_MOUSEHORIZONTALWHEELPRESENT

Ненулевое значение, если мышь имеет горизонтальное колёсико прокрутки. Нуль в противном случае.

SM_MOUSEPRESENT

Ненулевое значение, если установлена мышь. В противном случае значение нуль. Данное значение редко равно нулю, из-за поддержки виртуальных мышей и, так как некоторые системы проверяют наличие порта, но не мыши.

SM_MOUSEWHEELPRESENT

Ненулевое значение, если мышь имеет вертикальное колесико прокрутки. Нуль в противном случае.

SM_NETWORK

Самый младший бит возвращаемого значения взводится в случае наличия сети. В противном случае он сброшен. Остальные биты зарезервированы для будущего использования.

SM_PENWINDOWS

Ненулевое значение, если установлены расширения Microsoft Windows для работы с пером (Pen computing). В противном случае значение нуль.

SM_REMOTECONTROL

Используется в окружении Terminal Services для определения того, является ли текущий сеанс Terminal Server удаленно управляемым (remotely controlled). Значение отлично от нуля если текущий сеанс является удаленным. В противном случае, значение нуль.

Вы можете использовать утилиты управления teminal services, такие как Terminal Services Manager (tsadmin.msc) и shadow.exe для управления за удаленным сеансом. Кога сеанс является удаленным, другой пользователь может просматривать содержимое этого сеанса и взаимодействовать с ним.

SM_REMOTESESSION

Используется в окружении Terminal Services. Если вызывающий процесс ассоциирован с клиентским сеансом Terminal Services, то возвращаемое значение отлично от нуля. Если же вызывающий процесс ассоциирован с консольным сеансом Terminal Services, то возвращаемое значение равно нулю.

Windows Server 2003 и Windows XP: консольный сеанс необязательно основывается на фихзической консоли.

SM_SAMEDISPLAYFORMAT

Ненулевое значение, если все мониторы имеют одинаковый формат цветов (color format). В противном случае, значение нуль. Два монитора могут иметь одинаковую глубину цвета, но разные форматы цветов. Например, красный, зеленый и синий цвета могут кодироваться разным количеством бит, или эти биты могут располагаться в различных позициях значения цвета пикселя.

SM_SECURE

Должна игнорироваться. Возвращаемое значение всегда равно нулю.

SM_SERVERR2

Номер билда, если текущей операционной системой является Windows Server 2003 R2. Во всех других случаях - значение нуль.

SM_SHOWSOUNDS

Ненулевое значение, когда пользователь запрашивает у приложения визуального представления информации в ситуациях, когда имеющаяся информация представлялась бы только в звуковой форме (audible form). В противном случае - значение нуль.

SM_SHUTTINGDOWN

Ненулевое значение, если текущий сеанс завершает свою работу. В пртивном случае - значение нуль.

Windows 2000: данное значение не поддерживается.

SM_SLOWMACHINE

Ненулевое значение, если компьютер имеет бюджетный (медленный) процессор. В противном случае - значение нуль.

SM_STARTER

Ненулевое значение, если текущей операционной системой является Windows 7 Starter Edition, Windows Vista Starter, или Windows XP Starter Edition. В противном случае - значение нуль.

SM_SWAPBUTTON

Ненулевое значение если назначение левой и правой кнопок мыши поменяно местами. В противном случае - значение нуль.

SM_SYSTEMDOCKED

Отражает состояние режима стыковки (docking mode). Когда данный параметр изменяется система рассылает широковещательное сообщение WM_SETTINGCHANGE с параметром lparam, указывающим на строку "SystemDockMode".

SM_TABLETPC

Ненулевое значение, если текущей операционной системой является Windows XP Tablet PC edition или если текущей операционной системой является Windows Vista или Windows 7 и запущена служба Tablet PC Input. В противном случае - значение нуль.

SM_XVIRTUALSCREEN

Координаты левого края виртуального экрана. Виртуальный экран - это органичивающий прямоугольник всех мониторов. Параметр SM_CXVIRTUALSCREEN задает ширину виртуального экрана.

SM_YVIRTUALSCREEN

Координаты верхнего края виртуального экрана. Виртуальный экран - это органичивающий прямоугольник всех мониторов. Параметр SM_CYVIRTUALSCREEN задает высоту виртуального экрана.

Заголовочный файл: winuser.h (включен в windows.h)


Флаги функции LCMapStringEx

LCMAP_BYTEREV

(0x00000800)

Развернуть байты. Например, если приложение передает в функцию 0x3450 и 0x4822, то функция вернет 0x5034 и 0x2248.

LCMAP_FULLWIDTH

(0x00800000)

Где возможно использовать символы Unicode (широкие). Данный флаг несовместим с флагом LCMAP_HALFWIDTH.

LCMAP_HALFWIDTH

(0x00400000)

Где возможно использовать узкие (narrow) символы. Данный флаг несовместим с флагом LCMAP_FULLWIDTH.

LCMAP_HIRAGANA

(0x00100000)

Отображать все символы катаканы в символы хираганы. Данный флаг несовместим с флагом LCMAP_KATAKANA.

LCMAP_KATAKANA

(0x00200000)

Отображать все символы хираганы в символы катаканы. Данный флаг несовместим с флагом LCMAP_HIRAGANA.

LCMAP_LINGUISTIC_CASING

(0x01000000)

Вместо системных правил (по умолчанию) использовать лингвистические правила. Данный флаг допустим только в сочетании с флагом LCMAP_LOWERCASE или LCMAP_UPPERCASE.

LCMAP_LOWERCASE

(0x00000100)

Для локалей и скриптов, допускающих обработку символов верхнего и нижнего регистра, привести все символы к нижнему регистру.

LCMAP_SIMPLIFIED_CHINESE

(0x02000000)

Отображать символы традиционного китайского языка в символы упрощенного китайского языка. Данный флаг несовместим с флагом LCMAP_TRADITIONAL_CHINESE.

LCMAP_SORTKEY

(0x00000400)

Создать нормализованный ключ сортировки (sort key). Если данный флаг не определен, функция выполняет отображение строки.

LCMAP_TITLECASE

(0x00000300)

Windows 7. Отображать все символы в формате заглавных первых букв предложений. В этом формате первые буквы первых слов предложений приводятся к верхнему регистру. Остальные буквы - к нижнему.

LCMAP_TRADITIONAL_CHINESE

(0x04000000)

Отображать символы упрощенного китайского языка в символы традиционного китайского языка. Данный флаг несовместим с флагом LCMAP_SIMPLIFIED_CHINESE.

LCMAP_UPPERCASE

(0x00000200)

Для локалей и скриптов, допускающих обработку символов верхнего и нижнего регистра, привести все символы к верхнему регистру.

Флаги, перечисленные ниже могут быть использовать самостоятельно, совместно друг с другом, или же совместно с флагом LCMAP_SORTKEY или LCMAP_BYTEREV. Однако они не могут сочетаться с другими флагами, приведенными выше.

NORM_IGNORENONSPACE

(0x00000002)

Игнорировать непробельные символы. Для большинства скриптов (особенно латинских), флаг NORM_IGNORENONSPACE эквивалентен флагу LINGUISTIC_IGNOREDIACRITIC.

Флаг NORM_IGNORENONSPACE игнорирует все вторичные различия, вне зависимости от того, являются ли они диакритическими знаками или нет. Скрипты для корейского, японского, китайского и индийского языков, используют эти различия для целей, отличных от целей диакритических знаков. Флаг LINGUISTIC_IGNOREDIACRITIC заставляет функцию игнорировать только действительные диакритические знаки, вместо всех вторичных (дополнительных) символов.

NORM_IGNORESYMBOLS

(0x00000004)

Игнорировать символы и знаки пунктуации.

Флаги перечисленные ниже используются только совместно с флагом LCMAP_SORTKEY.

LINGUISTIC_IGNORECASE

(0x00000010)

Игнорировать регистр, по правилам лингвистики.

LINGUISTIC_IGNOREDIACRITIC

(0x00000020)

Игнорировать непробельные символы, по правилам лингвистики.

При работе с раздельными (decomposed) символами данный флаг не всегда приводит к предсказуемым результатам. Такие символы состоят из базового символа и одного или нескольких непробельных символов. Каждый из таких симвлов имеет отдельную кодовую точку.

NORM_IGNORECASE

(0x00000001)

Игнорировать регистр. Для большинства скриптов (особенгно латинских), флаг NORM_IGNORECASE эквивалентен флагу LINGUISTIC_IGNORECASE.

Флаг NORM_IGNORECASE игнорирует все третьичные различия, вне зависимости от правил лингвистики. Например, в арабских и индийских скриптах, данный флаг различает разные формы символа, но эта разница не соответствует правилам лингвистики. Флаг LINGUISTIC_IGNORECASE заставляет функцию игнорировать только действительные лингвистические различия, вместо того, чтобы игнорировать все третьичные различия.

Для локалей с двухбайтовым набором символов (DBCS) флаг NORM_IGNORECASE воздействует на все символы Unicode точно так же, как и на узкие (однобайтовые) символы, включая символы греческого алфавита и кириллицы.

NORM_IGNOREKANATYPE

(0x00010000)

Не различать символы хираганы и катаканы. Соответствующие символы хираганы и катаканы сравниваются как идентичные.

NORM_IGNOREWIDTH

(0x00020000)

Игнорировать разницу между полуширокими (half-width) и полноширокими (full-width) символами. Например, строка "C a t" считается эквивалентной строке "cat". Полноширокая (full-width) форма используется для форматного различения в китайских и японских скриптах.

NORM_LINGUISTIC_CASING

(0x08000000)

Вместо правил файловой системы (по умолчанию) использовать правила лингвистики.

SORT_DIGITSASNUMBERS

(0x00000008)

Windows 7. Во время сортировки интерпретировать цифры как числа. Например, строку "2" размещать до строки "10".

SORT_STRINGSORT

(0x00001000)

Интерпретировать знаки пунктуации так же как и символы.

Заголовочный файл: winnls.h (включен в windows.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)


Флаги функции MessageBeep (MB_*)

-1

Простейший звуковой сигнал. Если звуковая карта не устанволена, то он воспроизводится системным динамиком.

MB_ICONASTERISK

То же самое что и MB_ICONINFORMATION.

MB_ICONEXCLAMATION

То же самое что и MB_ICONWARNING.

MB_ICONERROR

Критическая ошибка.

MB_ICONHAND

То же самое что и MB_ICONERROR.

MB_ICONINFORMATION

Системное уведомление.

MB_ICONQUESTION

Вопрос.

MB_ICONSTOP

То же самое что и MB_ICONERROR.

MB_ICONWARNING

Восклицание

MB_OK

Стандартный звук

Заголовочный файл: winuser.h (включен в windows.h)


Флаги функции MultiByteToWideChar (MB_*)

MB_COMPOSITE

Всегда использовать декомпозированные символы, то есть символы, в которых базовый символ и один или несколько непробельных символов имеют различные значения кодов. Например, символ A представляется в виде символов A (U+0041) и ¨ (U+0308). Данный флаг не может использоваться совместно с флагом MB_PRECOMPOSED.

MB_ERR_INVALID_CHARS

Если встречается недопустимый символ, то функция завершается ошибкой.

Начиная с Windows Vista, функция не отбрасывает недопустимые символы, если приложение не установило этот флаг.

Windows 2000 с SP4 и новее, Windows XP: если этот флаг не установлен, то функция отбрасывает нелопустимые символы без генерирования ошибки. Функция GetLastError вернет значение ERROR_NO_UNICODE_TRANSLATION.

MB_PRECOMPOSED

Используется по умолчанию. Не совместим с флагом MB_COMPOSITE. Всегда использовать составные символы, то есть символы, имеющие один код для комбинации базового и одного или нескольких непробельных символов. Например, в символе e, символ e явялется базовым, а знак ударения - непробельный символ. Если в Unicode есть код для составного символа, то приложение должно использовать именно его, вместо последовательности базового и дополнительных символов. Например, символ A описывается одним кодом U+00C4.

MB_USEGLYPHCHARS

Использовать символ глифа (glyph) вместо управляющих символов.

Заголовочный файл: Stringapiset.h (включен в windows.h)


Флаги функции SetSystemCursor (OCR_*)

OCR_APPSTARTING

32650

Стандартная стрелка и маленькие песочные часы.

OCR_NORMAL

32512

Стандартная стрелка

OCR_CROSS

32515

Перекрестие

OCR_HAND

32649

Рука

OCR_HELP

32651

Стрелка и знак вопроса

OCR_IBEAM

32513

I-образный курсор

OCR_NO

32648

Зачеркнутый круг

OCR_SIZEALL

32646

Четырехконечная стрелка, указывающая на север, юг, восток и запад.

OCR_SIZENESW

32643

Стрелка с двойным концом, указывающая на северо-восток и юго-запад.

OCR_SIZENS

32645

Стрелка с двойным концом, указывающая на север и юг.

OCR_SIZENWSE

32642

Стрелка с двойным концом, указывающая на северо-запад и юго-восток.

OCR_SIZEWE

32644

Стрелка с двойным концом, указывающая на запад и восток.

OCR_UP

32516

Вертикальная стрелка.

OCR_WAIT

32514

Песочные часы.

Заголовочный файл: winuser.h (включен в windows.h)


Флаги функции SetWindowPos (SWP_*)

SWP_ASYNCWINDOWPOS

Если вызывающий поток и поток, владеющий окном подключены к различным очередям система отправляет запрос потоку, который владеет окном. Это предотвращает блокирование вызывающего потока во время обработки запроса другими потоками.

SWP_DEFERERASE

Предотвращает создание сообщения WM_SYNCPAINT.

SWP_DRAWFRAME

Рисует рамку (определенную в описании оконного класса) вокруг окна.

SWP_FRAMECHANGED

Применяет новый набор стилей рамки. Отправляет сообщение WM_NCCALCSIZE окну даже если размер окна не изменился. Если этот флаг не установлен сообщение WM_NCCALCSIZE отправляется только если был изменен размер окна.

SWP_HIDEWINDOW

Скрывает окно.

SWP_NOACTIVATE

Не активирует окно. Если это флаг не установлен окно активируется и перемещается на вершину окон верхнего уровня или на вершину окон, не являющихся окнами верхнего уровня.

SWP_NOCOPYBITS

Сбрасывает всё содержимое клиентской области окна. Если этот флаг не установлен допустимое содержимое клиентской области сохраняется и копируется обратно на клиентскую область после того как размер и/или положение окна будут изменены.

SWP_NOMOVE

Сохраняется текущая позиция окна (параметры X и Y игнорируются).

SWP_NOOWNERZORDER

Позиция окна в Z-последовательности не изменяется.

SWP_NOREDRAW

Изменения не перерисовываются.

SWP_NOREPOSITION

То же самое что и SWP_NOOWNERZORDER.

SWP_NOSENDCHANGING

Предотвращает прием сообщения WM_WINDOWPOSCHANGING.

SWP_NOSIZE

Сохраняет текущий размер окна (параметры cx и cy игнорируются).

SWP_NOZORDER

Сохраняет текущую позицию в Z-последовательности (параметр hWndInsertAfter игнорируется).

SWP_SHOWWINDOW

Делает окно видимым.

Заголовочный файл: winuser.h (включен в windows.h)


Флаги функции ShowWindow (SW_*)

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)


Флаги функции WideCharToMultiByte (WC_*)

WC_COMPOSITECHECK

Конвертировать составные символы, состоящие из отличающихся базового и непробельного символов. Данные символы транслируются в предварительно составленные символы, в которых имеется отдельный символ для каждой комбинации. Например, в символе e, e является базовым символом, а знак ударения - дополнительным непробельным символом.

Учтите, что обычно Windows представляет Unicode строки с использованием предварительно составленных символов, поэтому использование флага WC_COMPOSITECHECK необязательно.

Ваше приложение может комбинировать этот флаг с дополнительными флагами перечисленными ниже. По умолчанию используется флаг WC_SEPCHARS. Эти дпополнительные флаги задают поведение функции при отсутствии в Unicode предварительно составленной комбинации символов. Если ни один из этих флагов не установлен, то используется флаг WC_SEPCHARS.

WC_DEFAULTCHAR - исключения заменяются символом по умолчанию.

WC_DISCARDNS - отбрасывает непробельные символы.

WC_SEPCHARS - по умолчанию. Генерировать отдельные символы.

WC_ERR_INVALID_CHARS

Windows Vista и новее. Если встречается недопустимый символ, то происходит ошибка. Если это флаг не установлен. то функция "молча" пропустит недопустимые символы. Функция GetLastError вернет код ERROR_NO_UNICODE_TRANSLATION. Учтите, что этот флаг используется только если в параметре CodePage задана кодовая страница CP_UTF8 или 54936 (для Windows Vista и новее). Он не может использоваться с другими кодовыми страницами.

WC_NO_BEST_FIT_CHARS

Все символы Unicode, которые не транслируются в многобайтный эквивалент, транслировать в символ по умиолчанию, заданный в параметре lpDefaultChar. Другими словами, если перевод символа Unicode в многобайтный эквивалент и обратно приводит к появлению на его месте другого символа, то функция использует символ по умолчанию. Данный флаг может использоваться самостоятельно или в сочетании с другими флагами.

Для строк, которые требуют проверки, например, наименование файла, ресурса, пользователя, приложение всегда должно использовать флаг WC_NO_BEST_FIT_CHARS. Он запретит функции транслировать символы в похожие на низх символы, которые выглядят приблизительно так же, но имеют другую семантику. Внекоторых случаях, изменение семантики может стать критичным. Например, символ (бесконечность) в некоторых кодовых страницах приводится к символу 8 (восемь).

Заголовочный файл: Stringapiset.h (включен в windows.h)


Форматы буфера обмена (CF_*)

CF_BITMAP

Дескриптор растрового изображения (HBITMAP).

CF_DIB

Объект памяти, содержащий структуру BITMAPINFO, предшествующую растровому изображению (bitmap).

CF_DIBV5

Объект памяти содержащий структуру BITMAPV5HEADER, предшествующую информации о пространстве цветов растрового изображения и самому растровому изображению.

CF_DIF

Формат обмена графической информацией.

CF_DSPBITMAP

Растровый формат отображения, ассоциированный с закрытым форматом. Параметр hMem должен содержать дескриптор данных, которые могут быть отображены в растровом формате, взамен данных, представленных в закрытом формате.

CF_DSPENHMETAFILE

Улучшенный формат отображения метафайлов, ассоциированный с закрытым форматом. Параметр hMem должен содержать дескриптор данных, которые могут быть отображены в расширенном формате метафайлов, взамен данных, представленных в закрытом формате.

CF_DSPMETAFILEPICT

Формат отображения метаизображений, ассоциированный с закрытым форматом. Параметр hMem должен соержать дескриптор данных, которые могут быть отображены в формате отображения метаизображений, взамен данных, представленных в закрытом формате.

CF_DSPTEXT

Формат отображения текста, ассоциированный с закрытым форматом. Параметр hMem должен содержать дескриптор данных, которые могут быть отображены в текстовом формате, взамен данных, представленных в закрытом формате.

CF_ENHMETAFILE

Дескриптор улучшенного метафайла (HENHMETAFILE).

CF_GDIOBJFIRST

Начало интервала целых значений для определенного приложением формата буфера обмена объектов GDI. Концом интервала является CF_GDIOBJLAST. Значение параметра hMem не является дескриптором объекта GDI.

CF_GDIOBJLAST

см. CF_GDIOBJFIRST.

CF_HDROP

Дескриптор типа HDROP, который идентифицирует список файлов. Приложение может получить информацию о файлах путём передачи дескриптора в функцию DragQueryFile.

CF_LOCALE

Данные являются дескриптором идентификатора локали, ассоциированной с текстом в буфере обмена. Когда вы закрываете буфер обмена, если он содержит данные CF_TEXT, но не данные CF_LOCALE система автоматически устанавливает формат CF_LOCALE для текущего языка ввода. Вы можете использовать формат CF_LOCALE для ассоциирования другой локали с текстом в буфере обмена.

Приложение, которое читает текст из буфера обмена может получить это формат для определения набора символов, используемого для генерации этого текста.

Буфер обмена не поддерживает текст в нескольких наборах символов. Для работы с таким текстом используйте форматированный текст, типа RTF.

Система использует кодовую страницу, ассоциированную с CF_LOCALE для неявного преобразования из CF_TEXT в CF_UNICODETEXT. Это позволяет использовать правильную кодовую страницу для преобразования.

CF_METAFILEPICT

Дескриптор на формат метафайла изображения, предсьтавленный в виде структуры METAFILEPICT. При передаче дескриптора CF_METAFILEPICT посредством DDE приложение, отвечающее за удаление hMem, должно также освободить метафайл, на который ссылается дескриптор CF_METAFILEPICT.

CF_OEMTEXT

Формат текста, содержащего символы в кодировке OEM. Каждая строка заканчивается комбинацией (CR-LF). NULL символ является признаком конца данных.

CF_OWNERDISPLAY

Самостоятельно отображаемый формат. Владелец буфера обмена должен отображать и обновлять окно просмотрщика буфера обмена и принимать сообщения WM_ASKCBFORMATNAME, WM_HSCROLLCLIPBOARD, WM_PAINTCLIPBOARD, WM_SIZECLIPBOARD и WM_VSCROLLCLIPBOARD. Значение параметра hMem должно быть равно NULL.

CF_PALETTE

Дескриптор палитры цветов. Когда приложение помещает в буфер обмена данные, которые зависят от палитры цветов, то это приложение должно так же разместить в буфере обмена палитру цветов. Если буфер обмена содержит данные в формате CF_PALETTE (логическая палитра цветов), то приложение должно использовать функции SelectPalette и RealizePalette для сравнения данных в буфере обмена. При отображении данных буфера обмена, буфер обмена всегда использует свою текущую палитру, находящуюся в буфере обмена в формате CF_PALETTE.

CF_PENDATA

Данные для расширений пера Windows.

CF_PRIVATEFIRST

Начало интервала целых чисел для закрытых форматов буфера обмена. Интервал заканчивается с CF_PRIVATELAST. Дескрипторы, ассоциированные с закрытыми форматами буфера обмена, автоматически не освобождаются. Владелец буфера обмена должен освобождать такие дескрипторы, обычно в ответ на сообщение WM_DESTROYCLIPBOARD.

CF_PRIVATELAST

См. CF_PRIVATEFIRST.

CF_RIFF

Представляет аудио данные в более сложном чем CF_WAVE формате.

CF_SYLK

Формат символических ссылок (Microsoft Symbolic Link - SYLK).

CF_TEXT

Формат текста. Каждая строка заканчивается комбинацией CR-LF. NULL символ указывает на конец данных. Используйте этот формат для ANSI текста.

CF_TIFF

Файловый формат тегированного изображения (Tagged-image).

CF_UNICODETEXT

Формат текста в колдировке Unicode. Каждая строка заканчивается комбинацией CR-LF. NULL символ указывает на конец данных.

CF_WAVE

Представляет аудио данные в одном из стандартных wave форматов, таких как 11 кГц или 22 кГц импульсно-кодовой модуляции (PCM).

Заголовочный файл: winuser.h (включен в windows.h)


ChoosePixelFormat

Пытается найти подходящий формат пикселя поддерживаемый контекстом устройства и соответствующий полученному описанию.

Прототип

int WINAPI ChoosePixelFormat(

HDC hdc,

const PIXELFORMATDESCRIPTOR *ppfd

);

Параметры

hdc

Контекст устройства, который функция проверяет на наилучшее соответствие формату пикселей, описанному в параметре ppfd.

ppfd

Указатель на структуру PIXELFORMATDESCRIPTOR, описывающую желаемый формат пикселей. Поля структуры используются в соответствии с описание ниже.

nSize - размер структуры. Установите в это поле значение sizeof(PIXELFORMATDESCRIPTOR).

nVersion - номер версии структуры. Установите в это поле значение 1.

dwFlags - набор битовых флагов, задающих свойства буфера пикселей. Вы можете объединять флаги с помощью битовой операции ИЛИ. Если установлены какие-либо флаги функция ChoosePixelFormat пытается найти формат пикселей, в котором эти флаги также установлены. Хотя, функция игнорирует флаги PFD_DRAW_TO_WINDOW, PFD_DRAW_TO_BITMAP, PFD_SUPPORT_GDI, PFD_SUPPORT_OPENGL, она, тем не менее, старается найти такой формат пикселей, в котором эти флаги установлены. По умолчанию функция старается найти форматы, в которых флаги PFD_DOUBLEBUFFER и PFD_STEREO не установлены. Если установлен флаг PFD_DOUBLEBUFFER_DONTCARE, то флаг PFD_DOUBLEBUFFER игнорируется. Аналогично, если установлен флаг PFD_STEREO_DONTCARE, флаг PFD_STEREO игнорируется.

iPixelType - тип формата пикселя: PFD_TYPE_RGBA или PFD_TYPE_COLORINDEX.

cColorBits - ноль или больше нуля.

cRedBits - не используется.

cRedShift - не используется.

cGreenBits - не используется.

cGreenShift - не используется.

cBlueBits - не используется.

cBlueShift - не используется.

cAlphaBits - ноль или больше нуля.

cAlphaShift - не используется.

cAccumBits - ноль или больше нуля.

cAccumRedBits - не используется.

cAccumGreenBits - не используется.

cAccumBlueBits - не используется.

cAccumAlphaBits - не используется.

cDepthBits - ноль или больше нуля.

cStencilBits - ноль или большу нуля.

cAuxBuffers - ноль или большу нуля.

iLayerType - тип слоя. Допустимые значения: PFD_MAIN_PLANE, PFD_OVERLAY_PLANE и PFD_UNDERLAY_PLANE.

bReserved - не используется.

dwLayerMask - не используется.

dwVisibleMask - не используется.

dwDamageMask - не используется.

Возвращаемое значение

Индекс формата пикселей (нумерация с 1), который лучше всего соответствует описанию.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации об ошибке используйте функцию GetLastError,

Пример использования

Пример использваония приведен здесь и здесь.

Примечание

Вы должны сами убедиться в том, что формат пикселей, найденный функцией ChoosePixelFormat, соответствует вашим требованиям. Например, если вам нужен формат пикселей с 24-битным цветом формата RGB, а контекст устройства поддерживает только 8-битные цвета, функция вернет формат пикселя с 8-битным цветом формата RGB.

Заголовочный файл | wingdi.h
Экспортирующая библиотека | gdi32.dll


CreateCompatibleDC

Создаёт временный контекст устройства (memory DC), совместимый с заданным устройством.

Прототип

HDC CreateCompatibleDC(

_In_ HDC hdc

);

Параметры

hdc[in]

Описатель существующего контекста устройства (DC). Если значение этого параметра равно NULL, то временный DC будет совместим с текущим экраном приложения.

Возвращаемое значение

Описатель временного DC (memory DC).

Возвращаемое значение в случае ошибки

NULL.

Пример использования

#include <windows.h>

typedef HDC (*CREATECOMPATIBLEDC)(HDC);

typedef BOOL (*DELETEDC)(HDC);

CREATECOMPATIBLEDC pCreateCompatibleDC;

DELETEDC pDeleteDC;

int main()

{

HWND hwnd;

//Находим главное окно калькулятора

hwnd = FindWindow("SciCalc",NULL);

if(!hwnd) return -1;

//Получаем существующий DC

HDC hdc;

hdc = GetDC(hwnd);

//загружаем библиотеку gdi32.dll

HINSTANCE hgdi;

hgdi = LoadLibrary("gdi32.dll");

//Нахрдим адрес функции CreateCompatibleDC

pCreateCompatibleDC = (CREATECOMPATIBLEDC)GetProcAddress(hgdi,"CreateCompatibleDC");

HDC hCompatibleDC = NULL;

//Создаем совместимый DC

if(pCreateCompatibleDC)

hCompatibleDC = pCreateCompatibleDC(hdc);

//Выводим результат на экран

printf("%x\n",hCompatibleDC);

//Освобождаем ресурсы

pDeleteDC = (DELETEDC)GetProcAddress(hgdi,"DeleteDC");

if((pDeleteDC)&&(hCompatibleDC))

pDeleteDC(hCompatibleDC);

if(hdc)

ReleaseDC(hwnd, hdc);

FreeLibrary(hgdi);

getchar();

return 0;

}

Примечание

Временный DC существует только в памяти. Когда временный DC только создан он отображает черно-белое изображение размером 1 на 1 пиксель. Перед тем как приложение сможет рисовать в созданном DC, оно должно выбрать в нём растровое изображение необходимых размеров. Используйте для этого функцию CreateCompatibleBitmap, с помощью которой можно задать требуемые высоту, ширину и цветовую организацию (color organization).

При создании временного DC все его атрибуты устанавливаются в значения по умолчанию. Временный DC может использоваться так же как и обычный DC. Вы можете устанавливать атрибуты, получать текущие значения этих атрибутов; а также выбирать перья (pens), кисти (brushes) и регионы (regions).

Функция CreateCompatibleDC может использоваться только для устройств, которые поддерживают растровые операции. Приложение может определить поддерживает их устройство или нет с помощью функции GetDeviceCaps.

Когда временный DC вам больше не нужен, вызовите функцию DeleteDC. Желательно, чтобы вы использовали именно эту функцию для удаления DC. Тем не менее, вы также можете использовать функцию DeleteObject с полученным DC для его удаления.

Если значение параметра hdc равно NULL, то поток, который вызвал функцию CreateCompatibleDC становится владельцем созданного DC. При уничтожении потока, созданный им DC становится недействительным. Поэтому, если вы создаете DC и передаете его другому потоку, а затем уничтожаете первый поток, то второй поток не сможет использовать полученный DC.

ICM: если переданный в функцию CreateCompatibleDC контекст устройства был доступен для управления цветом (Image Color Management, ICM), то созданный функцией DC также будет доступен для ICM. Исходное и целевое пространства цветов определяются в DC.

Заголовочный файл | wingdi.h (включен в windows.h)
Экспортирующая библиотека | gdi32.dll


DeleteDC

Удаляет заданный контекст устройства (DC).

Прототип

BOOL DeleteDC(

_In_ HDC hdc

);

Параметры

hdc[in]

Описатель удаляемого контекста устройства (DC).

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль.

Пример использования

#include <windows.h>

typedef HDC (*CREATECOMPATIBLEDC)(HDC);

typedef BOOL (*DELETEDC)(HDC);

CREATECOMPATIBLEDC pCreateCompatibleDC;

DELETEDC pDeleteDC;

int main()

{

HWND hwnd;

//Находим главное окно калькулятора

hwnd = FindWindow("SciCalc",NULL);

if(!hwnd) return -1;

//Получаем существующий DC

HDC hdc;

hdc = GetDC(hwnd);

//загружаем библиотеку gdi32.dll

HINSTANCE hgdi;

hgdi = LoadLibrary("gdi32.dll");

//Нахрдим адрес функции CreateCompatibleDC

pCreateCompatibleDC = (CREATECOMPATIBLEDC)GetProcAddress(hgdi,"CreateCompatibleDC");

HDC hCompatibleDC = NULL;

//Создаем совместимый DC

if(pCreateCompatibleDC)

hCompatibleDC = pCreateCompatibleDC(hdc);

//Выводим результат на экран

printf("%x\n",hCompatibleDC);

//Освобождаем ресурсы

pDeleteDC = (DELETEDC)GetProcAddress(hgdi,"DeleteDC");

if((pDeleteDC)&&(hCompatibleDC))

pDeleteDC(hCompatibleDC);

if(hdc)

ReleaseDC(hwnd, hdc);

FreeLibrary(hgdi);

getchar();

return 0;

}

Примечание

Приложения не должны удалять DC, описатель которого был получен с помощью функции GetDC. Вместо этого они должны освобождать этот описатель с помощью функции ReleaseDC.

Заголовочный файл | wingdi.h (включен в windows.h)
Экспортирующая библиотека | gdi32.dll


GetDC

Возвращает описатель контекста устройства (DC) для клиентской области заданного окна или для всего экрана. Вы можете использовать этот описатель в последующих функциях GDI для рисования в DC. Контекст устройства - это внутренняя структура данных, значения полей которой используются внутри GDI.

Функция GetDCEx является расширенным вариантом функции GetDC, которая даёт приложениям больше контроля над тем, как и происходит ли отсечение по границам в клиентской области.

Прототип

HDC GetDC(

_In_ HWND hWnd

);

Параметры

hWnd[in]

Описатель окна чей DC мы запрашиваем. Если значение этого параметра равно NULL, то функция GetDC возвращает DC для всего экрана.

Возвращаемое значение

В случае успеха функция возвращает описатель контекста устройства (DC) для клиентской области заданного окна.

Возвращаемое значение в случае ошибки

NULL.

Пример использования

#include <windows.h>

int main()

{

HWND hwnd;

//Находим главное окно калькулятора

hwnd = FindWindow("SciCalc",NULL);

if(!hwnd) return -1;

HDC hdc;

//Получаем дескриптор DC клиентской области

hdc = GetDC(hwnd);

//Выводим его на экран

printf("%x\n",hdc);

ReleaseDC(hwnd,hdc);

getchar();

return 0;

}

Примечание

Функция GetDC возвращает общий, для класса, или частный контекст устройства (DC) в зависимости от стиля класса заданного окна. Для класса и частного контекстов устройства (DC), функция GetDC оставляет предварительно назначенные атрибуты неизменными. Однако, для общих контекстов устройства (DC), GetDC назначает атрибуты контексту устройства (DC) по умолчанию, каждый раз, когда он извлекается. Например, заданный по умолчанию шрифт System, который является растровым шрифтом. Из-за этого, дескриптор общего контекста устройства (DC), возвращенный функцией GetDC, не говорит вам, какой шрифт, цвет или кисть были использованы, когда выводилось окно. Чтобы определить шрифт используйте функцию GetTextFace.

Обратите внимание, что дескриптор контекста устройства (DC) может быть использован в любой момент только одним потоком.

После рисования с использованием общего контекста устройства (DC), должна быть вызвана функция ReleaseDC, чтобы освободить контекст устройства. Для контекста устройства класса (class DC) и частного DC контексты устройства не должны освобождаться. Функция ReleaseDC должна вызываться из того же самого потока, который вызвал GetDC. Количество контекстов устройства (DC) ограничено только размером доступной памяти.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetDCEx

Возвращает дескриптор контекста устройства (DC) для клиентской области заданного окна или для всего экрана. Полученное значение дескриптора в дальнейшем может использоваться в функциях GDI для рисования в DC. Контекст устройства - это внутренняя структура данных, значения полей которой используются внутри GDI.

Данная функция является расширенным вариантом функции GetDC, и даёт по сравнению с ней приложениям больше контроля над тем как и происходит ли отсечение по границам в клиентской области.

Прототип

HDC GetDCEx(

_In_ HWND hWnd,

_In_ HRGN hrgnClip,

_In_ DWORD flags

);

Параметры

hWnd[in]

Описатель окна, контекст устройства (DC) которого мы хотим получить. Если значение этого параметра равно NULL, то функция GetDCEx вернет DC всего экрана.

hrgnClip[in]

Описатель региона отсечения, который может объединен с видимой областью запрашиваемого DC. Если значение параметра flags равно DCX_INTERSECTRGN или DCX_EXCLUDERGN, то операционная система сама заберет нужную часть региона и автоматически удалит его, когда он будет не нужен. В этом случае приложение не должно использовать или удалять регион после успешного вызова функции GetDCEx.

flags[in]

Определяет как будет создаваться DC. Данный параметр принимает одно из значений перечисленных здесь, или их комбинацию.

Возвращаемое значение

Дескриптор DC для заданного окна.

Возвращаемое значение в случае ошибки

NULL. Недопустимое значение параметра hWnd приводит к ошибке функции.

Пример использования

#include <windows.h>

int main()

{

HWND hwnd;

//Находим главное окно калькулятора

hwnd = FindWindow("SciCalc",NULL);

if(!hwnd) return -1;

HDC hdc;

//Запрашиваем DC

hdc = GetDCEx(hwnd, NULL, DCX_WINDOW);

printf("%x\n",hdc);

//Освобождаем DC

ReleaseDC(hwnd,hdc);

getchar();

return 0;

}

Примечание

Если отображаемый DC не относится к оконному классу, то после рисования должна быть вызвана функция ReleaseDC для освобождения DC. Функция ReleaseDC должна вызываться тем же потоком, который вызывал GetDCEx. Количество DC ограничено только рамером памяти.

Если при регистрации оконного класса в структуре WNDCLASS был определен стиль CS_CLASSDC, CS_OWNDC или CS_PARENTDC, то функция GetDCEx вернет описатель DC, принадлежащий оконному классу.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetWindowDC

Возвращает контекст устройства (DC) для всего окна, включая область заголовка, меню и полосы прокрутки. Контекст устройства окна позволяет рисовать на всем окне, так как его начальная точка находится в левом верхнем углу окна, а не клиентской области окна.

Функция GetWindowDC сбрасывает атрибуты контекста устройства окна в значения по умолчанию каждый раз при возвращении контекста устройства. Предыдущие арибуты теряются.

Прототип

HDC GetWindowDC(

_In_ HWND hWnd

);

Параметры

hWnd[in]

Описатель окна, контекст устройства (DC) которого мы хотим получить. Если значение этого параметра равно NULL, то функция GetWindowDC возвращает контекст устройства всего экрана.

Если значение этого параметрпа равно NULL, то возвращается описатель контекста устройства для основного монитора (primary display monitor). Для получения контекста устройства другого монитора используйте функции EnumDisplayMonitor и CreateDC.

Возвращаемое значение

Описатель контекста устройства для заданного окна.

Возвращаемое значение в случае ошибки

NULL. Это говорит о том, что произошла ошибка, или о том, что значение параметра hWnd задано неверно.

Пример использования

#include <windows.h>

int main()

{

HWND hwnd;

//Находим главное окно калькулятора

hwnd = FindWindow("SciCalc",NULL);

if(!hwnd) return -1;

HDC hdc;

//Запрашиваем DC

hdc = GetWindowDC(hwnd);

printf("%x\n",hdc);

//Освобождаем DC

ReleaseDC(hwnd,hdc);

getchar();

return 0;

}

Примечание

Функция GetWindowDC предназначена для отрисовки специальных эффектов в неклиентской области окна. Рисование в неклиентской области окна не приветствуется.

Функция GetSystemMetrics может быть использована для определения размеров различных частей неклиентской области окна как, например, области заголовка, меню и полосы прокрутки.

Функция GetDC может быть использована для получения контекста устройства всего экрана.

После завершения рисования, для освобождения контекста устройства должна быть вызвана функция ReleaseDC. Не освобожденный контекст устройства может оказывать сильное влияние на результаты рисования в окне.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


ReleaseDC

Освобождает контекст устройства (DC), позволяя тем самым другим приложениям использовать его. Результат действия функции ReleaseDC зависит от типа освобождаемого DC. Она освобождает только общие и оконные DC и никак не влияет на DC класса и на закрытые (private) DC.

Прототип

int ReleaseDC(

_In_ HWND hWnd,

_In_ HDC hDC

);

Параметры

hWnd[in]

Описатель окна, чей DC мы освобождаем.

hDC[in]

Описатель освобождаемого контекста устройства (DC).

Возвращаемое значение

Если DC был освобожден, то возвращается значение 1. Если же DC не освобожден, то возвращается значение нуль.

Пример использования

#include <windows.h>

int main()

{

HWND hwnd;

//Находим главное окно калькулятора

hwnd = FindWindow("SciCalc",NULL);

if(!hwnd) return -1;

HDC hdc;

//Получаем дескриптор DC клиентской области

hdc = GetDC(hwnd);

//Выводим его на экран

printf("%x\n",hdc);

//Освобождаем DC

ReleaseDC(hwnd,hdc);

getchar();

return 0;

}

Примечание

Приложения должны вызывать функцию ReleaseDC для каждого вызова функций GetWindowDC и GetDC, которые возвращают общий (common) DC.

Приложения не могут использовать функцию ReleaseDC для освобождения DC, который был создан вызовом функции CreateDC. Они должны использовать функцию DeleteDC.

Функция ReleaseDC должна вызываться тем же потоком, что и функция GetDC, с помощью которой был получен освобождаемый DC.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


SelectObject

Выбирает объект в заданном контексте устройства (device context - DC). Новый объект замещает собой предыдущий объект того же типа.

Прототип

HGDIOBJ SelectObject(

_In_ HDC hdc,

_In_ HGDIOBJ hgdiobj

);

Параметры

hdc [in]

Описатель контекста устройства (DC).

hgdiobj [in]

Описатель выбираемого объекта. Данный объект должен быть создан одной из функций, перечисленых в таблице ниже.

Тип объекта | Функции создания
Битовая карта (bitmap) | CreateBitmap, CreateBitmapIndirect, CreateCompatibleBitmap, CreateDIBitmap, CreateDIBSection. Битовая карта может быть выбрана только во временном DC (memory's DC). Одна и та же битовая карта не может быть выбрана одновременно в более чем одном DC.
Кисть | CreateBrushIndirect, CreateDIBPatternBrushPt, CreateHatchBrush, CreatePatternBrush, CreateSolidBrush
Шрифт | CreateFont, CreateFontIndirect
Перо (Pen) | CreatePen, CreatePenIndirect
Регион | CombineRgn, CreateEllipticRgn, CreateEllipticRgnIndirect, CreatePolygonRgn, CreateRectRgn, CreateRectRgnIndirect

Возвращаемое значение

Если выбранный объект не является регионом, то функция возвращает описатель замещаемого объекта. Если же это регион, то функция возвращает одно из значений, перечисленных ниже.

SIMPLEREGION - регион состоит из одного прямоугольника.

COMPLEXREGION - регион состоит из более чем двух прямоугольников.

NULLREGION - регион пуст.

Возвращаемое значение в случае ошибки

Если выбранный объект не является регионом, то значение NULL. Если же он является регионом, то возвращается значение HGDI_ERROR.

Пример использования

Пример использования приведен здесь.

Примечание

Функция возвращает предыдущий выбранный объект данного типа. Приложение, по окончании рисования с использованием нового объекта, всегда должно замещать его предыдущим объектом.

Приложение не может выбрать одну битовую карту (bitmap) одновременно в более чем одном контексте устройства.

ICM: если замещаемый объект является кистью или пером, то выполняется управление цветом (color management is performed).

Заголовочный файл | wingdi.h (включен в windows.h)
Экспортирующая библиотека | gdi32.dll


SetPixelFormat

Устанавливает формат пикселей контекста устройства в формат, заданный индексом iPixelFormat.

Прототип

BOOL WINAPI SetPixelFormat(

HDC hdc,

int iPixelFormat,

const PIXELFORMATDESCRIPTOR *ppfd

);

Параметры

hdc

Контекст устройства, формат пикселей которого изменяется.

iPixelFormat

Индекс устанавливаемого формата пикселей. Различные форматы пикселей, поддерживаемые контекстом устройства проиндексированы. Нумерация начинается с 1.

ppfd

Указатель на структуру PIXELFORMATDESCRIPTOR, содержащую описание формата пикселей. Системный компонент метафайлов использует эту структуру для записи описания формата пикселей. Она никак иначе не влияет на поведение функции SetPixelFormat.

Возвращаемое значение

Значение TRUE.

Возвращаемое значение в случае ошибки

Значение FALSE. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь и здесь.

Примечание

Если параметр hdc описывает окно, вызов функции SetPixelFormat изменит формат пикселей окна. Многократная установка формата пикселей окна может привести к большим сложностям для менеджера окон и многопоточных приложений, поэтому делать этого не рекомендуется. Приложение может только один раз установить формат пикселей. После установки он не может быть изменен.

Вы должны выбрать формат пикселей в контексте устройства до вызова функции wglCreateContext. Данная функция создает контекст отображения для рисования на устройстве в выбранном формате пикселей.

Окно OpenGL имеет свой собственный формат пикселей. Поэтому, рисовать в окно разрешено только контекстам устройства, описывающих клиентскую область окна OpenGL, В результате этого, окно OpenGL должно быть создано со стилями WS_CLIPCHILDREN и WS_CLIPSIBLINGS. Также, оконный класс не должен иметь стиль CS_PARENTDC.

Заголовочный файл | wingdi.h (включен в windows.h)
Экспортирующая библиотека | gdi32.dll


wglCreateContext

Создает новый контекст отображения OpenGL, который подходит для рисования в заданном контексте устройства. Контекст отображения имеет такой же формат пикселей, что и контекст устройства.

Прототип

HGLRC WINAPI wglCreateContext(

HDC hdc

);

Параметры

hdc

Описатель контекста устройства, для которого функция создает подходящий контекст отображения OpenGL.

Возвращаемое значение

Описатель контекста отображения OpenGL.

Возвращаемое значение в случае ошибки

Значение NULL. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь и здесь.

Примечание

Контекст отображения и контекст устройства это не одно и тоже. Установите формат пикселей контекста устройства до создания контекста отображения. Формат пикселей устанавливается функцией SetPixelFormat.

При использовании OpenGL, вы создаете контекст отображения, выбираете его в качестве текущего контекста отображения потока, и затем вызываете функции OpenGL. Когда контекст отображения вам больше не нужен, освободите его с помощью функции wglDeleteContext.

Заголовочный файл | wingdi.h
Экспортирующая библиотека | opengl32.dll


wglDeleteContext

Удаляет заданный контекст отображения OpenGL.

Прототип

BOOL WINAPI wglDeleteContext(

HGLRC hglrc

);

Параметры

hglrc

Описатель контекста отображения OpenGL, который функция должна удалить.

Возвращаемое значение

Значение TRUE.

Возвращаемое значение в случае ошибки

Значение FALSE. Ддля получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь и здесь.

Примечание

Попытка удаления контекста отображения OpenGL, являющегося текущим для другого потока, приведет к ошибке. Однако, если удаляемый контекст является текущим для вызывающего потока, функция wglDeleteContext изменит контекст таким образом, чтобы удаляемый контекст больше не был текущим, а потом удалит его.

Функция wglDeleteContext не удаляет контекст устройства, связанный с контекстом отображения функцией wglMakeCurrent. После вызова функции wglDeleteContext вы должны сами вызвать функцию DeleteDC для удаления контекста устройства.

Заголовочный файл | wingdi.h
Экспортирующая библиотека | opengl32.dll


wglMakeCurrent

Устанавливает указанный контекст отображения OpenGL в качестве текущего контекста отображения потока. Все последующие вызовы функций OpenGL должны делаться потоком, рисующим на поверхности, задаваемой параметром hdc. Вы также можете использовать функцию wglMakeCurrent для изменения текущего контекста отображения потока, когда он вам больше не нужен в качестве текущего.

Прототип

BOOL WINAPI wglMakeCurrent(

HDC hdc,

HGLRC hglrc

);

Параметры

hdc

Описатель контекста устройства. Последующие вызовы функций OpenGL должны выполняться потоком, рисующим на устройстве, задаваемом параметром hdc.

hglrc

Описатель контекста отображения OpenGL, который функция должна сделать текущим.

Если значение этого параметра равно NULL, то текущий контекст отображения теряет свой статус, а используемый им контекст устройства освобождается. В этом случае значение параметра hdc игнорируется.

Возвращаемое значение

Значение TRUE.

Возвращаемое значение в случае ошибки

Значение FALSE. Ддля получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь и здесь.

Примечание

Параметр hdc должен задавать поверхность рисования, поддерживаемую OpenGL. Онможет отличаться от контекста усттройства, используемого в функции wglCreateContext при создании значения параметра hglrc, но должен описывать тоже устройство и иметь такой же формат пикселей. Контекст отображения не поддерживает трансформации (transformation) и усечение (clipping) в контексте hdc. Текущий контекст отображения использует контекст устройства hdc все время, которое он является текущим.

Перед переключением на новый контекст отображения OpenGL сбрасывает все предыдущие контексты отображеия, которые были текущими в вызывающем потоке.

Поток может иметь только один контекст отображения. Процесс может иметь несколько контекстов отображения благодаря многопоточности. Поток должен установить текущий контекст отображения до вызова какой-либо функции OpenGL. Если это не сделано, то все вызовы OpenGL будут игнорироваться.

Контекст отображения может быть текущим только для одного потока. Вы не можете сделать контекст отображения текущим для нескольких потоков.

Приложение может выполнять многопоточное рисование путем создания различных контекстов отображения для различных потоков, реализуя каждый поток со своим собственным контекстом отображения и контекстом устройства.

В случае ошибки функция wglMakeCurrent снимает с текущего контекста отображения потока статус "текущий".

Заголовочный файл | wingdi.h
Экспортирующая библиотека | opengl32.dll


ClipCursor

Ограничивает курсор прямоугольной областью на экране. Если в последующем положение курсора (установленное функцией SetCursorPos или путём перемещения мыши) будет лежать вне прямоугольника, система автоматически скорректирует его положение таким образом, чтобы он лежал внутри прямоугольной области.

Прототип

BOOL WINAPI ClipCursor(

_In_opt_ const RECT *lpRect

);

Параметры

lpRect[in,opt]

Указатель на структуру RECT, которая сожержит экранные координаты левого верхнего и правого нижнего углов ограничивающего прямоугольника. Если значение этого равно NULL, то курсор может перемещаться по всему экрану.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Курсор является разделяемым ресурсом. Если приложение ограничивает курсор, то оно должно освободить его перед передачей управления другому приложению.

Вызывающий процесс должен иметь право доступа WINSTA_WRITEATTRIBUTES к объекту WindowStation.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


CopyCursor

Копирует заданный курсор.

Прототип

HCURSOR WINAPI CopyCursor(

_In_ HCURSOR pcur

);

Параметры

pcur[in]

Описатель копируемого курсора.

Возвращаемое значение

Описатель дублирующего курсора.

Возвращаемое значение в случае ошибки

Значение NULL. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

#include <windows.h>

#include "Constants.h"

int main()

{

HCURSOR hCur1, hCur2;

//Загружаем курсор из ресурсов

hCur1 = LoadCursor(GetModuleHandle(NULL),MAKEINTRESOURCE(ID_CURSOR));

//Копируем курсор

hCur2 = CopyCursor(hCur1);

printf("%X\n",hCur2);

//Уничтожаем курсор

DestroyCursor(hCur2);

getchar();

return 0;

}

Файл ресурсов.

#include "Constants.h"

ID_CURSOR CURSOR "hmove.cur"

Заголовочный файл "Constants.h".

#define ID_CURSOR 0x100

Примечание

Данная функция позволяет приложению или библиотеке получить описатель курсора, принадлежащего другому модулю. Если другой модуль будет выгружен, приложение все еще сможет использовать курсор.

Перед завершением работы приложение должновызвать функцию DestroyCursor для освобождения системных ресурсов, занимаемых курсором.

Не используйте функцию CopyCursor для анимированых курсоров. Вместо неё используйте функцию CopyImage.

Функция CopyCursor реализована как обертка вокруг функции CopyIcon.

#define CopyCursor(pcur) ((HCURSOR)CopyIcon((HICON)(pcur)))

Заголовочный файл: Winuser.h (включен в windows.h)


CreateCursor

Создаёт курсор, имеющий заданный размер, битовые шаблоны и положение стрелки.

Прототип

HCURSOR WINAPI CreateCursor(

_In_opt_ HINSTANCE hInst,

_In_ int xHotSpot,

_In_ int yHotSpot,

_In_ int nWidth,

_In_ int nHeight,

_In_ const VOID *pvANDPlane,

_In_ const VOID *pvXORPlane

);

Параметры

hInst[in,opt]

Описатель текущего экземпляра приложения создающего курсор.

xHotSpot[in]

Горизонтальное положение стрелки курсора.

yHotSpot[in]

Вертикальное положение стрелки курсора.

nWidth[in]

Ширина курсора, в пикселях.

nHeight[in]

Высота курсора, в пикселях.

pvANDPlane[in]

Массив байтов, который содержит биты AND маски курсора, как в зависимом от устройства двуцветном растровом изображении.

pvXORPlane[in]

Массив байтов, который содержит биты XOR маски курсора, как в зависимом от устройства двуцветном растровом изображении.

Возвращаемое значение

Описатель курсора.

Возвращаемое значение в случае ошибки

NULL. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Параметры nWidth и nHeight должны задавать ширину и высоту, которую поддерживает текущий драйвер монитора, так как система не может создавать курсоры других размеров. Для определения ширины и высоты поддерживаемой драйвером монитора, используйте функцию GetSystemMetrics с флагом SM_CXCURSOR и SM_CYCURSOR.

При создании курсора используется следующая таблица истинности для масок AND и XOR.

AND маска | XOR маска | Цвет
0 | 0 | Черный
0 | 1 | Белый
1 | 0 | Экранный
1 | 1 | Противоположный экранному

Перед завершением работы приложения должны вызвать функцию DestroyCursor для освобождения системных ресурсов, связанных с курсором.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


DestroyCursor

Уничтожает курсор и свобождает память занимаемую курсором. Не используйте эту функцию для уничтожения разделяемых курсоров.

Прототип

BOOL WINAPI DestroyCursor(

_In_ HCURSOR hCursor

);

Параметры

hCursor[in]

Описатель уничтожаемого курсора. Курсор не должен использоваться.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Функция DestroyCursor уничтожает неразделяемые курсоры. Не используйте эту функцию для уничтожения разделяемых курсоров. Разделяемый курсор действителен до тех пор, пока модуль из которого он был загружен остается в памяти. Следующие функции создают разделяемые курсоры:

· LoadCursor,
· LoadCursorFromFile,
· LoadImage(с флагом LR_SHARED).
· CopyImage(если используется флаг LR_COPYRETURNORG, а параметр hImage описывает разделяемый курсор).

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetClipCursor

Возвращает экранные координаты прямоугольной области, которой ограничен курсор.

Прототип

BOOL WINAPI GetClipCursor(

_Out_ LPRECT lpRect

);

Параметры

lpRect[out]

Указатель на структуру RECT, в которую будут записаны экранные координаты ограничивающего прямоугольника. В эту структуру будут записаны размеры экрана, если курсор не ограничен каким-либо прямоугольником.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

#include <windows.h>

int main()

{

RECT rc;

GetClipCursor(&rc);

printf("(%d;%d)-(%d;%d)\n",rc.left,rc.top,rc.right,rc.bottom);

getchar();

return 0;

}

В данном примере на экран выводятся размеры экрана (курсор ничем не ограничен). В моём случае это строка "(0;0)-(1280;1024)".

Примечание

Курсор является разделяемым ресурсом. Если приложение ограничиает курсор функцией ClipCursor, то оно должно освободить его с помощью ClipCursor перед передачей управления другому приложению.

Вызывающий процесс должен право доступа WINSTA_READATTRIBUTES к объекту WindowStation.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetCursor

Возвращает описатель текущего курсора.

Для получения информации о глобальном курсоре, даже если он не принадлежит текущему потоку, используйте функцию GetCursorInfo.

Прототип

HCURSOR WINAPI GetCursor(void);

Параметры

У данной функции нет параметров.

Возвращаемое значение

Описатель текущего курсора. Если курсора нет, то возвращается значение NULL.

Пример использования

#include <windows.h>

int main()

{

HCURSOR hCur;

//Получаем текущий курсор

hCur = GetCursor();

//Выводим его на экран

printf("%X\n",hCur);

getchar();

return 0;

}

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetCursorInfo

Возвращает информацию о глобальном курсоре (global cursor).

Прототип

BOOL WINAPI GetCursorInfo(

_Inout_ PCURSORINFO pci

);

Параметры

pci[in,out]

Указатель на структуру CURSORINFO, в которую будет записана информация. Перед вызовом функции вы должны записать в поле cbSze этой структуры значение sizeof(CURSORINFO).

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

#include <windows.h>

int main()

{

CURSORINFO CurInfo;

//Получаем информацию о курсоре

CurInfo.cbSize = sizeof(CURSORINFO);

GetCursorInfo(&CurInfo);

//Выводим на экран описатель курсора

printf("%X\n",CurInfo.hCursor);

getchar();

return 0;

}

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetCursorPos

Возвращает положение курсора мыши, в экранной системе координат.

Прототип

BOOL WINAPI GetCursorPos(

_Out_ LPPOINT lpPoint

);

Параметры

lpPoint[out]

Указатель на структуру POINT, в которую будут записаны координаты курсора в экранной системе координат.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

#include <windows.h>

int main()

{

POINT point={0,0};

GetCursorPos(&point);

printf("x=%d\r\ny=%d\r\n",point.x,point.y);

getchar();

return 0;

}

Примечание

Положение курсора всегда задаётся в экранных координатах и никак не влияет на редим отображения (mapping mode) окна, над которым располагается курсор.

Вызывающий процесс должен иметь право доступа WINSTA_READATTRIBUTES к объекту window station.

Рабочий стол ввода (input desktop) должен быть текущим рабочим столом во время вызова функции GetCursorPos. Используйте функцию OpenInputDesktop для определения того является ли текущий стол рабочим столом ввода. Если это не так, тогда используйте функцию SetThreadDesktop с параметром HDESK, который вернула функция OpenInputDesktop для переключения на этот рабочий стол.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetMessagePos

Возвращает положение курсора мыши для последнего сообщения, извлеченного функцией GetMessage.

Для определения текущего положения курсора используйте функцию GetCursorPos.

Прототип

DWORD WINAPI GetMessagePos(void);

Параметры

У данной функции нет параметров

Возвращаемое значение

Возвращаемое значение определяет координаты курсора мыши на экране. Младшее короткое целое (short) содержит координату по горизонтали. Старшее короткое целое - коорднату по вертикали.

Пример использования

Создадим небольшое приложение, которое создаёт диалоговое окно. В данном окне при нажатии на левую кнопку мыши будет выводиться информация о положении курсора мыши.

#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)

{

DWORD dpos;

POINTS point;

char s[50];

switch(uMsg){

case WM_LBUTTONDOWN:

//Выводим на экран координаты курсора

dpos = GetMessagePos();

point = MAKEPOINTS(dpos);

sprintf(s,"x=%d\r\ny=%d",point.x,point.y);

MessageBox(hwnd,s,"",MB_OK);

break;

case WM_CLOSE:

//Закрываем окно

EndDialog(hwnd,0);

}

return 0;

}

Примечание

Обратите внимание. что координаты представлены в виде короткого целого (short) (они могут иметь отрицательное значение на системах с несколькими мониторами). Для дальнейшей обработки этих величин вы может использовать макрос MAKEPOINTS для представления координат в виде структуры POINTS (это показано в приводимом выше примере). Также вы можете использовать макросы GET_X_LPARAM и GET_Y_LPARAM для извлечения координаты по горизонтали и вертикали соответственно.

Важно: не используйте для извлечения координат макросы LOWORD и HIWORD, так как они могут возвращать некорректные значения на системах с несколькими мониторами. Такие системы могут иметь отрицательные координаты курсора мыши. Макросы LOWORD и HIGHWORD интерпретируют координаты как беззнаковые величины.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetPhysicalCursorPos

Появилась в Windows Vista. Возвращает положение курсора в физических координатах.

Прототип

BOOL WINAPI GetPhysicalCursorPos(

_Out_ LPPOINT lpPoint

);

Параметры

lpPoint[out]

Указатель на структуру POINT, в которую будет записано положение курсора в физических координатах.

Возвращаемое значение

TRUE.

Возвращаемое значение в случае ошибки

Значение FALSE. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

#include <windows.h>

//Прототип функции GetPhysicalCursorPos

typedef __stdcall BOOL WINAPI (*GETPHYSICALCURSORPOS)(LPPOINT);

GETPHYSICALCURSORPOS lpfGPCP;

int main()

{

//Находим адрес функции GetPhysicalCursorPos

HINSTANCE huser;

huser = LoadLibrary("user32.dll");

lpfGPCP = (GETPHYSICALCURSORPOS)GetProcAddress(huser,"GetPhysicalCursorPos");

//Вызываем функцию GetPhysicalCursorPos

POINT pt;

if(lpfGPCP)

lpfGPCP(&pt);

//Выводим координаты на экран

printf("(%d;%d)\n",pt.x,pt.y);

getchar();

}

Примечание

Разница между логическими и физическими координатами объяснена в описании функции PhysicalToLogicalPoint.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


LoadCursor

Загружает заданный ресурс курсора из исполняемого файла (.exe) связанного с экземпляром изображения.

Данная функция заменена функцией LoadImage.

Прототип

HCURSOR WINAPI LoadCursor(

_In_opt_ HINSTANCE hInstance,

_In_ LPCTSTR lpCursorName

);

Параметры

hInstance[in,opt]

Описатель экземпляра модуля, исполняемый файл которого содержит загружаемый курсор.

lpCursorName[in]

Наименование загружаемого ресурса курсора. Данный параметр может состоять из идентификатора ресурса в младшем слове и значения нуль в старшем слове. Для получения такого значения может быть использован макрос MAKEINTRESOURCE.

Для использования предопределенного системного курсора приложение должно установить значение параметра hInstance равным NULL, а значение параметра lpCursorName равным одному из значений перечисленных здесь.

Возвращаемое значение

Описатель загруженного курсора.

Возвращаемое значение в случае ошибки

Значение NULL. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

#include <windows.h>

#include "Constants.h"

int main()

{

HCURSOR hCur;

//Загружаем курсор

hCur = LoadCursor(GetModuleHandle(NULL),MAKEINTRESOURCE(ID_CURSOR));

//Выводим на экран описатель курсора

printf("%X\n",hCur);

getchar();

return 0;

}

Файл ресурсов.

#include "Constants.h"

ID_CURSOR CURSOR "hmove.cur"

Заголовочный файл "Constants.h" содержит идентификаор ресурса.

#define ID_CURSOR 0x100

Примечание

Функция LoadCursor загружает курсор только если он еще не загружен. В противном слуае она возвращает описатель существующего ресурса. Данная функция возвращает действительный описатель только если параметр lpCursorName указывает на ресурс курсора. Если параметр lpCursorName указывает на ресурс другого типа (например, иконки), функция вернет значение отличное от NULL, хотя это будет недействительный описатель курсора.

Функция LoadCursor ищет ресурс курсора наиболее подходящего текущему устройству оображения (display device). Ресурс курсора может быть цветным или чернобелым растровым изображением (bitmap).

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | LoadCursorA и LoadCursorW


LoadCursorFromFile

Создаёт курсор на основе данных в заданном файле.

Прототип

HCURSOR WINAPI LoadCursorFromFile(

_In_ LPCTSTR lpFileName

);

Параметры

lpFileName[in]

Путь к файлу с данными, на основе которых создаётся курсор. Данные в файл должны быть в формате .CUR или .ANI.

Если старшее слово lpFileName отлично от нуля, то этот параметр содержит указатель на строку, содержащую полный путь к файлу, содержащему данные курсора.

Возвращаемое значение

Описатель нового курсора.

Возвращаемое значение в случае ошибки

Значение NULL. Для получения дополнительной информации об ошибке используйте функцию GetLastError. Функция GetLastError может вернуть следующее зачение:

ERROR_FILE_NOT_FOUND - заданный файл не найден.

Пример использования

#include <windows.h>

int main()

{

HCURSOR hCur;

//Загружаем курсор

hCur = LoadCursorFromFile("hmove.cur");

//Выводим на экран описатель курсора

printf("%X\n",hCur);

getchar();

return 0;

}

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | LoadCursorFromFileA и LoadCursorFromFileW


SetCursor

Устанавливает форму курсора.

Прототип

HCURSOR WINAPI SetCursor(

_In_opt_ HCURSOR hCursor

);

Параметры

hCursor[in,opt]

Описатель курсора. Курсор должен быть создан функцией CreateCursor, или загружен с помощью функции LoadCursor или LoadImage. Если значение этого параметра равно NULL, то курсор удаляется с экрана.

Возвращаемое значение

Если ранее был установлен другой курсор, то возвращается его описатель.

Если курсора не было, то возвращается значение NULL.

Пример использования

Пример использования приведен здесь.

Примечание

Курсор устанавливается только если новый курсор отличается от предыдущего курсора. Если это не так, то функция немедленно возвращает управление.

Курсор является разделяемым ресурсом. Окно должно устанавливать форму курсора только тогда, когда курсор находится в клиентской области окна, или когда окно захватило ввод мыши. Окно должно восстановить предыдущий курсор перед тем, как курсор покинет клиентскую область окна, или перед тем, как передать управление другому окну.

Если ваше приложение должно устанавливать курсор на то время, пока он находится в пределах окна, убедитесь в том, что в качестве курсора для заданного класса окна было установлено значение NULL. Если это не так, то система будет восстанавливать курсор каждый раз при перемещении мыши.

Курсор не отображается на экране, если значение внутреннего счетчика отображений курсора меньше нуля. Это происходит когда приложение использет функцию ShowCursor для сокрытия курсора большее количество раз, чем для отображения курсора.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


SetCursorPos

Перемещает курсор по заданным экранным координатам. Если новые координаты находятся вне прямоугольника, установленного поседним вызовом функциейClipCursor, система автоматически скорректирует координаты так, чтобы курсор оставался внутри прямоугольника.

Прототип

BOOL WINAPI SetCursorPos(

_In_ int X,

_In_ int Y

);

Параметры

X[in]

Новая координата курсора по горизонтали в экранных координатах.

Y[in]

Новая координата курсора по вертикали в экранных координатах.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение NULL. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

int i;

for(i=0;i<1000;i += 20){

SetCursorPos(i,300);

Sleep(300);

}

return 0;

}

В данном примере курсор равномерно перемещается от левой границы экрана вправо на 1000 пикселей.

Примечание

Курсор является разделяемым ресурсом. Приложения должны перемещать курсор только тогда, когда он находится в клиентской области окна.

Вызывающий процесс должен иметь право доступа WINSTA_WRITEATTRIBUTES к объекту WindowStation.

При вызове функции SetCursorPos рабочий стол ввода должен быть текущим рабочим столом. Используйте функцию OpenInputDesktop для определения того явяляется ли текущий рабочий стол рабочим столом ввода. Если это не так, используйте функцию SetThreadDesktop с параметром HDESK возвращенным функцией OpenInputDesktop для переключения на рабочий стол ввода.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


SetPhysicalCursorPos

Появилась в Windows Vista. Устанавливает положение курсора в физических координатах.

Прототип

BOOL WINAPI SetPhysicalCursorPos(

_In_ int X,

_In_ int Y

);

Параметры

X[in]

Новая координата курсора по горизонтали, в физических координатах.

Y[in]

Новая координата курсора по вертикали, в физических координатах.

Возвращаемое значение

Значение TRUE.

Возвращаемое значение в случае ошибки

Значение FALSE. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

#include <windows.h>

//Прототип функции SetPhysicalCursorPos

typedef __stdcall BOOL WINAPI (*SETPHYSICALCURSORPOS)(int,int);

SETPHYSICALCURSORPOS lpfSPCP;

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Находим адрес функции SetPhysicalCursorPos

HINSTANCE huser;

huser = LoadLibrary("user32.dll");

lpfSPCP = (SETPHYSICALCURSORPOS)GetProcAddress(huser,"SetPhysicalCursorPos");

if(!lpfSPCP)

return -1;

//Перемещаем курсор

int i;

for(i=0;i<1000;i += 20){

lpfSPCP(i,300);

Sleep(300);

}

return 0;

}

Данный пример аналогичен примеру приводимому в описании функции SetCursorPos с той лишь разницей, что здесь мы вместо функции SetCursorPos используем функцию SetPhysicalCursorPos.

Примечание

Описание разницы между логическими и физическими координатами дано в описании функции PhysicalToLogicalPoint.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


SetSystemCursor

Позволяет приложениям персонализировать системные курсоры. Данная функция замещает системный курсор определенный параметром id курсором переданнм в параметре hcur и затем уничтожает курсор hcur.

Прототип

BOOL WINAPI SetSystemCursor(

_In_ HCURSOR hcur,

_In_ DWORD id

);

Параметры

hcur[in]

Описатель курсора. Функция замещает содержимое системного курсора определенного в параметре id содержимым курсора, описатель которого перелан в параметре hcur.

Система разрушает курсор hcur вызовом функции DestroyCursor. Поэтому, hcur не может быть курсором загруженным с помощью функции LoadCursor. Для определения курсора загружаемого из ресурсов, копируйте курсор с помощью функции CopyCursor, и затем передайте копию в функцию SetSytemCursor.

id[in]

Системный курсор замещаемый курсором hcur. Данный параметр принимает одно из значений перечисленных здесь.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

#include <windows.h>

#include "Constants.h"

#define OCR_HAND 32649

int main()

{

HCURSOR hCur1, hCur2;

//Загружаем курсор

hCur1 = LoadCursor(GetModuleHandle(NULL),MAKEINTRESOURCE(ID_CURSOR));

//Создаём копию курсора

hCur2 = CopyCursor(hCur1);

//Устанавливаем системный курсор

BOOL res;

res = SetSystemCursor(hCur2,OCR_HAND);

if(res)

printf("success\n");

else

printf("fail\n");

getchar();

return 0;

}

Примечание

Для приложений, использующих OCR_ константы, перед подключением заголовочного файла Windows.h должна быть объявлена константа OEMRESOURCE. Однако, как показывает мой опыт это работает не во всех средах разработки.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


ShowCursor

Отображает или скрывает курсор.

Прототип

int WINAPI ShowCursor(

_In_ BOOL bShow

);

Параметры

bShow[in]

Если значение этого параметра равно TRUE, то счетчик отображения увеличивается на единицу. Если же значение этого параметра равно FALSE, то счетчик отображения уменьшается на единицу.

Возвращаемое значение

Новое значение счетчика отображения.

Пример использования

#include <windows.h>

int main()

{

int ch;

//Уменьшаем значение счетчика

ch = ShowCursor(FALSE);

printf("%d\n",ch);

//Увеличиваем значение счетчика

ch = ShowCursor(TRUE);

printf("%d\n",ch);

getchar();

return 0;

}

В данном примере на экран выводится значение счетчика отображения. После уменьшения его значение становится равным -1. После увеличения он восстанавливается в свое первоначальное значение - нуль.

Изменение счетчика отображения в данном примере никак не сказывается на отображении курсора на экране. Почему объяснено в примечании.

Примечание

Windows 8: используйте функцию GetCursorInfo для опредедения идимости курсора.

Функция изменяет значение внутреннего счетчика отображения, по которому определяется должен ли курсор отображаться на экране или нет. Курсор отображается на экране только если значение этого счетчика больше или равно нулю. Если мышь установлена, то начальное значение счетчика нуль. Если мышь не установлена, то начальное значение счетчика -1 (минус единица).

Как показывают эксперименты данная функция изменяет отображение курсора только если курсор мыши находится над окном, созданным тем же потоком. Так как в нашем примере мы не создаём окна, то курсор отсаётся на экране, хотя значение счетчика меньше нуля.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


AppendMenu

Добавляет новый пункт в полоску меню, раскрывающееся меню, подменю или контекстное меню. Вы можете использовать эту функцию для задания содержимого, отображения и поведения пункта меню.

Прототип

BOOL WINAPI AppendMenu(

_In_ HMENU hMenu,

_In_ UINT uFlags,

_In_ UINT_PTR uIDNewItem,

_In_opt_ LPCTSTR lpNewItem

);

Параметры

hMenu [in]

Описатель полоски меню, раскрывающегося меню, подменю или контекстного меню.

uFlags [in]

Задает отображение и поведение нового пункта меню. Данное поле содержит комбинацию флагов, перечисленных здесь.

uIDNewItem [in]

Идентификатор нового пункта меню или, если в параметре uFlags задан флаг MF_POPUP, описатель раскрывающегося меню или подменю.

lpNewItem [in, opt]

Содержимое нового пункта меню. Интерпретирование параметра lpNewItem зависит от флагов, заданных в параметре uFlags.

MF_BITMAP - описатель растрового изображения (bitmap).

MF_OWNERDRAW - определенное приложением значение, которое может быть использовано для хранения дополнительных данных, ассоциированных с пунктом меню. Значение параметра lpNewItem заносится в поле itemData структуры, на которую указывает параметр lParam сообщения WM_MEASUREITEM и WM_DRAWITEM, отправляемых окну при создании меню и обновлении его отображения.

MF_STRING - указатель на завершающуюся NULL символом строку.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Приложение должно вызывать функцию DrawMenuBar всякий раз при изменении меню, если оно принадлежит отображаемому окну.

Для получения клавиатурных ускорителей (keyboard accelerators) для работы с растровым изображением или самостоятельно отрисовываемыми пунктами меню, владелец меню должен обработать сообщение WM_MENUCHAR.

Следующие группы флагов не могут использоваться друг с другом:

· MF_BITMAP, MF_STRING и MF_OWNERDRAW;
· MF_CHECKED и MF_UNCHECKED;
· MF_DISABLED, MF_ENABLED и MF_GRAYED;
· MF_MENUBARBREAK и MF_MENUBREAK.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | AppendMenuA и AppendMenuW


CheckMenuItem

Устанавливает или отменяет соcтояние выбора заданного пункта меню.

Функция CheckMenuItem появилась в Windows 2000 может быть изменена или удалена в последующих версиях Windows. Вместо неё используйте функцию SetMenuItemInfo.

Прототип

DWORD WINAPI CheckMenuItem(

_In_ HMENU hmenu,

_In_ UINT uIDCheckItem,

_In_ UINT uCheck

);

Параметры

hmenu [in]

Описатель меню.

uIDCheckItem [in]

Пункт меню, состояние выбора которого подвергается изменению.

uCheck [in]

Набор флагов, определяющий интерпретацию параметра uIDCheckItem и устанавливаемое состояние выбора. Допустимые флаги перечислены ниже.

MF_BYCOMMAND (0x00000000L) - параметр uIDCheckItem содержит идентификатор пункта меню. Данный флаг используется по умолчанию.

MF_BYPOSITION (0x00000400L) - параметр uIDCheckItem содержит относительное положение пункта меню. Нумерация начинается с нуля.

MF_CHECKED (0x00000008L) - переводит пункт меню в выбранное состояние.

MF_UNCHECKED (0x00000000L) - переводит пункт меню в невыбранное состояние.

Возвращаемое значение

Предыдущее состояние пункта меню (MF_CHECKED или MF_UNCHECKED).

Возвращаемое значение в случае ошибки

Если пункт меню не существует, то функция возвращает значение -1.

Пример использования

Пример использования приведен здесь.

Примечание

Пункт в полоске меню не может иметь флажок (check mark).

Параметр uIDCheckItem задает пункт, открывающий подменю, или командный пункт меню. Для пункта меню, открывающего подменю, параметр uIDCheckItem должен содержать положение пункта. Для командного пункта, параметр uIDCheckItem может содержать положение пункта или его идентификатор.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


CreateMenu

Создает меню. Изначально меню пустое, но оно может быть наполнено функциями InsertMenuItem, AppendMenu и InsertMenu.

Прототип

HMENU WINAPI CreateMenu(void);

Параметры

У функции нет параметров.

Возвращаемое значение

Описатель соззданного меню.

Возвращаемое значение в случае ошибки

Значение NULL. Для получения дополнительной информации об ошибке используйте функцию GetLastError,

Пример использования

Пример использования приведен здесь.

Примечание

Ресурсы, ассоциированные с меню, который прикреплен к окну, освобождаются автоматически. Если меню не прикреплено к окну, то приложение перед завершением работы должно освободить системные ресурсы, выделенные под меню. Для этого используется функция DestroyMenu.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


CreatePopupMenu

Создает раскрывающееся меню, подменю, или контекстное меню. Созданное меню изначально пустое. Вы можете добавить в него пункты с помощью функций InsertMenuItem, InsertMenu или AppendMenu.

Прототип

HMENU WINAPI CreatePopupMenu(void);

Параметры

У функции нет параметров.

Возвращаемое значение

Описатель созданного меню.

Возвращаемое значение в случае ошибки

Значение NULL, Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Приложение может присоединить к новому меню ранее существующее меню, или оно может отобразить контекстное меню на экране с использованием функции TrackPopupMenuEx или TrackPopupMenu.

Ресурсы меню, прикрепленного к окну освобождаются автоматически. Если меню не прикреплено к окну, то приложение перед завершением работы должно освободить системные ресурсы, занимаемые меню с помощью функции DestroyMenu.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


DeleteMenu

Удаляет пункт меню из заданного меню. Если пункт меню открывает подменю, данная функция разрушает описатель подменю и освобождает память, которую он использовал.

Прототип

BOOL WINAPI DeleteMenu(

_In_ HMENU hMenu,

_In_ UINT uPosition,

_In_ UINT uFlags

);

Параметры

hMenu [in]

Описатель редактируемого меню.

uPosition [in]

Удаляемый пункт меню. Интерпретация этого параметра зависит от значения параметра uFlags.

uFlags [in]

Определяет, как следует интерпретировать значение параметра uPosition. Допустимые значения параметра uFlags перечислены ниже.

MF_BYCOMMAND (0x00000000L) - параметр uPosition содержит идентификатор пункта меню. Данный флаг используется по умолчанию.

MF_BYPOSITION (0x00000400L) - параметр uPosition содержит относительное положение пункта меню. Нумерация ведется с нуля.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации об ошибке, используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

При каждом изменении меню приложение должно вызывать функцию DrawMenuBar, даже если оно принадлежит окну, отображаемому на экране.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


DestroyMenu

Разрушает заданное меню и освобождает память, которую оно занимало.

Прототип

BOOL WINAPI DestroyMenu(

_In_ HMENU hMenu

);

Параметры

hMenu [in]

Описатель разрушаемого меню.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Перед завершением работы, приложение должно вызвать функцию DestroyMenu для разрушения меню, не связанного с окном. Меню, связанное с окном автоматически разрушается системой при закрытии приложения.

Функция DestroyMenu является рекурсивной. Это значит, что при разрушении меню, она также разрушит все его подменю.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


DrawMenuBar

Перерисовывает полосу меню заданного окна. Если в меню вносились изменения после создания окна, то для отображения изменений необходимо вызвать эту функцию.

Прототип

BOOL WINAPI DrawMenuBar(

_In_ HWND hWnd

);

Параметры

hWnd[in]

Описатель окна, чьё меню должно быть перерисовано.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Получить дополнительную информацию об ошибке можно с помощью функции GetLastError.

Пример использования

#include <windows.h>

int main()

{

HWND hwnd = NULL;

//Находим главное окно калькулятора

hwnd = FindWindow("SciCalc",NULL);

if(!hwnd) return -1;

//Перерисовываем меню калькулятора

DrawMenuBar(hwnd);

return 0;

}

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


EnableMenuItem

Делает доступным, недоступным, или закрашивает серым цветом (grayed) заданный пункт меню.

Прототип

BOOL WINAPI EnableMenuItem(

_In_ HMENU hMenu,

_In_ UINT uIDEnableItem,

_In_ UINT uEnable

);

Параметры

hMenu [in]

Описатель меню.

uIDEnableItem [in]

Пункт меню, состояние которого подвергается изменению. Точное значение этого параметра зависит от значения параметра uEnable.

uEnable [in]

Задает правило интерпретации параметра uIDEnableItem и определяет действие, выполняемое над пунктом меню. Параметр uEnable содержит комбинацию флагов перечисленных ниже.

MF_BYCOMMAND (0x00000000L) - параметр uIDEnableItem содержит идентификатор пункта меню. Данный флаг используется по умолчанию.

MF_BYPOSITION (0x00000400L) - параметр uIDEnableItem содержит относительное положение пункта меню. Нумерация пунктов начинается с нуля.

MF_DISABLED (0x00000002L) - пункт меню делается недоступным, но не закрашивается серым цветом. Тем не менее он не может быть выбран.

MF_ENABLED (0x00000000L) - пункт меню делается доступным. Он может быть выбран.

MF_GRAYED (0x00000001L) - пункт меню делается недоступным и закрашивается серым цветом. Он не может быть выбран.

Возвращаемое значение

Предыдущее состояние пункта меню (MF_DISABLED, MF_ENABLED или MF_GRAYED).

Возвращаемое значение в случае ошибки

Если пункта меню нет, то возвращается значение -1.

Пример использования

Пример использования приведен здесь.

Примечание

Для задания корректного описателя меню, приложения должны использовать флаг MF_BYPOSITION. Если описатель меню задает полоску меню (menu bar), то изменению подвергается пункт меню верхнего уровня (пункт в полоске меню). Для установки состояния пункта в раскрывающемся меню, или подменю, задаваемого своим положением, приложение должно задать описатель раскрывающегося меню или подменю.

Если приложение задало флаг MF_BYCOMMAND, система проверяет все пункты, открывающие подменю, принадлежащие заданному меню. Поэтому, если нет дублирования пунктов меню, достаточно задать описатель полоски меню.

Функции InsertMenu, InsertMenuItem, LoadMenuIndirect и SetMenuItemInfo также могут устанавливать состояние (доступно, недоступно или закрашено серым) пункта меню.

Когда вы изменяете меню окна, то полоска меню не обновляется мгновенно. Для принудительного обновления вызовите функцию DrawMenuBar.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetMenu

Возвращает описатель меню, ассоциированного с заданным окном.

Прототип

HMENU WINAPI GetMenu(

_In_ HWND hWnd

);

Параметры

hWnd [in]

Описатель окна, меню которого мы запрашиваем.

Возвращаемое значение

Описатель меню. Если у заданного окна нет меню, функция возвращает значение NULL. Если заданное окно является дочерним, то возвращаемое значение неопределено.

Пример использования

Пример использования приведен здесь.

Примечание

Функция GetMenu не работает с плавающим меню (floating menu bars). Плавающее меню - это элементы управления, которые имитируют меню, но не являются им.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetMenuBarInfo

Возвращает информацию о заданной полоске меню (menu bar).

Прототип

BOOL WINAPI GetMenuBarInfo(

_In_ HWND hwnd,

_In_ LONG idObject,

_In_ LONG idItem,

_Inout_ PMENUBARINFO pmbi

);

Параметры

hwnd [in]

Описатель окна (полоски меню), информация о котором запрашивается.

idObject [in]

Оъект меню. Данный параметр принимает одно из значений перечисленных ниже.

OBJID_CLIENT ((LONG)0xFFFFFFFC) - выскакивающее (popup) меню, ассоциированное с окном.

OBJID_MENU ((LONG)0xFFFFFFFD) - полоска меню, ассоциированная с окном (см. функцию GetMenu).

OBJID_SYSMENU ((LONG)0xFFFFFFFF) - системное меню, ассоциированное с окном (см. функцию GetSystemMenu).

idItem [in]

Пункт меню, для которого запрашивается информация. Если значение этого параметра равно нулю, то функция вернет информацию о всем меню. Если же значение этого параметра равно 1, то функция возвращает информацию о первом пункте меню и так далее.

pmbi [in, out]

Указатель на структуру MENUBARINFO, в которую будет занесена запрошенная информация. Перед вызовом функции вы должны записать в поле cbSize этой структуры значение sizeof(MENUBARINFO).

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

Ниже приводится полный исходный текст приложения, демонстрирующего использование функции GetMenuBarInfo.

#include <windows.h>

#include <stdio.h>

int main()

{

//Находим окно блокнота

HWND hwnd;

hwnd = FindWindow("Notepad", NULL);

//Получаем информацию о полоск меню

MENUBARINFO mbi;

mbi.cbSize = sizeof(MENUBARINFO);

GetMenuBarInfo(hwnd, OBJID_MENU, 0, &mbi);

//Выводим описатель меню

printf("%X\n",mbi.hMenu);

getchar();

return 0;

}

В данном примере с помощью функции FindWindow получается окно блокнота. После чего вызывается функция GeMenuBarInfo для получения информации о меню главного окна блокнота. На экран выводится значение поля hMenu (описатель меню) структуры MENUBARINFO.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetMenuCheckMarkDimensions

Возвращает размеры растрового изображения, используемого по умолчанию для обозначения выбора пункта меню. Система отображает это изображение рядом с выбранным пунктом меню. Перед вызовом функции SetMenuItemBitmaps для замещения растрового изображения по умолчанию, приложение должно с помощью функции GetMenuCheckMarkDimensions определить корректный размер растрового изображения.

Функция GetMenuCheckMarkDimensions поддерживается только в целях совместимости с 16-разрядными версиями Windows. Вместо нее приложения должны использовать функцию GetSystemMetrics с параметрами SM_CXMENUCHECK и SM_CYMENUCHECK.

Прототип

LONG WINAPI GetMenuCheckMarkDimensions(void);

Параметры

У функции нет параметров.

Возвращаемое значение

Возвращаемое значение определяет высоту и ширину растрового изображения в пикселях. Старшее слово содержит высоту, а младшее слово - ширину.

Пример использования

Ниже приводится полный исходный текст примера, демонстрирующего использование функции GetMenuCheckMarkDimensions.

#include <windows.h>

int main()

{

//Получаем размеры изображений

LONG dimensions;

dimensions = GetMenuCheckMarkDimensions();

//Выводим размеры на экран

printf("width is %d\nheight is %d\n", LOWORD(dimensions), HIWORD(dimensions));

getchar();

return 0;

}

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetMenuContextHelpId

Появилась в Windows XP. Возвращает идентификатор контекста помощи, ассоциированного с заданным меню.

Прототип

DWORD GetMenuContextHelpId(

HMENU hmenu

);

Параметры

hmenu

Описатель меню, для которого запрашивается идентификатор контекста помощи.

Возвращаемое значение

Идентификатор контекста помощи, если он установлен, или значение нуль.

Пример использования

Пример использования приведен здесь.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetMenuDefaultItem

Определяет для заданного меню пункт по умолчанию.

Прототип

UINT WINAPI GetMenuDefaultItem(

_In_ HMENU hMenu,

_In_ UINT fByPos,

_In_ UINT gmdiFlags

);

Параметры

hMenu [in]

Описатель меню, для которого запрашивается пункт по умолчанию.

fByPos [in]

Задает. что должна вернуть фунцкия: идентификатор или положение пункта. Если значение параметра fByPos равно FALSE, то функция возвращает идентификатор. В противном случае она возвращает положение.

gmdiFlags [in]

Определяет, как функция должна осуществлять поиск пунктов меню. данный параметр может быть равен нулю, одним или несколькими значениями, перечисленными ниже.

GMDI_GOINTOPOPUPS (0x0002L) - если пункт по умолчанию открывает подменю, функция осуществляет рекурсивный поиск в соответствующем подменю. Если у подменю нет пункта по умолчанию, функция возвращает идентификатор пункта, открывающего подменю. По умолчанию, функция возвращает первый пункт по умолчанию в заданном меню, независимо от того, открывает он подменю или нет.

GMDI_USEDISABLED (0x0001L) - функция вернет пункт по умолчанию, даже если он недоступен. По умолчанию, функция пропускает недоступные и закрашенные серым цветом (grayed) пункты.

Возвращаемое значение

Идентификатор или положение пункта меню по умолчанию.

Возвращаемое значение в случае ошибки

Значение -1. Для получения допонительной информации об ошибке используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Из комментария к статье msdn: возвращаемое функцией значение -1 не всегда свидетельствует об ошибке. Это может означать, что пункт меню не найден. При этом система не устанавливает кода ошибки, а функция GetLastError возвращает код "операция успешно выполнена".

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetMenuInfo

Возвращает информацию о заданном меню.

Прототип

BOOL WINAPI GetMenuInfo(

_In_ HMENU hmenu,

_Inout_ LPMENUINFO lpcmi

);

Параметры

hmenu [in]

Описатель меню.

lpcmi [in, out]

Указатель на структуру MENUINFO, содержащую информацию о меню. Перед вызовом функции вы должны записать в поле cbSize этой структуры значение sizeof(MENUINFO).

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetMenuItemCount

Определяет количество пунктов в заданном меню.

Прототип

int WINAPI GetMenuItemCount(

_In_opt_ HMENU hMenu

);

Параметры

hMenu [in, opt]

Описатель меню.

Возвращаемое значение

Количество пунктов в меню.

Возвращаемое значение в случае ошибки

Значение -1. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetMenuItemID

Возвращает идентфикатор пункта меню, заданного своим положением в меню.

Прототип

UINT WINAPI GetMenuItemID(

_In_ HMENU hMenu,

_In_ int nPos

);

Параметры

hMenu [in]

Описатель меню, содержащего пункт, для которого запрашивается идентификатор.

nPos [in]

Относительное положение пункта меню, для которого запрашивается идентификатор. Нумерация начинается с нуля.

Возвращаемое значение

Идентификатор заданного пункта меню. Если его идентификатор равен NULL, или он открывает подменю, функция возвращает значение -1.

Пример использования

Пример использования приведен здесь.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetMenuItemInfo

Возвращает информацию о пункте меню.

Прототип

BOOL WINAPI GetMenuItemInfo(

_In_ HMENU hMenu,

_In_ UINT uItem,

_In_ BOOL fByPosition,

_Inout_ LPMENUITEMINFO lpmii

);

Параметры

hMenu [in]

Описатель меню, которому принадлежит пункт меню.

uItem [in]

Идентификатор или положение пункта меню, о котором запрашивается информация. Интерпретация этого параметра зависит от значения параметра fByPosition.

fByPosition [in]

Определяет, как следует интерпретировать значение параметра uItem. Если значение параметра fByPosition равно FALSE, то uItem содержит идентификатор пункта меню. В противном случае, он содержит положение пункта.

lpmii [in, out]

Указатель на структуру MENUITEMINFO, в которой указывается, какую информацию мы запрашиваем, и в которую заносится запрошенная информация о пункте меню. Перед вызовом функции GetMenuItemInfo, вы должны записать в поле cbSize этой структуры значение sizeof(MENUITEMINFO).

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Для получения пункта меню типа MFT_STRING вначале нужно узнать длину строки. Для этого в поле dwTypeData структуры MENUITEMINFO установите значение NULL и вызовите функцию GetMenuItemInfo. Значение cch+1 - это и будет требуемый размер. Затем выделите память под буфер этого размера, разместите указатель на него в поле dwTypeData, увеличьте на единицу значение поля cch, и снова вызовите функцию GetMenuItemInfo для заполнения буфера строкой.

Если пункт меню, о котором запрашивается информация имеет другой тип, то уcтановите в поле dwTypeData значение, тип которого задан в поле fType, а в поле cch число нуль.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | GetMenuItemInfoA и GetMenuItemInfoW


GetMenuItemRect

Возвращает ограничивающий прямоугольник для заданного пункта меню.

Прототип

BOOL WINAPI GetMenuItemRect(

_In_opt_ HWND hWnd,

_In_ HMENU hMenu,

_In_ UINT uItem,

_Out_ LPRECT lprcItem

);

Параметры

hWnd [in, opt]

Описатель окна, которому принадлежит меню.

Если значение этого параметра равно NULL, а параметр hMenu задает выскакивающее (popup) меню, функция сама найдет окно.

hMenu [in]

Описатель меню.

uItem [in]

Положение пункта меню. Нумерация начинается с нуля.

lprcItem [out]

Указатель на структуру RECT, в которую будет занесена информация о прямоугольнике, ограничивающем заданный пункт меню. Координаты задаются в экранной системе координат.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Для того, чтобы возвращенный прямоугольник имел смысл, меню должно отображаться на экране (popped up), если это выскакивающее (popup) меню; или быть прикрепленным к окну, если это полоска меню (menu bar). Положение пункта меню неопределено, если меню не отображается на экране.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetMenuState

Возвращает набор флагов, ассоциированных с заданным пунктом меню. Если пункт открывает подменю, функция также возвращает количество пунктов в подменю.

Функция GetMenuState устарела и заменена функцией GetMenuItemInfo. Тем не менее, если вам не нужны дополнительные возможности, предоставляемые функцией GetMenuItemInfo вы можете использовать функцию GetMenuState.

Прототип

UINT WINAPI GetMenuState(

_In_ HMENU hMenu,

_In_ UINT uId,

_In_ UINT uFlags

);

Параметры

hMenu [in]

Описатель меню, которому принадлежит пункт.

uId [in]

Пункт меню, для которого запрашиваются флаги. Интерпретация этого параметра зависит от параметра uFlags.

uFlags [in]

Определяет порядок интерпретирования параметра uId. Параметр uFlags принимает одно из значений, перечисленных ниже.

MF_BYCOMMAND (0x00000000L) - параметр uId содержит идентификатор пункта меню. Данный флаг используется по умолчанию.

MF_BYPOSITION (0x00000400L) - параметр uId содержит положение пункта. Нумерация начинается с нуля.

Возвращаемое значение

Если пункт открывает подменю, младший байт возвращенного значения содержит набор флагов, ассоциированных с пунктом. Старший байт содержит количество пунктов в подменю, открываемым заданным пунктом.

Во всех других случаях, возвращенное значение является набором флагов. Допустимые флаги перечислены ниже.

MF_CHECKED (0x00000008L) - рядом с пунктом располагается галочка выбора (check mark) (только для раскрывающегося (drop-down) меню, подменю и контекстного меню).

MF_DISABLED (0x00000002L) - пункт недоступен.

MF_GRAYED (0x00000001L) - пункт недоступен и закрашен серым цветом (grayed).

MF_HILITE (0x00000080L) - пункт подсвечен (highlighted).

MF_MENUBARBREAK (0x00000020L) - аналогично MF_MENUBREAK, за исключением того, что в раскрывающихся меню, подменю и контекстных меню новая колонка вертикальной линией отделяется от старой.

MF_MENUBREAK (0x00000040L) - пункт размещается на новой линией (для полоски меню) или в новой колонке (для раскрывающегося меню, подменю и контекстного меню) без разделительных колонок.

MF_OWNERDRAW (0x00000100L) - пункт отрисовывается владельцем.

MF_POPUP (0x00000010L) - пункт является подменю.

MF_SEPARATOR (0x00000800L) - это горизонтальная разделительная линия (только для раскрывающегося меню, подменю и контекстного меню).

Возвращаемое значение в случае ошибки

Если заданный пункт меню не существует, функция возвращает значение -1.

Пример использования

Пример использования приведен здесь.

Примечание

Возможно тестирование состояния пункта на наличие флагов MF_ENABLED, MF_STRING, MF_UNCHECKED и MF_UNHILITE. Однако, так как эти флаги равны нулю, вы должны использовать специальные выражения для их проверки. Данные выражения приведены в таблице ниже.

Флаг | Выражение
MF_ENABLED | ! (Flag&(MF_DISABLED | MF_GRAYED))
MF_STRING | ! (Flag&(MF_BITMAP | MF_OWNERDRAW))
MF_UNCHECKED | ! (Flag&MF_CHECKED)
MF_UNHILITE | ! (Flag&MF_HILITE)

Из комментариев к статье в msdn: в 64-разрядной Windows 7 функция в случае ошибки возвращает значение 4294967295 (0x00000000ffffffff), а не -1 (0xffffffffffffffff). Возвращаемое значение также может содержать флаги MF_DEFAULT и MFT_RADIOCHECK.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetMenuString

Копирует текстовую строку заданного пункта меню в заданный буфер.

Функция GetMenuString устарела. Используйте вместо неё функцию GetMenuItemInfo.

Прототип

int WINAPI GetMenuString(

_In_ HMENU hMenu,

_In_ UINT uIDItem,

_Out_opt_ LPTSTR lpString,

_In_ int nMaxCount,

_In_ UINT uFlag

);

Параметры

hMenu [in]

Описатель меню.

uIDItem [in]

Пункт меню. Интерпретирование значения этого параметра зависит от параметра uFlag.

lpString [out, opt]

Буфер, в который будет записана завершающаяся NULL символом строка. если строка не помещается в буфер lpString, то она будет обрезана. Если значение параметра lpString равно NULL, то функция возвращает длину строки с наименованием пункта меню.

nMaxCount [in]

Максимальная длина, в символах, копируемой строки. Если строка длинее значения nMaxCount, то она будет обрезана. Если значение nMaxCount равно нулю, то функция вернет длину строки.

uFlag [in]

Задает порядок интерпретации параметра uIDItem. Параметр uFlag принимает одно из значений перечисленных ниже.

MF_BYCOMMAND - параметр uIDItem содержит идентификатор пункта меню. Используется по умолчанию.

MF_BYPOSITION - параметр uIDItem содержит относительный порядковый номер пункта меню. Нумерация ведется с нуля.

Возвращаемое значение

Количество символов, скопированных в буфер, не включая завершающего NULL символа.

Возвращаемое значение в случае ошибки

Значение нуль. Если запрашиваемый пункт меню имеет тип, отличный от MIIM_STRING и MFT_STRING, функция также возвращает нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Значение параметра nMaxCount должно быть на единицу больше, чем количество символов в копируемом тексте. Добавочное значение учитывает завершающий NULL символ.

Если значение параметра nMaxCount равно нулю, то функция возвращает длину строки.

Параметр lpString указывает на буфер TCHAR, параметр nMaxCount задает длину строки в символах. Некорректная установка этих параметров может привести к обрезанию строки и возможной потере данных.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | GetMenuStringA и GetMenuStringW


GetSubMenu

Возвращает описатель раскрывающегося меню или подменю, активируемого заданным пунктом меню.

Прототип

HMENU WINAPI GetSubMenu(

_In_ HMENU hMenu,

_In_ int nPos

);

Параметры

hMenu [in]

Описатель меню.

nPos [in]

Относительная позиция пункта, активирующего раскрывающееся меню или подменю. Нумерация начинается с нуля.

Возвращаемое значение

Описатель раскрывающегося меню или подменю, активируемого заданным пунктом. Если пункт меню не активирует раскрывающееся меню или подменю, то функция возвращает значение NULL.

Пример использования

Пример использования приведен здесь.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


HiliteMenuItem

Добавляет или удаляет подсветку пункта меню в полоске меню (menu bar).

Прототип

BOOL WINAPI HiliteMenuItem(

_In_ HWND hwnd,

_In_ HMENU hmenu,

_In_ UINT uItemHilite,

_In_ UINT uHilite

);

Параметры

hwnd [in]

Описатель окна, содержащего меню.

hmenu [in]

Описатель меню, содержащего пункт.

uItemHilite

Пункт меню. Данный параметр в зависимости от значения параметра uHilite содержит идентификатор пункта меню, или его порядковый номер в полоске меню.

uHilite [in]

Управляет интерпретацией параметра uItemHilite и выполняемым действием. Параметр uHilite должен содержать флаг MF_BYCOMMAND или MF_BYPOSITION и MF_HILITE или MF_UNHILITE. Данные флаги описаны ниже.

MF_BYCOMMAND (0x00000000L) - параметр uItemHilite содержит идентификатор пункта меню.

MF_BYPOSITION (0x00000400L) - параметр uItemHilite содержит порядковый номер пункта меню. Нумерация начинается с нуля.

MF_HILITE (0x00000080L) - подсвечивает пункт меню. Если этот флаг не задан, то подсветка удаляется.

MF_UNHILITE (0x00000000L) - удаляет подсветку пункта меню.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Флаги MF_HILITE и MF_UNHILITE могут быть использованы только в функции HiliteMenuItem. Они не могут быть использованы в функции ModifyMenu.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


InsertMenu

Вставляет в меню новый пункт, сдвигая вниз имеющиеся пункты.

Функция InsertMenu устарела и заменена функцией InsertMenuItem. Тем не менее, вы по-прежнему можете использовать функцию InsertMenu, если вам не нужны дополнительные возможности, предоставляемые функцией InsertMenuItem.

Прототип

BOOL WINAPI InsertMenu(

_In_ HMENU hMenu,

_In_ UINT uPosition,

_In_ UINT uFlags,

_In_ UINT_PTR uIDNewItem,

_In_opt_ LPCTSTR lpNewItem

);

Параметры

hMenu [in]

Описатель редактируемого меню.

uPosition [in]

Пункт меню, перед которым вставляется новый пункт. Интерпретация этого параметра зависит от значения параметра uFlags.

uFlags[in]

Определяет, как следует интерпретировать значение параметра uPosition, содержимое, отображение и поведение нового пункта. Интерпретация параметра uPosition определяется флагами, перечисленными ниже.

MF_BYCOMMAND (0x00000000L) - параметр uPosition содержит идентификатор пункта меню. Данный флаг используется по умолчанию.

MF_BYPOSITION (0x00000400L) - параметр uPosition содержит относительное положение пункта меню. Нумерация ведется с нуля. Если значение параметра uPosition равно -1, то новый пункт добавляется в конец меню.

В параметре uFlags также могут указываться флаги, перечисленные здесь.

uIDNewItem [in]

Идентификатор нового пункта меню или, если задан флаг MF_POPUP, описатель раскрывающегося меню или подменю.

lpNewItem [in, opt]

Содержимое нового пункта меню. Интерпретация параметра lpNewItem определяется флагами MF_BITMAP, MF_OWNERDRAW и MF_STRING так, как описано ниже.

MF_BITMAP - содержит описатель растрового изображения.

MF_OWNERDRAW - содержит определенное приложением значение, которое может быть использовано для хранения дополнительной информации, относящейся к пункту меню. Это значение будет сохранено в поле itemData структуры, на которую указывает параметр lParam сообщений WM_MEASUREITEM и WM_DRAWITEM, отправляемых при создании пункта меню и обновлении его отображения на экране.

MF_STRING - содержит указатель на завершающуюся NULL символом строку.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

При каждом изменении меню, приложение должно вызывать функцию DrawMenuBar, даже если оно принадлежит окну, отображаемому на экране.

Некоторые группы флагов не могут использоваться совместно друг с другом. Такие сочетания перечислены ниже.

· MF_BYCOMMAND и MF_BYPOSITION;
· MF_DISABLED, MF_ENABLED и MF_GRAYED;
· MF_BITMAP, MF_STRING, MF_OWNERDRAW и MF_SEPARATOR;
· MF_MENUBARBREAK и MF_MENUBREAK;
· MF_CHECKED и MF_UNCHECKED.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | InsertMenuA и InsertMenuW


InsertMenuItem

Вставляет новый пункт меню в заданное место меню.

Прототип

BOOL WINAPI InsertMenuItem(

_In_ HMENU hMenu,

_In_ UINT uItem,

_In_ BOOL fByPosition,

_In_ LPCMENUITEMINFO lpmii

);

Параметры

hMenu [in]

Описатель меню, в который вставляется новый пункт.

uItem [in]

Идентификатор или положение пункта меню, перед которым вставляется новый пункт. Интерпретация этого параметра зависит от значения параметра fByPosition.

fByPosition [in]

Задает интерпретацию параметра uItem. Если значение параметра fByPosition равно FALSE, то uItem содержит идентификатор пункта меню. В противном случае, uItem содержит положение пункта.

lpmii [in]

Указатель на структуру MENUITEMINFO, содержащей информацию о новом пункте меню.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации об ошибке, используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

При каждом изменении меню приложение должно вызывать функцию DrawMenuBar, даже если оно принадлежит окну, отображаемому на экране.

Для поддержки клавиатурных ускорителей (keyboard accelerators), работающих с пунктами меню, содержащими растровое изображение, и самостоятельно перерисовываемыми пунктами, приложение должно обрабатывать сообщение WM_MENUCHAR.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | InsertMenuItemA и InsertMenuItemW


IsMenu

Определяет, является ли полученный описатель описателем меню.

Прототип

BOOL WINAPI IsMenu(

_In_ HMENU hMenu

);

Параметры

hMenu [in]

Тестируемый описатель.

Возвращаемое значение

Если полученный описатель задает меню, то функция возвращает ненулевое значение. В противном случае она возвращает значение нуль.

Пример использования

Пример использования приведен здесь.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


LoadMenu

Загружает заданный ресурс меню из исполняемого файла, ассоциированного с приложением.

Прототип

HMENU WINAPI LoadMenu(

_In_opt_ HINSTANCE hInstance,

_In_ LPCTSTR lpMenuName

);

Параметры

hInstance [in, opt]

Описатель модуля, содержащего загружаемый ресурс меню.

lpMenuName [in]

Наименование ресурса меню. Данный параметр может состоять из идентификатора ресурса в младшем слове и нуля в старшем слове. Для создания такого значения используйте макрос MAKEINTRESOURCE.

Возвращаемое значение

Описатель ресурса меню.

Возвращаемое значение в случае ошибки

Значение NULL. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Перед закрытием приложения вызовите функцию DestroyMenu для разрушения меню и освобождения памяти, занимаемой меню.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | LoadMenuA и LoadMenuW


LoadMenuIndirect

Загружает в память заданный шаблон меню.

Прототип

HMENU WINAPI LoadMenuIndirect(

_In_ const MENUTEMPLATE *lpMenuTemplate

);

Параметры

lpMenuTemplate [in]

Указатель на шаблон меню или на расширенный шаблон меню. Шаблон меню состоит из структуры MENUITEMTEMPLATEHEADER, вслед за которой располагается одна или несколько структур MENUITEMTEMPLATE. Расширенный шаблон меню состоит из структуры MENUEX_TEMPLATE_HEADER, вслед за которой располагается одна или несколько структур MENUEX_TEMPLATE_ITEM.

Возвращаемое значение

Описатель меню.

Возвращаемое значение в случае ошибки

Значение NULL. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Для ANSI и Unicode версий функции, строки в структурах MENUITEMTEMPLATE должны задаваться в Unicode.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | LoadMenuIndirectA и LoadMenuIndirectW


MenuItemFromPoint

Определяет какому пункту меню принадлежит заданная точка.

Прототип

int WINAPI MenuItemFromPoint(

_In_opt_ HWND hWnd,

_In_ HMENU hMenu,

_In_ POINT ptScreen

);

Параметры

hWnd [in, opt]

Описатель окна, которому принадлежит меню. Если значение этого параметра равно NULL, а параметр hMenu задает выскакивающее (popup) меню, функция сама найдет окно.

hMenu [in]

Описатель меню, содержащего тестируемые пункты.

ptScreen [in]

Структура POINT, содержащая координаты тестируемой точки. Если параметр hMenu задает полоску меню, точка задается в координатах окна. В противном случае, в клиентских координатах.

Возвращаемое значение

Положение пункта меню в заданной точке. Нумерация начинается с нуля.

Возвращаемое значение в случае ошибки

Если пункт меню не найден, то возвращается значение -1.

Пример использования

Пример использования приведен здесь.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


ModifyMenu

Изменяет существующий пункт меню. Эта функция используется для задания содержимого, отображения и поведения пункта меню.

Функция ModifyMenu заменена функцией SetMenuItemInfo. Тем не менее, если вам не нужны дополнительные возможности, предоставляемые функцией SetMenuItemInfo, вы можете использовать функцию ModifyMenu.

Прототип

BOOL WINAPI ModifyMenu(

_In_ HMENU hMnu,

_In_ UINT uPosition,

_In_ UINT uFlags,

_In_ UINT_PTR uIDNewItem,

_In_opt_ LPCTSTR lpNewItem

);

Параметры

hMnu [in]

Описатель редактируемого меню.

uPosition [in]

Редактируемый пункт меню. Интерпретация этого параметра зависит от значения параметра uFlags.

uFlags[in]

Набор флагов, задающих интерпретацию параметра uPosition, содержимое, отображение и поведение пункта меню.

Интерпретация параметра uPosition задается флагами, перечисленными ниже.

MF_BYCOMMAND (0x00000000L) - uPosition содержит идентификатор пункта меню. Данный флаг используется по умолчанию.

MF_BYPOSITION (0x00000400L) - uPosition содержит относительное положение пункта меню. Нумерация пунктов начинается с нуля.

Также параметр uFlags может содержать комбинацию флагов, перечисленных здесь.

uIDNewItem [in]

Идентификатор редактируемого пункта меню, или, если в параметре uFlags установлен флаг MF_POPUP, описатель раскрывающегося меню (drop-down menu) или подменю.

lpNewItem [in]

Содержимое редактируемого пункта меню. Интерпретация параметра lpNewItem зависит от того, какой из флагов установлен в параметре uFlags: MF_BITMAP, MF_OWNERDRAW или MF_STRING.

MF_BITMAP - описатель растрового изображения.

MF_OWNERDRAW - определенное приложением значение, которое используется для хранения дополнительной информации, ассоциированной с пунктом меню. Данное значение будет занесено в поле itemData структуры, указатель на которую будет передан в параметре lParam сообщения WM_MEASUREITEM и WM_DRAWITEM, отправляемых окну при создании пункта меню и необходимости обновления его отображения на экране соответственно.

MF_STRING - указатель на завершающуюся NULL символом строку. Данный флаг используется по умолчанию.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Если функция ModifyMenu замещает пункт меню, который открывает раскрывающееся меню или подменю, функция разрушает старое раскрывающееся меню или подменю и освобождает память, которую оно занимало.

Для поддержки клавиатурных ускорителей (keyboard accelerators), работающих с пунктами меню, имеющими растровое изображение, и самостоятельно перерисовываемыми пунктами меню, окно, владеющее меню, должно обрабатывать сообщение WM_MENUCHAR.

При каждом изменении меню приложение должно вызывать функцию DrawMenuBar, даже если меню принадлежит окну, отображаемому на экране.

Изменить атрибуты существующих пунктов меню можно быстрее с помощью функций CheckMenuItem и EnableMenuItem.

Перечисленные ниже группы флагов не могут сочетаться друг с другом.

· MF_BYCOMMAND и MF_BYPOSITION.
· MF_DISABLED, MF_ENABLED и MF_GRAYED.
· MF_BITMAP, MF_STRING, MF_OWNERDRAW и MF_SEPARATOR.
· MF_MENUBARBREAK и MF_MENUBREAK.
· MF_CHECKED и MF_UNCHECKED.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | ModifyMenuA и ModifyMenuW


RemoveMenu

Удаляет пункт меню или отсоединяет подменю от заданного меню. Если пункт меню открывает раскрывающееся меню или подменю, функция RemoveMenu не разрушает меню или его описатель, позволяя ему быть повторно используемым. Перед вызовом этой функции, фукция GetSubMenu должна вернуть описатель раскрывающегося меню или подменю.

Прототип

BOOL WINAPI RemoveMenu(

_In_ HMENU hMenu,

_In_ UINT uPosition,

_In_ UINT uFlags

);

Параметры

hMenu [in]

Описатель редактируемого меню.

uPosition [in]

Удаляемый пункт меню. Интерпретация этого параметра зависит от параметра uFlags.

uFlags[in]

Задает, как следует интерпретировать значение параметра uPosition. Допустимые значения параметра uFlags перечислены ниже.

MF_BYCOMMAND (0x00000000L) - параметр uPosition содержит идентификатор пункта меню. Данный флаг используется по умолчанию.

MF_BYPOSITION (0x00000400L) - параметр uPosition содержит относительное положение пункта меню. Нумерация ведется с нуля.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации об ошибке, используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Приложение должно вызывать функцию DrawMenuBar при каждом изменении меню, даже если оно принадлежит окну, отображаемому на экране.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


SetMenu

Связывает новое меню с заданным окном.

Прототип

BOOL WINAPI SetMenu(

_In_ HWND hWnd,

_In_opt_ HMENU hMenu

);

Параметры

hWnd [in]

Описатель окна, к которому прикрепляется меню.

hMenu [in, opt]

Описатель нового меню. Если значение этого параметра равно NULL, то у окна удаляется текущее меню.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации об ошибке, используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Окно перерисовывается в ответ на изменение меню. Меню может быть прикреплено к любому окну, не являющемуся дочерним окном.

Функция SetMenu замещает предыдущее меню, если оно было, но не разрушает его. Для его разрушения приложения должны использовать функцию DestroyMenu.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


SetMenuContextHelpId

Появилась в Windows XP. Ассоциирует с меню идентификатор контекста помощи.

Прототип

BOOL SetMenuContextHelpId(

HMENU hmenu,

DWORD dwContextHelpId

);

Параметры

hmenu

Описатель меню, с которым ассоциируется идентификатор контекста помощи.

dwContextHelpId

Идентификатор контекста помощи.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации об ошибке, используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Установленный идентификатор разделяется всеми пунктами меню. Идентификатор контекста помощи не может быть прикреплен к отдельным пунктам меню.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


SetMenuDefaultItem

Устанавливает пункт меню по умолчанию для заданного меню.

Прототип

BOOL WINAPI SetMenuDefaultItem(

_In_ HMENU hMenu,

_In_ UINT uItem,

_In_ UINT fByPos

);

Параметры

hMenu [in]

Описатель меню, в котором устанавливается пункт по умолчанию.

uItem [in]

Идентификатор или положение нового пукта по умолчанию. Если в меню отменяется пункт по умолчанию, то данный параметр должен содержать значение -1. Интерпретация параметра uItem зависит от значения параметра fByPos.

fByPos [in]

Задает интерпретацию параметра uItem. Если значение параметра fByPos равно FALSE, то параметр uItem содержит идентификатор пункта меню. В противном случае, он содержит положение пункта меню.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации об ошибке, используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


SetMenuInfo

Устанавливает информацию для заданного меню.

Прототип

BOOL WINAPI SetMenuInfo(

_In_ HMENU hmenu,

_In_ LPCMENUINFO lpcmi

);

Параметры

hmenu [in]

Описатель меню.

lpcmi [in]

Указатель на структуру MENUINFO, содержащую устанавливаемую информацию.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации об ошибке, используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


SetMenuItemBitmaps

Прикрепляет заданное растровое изображение (bitmap) к пункту меню. Когда пункт меню активирован или деактивирован, система отображает рядом с ним соответствующее растровое изображение.

Прототип

BOOL WINAPI SetMenuItemBitmaps(

_In_ HMENU hMenu,

_In_ UINT uPosition,

_In_ UINT uFlags,

_In_opt_ HBITMAP hBitmapUnchecked,

_In_opt_ HBITMAP hBitmapChecked

);

Параметры

hMenu [in]

Описатель меню, которому принадлежит редактируемый пункт.

uPosition [in]

Редактируемый пункт меню. Интерпретация этого параметра зависит от значения параметра uFlags.

uFlags [in]

Задает правило интерпретации значения параметра uPosition. Допустимые значения этого параметра перечислены ниже.

MF_BYCOMMAND (0x00000000L) - параметр uPosition содержит идентификатор пункта меню. Данное значение используется по умолчанию.

MF_BYPOSITION (0x00000400L) - параметр uPosition содержит порядковый номер пункта меню. Нумерация ведется с нуля.

hBitmapUnchecked [in, opt]

Описатель растрового изображения, отображаемого когда пункт меню не выбран.

hBitmapChecked [in, opt]

Описатель растрового изображения, отображаемого когда пункт меню выбран.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации об ошибке, используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Если значение параметра hBitmapUnchecked или hBitmapChecked равно NULL, то для соответствующего состояния пункта меню система ничего не будет отрисовывать рядом с ним. Если оба параметра равны NULL, система будет отображать стандартную галочку, когда пункт выбран, и ничего не будет отображать, когда он не выбран.

Когда меню уничтожается, растровые изображения не уничтожаются. Поэтому приложение должно само уничтожать их.

Изображения должны быть двуцветными. Система использует логическую операцию И для совмещения растрового изображения с меню таким образом, что белые участки становятся прозрачными, а черные участки приобретают цвет пункта меню. Если вы используете цветные изображения, то результат может отличаться от ожидаемого.

Для получения размеров изображения используйте функцию GetSystemMetrics с параметрами SM_CXMENUCHECK и SM_CYMENUCHECK.

В комментариях к соответствующей статье msdn говорится, что константа MF_BYPOSITION имеет значение 0x000004L.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


SetMenuItemInfo

Изменяет информацию о пункте меню.

Прототип

BOOL WINAPI SetMenuItemInfo(

_In_ HMENU hMenu,

_In_ UINT uItem,

_In_ BOOL fByPosition,

_In_ LPMENUITEMINFO lpmii

);

Параметры

hMenu [in]

Описатель меню, содержащего редактируемый пункт.

uItem [in]

Идентификатор или положение редактируемого пункта меню. Интерпретация этого параметра зависит от значения параметра fByPosition.

fByPosition [in]

Определяет, как следует интерпретировать значение параметра uItem. Если значение fByPosition равно FALSE, то uItem содержит идентификатор пункта меню. В противном случае, он содержит положение пункта меню.

lpmii [in]

Указатель на структуру MENUITEMINFO, содержащую информацию о пункте меню и определяющую, какие его атрибуты будут изменены.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации об ошибке используйте функцию GetLastError,

Пример использования

Пример использования приведен здесь.

Примечание

При каждом изменении меню приложение должно вызывать функцию DrawMenuBar, даже если меню принадлежит окну, отображаемому на экране.

Для поддержки работы клавиатурных ускорителей (keyboard accelerators) с пунктами меню, содержащими изображения, и самостоятельно перерисовываемыми пунктами меню, владелец меню должен обрабатывать сообщение WM_MENUCHAR.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | SetMenuItemInfoA и SetMenuItemInfoW


TrackPopupMenu

Отображает в заданном месте контекстное меню и отслеживает выбранный пользователем пункт. Контекстное меню может отображаться в любом месте экрана.

Прототип

BOOL WINAPI TrackPopupMenu(

_In_ HMENU hMenu,

_In_ UINT uFlags,

_In_ int x,

_In_ int y,

_In_ int nReserved,

_In_ HWND hWnd,

_In_opt_ const RECT *prcRect

);

Параметры

hMenu [in]

Описатель отображаемого контекстного меню. Данный описатель может быть получен с помощью функции CreatePopupMenu, создающей новое контекстное меню, или с помощью функции GetSubMenu, возвращающей описатель подменю, ассоциированного с существующим пунктом меню.

uFlags [in]

Используйте значение нуль или комбинацию флагов, перечисленных ниже.

Горизонтальное положение контекстного меню задается флагами, перечисленными ниже.

TPM_CENTERALIGN (0x0004L) - меню располагается так, чтобы координата x совпала с центром меню.

TPM_LEFTALIGN (0x0000L) - меню располагается так, чтобы его левый край был выровнен по координате x.

TPM_RIGHTALIGN (0x0008L) - меню располагается так, чтобы его правый край был выровнен по координате x.

Вертикальное положение контекстного меню задается флагами, перечисленными ниже.

TPM_BOTTOMALIGN (0x0020L) - меню располагается так, чтобы его нижний край был выровнен по координате y.

TPM_TOPALIGN (0x0000L) - меню располагается так, чтобы его верхний край был выровнен по координате y.

TPM_VCENTERALIGN (0x0010L) - меню располагается так, чтобы его центр совпал с координатой y.

Флаги перечисленные ниже управляют оповещением приложения о выборе пользователя без установки родительского окна для меню.

TPM_NONOTIFY (0x0080L) - функция не отправляет уведомительное сообщение о выборе пользователя.

TPM_RETURNCMD (0x0100L) - функция возвращает идентификатор выбранного пользователем пункта меню.

Кнопки мыши, посредством которых пользователь может выбрать пункт меню, задаются флагами перечисленными ниже.

TPM_LEFTBUTTON (0x0000L) - только левой кнопкой мыши.

TPM_RIGHTBUTTON (0x0002L) - левой или правой кнопкой мыши.

Флаги, перечисленные ниже, управляют анимацией меню. Вы можете их комбинировать. Например, объединение горизонтальной и вертикальной анимации, приведет к анимации по диагонали.

TPM_HORNEGANIMATION (0x0800L) - меню анимируется справа налево.

TPM_HORPOSANIMATION (0x0400L) - меню анимируется слева направо.

TPM_NOANIMATION (0x4000L) - меню отображается без анимации.

TPM_VERNEGANIMATION (0x2000L) - меню анимируется снизу вверх.

TPM_VERPOSANIMATION (0x1000L) - меню анимируется сверху вниз.

Для осуществления анимации, функция SystemParametersInfo должна установить флаг SPI_SETMENUANIMATION. Также, все флаги TPM_*ANIMATION кроме TPM_NOANIMATION игнорируются если включено анимация исчезновения меню (menu fade animation). Для боле подробной информации смотрите описание флага SPI_GETMENUFADE функции SystemParametersInfo.

При отображении меню во время отображдения другого меню используйте флаг TPM_RECURSE. Он предназначен для поддержки контекстных меню внутри меню.

Для отображения текста справа-налево используйте флаг TPM_LAYOUTRTL. По умолчанию применяется отображение текста слева направо.

x[in]

Положение контекстного меню по горизонтали. В экранной системе координат.

y[in]

Положение контекстного меню по вертикали. В экранной системе координат.

nReserved [in]

Зарезервировано. Должно быть равно нулю.

hWnd [in]

Описатель окна, которому принадлежит контекстное меню. Данное окно будет получать все сообщения от меню. Окно не получит сообщения WM_COMMAND до тех пор, пока функция не вернет управление. Если в параметре uFlags задан флаг TPM_NONOTIFY, то функция не отправит окну сообщение. Однако, вы должны указать в параметре hWnd описатель окна. Это может быть описатель любого окна вашего приложения.

prcRect [in, opt]

Игнорируется.

Возвращаемое значение

Если в параметре uFlags задан флаг TPM_RETURNCMD, то функция возвращает идентификатор выбранного пользователем пункта меню. Если пользователь ничего не выбрал, то возвращается значение нуль.

Если флаг TPM_RETURNCMD не задан, то функция возвращает ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Вызовите функцию GetSystemMetrics с флагом SM_MENUDROPALIGNMENT для определения корректного значения флага выравнивания по горизонтали (TPM_LEFTALIGN или TPM_RIGHTALIGN) и/или флага направления анимации (TPM_HORPOSANIMATION или TPM_HORNEGANIMATION), передаваемых в функцию TrackPopupMenu и TrackPopupMenuEx. Это важно для создания оптимального пользовательского интерфейса, особенно при разработке приложений для Microsoft Tablet PC.

Для задания области экрана, которую меню не должно перекрывать используйте функцию TrackPopupMenuEx.

Для отображения контекстного меню для уведомительной иконки, текущее окно должно стать окном переднего плана до того как приложение вызовет функцию TrackPopupMenu или TrackPopupMenuEx. В противном случае, меню не исчезнет, если пользователь щелкнет мышью вне границ меню или окна, создавшего меню (если оно видимо). Если текущее окно является дочерним окном, то вы должны установить родительское окно (верхнего уровня) в качестве окна переднего плана (foreground window).

Однако, когда текущее окно является окном переднего плана, то при вторичном отображении меню, оно отобразится и немедленно исчезнет. Для исправления этого, вы должны принудительно переключить задачу на приложение, вызвавшее фукцию TrackPopupMenu. Это делается путем отправки простого сообщения окну или потоку так, как показано в примере ниже.

SetForegroundWindow(hDlg);

// Display the menu

TrackPopupMenu( hSubMenu,

TPM_RIGHTBUTTON,

pt.x,

pt.y,

0,

hDlg,

NULL);

PostMessage(hDlg, WM_NULL, 0, 0);

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.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


SetLastError

Устанавливает код последней ошибки для вызывающего потока.

Прототип

void WINAPI SetLastError(

_In_ DWORD dwErrCode

);

Параметры

dwErrCode[in]

Устанавливаемый код последней ошибки для вызывающего потока.

Пример использования

#include <windows.h>

int main()

{

//Устанавливаем код последней ошибки

SetLastError(0xAB);

//Получаем код ошибки и выводим его на экран

printf("%X\n",GetLastError());

getchar();

return 0;

}

В данном примере на экран будет выведено значение 0xAB.

Примечание

Код последней ошибки сохраняется в области памяти, специфичной для каждого потока. Поэтому изменение кода последней ошибки потока никак не повлияет на коды ошибок других потоков приложения.

Большинство функций вызывают функцию SetLastError или SetLastErrorEx только тогда, когда завершаются ошибкой. Однако, некоторые системные функции вызывают SetLastError или SetLastErrorEx и для установления признака успешности.

Приложения могут читать код последней ошибки потока с помощью функции GetLastError.

Код ошибки является 32-разрядным целым (31 бит - самый старший бит). Бит 29 зарезервирован для кодов ошибок приложений; у системных кодов ошибок данный бит сброшен. Если вы определяете собственный код ошибки, используйте значения, в которых данный бит взведен (например, 0x20000000, 0x30000000, 0x60000000 и др.). Так определенные вами коды ошибок гарантировано не будут "пересекаться" с системными кодами ошибок.

Заголовочный файл | winbase.h (включен в windows.h)
Экспортирующая библиотека | kernel32.dll


SetLastErrorEx

Появилась в Windows XP. На сегодняшний день, она аналогична функции SetLastError. Второй (дополнительный) параметр игнорируется.

Прототип

void WINAPI SetLastErrorEx(

_In_ DWORD dwErrCode,

_In_ DWORD dwType

);

Параметры

dwErrorCode[in]

Устанавливаемый код последней ошибки для вызывающего потока.

dwType[in]

Игнорируется.

Пример использования

#include <windows.h>

int main()

{

//Устанавливаем код последней ошибки

SetLastErrorEx(0xAB, 0);

//Получаем код ошибки и выводим его на экран

printf("%X\n",GetLastError());

getchar();

return 0;

}

В данном примере на экран будет выведено значение 0xAB.

Примечание

Код последней ошибки сохраняется в области памяти, специфичной для каждого потока. Поэтому изменение кода последней ошибки потока никак не повлияет на коды ошибок других потоков приложения.

Большинство функций вызывают функцию SetLastError или SetLastErrorEx только тогда, когда завершаются ошибкой. Однако, некоторые системные функции вызывают SetLastError или SetLastErrorEx и для установления признака успешности.

Приложения могут читать код последней ошибки потока с помощью функции GetLastError.

Код ошибки является 32-разрядным целым (31 бит - самый старший бит). Бит 29 зарезервирован для кодов ошибок приложений; у системных кодов ошибок данный бит сброшен. Если вы определяете собственный код ошибки, используйте значения, в которых данный бит взведен (например, 0x20000000, 0x30000000, 0x60000000 и др.). Так определенные вами коды ошибок гарантировано не будут "пересекаться" с системными кодами ошибок.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


AdjustWindowRect

Вычисляет размер прямоугольника окна, основываясь на желательном размере клиентской области окна. Прямоугольник окна затем может быть передан в функцию CreateWindow для создания окна, клиентская область которого будет иметь желаемый размер.

Для определения расширенных оконных стилей используйте функцию AdjustWindowRectEx.

Прототип

BOOL WINAPI AdjustWindowRect(

_Inout_ LPRECT lpRect,

_In_ DWORD dwStyle,

_In_ BOOL bMenu

);

Параметры

lpRect[in, out]

Указатель на сруктуру RECT, которая содержит координаты левого верхнего и правого нижнего углов желательной клиентской области. Когда функция вернет управление в данной структуре будут находиться координаты левого верхнего и правого нижнего углов окна, содержащего желаемую клиентскую область.

dwStyle[in]

Набор оконных стилей окна, размер которого мы вычисляем. Допустимые оконные стили перечислены здесь. Обратите внимание на то, что вы не можете определять стиль WS_OVERLAPPED.

bMenu[in]

Указывает имеет ли окно меню.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке используйте функцию GetLastError.

Пример использования

#include <windows.h>

int main()

{

RECT rc = {10,10,20,20};

printf("(%d,%d) - (%d,%d)\n", rc.left, rc.top, rc.right,rc.bottom);

AdjustWindowRect(&rc,WS_SYSMENU|WS_BORDER|WS_VISIBLE,TRUE);

printf("(%d,%d) - (%d,%d)\n", rc.left, rc.top, rc.right,rc.bottom);

getchar();

return 0;

}

Вывод данной программы представлен ниже.

(10,10) - (20,20)

(9,-11) - (21,21)

Примечание

Клиентский прямоугольник - это наименьший прямоугольник, который полностью охватывает клиентскую область окна. Оконный прямоугольник - это наименьший прямоугольник, который полностью охватывает всё окно, включая клиентскую и неклиентскую области.

Функция AdjustWindowRect не учитывает дополнительного места когда меню состоит из двух или более строк.

Функция AdjustWindowRect не учитывает стили WS_VSCROLL и WS_HSCROLL. Для вычисления размеров полос прокрутки используйте функцию GetSystemMetrics с флагами SM_CXVSCROLL или SM_CYHSCROLL.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


AdjustWindowRectEx

Вычисляет размер прямоугольника окна, основываясь на желательном размере клиентского прямоугольника. Прямоугольник окна затем может быть передан в функцию CreateWindowEx для создания окна, клиентская область которого будет иметь желаемый размер.

Прототип

BOOL WINAPI AdjustWindowRectEx(

_Inout_ LPRECT lpRect,

_In_ DWORD dwStyle,

_In_ BOOL bMenu,

_In_ DWORD dwExStyle

);

Параметры

lpRect[in, out]

Указатель на сруктуру RECT, которая содержит координаты левого верхнего и правого нижнего углов желательной клиентской области. Когда функция вернет управление в данной структуре будут находиться координаты левого верхнего и правого нижнего углов окна, содержащего желаемую клиентскую область.

dwStyle[in]

Набор оконных стилей окна, размер которого мы вычисляем. Допустимые оконные стили перечислены здесь. Обратите внимание на то, что вы не можете определять стиль WS_OVERLAPPED.

bMenu[in]

Указывает имеет ли окно меню.

dwExStyle[in]

Набор расширенных стилей окна, размер которого мы вычисляем. Допустимые расширенные оконные стили перечислены здесь.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке используйте функцию GetLastError.

Пример использования

#include <windows.h>

int main()

{

RECT rc = {10,10,20,20};

printf("(%d,%d) - (%d,%d)\n", rc.left, rc.top, rc.right,rc.bottom);

AdjustWindowRectEx(&rc,WS_SYSMENU|WS_BORDER|WS_VISIBLE,TRUE,WS_EX_TOOLWINDOW);

printf("(%d,%d) - (%d,%d)\n", rc.left, rc.top, rc.right,rc.bottom);

getchar();

return 0;

}

Вывод данной программы представлен ниже.

(10,10) - (20,20)

(9,-11) - (21,21)

Примечание

Клиентский прямоугольник - это наименьший прямоугольник, который полностью охватывает клиентскую область окна. Оконный прямоугольник - это наименьший прямоугольник, который полностью охватывает всё окно, включая клиентскую и неклиентскую области.

Функция AdjustWindowRectEx не учитывает дополнительного места когда меню состоит из двух или более строк.

Функция AdjustWindowRectEx не учитывает стили WS_VSCROLL и WS_HSCROLL. Для вычисления размеров полос прокрутки используйте функцию GetSystemMetrics с флагами SM_CXVSCROLL или SM_CYHSCROLL.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


AllowSetForegroundWindow

Разрешает заданному процессу устанавливать окно переднего плана (foreground window) с помощью функции SetForegroundWindow. Вызывающий процесс сам должен иметь право устанавливать окно переднего плана.

Прототип

BOOL WINAPI AllowSetForegroundWindow(

_In_ DWORD dwProcessId

);

Параметры

dwProcessId[in]

Идентификатор процесса, которому разрешается устанавливать окно переднего плана. Если этот параметр равен ASFW_ANY, то окно переднего плана разрешается устанавливать всем процессам.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Функция завершается ошибкой, если вызывающий её процесс не имеет права устанавливать окно переднего плана. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#define WINVER 0x0500

#include <windows.h>

int main()

{

HWND hwnd;

//Находим главное окно калькулятора

hwnd = FindWindow("SciCalc", NULL);

int pid;

//Получаем идентификатор процесса калькулятора

GetWindowThreadProcessId(hwnd,&pid);

//Разрешаем ему вызывать SetForegroundWindow

AllowSetForegroundWindow(pid);

getchar();

return 0;

}

Для доступа к объявлению ASFW_ANY и самой функции AllowSetForegroundWindow нужно переопределить объявление _WIN32_WINNT (сделать его большим чем 0x0500) или _WIN32_WINDOWS (сделать его большим чем 0x0490).

В нашем примере мы переопределяем WINVER. По умолчанию _WIN32_WINNT присваивается равным WINVER (см. заголовочный файл windef.h). _WIN32_WINDOWS по умолчанию не задано.

Примечание

Система жестко ограничивает процессы, которые могут устанавливать верхние окна (foreground window). Процесс может установить такое окно только если выполнено одно из следующих условий:

· процесс является приоритетным процессом (foreground process);
· процесс был запущен приоритетным процессом;
· процесс обрабатывал последнее событие ввода;
· нет приоритетного процесса;
· процесс отлаживается;
· окно переднего плана не заблокировано (см. описание функции LockSetForegroundWindow);
· истекла задержка на срабатывание функции SetForegroundWindow (см. описание параметра SPI_GETFOREGROUNDLOCKTIMEOUT функции SystemParametersInfo);
· нет активных меню.

Процесс, который имеет право устанавливать верхние окна может разрешить устанавливать верхние окна другим приложениям с помощью функции AllowSetForegroundWindow. Процесс, указанный в параметре dwProcessId теряет возможность устанавливать верхнее окно до тех пор, пока пользователь не сгенерирет ввод, направленный в этот процесс, или процесс не вызовет функцию AllowSetForegroundWindow, в параметре которой указан данный процесс.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


AnimateWindow

Позволяет скрыть и отобразить окно с использованием специального эффекта.

Прототип

BOOL WINAPI AnimateWindow(

_In_ HWND hwnd,

_In_ DWORD dwTime,

_In_ DWORD dwFlags

);

Параметры

hwnd[in]

Описатель окна.

dwTime[in]

Время в миллисекундах, в течение которого воспроизводится специльный эффект. Обычно, для воспроизведения специального эффекта не требуется более 200 миллисекунд.

dwFlags[in]

Тип специального эффекта. Представляет собой сочетание флагов, перечисленных здесь.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#define WINVER 0x500

#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, ID_DIALOG, HWND_DESKTOP, Dlg_Proc, 0);

return 0;

}

//Диалоговая процедура

INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

if(uMsg==WM_CLOSE)

{

//Скрываем окно

AnimateWindow(hwnd, 5000, AW_HIDE|AW_BLEND);

EndDialog(hwnd, 0);

}

return 0;

}

Примечание

Функция AnimateWindow возвращает ошибку в одном изследующих случаев:

-при попытке показать уже видимое окно;

-при попытке скрыть уже скрытое окно;

-при использовании флага AW_SLIDE без одного или более флагов направления (AW_CENTER,AW_HOR_NEGATIVE, AW_HOR_POSITIVE, AW_VER_NEGATIVE и AW_VER_POSITIVE);

-при попытке применить флаг AW_BLEND к окну, являющемуся дочерним окном;

-при попытке применить функцию AnimateWindow к окну, принадлежащему другому потоку. В этом случае функция GetLastError вернет значение ERROR_SUCCESS.

Оконная процедура окна hwnd и его дочерние окна должны обрабатывать сообщение WM_PRINT или WM_PRINTCLIENT. Диалоговые окна и элементы управления обрабатывают сообщение WM_PRINTCLIENT. Оконная процедура по умолчанию обрабатывает сообщение WM_PRINT.

Для удобного использования функции AnimateWindow нужно переопределить константу WINVER на значение большее или равное 0x500 до подключения заголовочного файла windows.h.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


AnyPopup

Указывает существует ли на экране собственное, видимое всплывающее (pop-up) или перекрывающееся (overlapped) окно верхнего уровня. Функция просматривает весь экран, а не только клиентскую область вызывающего приложения.

Поддерживается только для совместимости с 16 разрядными версиями Windows.

Прототип

BOOL WINAPI AnyPopup(void);

Параметры

Данная функция не имеет параметров.

Возвращаемое значение

Если всплывающее (pop up) окно существует, то функция возвращает ненулевое значение, даже если это окно полностью закрыто другими окнами.

Если всплывающего окна нет, то функция возвращает значение нуль.

Пример использования

#include <windows.h>

int main()

{

printf("%x\n",AnyPopup());

getchar();

return 0;

}

Данная программа выводит значение 1, так как у потока есть окно (окно консоли).

Примечание

Данная функция не обнаруживает несобственные (unowned) всплывающие окна или окна, у которых не установлен стиль WS_VISIBLE.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


ArrangeIconicWindows

Упорядочивает все свёрнутые (представленные в виде пиктограмм (iconic)) дочерние окна заданного окна.

Прототип

UINT WINAPI ArrangeIconicWindows(

_In_ HWND hWnd

);

Параметры

hWnd[in]

Описатель родительского окна.

Возвращаемое значение

Высота одной строки иконок.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке используйте функцию GetLastError.

Пример использования

#include <windows.h>

int main()

{

ArrangeIconicWindows(GetDesktopWindow());

return 0;

}

Примечание

Приложение, которое имеет собственные свёрнутые дочерние окна может использовать функцию ArrangeIconicWindows для упорядочивания иконок в родительском окне. Эта функция также может упорядочивать иконки на рабочем столе. Для получения описателя окна рабочего стола используйте функцию GetDesktopWindow.

Приложение посылает сообщение WM_MDIICONARRANGE клиентскому окну многодокументального интерфейса (MDI) для того, чтобы указать клиентскому окну упорядочить свои свёрнутые дочерние MDI окна.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


BeginDeferWindowPos

Выделяет память для структуры, описывающей положение нескольких окон (multiple-window- position structure), и возвращает дескриптор этой структуры.

Прототип

HDWP WINAPI BeginDeferWindowPos(

_In_ int nNumWindows

);

Параметры

nNumWindows[in]

Количество окон, для которых будет храниться информация об их положении. Функция DeferWindowPos, в случае необходимости, увеличит размер структуры.

Возвращаемое значение

Описатель структуры, описывающей положение нескольких окон.

Возвращаемое значение в случае ошибки

NULL. Чтобы получить дополнительную информацию об ошибке используйте функцию GetLastError.

Пример использования

Смотри здесь.

Примечание

Структура, описывающая положение нескольких окон, является внутренней системной структурой. Приложения не могут обращаться к ней напрямую.

Функция DeferWindowPos заполняет эту структуру информацией о желаемом положении одного или нескольких окон перед их перемещением. Функция EndDeferWindowPos принимает описатель этой структуры и перемещает окна, на основе информации в ней.

Если какие-либо окна в структуре, описывающей положение нескольких окон, имеют установленный флаг SWP_HIDEWINDOW или SWP_SHOWWINDOW, то ни одно из окон не перемещается. (мои собственные эксперименты этого не подтверждают)

Если система должна увеличить размер структуры, описывающей положение нескольких окон, но не может выделить дополнительную память, то система прерывает всю последовательность изменения положения окон (BeginDeferWindowPos, DeferWindowPos и EndDeferWindowPos). Указывая максимальный размер, приложения могут предотвратить эту ситуацию.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


BringWindowToTop

Помещает заданное окно на вершину Z-последоватлеьности. Если заданное окно является оком верхнего уровня, то оно активируется. Если заданное окно является дочерним окном, то активируется окно верхнего уровня, являющееся родителем заданного окна.

Прототип

BOOL WINAPI BringWindowToTop(

_In_ HWND hWnd

);

Параметры

hWnd[in]

Описатель окна, перемещаемого на вершину Z-последовательности.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке используйте функцию GetLastError.

Пример использования

#include <windows.h>

int main()

{

HWND hwnd;

//Находим главное окно калькулятора

hwnd = FindWindow("SciCalc",NULL);

if(!hwnd) return -1;

//Перемещаем его на вершину Z-последовательности

BringWindowToTop(hwnd);

return 0;

}

Примечание

Используйте функцию BringWindowToTop для отображения на экране любых окон частично или полностью закрытых другими окнами.

Вызов этой функции похож на вызов функции SetWindowPos, изменяющую положение окна в Z-последовательности. Функция BringWindowToTop не делает окно системно-модальным.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


CalculatePopupWindowPosition

Появилась в Windows 7. Вычисляет положение всплывающего окна, используя заданную опорную точку, размер окна, набор флагов, и опциональный исключаемый прямоугольник (exclude rectangle). Когда размер всплывающего окна меньше размера окна рабочего стола (desktop window), используйте функцию CalculatePopupWindowPositiion для того, чтобы гарантировать, что всплывающее окно будет полностью видимо на рачоем столе, независимо от положения опорной точки.

Прототип

BOOL WINAPI CalculatePopupWindowPosition(

_In_ const POINT *anchorPoint,

_In_ const SIZE *windowSize,

_In_ UINT flags,

_In_opt_ RECT *excludeRect,

_Out_ RECT *popupWindowPosition

);

Параметры

anchorPoint[in]

Указатель на структуру POINT, описывающую опорную точку.

windowSize[in]

Указатель на структуру SIZE, содержащую информацию о размерах окна.

flags[in]

Набор флагов, определяющих как функция должна располагать окно по горизонтали и вертикали. Данные флаги перечислены здесь.

excludeRect[in,opt]

Указатель на структуру RECT, которая определяет исключаемый прямоугольник. Он может быть равен NULL.

popupWindowPosition[out]

Указатель на структуру RECT, в которую будет записано запрашиваемое положение всплывающего окна.

Возвращаемое значение

TRUE.

Возвращаемое значение в случае ошибки

FALSE. Чтобы получить дополнительную информацию об ошибке используйте функцию GetLastError.

Пример использования

#include <windows.h>

//Прототип функции CalculatePopupWindowPosition

typedef BOOL (*PCALCULATEPOPUPWINDOWPOSITION)(POINT*,SIZE*,UINT,RECT*,RECT*);

int main()

{

HINSTANCE huser32;

huser32 = LoadLibrary("user32.dll");

if(!huser32) return 0;

PCALCULATEPOPUPWINDOWPOSITION pCalculatePopupWindowPosition;

//Получаем адрес нужной нам функции в библиотеке user32.

pCalculatePopupWindowPosition = (PCALCULATEPOPUPWINDOWPOSITION)GetProcAddress(huser32,"CalculatePopupWindowPosition");

if(!pCalculatePopupWindowPosition) return 0;

//Начальные параметры

POINT point = {500,500};

SIZE size = {100,100};

RECT rc = {0,0,0,0};

//Вызываем функцию

pCalculatePopupWindowPosition(&point,&size,TPM_CENTERALIGN|TPM_VCENTERALIGN,NULL,&rc);

//Выводим результаты

printf("(%d;%d)-(%d;%d)",rc.left,rc.top,rc.right,rc.bottom);

getchar();

return 0;

}

В результате своей работы программа выдает результат:

(450;450)-(550;550)

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


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


CascadeWindows

Размещает каскадом заданные дочерние окна заданного окна.

Прототип

WORD WINAPI CascadeWindows(

_In_opt_ HWND hwndParent,

_In_ UINT wHow,

_In_opt_ const RECT *lpRect,

_In_ UINT cKids,

_In_opt_ const HWND *lpKids

);

Параметры

hwndParent[in, opt]

Описатель родительского окна. Если значение этого параметра равно NULL, то используется окно рабочего стола.

wHow[in]

Флаг упорядочивания. Данный параметр принимает одно из значений перечисленных ниже (в скобках фактическое значение константы).

MDITILE_SKIPDISABLED (0x0002) - предотвращает исключение дочерних MDI окон из перечня окон, подлежащих каскадированию.

MDITILE_ZORDER (0x0004) - Упорядочивает окна в Z-последовательности. Если этот флаг не указан, то окна упорядочиваются в том порядке, в каком они указаны в массиве lpKids.

lpRect[in, opt]

Указатель на структуру RECT, которая определяет прямоугольную область (в клиентских координатах), внутри которой упорядочиваются окна. Значение данного параметра может быть равно NULL, в этом случае используется клиентская область родительского окна.

cKids[in]

Число элементов в массиве lpKids. Если значение параметра lpKids равно NULL, то параметр cKids игнорируется.

lpKids[in,opt]

Массив описателей дочерних окон, которые должны быть упорядочены. Если заданное дочернее является окном верхнего уровня с установленным стилем WS_EX_TOPMOST или WS_EX_TOOLWINDOW, то это окно не упорялочивается. Если значение параметра lpKids равно NULL, то упорядочиваются все дочерние окна заданного родительского окна (или окна рабочего стола).

Возвращаемое значение

Количество упорядоченных окон.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке используйте функцию GetLastError.

Пример использования

Простейший пример:

#include <windows.h>

int main()

{

CascadeWindows(NULL,0,NULL,0,NULL);

}

Данная программа каскадирует все окна верхнего уровня на рабочем столе.

Пример чуть посложнее.

#include <windows.h>

int main()

{

//Подготавливаем массив окон

HWND Kids[2];

Kids[0] = FindWindow("AkelPad4",NULL);

Kids[1] = FindWindow("SciCalc", NULL);

//Родительское окно

HWND parent;

parent = GetDesktopWindow();

RECT rc;

GetClientRect(parent, &rc);

//Каскадируем окна

CascadeWindows(parent,0,&rc,2,Kids);

}

В данном примере программа каскадирует не все окна (как в первом примере), а всего два окна (приложений калькулятор и AkelPad). В принципе, в этом примере параметры hwndParent и lpRect можно было не заполнять. Но мы их явно указываем в целях демонстрации работы с функцией CascadeWindows.

Хочу заметить: применить функцию CascadeWindows для каскадирования элементов управления диалогового окна мне так и не удалось. Функция возвращает значение нуль, а GetLastError свидетельствует об успехе последней операции.

Примечание

По умолчанию функция CascadeWindows упорядочивает окна в том порядке, в котором они указаны в массиве lpKids, но сохраняет их порядок в Z-последовательности. Если вы определили флаг MDITILE_ZORDER, то функция будет упорядочивать окна в том порядке, в котором они находятся в Z-последовательности.

Вызов CascadeWindows заставляет все развёрнутые окна восстановить свои первоначальные размеры.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


ChildWindowFromPoint

Определяет какое дочернее окно заданного родительского окна содержит данную точку. Поиск ограничивается только непосредственно дочерними окнами. "Внучатые" и ниже окна не проверяются.

Чтобы пропустить некоторые дочерние окна используйте функцию ChildWindowFromPointEx.

Прототип

HWND WINAPI ChildWindowFromPoint(

_In_ HWND hWndParent,

_In_ POINT Point

);

Параметры

hWndParent[in]

Описатель родительского окна.

Point[in]

Структура POINT, которая описывает проверяемую точку в клиентских координатах.

Возвращаемое значение

Описатель дочернего окна, которому принадлежит заданная точка. Описатель окна возвращается даже если окно скрыто или недоступно. Если заданная точка находится вне родительского окна, то возвращается значение NULL. Если заданная точка находится внутри родительского окна, но не принадлежит какому-либо дочернему окну, то функция возвращает описатель родительского окна.

Пример использования

#include <windows.h>

#include "Resource.h"

#define CLICKONBUTTON ((BN_CLICKED<<8) + ID_BUTTON)

//Прототип Диалоговой процедуры

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;

}

//Обработчик нажатия на кнопку

void FindWindowInPoint(HWND hwndParent, HWND hwndButton){

POINT point;

//Получаем положение курсора в экранных координатах

GetCursorPos(&point);

//Пересчитываем экранные координаты в клиентские

ScreenToClient(hwndParent,&point);

HWND hwndButton1;

//Получаем дескриптор окна по точке

hwndButton1 = ChildWindowFromPoint(hwndParent, point);

char s[20]="";

//Формируем сообщение

//hwndButton должен быть равен hwndButton1

snprintf(s,20,"%x;%x\x00", hwndButton, hwndButton1);

//Выводим результат

MessageBox(hwndParent,s,"",MB_OK);

}

//Диалоговая процедура

INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

switch(uMsg){

case WM_COMMAND:

if(wParam == CLICKONBUTTON)

FindWindowInPoint(hwnd, (HWND)lParam);

break;

case WM_CLOSE:

EndDialog(hwnd,0);

}

return 0;

}

В данном примере создаётся простое диалоговое окно с одной кнопкой. При нажатии на эту кнопку вызывается функция FindWindowInPoint. Мы исходим из предположения, что пользователь нажал на кнопку с помощью мыши. Вначале определяем положение курсора мыши (если наше предположение верно, то он располагается над кнопкой). Так как положение курсора задается экранными координатами а нам нужны клиентские, то с помощью функции ScreenToClient мы пересчитываем координаты точки.

Так как курсор располагался над кнопкой, то функция ChildWindowFromPoint должна вернуть описатель кнопки. hwndButton - дескриптор кнопки переданный в сообщении WM_COMMAND. hwndButton1 - описатель кнопки, полученный функцией ChildWindowFromPoint. Понятно, что эти значения должны совпадать.

Примечание

Система поддерживает внутренний список, содержащий описатели дочерних окон, заданного родительского окна. Порядок описателей в этой последовательности определяется расположением дочерних окон в Z-последовательности. Если заданная точка принадлежит нескольким окнам, то функция вернет дескриптор того окна, который расположен первым в списке.

Функция ChildWindowFromPoint рассматривает перекрывающиеся области элементов управления точно так же как и другие области элементов упправления. В отличие от неё, функция RealChildWindowFromPoint рассматривает перекрывающиеся области по другому. Она возвращает дочернее окно, расположенное за прозрачной областью элемента управления. Например, если точка принадлежит прозрачной области элемента groupbox, то функция ChildWindowFromPoint вернет дескриптор элемента управления groupbox, в то время как функция RealChildWindowFromPoint вернет дескриптор окна, расположенного за элементом groupbox. Однако обе функции вернут статический элемент управления, даже если он тоже перекрывает кого-либо.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


ChildWindowFromPointEx

Определяет какое дочернее окно заданного ролительского окна содержит данную точку. Функция может пропускать невидимые, недоступные и прозрачные дочерние окна. Поиск ограничивается только непосредственно дочерними окнами. "Внучатые" и ниже окна не проверяются.

Прототип

HWND WINAPI ChildWindowFromPointEx(

_In_ HWND hwndParent,

_In_ POINT pt,

_In_ UINT uFlags

);

Параметры

hwndParent[in]

Описатель родительского окна.

pt[in]

Структура POINT, которая описывает проверяемую точку в клиентских координатах.

uFlags[in]

Пропускаемый дочерние окна. Представляет собой одно из значений перечисленных ниже, или их комбинацию.

CWP_ALL - не пропускать дочерних окон.

CWP_SKIPDISABLED - пропускать недоступные дочерние окна.

CWP_SKIPINVISIBLE - пропускать невидимые дочерние окна.

CWP_SKIPTRANSPARENT - пропускать прозрачные дочерние окна.

Возвращаемое значение

Описатель первого дочернего окна, содержащего заданную точку и удовлетворяющего условиям, определенным в uFlags. Если заданная точка находится внутри родительского окна, но не принадлежит какому-либо дочернему окну, удовлетворяющему условиям uFlags, то функция возвращает описатель родительского окна. Если заданная точка находится вне родительского окна, то возвращается значение NULL.

Пример использования

#include <windows.h>

#include "Resource.h"

#define CLICKONBUTTON ((BN_CLICKED<<8) + ID_BUTTON)

//Прототип Диалоговой процедуры

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;

}

//Обработчик нажатия на кнопку

void FindWindowInPoint(HWND hwndParent, HWND hwndButton){

POINT point;

//Получаем положение курсора в экранных координатах

GetCursorPos(&point);

//Пересчитываем экранные координаты в клиентские

ScreenToClient(hwndParent,&point);

HWND hwndButton1;

//Получаем дескриптор окна по точке

hwndButton1 = ChildWindowFromPointEx(hwndParent, point, CWP_SKIPINVISIBLE);

char s[20]="";

//Формируем сообщение

snprintf(s,20,"%x;%x\x00", hwndButton, hwndButton1);

//Выводим результат

MessageBox(hwndParent,s,"",MB_OK);

}

//Диалоговая процедура

INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

switch(uMsg){

case WM_COMMAND:

if(wParam == CLICKONBUTTON)

FindWindowInPoint(hwnd, (HWND)lParam);

break;

case WM_CLOSE:

EndDialog(hwnd,0);

}

return 0;

}

В данном примере создаётся простое диалоговое окно с одной кнопкой. При нажатии на эту кнопку вызывается функция FindWindowInPoint. Мы исходим из предположения, что пользователь нажал на кнопку с помощью мыши. Вначале определяем положение курсора мыши (если наше предположение верно, то он располагается над кнопкой). Так как положение курсора задается экранными координатами а нам нужны клиентские, то с помощью функции ScreenToClient мы пересчитываем координаты точки.

Так как курсор располагался над кнопкой, то функция ChildWindowFromPointEx должна вернуть дескриптор кнопки. hwndButton - описатель кнопки переданный в сообщении WM_COMMAND. hwndButton1 - описатель кнопки, полученный функцией ChildWindowFromPointEx. Понятно, что эти значения должны совпадать.

Примечание

Система поддерживает внутренний список, содержащий описатели дочерних окон, заданного родительского окна. Порядок описателей в этой последовательности определяется расположением дочерних окон в Z-последовательности. Если заданная точка принадлежит нескольким дочерним окнам, удовлетворяющим условиям uFlags, то функция вернет описатель того окна, который расположен первым в списке.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


ClientToScreen

Осуществляет пересчет координат точки из клиентской системы координат в экранную систему координат.

Прототип

BOOL ClientToScreen(

_In_ HWND hWnd,

_Inout_ LPPOINT lpPoint

);

Параметры

hWnd[in]

Описатель окна, чья клиентская область будет использоваться для пересчета координат.

lpPoint[in,out]

Адрес структуры POINT, которая содержит координаты точки в клиентской системе координат. В эту же структуру будут записаны пересчитанные координаты этой же точки в экранной системе координат.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль.

Пример использования

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

int main(int argc, char *argv[])

{

HWND hwnd;

//Находим главное окно калькулятора

hwnd = FindWindow("SciCalc",NULL);

POINT p;

p.x = 0;

p.y = 0;

//Пересчитываем координаты

ClientToScreen(hwnd, &p);

//Выводим новые координаты пользователю

printf("(%d;%d)\n", p.x,p.y);

getch();

return 0;

}

Примечание

Все координаты задаются в единицах устройства.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


CloseWindow

Сворачивает (но не разрушает) заданное окно.

Прототип

BOOL WINAPI CloseWindow(

_In_ HWND hWnd

);

Параметры

hWnd[in]

Дескриптор окна, которое требуется свернуть.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#include <windows.h>

int main()

{

HWND hwnd;

//Ищем главное окно калькулятора

hwnd = FindWindow("SciCalc",NULL);

if(!hwnd) return -1;

//Сворачиваем найденное окно

CloseWindow(hwnd);

return 0;

}

Примечание

Для разрушения окна, приложения должны использовать функцию DestroyWindow.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


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 - статический элемент управления.

Функция CreateWindow представляет собой макрос, вызывающий функцию 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


DeferWindowPos

Обновляет специальную структуру, содержащую информацию о положении нескольких окон. После обновления функция возвращает дескриптор на обновленную структуру. Функция EndDeferWindowPos использует информацию в этой структуре для одновременного изменения положения и размеров нескольких окон. Функция BeginDeferWindowPos создаёт эту структуру.

Прототип

HDWP WINAPI DeferWindowPos(

_In_ HDWP hWinPosInfo,

_In_ HWND hWnd,

_In_opt_ HWND hWndInsertAfter,

_In_ int x,

_In_ int y,

_In_ int cx,

_In_ int cy,

_In_ UINT uFlags

);

Параметры

hWinPosInfo[in]

Описатель структуры, содержащей информацию о положении одного или нескольких окон. Данный дескриптор возвращается функцией BeginDeferWindowPos или предыдущим вызовом функции DeferWindowPos.

hWnd[in]

Описатель окна, для которого обновляется информация хранящаяся в структуре. Все окна в структуре, описывающей положение нескольких окон, должны иметь общего родителя.

hWndInsertAfter[in, opt]

Описатель окна, которое предшествует окну hWnd в Z-последовательности. Данный параметр должен быть описателем окна, или одним из значений, перечисленных ниже.

HWND_BOTTOM - размещает окно в самом низу Z-последовательности. Если параметр hwnd определяет системно модальное (topmost) окно, то оно теряет этот статус и располагается ниже других окон.

HWND_NOTOPMOST - поместить окно ниже всех системно-модальных (topmost) окон. Этот параметр игнорируется если окно не является системно-модальным окном.

HWND_TOP - поместить окно на вершине Z-последовательности.

HWND_TOPMOST - поместить окно над всеми окнами, не являющимися системно-модальными (topmost) окнами. Окно сохраняет эту позицию даже когда становится не активным.

Если в параметре uFlags задан флаг SWP_NOZORDER, то значение параметра hWndInsertAfter игнорируется.

x[in]

Горизонтальная координата левого верхнего угла окна.

y[in]

Вертикальная координата левого верхнего угла окна.

cx[in]

Новая ширина окна в пикселях.

cy[in]

Новая высота окна в пикселях.

uFlags[in]

Комбинация флагов. Допустимые флаги перечислены здесь.

Возвращаемое значение

Описатель обновленной структуры, содержащей информациию о положении нескольких окон (multiple-window- position structure). Описатель, возврашаемый этой функцией может отличаться от описателя, переданного в функцию. Новый описатель, который вернула эта функция должен быть передан в следующий вызов DeferWindowPos или в функцию EndDeferWindowPos.

Возвращаемое значение в случае ошибки

NULL. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

Смотри здесь.

Примечание

Если вызов функции DeferWindowPos закончился ошибкой, то приложение должно прервать операцию перемещения окон и не должно вызывать функцию EndDeferWindowPos.

Если флаг SWP_NOZORDER не задан, то система размещает окно, идентифицируемое параметром hWnd, в положение, следующее за окном hWndInsertAfter. Если значение параметра hWndInsertAfter равно NULL или HWND_TOP, то система размещает окно hWnd на вершине Z-последовательности. Если значение параметра hWndInsertAfter равно HWND_BOTTOM, то система размещает окно hWnd внизу Z-последовательности.

Для дочерних окон все координаты задаются в клиентских координатах относительно родительского окна.

Окно может быть сделано системно-модальным (topmost) окном путём установки параметра hWndInsertAfter в значение HWND_TOPMOST, при условии, что флаг SWP_NOZORDER не установлен, или путём установки положения окна в Z-последовательности так, чтобы оно было выше всех существующих системно-модальных окон. Когда обычное (non-topmost) окно становится системно-модальным, его собственные окна также становятся системно-модальными окнами. Состояние окна-владельца тем не менее не изменяется.

Если ни один из флагов SWP_NOACTIVATE или SWP_NOZORDER не указан (то есть, когда приложение запрашивает одновременно и активировать окно и изменить его положение в Z-последоватлеьности), то значение заданное в параметре hWndInsertAfter используется только в следующих случаях:

· в параметре hWndInsertAfter указано значение отличное от HWND_TOPMOST и HWND_NOTOPMOST;
· окно, идентифицируемое параметром hWnd не является активным окном.

Приложение не может активировать неактивное окно без его перемещения на вершину Z-последовательности. Приложение может без ограничений изменять положение активного окна в Z-последовательности, или оно может активировать окно и затем переместить его на вершину последовательности.

Системно-модальное окно перестает быть системно-модальным если оно было перемещено вниз Z-последовательности (HWND_BOTTOM) или расположено после обычного (non-topmost) окна. Когда системно-модальное окно становится обычным окном, то его окна-владельцы и принадлежащие ему окна также становятся обычными окнами.

Обычное окно может владеть системно-модальным окном, но не наоборот. Любые окна (например, диалоговые окна) принадлежащие системно-модальным окнам самостоятельно делают себя системно-модальными для обеспечения того, чтобы все собственные окна оставались выше своего владельца.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


DeregisterShellHookWindow

[Данная функция не предназначена для общего использования. Она может быть убрана или заменена в новых версиях Windows.]

Снимает с регистрации окно, ранее зарегистрированное с помощью функции RegisterShellHookWindow.

Прототип

BOOL WINAPI DeregisterShellHookWindow(

_In_ HWND hWnd

);

Параметры

hWnd[in]

Описатель окна, снимаемого с регистрации.

Возвращаемое значение

TRUE.

Возвращаемое значение в случае ошибки

FALSE.

Пример использования

Пример использования приведен здесь.

Экспортирующая библиотека

user32.dll


DestroyWindow

Разрушает (уничтожает) заданное окно.

Прототип

BOOL WINAPI DestroyWindow(

_In_ HWND hWnd

);

Параметры

hWnd[in]

Описатель окна, которое нужно разрушить (уничтожить).

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

Смотри в примере оконного приложения.

Примечание

Поток не может использовать эту функцию для разрушения окон созданных другим потоком.

Если разрушается дочернее окно, у которого не установлен стиль WS_EX_NOPARENTNOTIFY, родительскому окну отправляется сообщение WM_PARENTNOTIFY.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


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


EndDeferWindowPos

Одновременно обновляет положение и размер одного или нескольких окон за один цикл обновления экрана.

Прототип

BOOL WINAPI EndDeferWindowPos(

_In_ HDWP hWinPosInfo

);

Параметры

hWinPosInfo[in]

Описатель структуры, содержащей информацию о положении одного или нескольких окон (multiple-window-position structure). Это внутрення структура, описатель которой возвращает функция BeginDeferWindowPos, или последний вызов функции DeferWindowPos.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

Смотри здесь.

Примечание

Функция EndDeferWindowPos рассылает сообщения WM_WINDOWPOSCHANGING и WM_WINDOWPOSCHANGED каждому окну, представленному во внутренней структуре.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


EndTask

[Данная функция не предназначена для общего использования. Она может быть убрана или заменена в новых версиях Windows.]

Принудительно закрывает заданное окно.

Прототип

BOOL WINAPI EndTask(

_In_ HWND hWnd,

_In_ BOOL fShutDown,

_In_ BOOL fForce

);

Параметры

hWnd[in]

Описатель окна, которое нужно закрыть.

fShutDown[in]

Игнорируется. Должен быть равен FALSE.

fForce[in]

Если равно TRUE, то в случае, если закрыть окно путём отправки сообщения WM_CLOSE не удалось, то окно должно быть принудительно разрушено.

Если же равно FALSE, то отправляется только сообщение WM_CLOSE. В случае неудачи окно остается открытым.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

FALSE. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#include <windows.h>

//Прототип функции EndTask

typedef BOOL (*PENDTASK)(HWND,BOOL, BOOL);

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

HINSTANCE huser;

huser = LoadLibrary("user32");

if(!huser) return -1;

PENDTASK pEndTask;

//Находим адрес функции EndTask

pEndTask = (PENDTASK)GetProcAddress(huser,"EndTask");

if(!pEndTask) return -1;

HWND hwnd;

//Получаем дескриптор главного окна калькулятора

hwnd = FindWindow("SciCalc", NULL);

if(!hwnd) return -1;

//Закрываем окно калькулятора

pEndTask(hwnd,FALSE,FALSE);

return 0;

}

Экспортирующая библиотека

user32.dll


EnumChildWindows

Перечисляет дочерние окна заданного родительского окна. При этом для каждого найденного дочернего окна вызывается определенная приложением функция обратного вызова. Функция EnumChildWindows перечисляет дочерние окна до тех пор, пока либо не будут найдены все окна, либо функция обратного вызова не вернет значение FALSE.

Прототип

BOOL WINAPI EnumChildWindows(

_In_opt_ HWND hWndParent,

_In_ WNDENUMPROC lpEnumFunc,

_In_ LPARAM lParam

);

Параметры

hWndParent[in,opt]

Описатель окна, дочерние окна которого мы хотим перечислить. Если значение этого равно NULL, то функция ведет себя так же как и EnumWindows.

lpEnumFunc[in]

Указатель, на определенную приложением функцию обратного вызова EnumChildProc.

lParam[in]

Определенное приложением значение, которое будет передаваться в функцию обратного вызова EnumChildProc.

Возвращаемое значение

Возвращаемое значение не используется.

Пример использования

Пример использования приведен здесь.

Примечание

Если дочерние окна имеют свои собственные дочерние окна, то функция EnumChildWindows перечислит и их.

Дочернее окно, которое во время перечисления было перемещено в Z-последовательности будет правильно перечислено. Функция EnumChildWindows не перечисляет окна, которые были уничтожены перед тем, как были перечислены, и окна, которые были созданы во время перечисления.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


EnumThreadWindows

Перечисляет все недочерние окна, принадлежащие заданному потоку. При этом для каждого найденного окна вызывается определенная приложением функция обратного вызова. Функция EnumThreadWindows перечисляет окна до тех пор пока либо не будут перечислены все окна, либо функция обратного вызова не вернет значение FALSE. Для перечисления дочерних окон заданного окна используйте функцию EnumChildWindows.

Прототип

BOOL WINAPI EnumThreadWindows(

_In_ DWORD dwThreadId,

_In_ WNDENUMPROC lpfn,

_In_ LPARAM lParam

);

Параметры

dwThreadId[in]

Идентификатор потока, окна которого мы перечисляем.

lpfn[in]

Указатель на определенную приложением функцию обратного вызова EnumThreadWndProc.

lParam[in]

Определенное приложением значение, которое будет передаваться в функцию обратного вызова EnumThreadWndProc.

Возвращаемое значение

Если функция обратного вызова EnumThreadWndProc вернула значение TRUE для всех найденных окон, то EnumThreadWindows вернет значение TRUE. Если же функция обратного вызова EnumThreadWndProc вернула значение FALSE для какого-либо найденного окна, или у потока dwThreadId нет окон, то EnumThreadWindows вернет значение FALSE.

Пример использования

Пример использования приведен здесь.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


EnumWindows

Перечисляет все окна верхнего уровня на экране путём передачи описателя каждого найденного окна в определенную приложением функцию обратного вызова. Функция EnumWindows перечисляет окна до тех пор, пока либо не будут перечислены все окна верхнего уровня, либо определенная приложением функция обратного вызова не вернет значение FALSE.

Прототип

BOOL WINAPI EnumWindows(

_In_ WNDENUMPROC lpEnumFunc,

_In_ LPARAM lParam

);

Параметры

lpEnumFunc[in]

Указатель на определенную приложением функцию обратного вызова EnumWindowsProc.

lParam[in]

Определенное приложением значение, которое будет передаваться в функцию обратного вызова EnumWindowsProc.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Если функция EnumWindowsProc вернула значение нуль, то функция EnumWindows также вернет значение нуль. Для установления признака ошибки используйте в EnumWindowsProc функцию SetLastError.

Функция EnumWindows не перечисляет дочерние окна за исключением окон верхнего уровня, принадлежащих системе и имеющих стиль WS_CHILD.

Функция EnumWindows более эффективна для перечисления окон, нежели чем вызываемая в цикле функция GetWindow. Приложение, которое использует GetWindow для перечисления окон рискует уйти в бесконечный цикл, или получить дескриптор окна, которое было разрушено.

Для Window 8 и далее функция EnumWindows перечисляет только окна верхнего уровня десктопных приложений (desktop apps).

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


FindWindow

Осуществляет поиск окна верхнего уровня.

Прототип

HWND WINAPI FindWindow(

_In_opt_ LPCTSTR lpClassName,

_In_opt_ LPCTSTR lpWindowName

);

Параметры

lpClassName [in, opt]

Строка с наименованием или атом зарегистрированного оконного класса искомого окна.

lpWindowName [in, opt]

Строка с заголовком искомого окна.

Возвращаемое значение

Дескриптор найденного окна.

Возвращаемое значение в случае ошибки

NULL. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

int main(int argc, char *argv[])

{

if(FindWindow("SciCalc", NULL))

printf("Calc is run\n");

else

printf("Calc is not run\n");

getch();

return 0;

}

В данном примере осуществляется поиск главного окна стандартного калькулятора Windows (Calc.exe) по наименованию его оконного класса ("SciCalc").

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | FindWindowA и FindWindowW


FindWindowEx

Осуществляет поиск окон верхнего уровня и дочерних окон.

Прототип

HWND WINAPI FindWindowEx(

_In_opt_ HWND hwndParent,

_In_opt_ HWND hwndChildAfter,

_In_opt_ LPCTSTR lpszClass,

_In_opt_ LPCTSTR lpszWindow

);

Параметры

hwndParent [in, opt]

Описатель окна, являющегося родительским окном по отношению к искомому окну. Если значение этого параметра равно NULL, то ведется поиск окна верхнего уровня. Если значение этого параметра HWND_MESSAGE то ведется поиск специального невидимого окна, которое не отображается при перечислении окон, но, тем не менее способно принимать оконные сообщения.

hwndChildAfter[in, opt]

Описатель окна дочернего по отношению к окну hwndParent. Поиск начинается с окна следующего за окном с дескриптором hwndChildAfter. Если значение этого параметра NULL поиск начинается с самого первого окна дочернего по отношению к окну hwndParent.

Если параметры hwndParent и hwndChildAfter одновременно равны NULL, то осуществляется поиск всех окон верхнего уровня. В этом случае функция FindWindowEx(A/W) эквивалентна функции FindWindow(A/W).

lpszClass[in, opt]

Строка с наименованием или атом зарегистрированного оконного класса искомого окна.

lpszWindow[in, opt]

Строка с заголовком искомого окна.

Возвращаемое значение

Описатель найденного окна.

Возвращаемое значение в случае ошибки

NULL. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

int main(int argc, char *argv[])

{

HWND hwndcalc, hwndbutton;

//Ищем главное окно калькулятора

hwndcalc = FindWindow("SciCalc", NULL);

if(!hwndcalc){

printf("calc is not run\n");

getch();

return 0;

}

//Ищем кнопку с надписью "Backspace"

hwndbutton = FindWindowEx(hwndcalc, NULL, NULL, "Backspace");

if(hwndbutton)

printf("Calc button is found %x\n", hwndbutton);

else

printf("Calc button is not found\n");

getch();

return 0;

}

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | FindWindowExA и FindWindowExW


GetActiveWindow

Возвращает описатель активного окна, связанного с очередью сообщений текущего потока.

Прототип

HWND WINAPI GetActiveWindow(void);

Возвращаемое значение

Возвращает описатель активного окна, связанного с очередью сообщений текущего потока. Если с текущим (вызывающим функцию) потоком не связано ни одного окна, функция возвращает значение NULL.

Пример использования

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

int main(int argc, char *argv[])

{

HWND hwnd;

hwnd = GetActiveWindow();

printf("%x\n",hwnd);

getch();

return 0;

}

Так как в данном примере с основным потоком приложения не связано ни одного окна, то функция GetActiveWindow возвращает значение NULL.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetAncestor

Возвращает описатель окна-предка по отношению к заданному окну.

Прототип

HWND WINAPI GetAncestor(

_In_ HWND hwnd,

_In_ UINT gaFlags

);

Параметры

hwnd[in]

Описатель окна, предка которого мы ищем.

gsFlags[in]

Одно из значений перечисленных ниже.

GA_PARENT - функция возвращает родительское окно по отношению к окну hwnd. В этом случае владелец окна не учитывается. Функция GetParent может возвращать владельца окна.

GA_ROOT - функция возвращает описатель корневого окна в дереве иерархии окон.

GA_ROOTOWNER - функция возвращает описатель собственного корневого окна в дереве окон-родителей и владельцев, возвращаемых функцией GetParent.

Возвращаемое значение

Описатель окна-предка по отношению к окну hwnd.

Пример использования

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

int main(int argc, char *argv[])

{

HWND hwndcalc,hwndancestor;

//Ищем главное окно калькулятора

hwndcalc = FindWindow("SciCalc",NULL);

if(!hwndcalc) return 0;

//Ищем предка главного окна калькулятора

hwndancestor = GetAncestor(hwndcalc,GA_PARENT);

printf("%x\n",hwndancestor);

getch();

return 0;

}

Окном предком по отношению к главному окну калькулятора является окно рабочего стола. В этом легко убедиться с помощью утилиты spy++, входящей в комплект поставки Microsoft Visual Studio.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetDesktopWindow

Возвращает описатель окна рабочего стола (desktop window). Окно рабочего стола накрывает весь экран. Окно рабочего стола представляет собой область, на поверхности которой отображаются остальные окна.

Прототип

HWND WINAPI GetDesktopWindow(void);

Параметры

Данная функция не имеет входных параметров.

Возвращаемое значение

Описатель окна рабочего стола.

Пример использования

#include <windows.h>

int main()

{

printf("%x\n",GetDesktopWindow());

getchar();

return 0;

}

Данная программа выводит на экран описатель окна рабочего стола.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetFocus

Возвращает описатель окна, которому принадлежит фокус ввода, если это окно связано с очередью сообщений вызывающего потока.

Прототип

HWND WINAPI GetFocus(void);

Возвращаемое значение

Возвращает описатель окна, которому принадлежит фокус ввода. Если очередь сообщений вызывающего потока не связана с окном, владеющим фокусом ввода, функция возвращает значение NULL.

Пример использования

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

int main(int argc, char *argv[])

{

HWND hwnd;

hwnd = GetFocus();

printf("%x\n",hwnd);

getch();

return 0;

}

В данном примере главный поток приложения не связан ни с каким окном, поэтому функция GetFocus возвращает значение NULL.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetForegroundWindow

Возвращает описатель окна, с которым в данный момент работает пользователь.

Прототип

HWND WINAPI GetForegroundWindow(void);

Возвращаемое значение

Описатель окна, с которым в данный момент работает пользователь. В некоторых случаях данное значение может быть равно NULL. Такое происходит, например, когда окно теряет активность.

Пример использования

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

int main(int argc, char *argv[])

{

HWND hwnd;

//Получаем дескриптор окна, с которым работает пользователь

hwnd = GetForegroundWindow();

int length;

//Получаем длину заголовка окна, с которым работает пользователь

length = GetWindowTextLength(hwnd);

length++;

char* s;

s = (char*)malloc(length);

//Получаем сам заголовок окна, с которым работает пользователь

GetWindowText(hwnd,s,length);

//Выводим полученный заголовок пользователю

printf("%s\n", s);

free(s);

getch();

return 0;

}

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetGUIThreadInfo

Возвращает информацию об активном окне или графическом интерфейсе заданного потока.

Прототип

BOOL WINAPI GetGUIThreadInfo(

_In_ DWORD idThread,

_Inout_ LPGUITHREADINFO lpgui

);

Параметры

idThread[in]

Идентификатор потока для которого запрашивается информация. Для получения этого значения вы можете использовать функцию GetWindowThreadProcessId. Если значение этого параметра равно NULL, то функция возвращает информацию для исполняющегося (foreground) потока.

lpgui[in,out]

Указатель на структуру GUITHREADINFO, в которую будет записана запрошенная информация. Вы должны самостоятельно установить значение поля cbSize этой структуры равным sizeof(GUITHREADINFO).

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#define WINVER 0x500

#include <windows.h>

int main()

{

HWND hwnd;

//Находим главное окно калькулятора

hwnd = FindWindow("SciCalc",NULL);

if(!hwnd) return -1;

//Выводи на экран

printf("%x\n",hwnd);

int tid;

//Получаем идентификатор потока калькуя=лятора

tid = GetWindowThreadProcessId(hwnd,NULL);

GUITHREADINFO GUIThreadInfo;

//Подготавливаем структуру GUITHREADINFO

GUIThreadInfo.cbSize = sizeof(GUITHREADINFO);

//Делаем задержку чтобы успеть активировать окно калькулятора

Sleep(2000);

//Получаем информацию о текущем активом окне калькулотре

GetGUIThreadInfo(tid,&GUIThreadInfo);

//Выводим на экран

printf("%x\n",GUIThreadInfo.hwndActive);

getchar();

return 0;

}

В данном примере двухсекундная задержка нужна для того, чтобы пользователь успел активировать главное окно калькулятора. Если он этого не сделает, то поле hwndActive структуры GUITHREADINFO будет содержать значение нуль, так как на момент вызова GetGUIThreadInfo у калькулятора нет ни одного активного окна.

Примечание

Данная функция завершается успехом даже если активное окно не принадлежит вызывающему процессу. Если указанный поток не существует, или не имеет очереди ввода (input queue), то функция завершается ошибкой.

Данная функция полезна для получения внеконтекстной информации о потоке. Приложение может запрашивать информацию о себе, или о каком-либо другом потоке.

Для элемента управления поле ввода (edit control) прямоугольник rcCaret содержит каретку плюс инофрмацию о направлении текста и дополнение. Поэтому вы можете не получить корректную информацию о положении курсора. Шрифт Sans Serif использует четыре символа для куроса:

CURSOR_LTR 0xF00C

CURSOR_RTL 0xF00D

CURSOR_THAI 0xF00E

CURSOR_USA 0xFFF (это значение маркера без специального символа).

Для получения корректной точки вставки (insertion point) в прямоугольнике rcCaret, выполните следующие шаги.

1. Вызовите GetKeyboardLayout для получения текущего языка ввода.

2. Определите символ курсора в зависимости от текущего языка ввода.

3. Вызовите CreateFont, используя шрифт Sans Serif, высоту полученную в rcCaret, и ширину равную нулю. Для определения fnWeight вызовите SystemParametersInfo(SPI_GETCARETWIDTH,0,pvParam,0). Если значение pvParam больше 1, то установите fnWeight равным 700, в противном случае установите его равным 400.

4. Выберите шрифт в контексте устройства (Device Context, DC) и используйте функцию GetCharABCWidths для получения ширины "B" соотвествующего символа курсора.

5. Добавьте ширину "B" к rcCaret.left для получения корректной точки вставки.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetLastActivePopup

Определяет какое всплывающее окно, принадлежащее заданному окну было активным последним.

Прототип

HWND WINAPI GetLastActivePopup(

_In_ HWND hWnd

);

Параметры

hWnd[in]

Описатель окна-владельца.

Возвращаемое значение

Описатель всплывающего окна, которое недавно было активным. Данное значение может совпадать со значением hWnd в одном из следующих случаев.

1. Окно hWnd было активным последним.

2. Окно hWnd не имеет всплывающих окон.

3. Окно hWnd не является окном верхнего уровня, или принадлежит другому окну.

Пример использования

#include <windows.h>

int main()

{

HWND hwnd;

hwnd = FindWindow("SciCalc",NULL);

if(!hwnd) return -1;

hwnd = GetLastActivePopup(hwnd);

printf("%x\n",hwnd);

getchar();

return 0;

}

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetLayeredWindowAttributes

Появилась в Windows XP. Возвращает информацию о прозрачности заданного окна.

Прототип

BOOL WINAPI GetLayeredWindowAttributes(

_In_ HWND hwnd,

_Out_opt_ COLORREF *pcrKey,

_Out_opt_ BYTE *pbAlpha,

_Out_opt_ DWORD *pdwFlags

);

Параметры

hwnd[in]

Описатель слоистого (layered) окна, информацию о прозрачности которого мы хотим получить. Слоистое окно - это окно, которое было создано функцией CreateWindowEx с установленным стилем WS_EX_LAYERED, или окно, у которого был установлен стиль WS_EX_LAYERED с помощью функции SetWindowLong.

pcrKey[out,opt]

Указатель на переменную типа COLORREF, в которую будет записан цвет, прозрачность которого была изменена. Запрашивается прозрачность всех пикселей окна hwnd с данным цветом. Тип COLORREF эквивалентен типу DWORD. Значение этого параметра может быть равно NULL.

pbAlpha[out,opt]

Указатель на переменную типа BYTE, в которую будет записана степень прозрачности окна. Если значение *pbAlpha равно нулю, то окно полностью позрачно. Если же значение *pbAlpha равно 255, то окно непрозрачно. Значение этого параметра может быть равно нулю.

pdwFlag[out,opt]

Указатель на переменную типа DWORD, в которую будет записано одно из двух значений, перечисленных ниже.

LWA_ALPHA - по адресу pbAlpha будет записано значение степени прозрачности заданного окна.

LWA_COLORKEY - по адресу pcrKey будет записан цвет, прозрачность которого была изменена.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#define _WIN32_WINNT 0x0500

#include <windows.h>

typedef BOOL (*GETLAYEREDWINDOWATTRIBUTES)(HWND,COLORREF*,BYTE*,DWORD*);

GETLAYEREDWINDOWATTRIBUTES pGetLayeredWindowAttributes;

int main()

{

HWND hwnd;

//Находим главное окно калькулятора

hwnd = FindWindow("SciCalc",NULL);

if(!hwnd) return -1;

//Находим адрес функции GetLayeredWindowAttributes

HINSTANCE huser;

huser = LoadLibrary("user32.dll");

if(!huser) return -1;

pGetLayeredWindowAttributes = (GETLAYEREDWINDOWATTRIBUTES)GetProcAddress(huser,"GetLayeredWindowAttributes");

if(!pGetLayeredWindowAttributes) return -1;

//Устанавливаем стиль WS_EX_LAYERED

SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED);

//Изменяем прозрачность окна

SetLayeredWindowAttributes(hwnd, 0, (255*50)/100, LWA_ALPHA);

BYTE btAlpha;

DWORD dwFlags;

//Запрашиваем прозрачность окна

if(pGetLayeredWindowAttributes(hwnd, NULL, &btAlpha, &dwFlags))

printf("%d\n",btAlpha);

getchar();

return 0;

}

Примечание

Функция GetLayeredWindowAttributes может быть вызвана только в том случае, если перед этим для того же окна вызывалась функция SetLayeredWindowAttributes. Вызов функции закончится ошибкой если слоистое око было установлено с помощью функции UpdateLayeredWindow.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetNextWindow

Возвращает описатель следующего или предыдущего окна в Z-последовательности. Следующее окно расположено под заданным окном, предыдущее окно расположено над ним.

Если заданное окно является topmost окном, то функция будет искать topmost окно. Если заданное окно является окном верхнего уровня (top-level), то функция будет искать окно верхнего уровня. Если заданное окно является дочерним оком, то функция будет искать дочернее окно.

Прототип

HWND WINAPI GetNextWindow(

_In_ HWND hWnd,

_In_ UINT wCmd

);

Параметры

hWnd[in]

Описатель окна, относительно которого в соответствии со значением параметра wCmd ведется поиск следующего или предыдущего окна.

wCmd[in]

Определяет направление поиска. Приниает одно из значений перечисленных ниже.

GW_HWNDNEXT - функция возвращает дескриптор окна, расположенного под заданным окном.

GW_NWNDPREV - функция возвращает дескриптор окна, расположенного над заданным окном.

Возвращаемое значение

Описатель следующего или предыдущего окна. Если такого окна нет, то возвращается значение NULL. Для получения дополнительной информации о наличии или отсутствии ошибки используйте функцию GetLastError.

Пример использования

#include <windows.h>

int main()

{

HWND hwnd;

//Находим главное окно калькулятора

hwnd = FindWindow("SciCalc",NULL);

if(!hwnd) return -1;

//Находим следующее окно

HWND hwndnext;

hwndnext = GetNextWindow(hwnd,GW_HWNDNEXT);

//Выводим его дескриптор на экран

printf("%x\n",hwndnext);

getchar();

return 0;

}

Примечание

Данная функция не экспортируется ни одной библиотекой Windows. Она представляет собой обёртку над функцией GetWindow, в соответствии с макросом:

#define GetNextWindow(hWnd, wCmd) GetWindow(hWnd, wCmd)

Заголовочный файл

winuser.h (включен в windows.h)


GetParent

Возвращает описатель окна, являющегося родительским по отношению к заданному окну.

Прототип

HWND WINAPI GetParent(

_In_ HWND hWnd

);

Параметры

hWnd[in]

Описатель окна, родителя которого мы хотим найти.

Возвращаемое значение

Если hWnd - дочернее окно, функция возвращает описатель окна, являющегося родительским по отношению к этому окну.

Возвращаемое значение в случае ошибки

NULL. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

int main(int argc, char *argv[])

{

HWND hwndcalc, hwndbutton, hwndparent;

//Получаем дескриптор главного окна калькулятора

hwndcalc = FindWindow("SciCalc", NULL);

//Получаем дескриптор окна кнопки с заголовком "Backspace"

hwndbutton = FindWindowEx(hwndcalc, NULL, "Button", "Backspace");

//Получаем дескриптор окна, родительского по отношению к окну кнопки

hwndparent = GetParent(hwndbutton);

//выводим найденные дескрипторы пользователю

printf("calc window handle is %x\n" ,hwndcalc);

printf("button window handle is %x\n",hwndbutton);

printf("parent window handle is %x\n",hwndparent);

getch();

return 0;

}

В данном примере, если все сделано правильно, описатели hwndcalc и hwndparent будут совпадать.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetProcessDefaultLayout

Возвращает раскладку по умолчанию (default layout), которая используется при создании окна без родителя или владельца.

Прототип

BOOL WINAPI GetProcessDefaultLayout(

_Out_ DWORD *pdwDefaultLayout

);

Параметры

pdwDefaultLayout[out]

Указатель на переменную типа DWORD, в которую будет записана информация о текущей раскладке по умолчанию для процесса. Возвращаемые значения перечислены в описании функции SetProcessDefaultLayout.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#define WINVER 0x0500

#include <windows.h>

int main()

{

//Устанавливаем новую раскладку по умолчанию

SetProcessDefaultLayout(LAYOUT_RTL);

//Получаем текущую раскладку

DWORD Layout = 0;

GetProcessDefaultLayout(&Layout);

//Выводим на экран текущую раскладку

if(Layout == LAYOUT_RTL)

printf("LAYOUT_RTL\n");

else

printf("%x\n",Layout);

getchar();

return 0;

}

Примечание

Раскладка (layout) определяет ориентацию текста и графики в окне; по умолчанию - слева направо. Функция GetProcessDefaultLayout позволяет вам узнать была ли эта ориентация изменена с помощью функции SetProcessDefaultLayout.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetShellWindow

Возвращает описатель окна, реализующего интерфейс рабочего стола (Shell's desktop window).

Прототип

HWND WINAPI GetShellWindow(void);

Возвращаемое значение

Описатель окна, реализующего интерфейс рабочего стола. Как показывает эксперимент, функция возвращает описатель окна "progman", принадлежащего проводнику Windows. Если процесс оболочки (Shell process) не запущен, то возвращается значение NULL.

Пример использования

#define WINVER 0x0500

#include <windows.h>

int main()

{

HWND hwnd;

hwnd = GetShellWindow();

printf("%x\n",hwnd);

getchar();

return 0;

}

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetTitleBarInfo

Возвращает информацию об области заголовка заданного окна.

Прототип

BOOL WINAPI GetTitleBarInfo(

_In_ HWND hwnd,

_Inout_ PTITLEBARINFO pti

);

Параметры

hwnd[in]

Описатель окна, информацию об области заголовка которого мы хотим получить.

pti[in,out]

Указатель на структуру TITLEBARINFO, в которую будет записана запрашиваемая информация. Обратите внимание, что перед вызовом функции GetTitleBarInfo вы должны установит значение поля cbSize этой структуры равным sizeof(TITLEBARINFO).

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#include <windows.h>

int main()

{

HWND hwnd;

//Находим главное окно калькулятора

hwnd = FindWindow("SciCalc",NULL);

if(!hwnd) return -1;

//Получаем информацию об области заголовка

TITLEBARINFO tbi;

tbi.cbSize = sizeof(TITLEBARINFO);

GetTitleBarInfo(hwnd,&tbi);

//Выводим на экран ширину и высоту области заголовка

printf("width is %d\n",tbi.rcTitleBar.right-tbi.rcTitleBar.left);

printf("height is %d\n",tbi.rcTitleBar.bottom-tbi.rcTitleBar.top);

getchar();

return 0;

}

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetTopWindow

Проверяет Z-последовательность дочерних окон заданного роительского окна и возвращает дескриптор дочернего окна, расположенного на вершине Z-последовательности.

Прототип

HWND WINAPI GetTopWindow(

_In_opt_ HWND hWnd

);

Параметры

hWnd[in,opt]

Описатель родительского окна, чьи дочерние окна подвергаются проверке. Если значение данного параметра равно NULL, то функция возвращает описатель окна, находящегося на вершине Z-последовательности.

Возвращаемое значение

Описатель дочернего окна, расположенного на вершине Z-последовательности. Если у заданного окна нет дочерних окон, то функция возвращает значение NULL. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

#include <windows.h>

int main()

{

HWND hwnd;

hwnd = GetTopWindow(NULL);

printf("%x\n",hwnd);

getchar();

return 0;

}

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetWindow

Возвращает описатель окна, имеющего определенное отношение (порядок в Z-последовательности или владение) с заданным окном.

Прототип

HWND WINAPI GetWindow(

_In_ HWND hWnd,

_In_ UINT uCmd

);

Параметры

hWnd[in]

Описатель окна. Функция GetWindow возвращает описатель окна, имеющего заданное в параметре uCmd отношение к окну hWnd.

uCmd[in]

Отношение между заданным окном (hWnd) и окном, описатель которого должна вернуть функция. Допустимые значения данного параметра перечислены здесь.

Возвращаемое значение

Описатель окна.

Возвращаемое значение в случае ошибки

Если не найдено ни одного окна, удовлетворяющего заданным условиям, то функция вернет значение NULL. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#include <windows.h>

int main()

{

HWND hwnd;

hwnd = GetWindow(GetDesktopWindow(),GW_CHILD);

//Выводим на экран дескриптор найденного окна

printf("%x\n",hwnd);

getchar();

return 0;

}

Примечание

Функция EnumChildWindows более пригодна для перечисления окон, чем вызов функции GetWindow в цикле. Приложение, которое использует GetWindow для перечисления окон рискует уйти в бесконечный цикл или получить описатель окна, которое было разрушено.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetWindowDisplayAffinity

Появилась в Windows 7. Возвращает из любого процесса текущую настройку родственности (affinity) заданного окна и дисплея.

Прототип

BOOL WINAPI GetWindowDisplayAffinity(

_In_ HWND hWnd,

_Out_ DWORD *dwAffinity

);

Параметры

hWnd[in]

Описатель окна.

dwAffinity[out]

Настройка родственности с дисплем.

Возвращаемое значение

Функция завершается успехом только для слоистых окон и когда диспетчер рабочего стола (Desktop Window Manager) формирует рабочий стол (is composing desktop). В случае успеха возвращает значение TRUE.

Возвращаемое значение в случае ошибки

FALSE. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

#include <windows.h>

#define WDA_MONITOR 0x01

//Прототип функции GetWindowDisplayWindow

typedef BOOL (*GETWINDOWDISPLAYAFFINITY)(HWND,DWORD*);

GETWINDOWDISPLAYAFFINITY lpfGetWindowDisplayAffinity;

int main()

{

HWND hwnd;

//Находим главное окно калькулятора

hwnd = FindWindow("CalcFrame",NULL);

if(!hwnd) return -1;

//Находим адрес функции GetWindowDisplayWindow

HINSTANCE huser32;

huser32 = LoadLibrary("user32.dll");

lpfGetWindowDisplayAffinity = (GETWINDOWDISPLAYAFFINITY)GetProcAddress(huser32,"GetWindowDisplayAffinity");

if(!lpfGetWindowDisplayAffinity) return -1;

//Вызываем функцию GetWindowDisplayWindow

BOOL res = TRUE;

DWORD dwAffinity = 0;

res = lpfGetWindowDisplayAffinity(hwnd,&dwAffinity);

//Выводим результат

if(res)

printf("Affinity is %s\n",(dwAffinity==WDA_MONITOR)?("on"):("off"));

else

printf("error\n");

getchar();

return 0;

}

В данном примере на окно выводится сообщение "Affinity is off".

Примечание

Данная функция поддерживает только один флаг WDA_MONITOR(0x01). Данный флаг говорит о том, что содержимое окна может отображаться только на экране монитора.

Эта функция и функция SetWindowDisplayAffinity созданы для предоставления окнам возможности защищать своё содержимое. Такая возможность появилась в Windows 7. Данная возможность позволяет приложениям защищать содержимое своих окон от захвата или копирования посредством определенного набора механизмов операционной системы (public operating system features) и API. Однако, данная возможность работает только при включенном построении окон посредством диспетчера рабочего стола (Desktop Window Manager - DWM).

Важно отметить, что данная возможность в отличие от подсистемы безопасности (security feature) или механизма управления цифровыми правами (Digital Rights Management - DRM), не дает гарантии, что использование функций SetWindowDisplayAffinity и GetWindowDisplayAffinity или других необходимых функций, таких как, например, DwmIsCompositionEnabled, надежно защитит содержимое окна, в тех случаях, когда например, кто-то делает фотографию экрана.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetWindowInfo

Возвращает информацию о заданном окне.

Прототип

BOOL WINAPI GetWindowInfo(

_In_ HWND hwnd,

_Inout_ PWINDOWINFO pwi

);

Параметры

hwnd[in]

Описатель окна, информацию о котором мы запрашиваем.

pwi[in,out]

Указатель на структуру WINDOWINFO, в которую будет помещена запрашиваемая информация. Перед вызовом фунцкии вы должны самостоятельно установить значение поля cbSize этой структуры равным sizeof(WINDOWINFO).

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#include <windows.h>

int main()

{

HWND hwnd;

//Находим главное окно калькулятора

hwnd = FindWindow("SciCalc",NULL);

if(!hwnd) return -1;

//Запрашиваем информацию об окне калькулятора

WINDOWINFO wi;

wi.cbSize = sizeof(WINDOWINFO);

GetWindowInfo(hwnd,&wi);

//Выводим полученную информацию

printf("border width is %d\n",wi.cxWindowBorders);

printf("border height is %d\n",wi.cyWindowBorders);

getchar();

return 0;

}

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetWindowLong

Возвращает информацию о заданном окне. Функция также возвращает 32-разрядное целое значение, расположенное в дополнительной памяти окна.

Для написания кода совместимого с 32-разрядными и 64-разрядными версиями Windows используйте функцию GetWindowLongPtr. При компиляции для 32-разрядной версии Windows вызов функции GetWindowLongPtr представляется как вызов функции GetWindowLong.

Прототип

LONG WINAPI GetWindowLong(

_In_ HWND hWnd,

_In_ int nIndex

);

Параметры

hWnd [in]

Описатель окна, информацию о кототром мы запрашиваем.

nIndex[in]

Отсчитываемое от нуля смещение запрашиваемого значения в дополнительной памяти окна. Допустимые значения смещения находятся в интервале от нуля до размера дополнительной памяти окна минус 4. Например, если дополнительная память окна имеет размер 12 байт, значение смещения 8 будет идентифицировать третье 32-разрядное целое, размещенное в этой памяти.

Для получения другой информации об окне, данный параметр должен иметь одно из допустимых значений, перечисленных ниже.

GWL_EXSTYLE - функция вернет набор расширенных стилей окна.

GWL_HINSTANCE - функция вернет дескриптор (базовый адрес загрузки) модуля приложения, в котором определено данное окно.

GWL_HWNDPARENT - функция вернет дескриптор окна, являющегося родительским по отношению к окну hWnd.

GWL_ID - функция вернет идентификатор окна.

GWL_STYLE - функция вернет набор стилей окна.

GWL_USERDATA - функция вернет пользовательские данные, ассоциированные с окном. Эти данные используются приложением, которое создало окно. Это значение инициализируется нулем.

GWL_WNDPROC - функция вернет адрес оконной процедуры, или специальный внутренний идентификатор представляющий адрес оконной процедуры.

Для диалоговых окон также допустимы значения, перечисленные ниже.

DWL_DLGPROC - функция вернет адрес диалоговой процедуры, или специальный внутренний идентификатор представляющий адрес диалоговой процедуры.

DWL_MSGRESULT - функция вернет то значение, которое вернула диалоговая процедура при обработке оконного сообщения.

DWL_USER - возвращает дополнительную информацию, специфичную для приложения, такую как дескрипторы или указатели.

Возвращаемое значение

Запрашиваемое значение.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

int main(int argc, char *argv[])

{

HWND hwnd;

//Получаем дескриптор главного окна калькулятора

hwnd = FindWindow("SciCalc", NULL);

if(!hwnd) return 0;

int hinst;

//Запрашиваем базовый адрес загрузки модуля calc.exe

hinst = GetWindowLong(hwnd, GWL_HINSTANCE);

printf("%p\n",hinst);

getch();

return 0;

}

Примечание

При запросе данных из дополнительной памяти окна, если они не были изменены в процессе работы приложения функция вернет значение нуль.

Функция GetWindowLongPtr документирована и описана в msdn. Согласно последней данная функция экспортируется библиотекой user32.dll. Однако, при просмотре таблицы экспорта последней найти там функцию GetWindowLongPtr (или аналогичную ей) не удалось.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | GetWindowLongA и GetWindowLongW


GetWindowModuleFileName

Возвращает имя файла и путь к нему для модуля, которому принадлежит заданное окно.

Прототип

UINT WINAPI GetWindowModuleFileName(

_In_ HWND hwnd,

_Out_ LPTSTR lpszFileName,

_In_ UINT cchFileNameMax

);

Параметры

hwnd[in]

Описатель окна, имя файла моделя которого мы запрашиваем.

lpszFileName[out]

Адрес буфера, в который будет записано имя файла и путь к нему.

cchFileNameMax[in]

Максимальное количество символов, которые могут быть записаны в буфер lpszFileName.

Возвращаемое значение

Количество символов, записанных в буфер lpszFileName.

Пример использования

#include <windows.h>

#include "Resource.h"

#define SIZE_BUFFER 100

//Прототип диалоговой процедуры

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)

{

char s[SIZE_BUFFER];

switch(uMsg){

case WM_INITDIALOG:

//Получаем имя файла и путь к нему

GetWindowModuleFileName(hwnd,s,SIZE_BUFFER-sizeof(char));

//Выводим имя файла

MessageBox(hwnd,s,"",MB_OK);

break;

case WM_CLOSE:

//Закрываем окно

EndDialog(hwnd,0);

}

return 0;

}

В данном приложении создаётся диалоговое окно и перед его отображением на экран выводится полное имя файла, в котором данное диалоговое окно реализовано.

Примечание

С помощью данной функции нельзя получить имя файла модуля и путь к нему для окна, принадлежащего другому процессу по отношению к вызывающему процессу.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | GetWindowModuleFileNameA и GetWindowModuleFileNameW


GetWindowPlacement

Возвращает состояние отображения (show state) и расположения в восстановленном, свёрнутом и развёрнутом состояниях заданного окна.

Прототип

BOOL WINAPI GetWindowPlacement(

_In_ HWND hWnd,

_Inout_ WINDOWPLACEMENT *lpwndpl

);

Параметры

hWnd[in]

Описатель окна.

lpwnddpl[in,out]

Указатель на структуру WINDOWPLACEMENT, в которую будет записана запрошенная информация. Перед вызовом функции GetWindowPlacement установите значение поля length этой структуры равным sizeof(WINDOWPLACEMENT). Функция GetWindowPlacement завершится ошибкой если значение этого поля установлено некорректно.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#include <windows.h>

int main()

{

HWND hwnd;

//Находим главное окно калькулятора

hwnd = FindWindow("SciCalc",NULL);

if(!hwnd) return -1;

//Вызываем функцию GetWindowPlacement

WINDOWPLACEMENT wp;

wp.length = sizeof(WINDOWPLACEMENT);

GetWindowPlacement(hwnd, &wp);

//Выводим результат

printf("showCmd is %d\n",wp.showCmd);

getchar();

return 0;

}

Примечание

Поле flags структуры WINDOWPLACEMENT для данной функции всегда содержит значение нуль. Если окно идентифицируемое параметром hWnd развёрнуто, то значение поля showCmd равно SW_SHOWMAXIMIZED. Если окно свёрнуто, то значение showCmd равно SW_SHOWMINIMIZED. Во всех остальных случаях оно равно SW_SHOWNORMAL.

Значение поля length структуры WINDOWPLACEMENT должно быть равно sizeof(WINDOWPLACEMENT). Если это не так, то фунцкия вернет значение FALSE. Для получения дополнительной информации по возможному использованию координат положения окна смотрите описание структуры WINDOWPLACEMENT.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


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


GetWindowTextLength

Возвращает длину заголовка заданного окна.

Прототип

int WINAPI GetWindowTextLength(

_In_ HWND hWnd

);

Параметры

hWnd [in]

Описатель окна, длину заголовка которого мы определяем.

Возвращаемое значение

Длина заголовка окна в символах.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

int main(int argc, char *argv[])

{

HWND hwndcalc;

//Ищем главное окно калькулятора

hwndcalc = FindWindow("SciCalc", NULL);

if(!hwndcalc){

printf("calc is not run\n");

getch();

return 0;

}

//Определяем длину заголовка главного окна калькулятора

int length=0;

length = GetWindowTextLength(hwndcalc);

printf("Window text length is %d\n", length);

getch();

return 0;

}

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | GetWindowTextLengthA и GetWindowTextLengthW


GetWindowThreadProcessId

Возвращает информацию о процессе и потоке, которым принадлежит заданное окно.

Прототип

DWORD WINAPI GetWindowThreadProcessId(

_In_ HWND hWnd,

_Out_opt_ LPDWORD lpdwProcessId

);

Параметры

hWnd[in]

Описатель окна

lpdwProcessId[out,opt]

Адрес, по которому будет записан идентификатор процесса, которому принадлежит окно hWnd.

Возвращаемое значение

Идентификатор потока, которому принадлежит окно hWnd.

Пример использования

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

int main(int argc, char *argv[])

{

HWND hwnd;

//Находим главное окно калькулятора

hwnd = FindWindow("SciCalc",NULL);

if(!hwnd) return 0;

//Определяем Pid процесса калькулятора

//и Tid его потока

int tid=0,pid=0;

tid=GetWindowThreadProcessId(hwnd,&pid);

printf("pid is %d\n",pid);

printf("tid is %d\n",tid);

getch();

return 0;

}

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


InternalGetWindowText

Данная функция не предназначена для основного использования. Она может быть изменена или удалена в последующих версиях Windows.

Копирует в буфер текст из области заголовка (если она есть) заданного окна.

Данная функция похожа на функцию GetWindowText. Тем не менее, она получает текст заголовка окна непосредственно из внутренней оконной структуры, связанной с дескриптором окна, и затем всегда предоставляет текст как строку в кодировке Unicode. Такое поведение отличает данную функцию от функции GetWindowText, которая получает текст заголовка окна путём отправки сообщения WM_GETTEXT. Если заданное окно является элементом управления, то возвращается текст из этого элемента уравления.

Прототип

int WINAPI InternalGetWindowText(

_In_ HWND hWnd,

_Out_ LPWSTR lpString,

_In_ int nMaxCount

);

Параметры

hWnd[in]

Описатель окна или элемента управления, содержащего текст.

lpString[out]

Адрес буфера, в котором будет размещен запрашиваемый текст. Если строка имеет такую же или большую длину, чем буфер lpString, то строка будет обрезана и завершена null символом.

nMaxCount[in]

Максимальное количество символов, которые могут быть заисаны в буфер lpString, включая NULL символ. Если записываемый в буфер текст превышает установленный лимит, то этот текст будет обрезан до максимально допустимой длины.

Возвращаемое значение

В случае успеха функция возвращает длину строки, записанной в буфер без учета завершающего NULL символа. Если заданное окно не имеет области заголовка, если область заголовка пуста, или если описатель окна задан неверно, то функция возвращает значение нуль. Для получения дополнительной информации используйте функцию GetLastError.

Пример использования

#define UNICODE

#include <windows.h>

#define SIZE_BUFFER 50

//Прототип функции InternalGetWindowText

typedef int (*INTERNALGETWINDOWTEXT)(HWND,LPWSTR,int);

INTERNALGETWINDOWTEXT lpfInternalGetWindowText;

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

HWND hwnd;

//Находим главное окно калькулятора

hwnd = FindWindow(L"SciCalc",NULL);

if(!hwnd) return -1;

//Находим адрес функции InternalGetWindowText

HINSTANCE huser32;

huser32 = GetModuleHandle(L"user32.dll");

lpfInternalGetWindowText = (INTERNALGETWINDOWTEXT)GetProcAddress(huser32,"InternalGetWindowText");

wchar_t s[SIZE_BUFFER];

//Получаем заголовок

if(lpfInternalGetWindowText)

lpfInternalGetWindowText(hwnd,s,SIZE_BUFFER);

//Выводим полученный заголовок

MessageBox(NULL,s,L"",MB_OK);

return 0;

}

Примечание

Данная функция не включалась в заголовочные файлы и библиотеки SDK до Windows XP Service Pack 1 и Windows Server 2003. Если у вас нет заголовочного файла и библиотеки импорта для этой функции, вы можете вызвать её с помощью функций LoadLibrary и GetProcAddress.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll


IsChild

Проверяет является ли окном дочерним или потомком по отношению к заданному родительскому окну. Дочернее окно является прямым потомком заданного родительского окна если это родительское окно расположено в цепочке родительских окон. Цепочка родительских окон начинается от окна верхнего уровня к дочерним окнам.

Прототип

BOOL WINAPI IsChild(

_In_ HWND hWndParent,

_In_ HWND hWnd

);

Параметры

hWndParent[in]

Описатель родительского окна.

hWnd[in]

Описатель проверяемого окна.

Возвращаемое значение

Если проверяемое окно является потомком или дочерним по отношению к заданному родительскому окну, возвращается ненулевое значение. В противном случае возвращается значение нуль.

Пример использования

#include <windows.h>

int main()

{

HWND hwndParent = NULL, hwndChild = NULL;

//Находим главное окно калькулятора

hwndParent = FindWindow("SciCalc",NULL);

if(!hwndParent) return -1;

//Находим дочернее окно калькулятора

hwndChild = FindWindowEx(hwndParent,NULL,NULL,"Backspace");

//Проверяем является найденное окно дочерним

printf("%d\n",IsChild(hwndParent,hwndChild));

getch();

return 0;

}

В данном примере на экран будет выведено значение 1 (единица).

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


IsGUIThread

Появилась в Windows XP. Определяет является ли вызывающий поток, GUI потоком (GUI thread). Функция также может преобразовать обычный поток в GUI поток.

Прототип

BOOL WINAPI IsGUIThread(

_In_ BOOL bConvert

);

Параметры

bConvert[in]

Если значение этого параметра равно TRUE и вызывающий поток не является GUI потоком, то функция преобразовывает поток в GUI поток.

Возвращаемое значение

Функция возвращает ненулевое значение в следующих случаях:

· вызывающий поток уже является GUI потоком;
· значение параметра bConvert равно TRUE и функция успешно преобразовала вызывающий поток в GUI поток.

Во всех остальных случаях функция возвращает значение нуль.

Возвращаемое значение в случае ошибки

Если значение параметра bConvert равно TRUE и функция не смогла преобразовать вызывающий поток в GUI поток, функция возвращает значение ERROR_NOT_ENOUGH_MEMORY.

Пример использования

#include <windows.h>

//Прототип функции

typedef BOOL (*ISGUITHREAD)(BOOL);

ISGUITHREAD lpfIsGUIThread;

int main()

{

//Находим адрес функции

HINSTANCE huser32;

huser32 = LoadLibrary("user32.dll");

lpfIsGUIThread = (ISGUITHREAD)GetProcAddress(huser32,"IsGUIThread");

BOOL res = FALSE;

//Вызываем функцию

if(lpfIsGUIThread)

res = lpfIsGUIThread(FALSE);

//Выводим результаты

printf("Thread is %sGUI thread\n",(res)?(""):("no "));

getchar();

return 0;

}

Данная программа проверяет свой основной поток на предмет того является он GUI потоком или нет, без его преобразования.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


IsHungAppWindow

Данная функция не предназначена для основного использования. Она может быть изменена или удалена в более новых версиях Windows.

Определяет не присвоила ли система заданному окну статус "не отвечает". Окно приложения получает этот статус когда оно не ожидает ввода, не находится в состоянии начальной инициализации (in startup processing), и не вызывало функцию PeekMessage в течение 5 секунд.

Прототип

BOOL WINAPI IsHungAppWindow(

_In_ HWND hWnd

);

Параметры

hWnd[in]

Описатель проверяемого окна.

Возвращаемое значение

Если заданное окно перестало отвечать, то функция возвращает значение TRUE. В противном случае она возвращает значение FALSE. Теневые окна (ghost windows) всегда возвращают значение TRUE.

Пример использования

#include <windows.h>

//Прототип функции

typedef BOOL (*ISHUNGAPPWINDOW)(HWND);

ISHUNGAPPWINDOW lpfIsHungAppWindow;

int main()

{

HWND hwnd;

hwnd = FindWindow("SciCalc",NULL);

if(!hwnd) return -1;

//Находим адрес функции

HINSTANCE huser32;

huser32 = LoadLibrary("user32.dll");

lpfIsHungAppWindow = (ISHUNGAPPWINDOW)GetProcAddress(huser32,"IsHungAppWindow");

BOOL res = FALSE;

//Вызываем функцию

if(lpfIsHungAppWindow)

res = lpfIsHungAppWindow(hwnd);

//Выводим результаты

printf("Window is %shung\n",(res)?(""):("not "));

getchar();

return 0;

}

В данном примере мы проверяем не присвоила ли система состояние "не отвечает" главному окну калькулятора.

Примечание

Интервал ожидания 5 секунд может быть изменен.

Данная функция не включалась в заголовочные файлы и библиотеки SDK до Windows XP Service Pack 1 и Windows Server 2003. Если у вас нет заголовочного файла и библиотеки импорта для этой функции, вы можете вызвать её с помощью функций LoadLibrary и GetProcAddress.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


IsIconic

Проверяет свёрнуто ли заданное окно.

Прототип

BOOL WINAPI IsIconic(

_In_ HWND hWnd

);

Параметры

hWnd[in]

Описатель проверяемого окна.

Возвращаемое значение

Если заданное окно свёрнуто (iconic), то функция возвращает ненулевое значение.

Если заданное окно не свёрнуто, то функция возвращает значение нуль.

Пример использования

#include <windows.h>

int main()

{

HWND hwnd;

hwnd = FindWindow("SciCalc",NULL);

if(!hwnd) return -1;

BOOL res = FALSE;

//Вызываем функцию

res = IsIconic(hwnd);

//Выводим результаты

printf("Window is %siconic\n",(res)?(""):("not "));

getchar();

return 0;

}

В данном примере мы проверяем свёрнуто ли главное окно калькулятора.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


IsProcessDPIAware

Появилась в Windows Vista. Данная функция может быть изменена или удалена в последующих версиях Windows. Используйте вместо неё функцию GetProcessDPIAwareness.

Определяет является ли вызывающий процесс dpi совместимым (dots per inch (dpi) aware), то есть корректирует ли он размеры элементов пользовательского интерфейса для компенсации настройки dpi.

Прототип

BOOL WINAPI IsProcessDPIAware(void);

Возвращаемое значение

Если процесс dpi совместим (dpi aware), то функция возвращает значение TRUE. В противном случае она возвращает значение FALSE.

Пример использования

#include <windows.h>

//Протитип функции

typedef BOOL (*ISPROCESSDPIAWARE)(void);

ISPROCESSDPIAWARE lpfIsProcessDPIAware;

int main()

{

//Находим адрес функции

HINSTANCE huser32;

huser32 = LoadLibrary("user32.dll");

lpfIsProcessDPIAware = (ISPROCESSDPIAWARE)GetProcAddress(huser32,"IsProcessDPIAware");

//Вызываем функцию

BOOL res = FALSE;

if(lpfIsProcessDPIAware)

res = lpfIsProcessDPIAware();

//Выводим результаты

printf("Process is %sdpi aware\n",(res)?(""):("not "));

getchar();

return 0;

}

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


IsWindow

Проверяет соответствует ли указанный описатель существующему окно.

Прототип

BOOL WINAPI IsWindow(

_In_opt_ HWND hWnd

);

Параметры

hWnd[in]

Проверяемый описатель.

Возвращаемое значение

Если указанный описатель соответствует существующему окну, функция возвращает ненулевое значение.

Если же указанный описатель не соответствует существующему окну, функция возвращает значение нуль.

Пример использования

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

int main(int argc, char *argv[])

{

HWND hwnd;

//Запрашиваем дескриптор окна, который нужно проверить

printf("Enter window handle:\n");

scanf("%d", &hwnd);

//Проверяем введенный дескриптор

if(IsWindow(hwnd))

printf("this is window\n");

else

printf("this is not window\n");

getch();

return 0;

}

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


IsWindowEnabled

Проверяет доступность заданного окна.

Прототип

BOOL WINAPI IsWindowEnabled(

_In_ HWND hWnd

);

Параметры

hWnd[in]

Описатель окна, доступность которого мы хотим проверить.

Возвращаемое значение

Если заданное окно доступно функция возвращает ненулевое значение.

Если заданное окно не доступно функция возвращает значение нуль.

Пример использования

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

int main(int argc, char *argv[])

{

HWND hwnd;

//Ищем главное окно калькулятора

hwnd = FindWindow("SciCalc",NULL);

if(!hwnd) return 0;

//Проверяем доступность окна калькулятора

if(IsWindowEnabled(hwnd))

printf("window is enabled\n");

else

printf("window is not enabled\n");

getch();

return 0;

}

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


IsWindowUnicode

Определяет является ли заданное окно Unicode окном.

Прототип

BOOL WINAPI IsWindowUnicode(

_In_ HWND hWnd

);

Параметры

hWnd[in]

Описатель проверяемого окна.

Возвращаемое значение

Если заданное окно является Unicode окном, то функция возвращает ненулевое значение.

Если заданное окно не является Unicode окном, то функция возвращает значение нуль. В этом случае окно является ANSI окном.

Пример использования

#include <windows.h>

int main()

{

HWND hwnd;

hwnd = FindWindow("SciCalc", NULL);

if(!hwnd) return -1;

if(IsWindowUnicode(hwnd))

printf("SciCalc is unicode window\n");

else

printf("SciCalc is not unicode window\n");

getchar();

return 0;

}

В данном примере проверяется окном какого типа (Unicode или ANSI) является главное окно стандартного калькулятора Windows. В ходе проверки выясняется, что оно является Unicode окном.

Примечание

Набор символов используемый окном определяется используемой функцией RegisterClass. Если класс окна регистрируется ANSI версией этой функцией (RegisterClassA), то для него будет создано ANSI окно. Если же класс окна регистрируется Unicode версией функции RegisterClass (RegisterClassW), то для этого класса будет создано Unicode окно.

Система автоматически конвертирует сообщения (из Unicode в ANSI и обратно) для окон в зависимости от их типа. Например, если ANSI окно посылает оконное сообщение Unicode окну, то система перед вызовом оконной процедуры целевого окна конвертирует это сообщение в Unicode. Система вызывает функцию IsWindowUnicode для определения того, в каком формате (ANSI или Unicode) окно принимает сообщения.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


IsWindowVisible

Проверяет видимо ли заданное окно.

Прототип

BOOL WINAPI IsWindowVisible(

_In_ HWND hWnd

);

Параметры

hWnd[in]

Описатель окна, видимость которого мы проверяем.

Возвращаемое значение

Если заданное окно видимо, то возращается ненулевое значение. Если же заданное окно невидимо, то возвращается значение нуль.

Пример использования

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

int main(int argc, char *argv[])

{

HWND hwnd;

//Ищем главное окно калькулятора

hwnd = FindWindow("SciCalc",NULL);

if(!hwnd) return 0;

//Проверяем видимость окна калькулятора

if(IsWindowVisible(hwnd))

printf("visible window\n");

else

printf("hidden window\n");

getch();

return 0;

}

Примечание

Если заданное окно невидимо из-за того что загорожено другими окнами, то функция IsWindowVisible вернет ненулевое значение (окно видимо).

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


IsZoomed

Определяет развёрнуто ли заданное окно.

Прототип

BOOL WINAPI IsZoomed(

_In_ HWND hWnd

);

Параметры

hWnd[in]

Описатель проверяемого окна.

Возвращаемое значение

Если заданное окно развёрнуто, то возвращается ненулевое значение.

Если заданное окно не развёрнуто, то возвращается значение нуль.

Пример использования

#include <windows.h>

int main()

{

//Находим окно блокнота

HWND hwnd;

hwnd = FindWindow("AkelPad4",NULL);

if(!hwnd) return -1;

//Вызываем функцию

BOOL res = FALSE;

res = IsZoomed(hwnd);

//Выводим результаты

printf("Window is %smaximized\n",(res)?(""):("not "));

getchar();

return 0;

}

В данном примере мы проверяем развёрнуто ли главное окно приложения AkelPad.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


LockSetForegroundWindow

Приоритетный процесс (foreground process) может вызвать функцию LockSetForegroundWindow для запрещения вызова функции SetForegroundWindow.

Прототип

BOOL WINAPI LockSetForegroundWindow(

_In_ UINT uLockCode

);

Параметры

uLockCode[in]

Определяет разрешаем мы или запрещаем вызов функции SetForegroundWindow. Он принимает одно из перечисленных ниже значений.

LSFW_LOCK - запретить вызов функции SetForegroundWindow.

LSFW_UNLOCK - разрешить вызов функции SetForegroundWindow.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#define WINVER 0x0500

#include <windows.h>

int main()

{

LockSetForegroundWindow(LSFW_LOCK);

return 0;

}

Для доступа к объявлениям LSFW_LOCK, LSFW_UNLOCK и самой функции LockSetForegroundWindow нужно переопределить объявление _WIN32_WINNT (сделать его большим чем 0x0500) или _WIN32_WINDOWS (сделать его большим чем 0x0490).

В нашем примере мы переопределяем WINVER. По умолчанию _WIN32_WINNT присваивается равным WINVER (см. заголовочный файл windef.h). _WIN32_WINDOWS по умолчанию не задано.

Примечание

Система автоматически разрешает вызовы функции SetForegroundWindow если пользоватлеь нажал клавишу Alt, или произвел какое-либо иное действие, в результате которого было изменено верхнее окно (foreground window) (например, щелкнул мышью по фоновому окну).

Данная функция даёт приложениям возможность помешать другим приложениям сменить верхнее окно и, тем самым прервать работу пользователя.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


LockWindowUpdate

Разрешает или запрещает рисование в заданном окне. В любой момент времени может быть заблокировано только одно окно.

Прототип

BOOL LockWindowUpdate(

_In_ HWND hWndLock

);

Параметры

hWndLock[in]

Описатель окна, рисование в котором мы запрещаем. Если значение этого параметра равно NULL, то ранее заблокированное окно становится свободным.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Это говорит либо о том, что произошла ошибка, либо ранее было заблокировано другое окно, которое еще не освобождено.

Пример использования

#include <windows.h>

int main()

{

HWND hwnd;

//Находим главное окно калькулятора

hwnd = FindWindow("SciCalc",NULL);

if(!hwnd) return -1;

//Запрещаем рисование в нём

if(LockWindowUpdate(hwnd))

printf("success\n");

getchar();

return 0;

}

Примечание

Задача функции LockWindowUpdate заключается в разрешении обратной связи механизма перетаскивания (drag/drop feedback), при котором можно рисовать по окну без участия самого окна. Идея состоит в том, что окно блокируется при начале операции и разблокируется при её завершении.Функция LockWindowUpdate не предназначена для подавления перерисовки окна. Для запрета перерисовки конкретного окна используйте сообщение WM_SETREDRAW.

Если приложение для заблокированного окна вызывает функцию GetDC, GetDCEx или BeginPaint, то вызываемая функция вернет контекст устройства (DC) с пустой видимой областью (регионом). Такое поведение будет сохраняться до тех пор пока приложение не разблокирует окно вызовом функции LockWindowUpdate со значением параметра hWndLock равным NULL.

Если приложение будет пытаться рисовать в заблокированном окне, то система запишет все предпринимаемые попытки рисования в свой буфер. Когда окно будет разблокировано, система признает недействительной область окна, в которую предпринималась попытка рисования, инициируя тем самым отправку сообщений WM_PAINT к ранее заблокированному окну и его дочерним окнам. Если во время блокирования окна, попыток рисования в него не было, то ни одна из областей этого окна не признаётся недействительной.

Функция LockWindowUpdate не делает заданное окно невидимым и не удаляет стиль WS_VISIBLE.

Заблокированное окно не может быть перемещено.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


LogicalToPhysicalPoint

Появилась в Windows Vista. Преобразовывает логические координаты точки внутри окна в физические координаты.

Прототип

BOOL WINAPI LogicalToPhysicalPoint(

_In_ HWND hWnd,

_Inout_ LPPOINT lpPoint

);

Параметры

hWnd[in]

Описатель окна, чей образ используется для преобразования координат. Полностью поддерживаются окна верхнего уровня. В случае использования дочерних окон, пересчитывается только область образованная пересечением родительского и дочернего окна.

lpPoint[in, out]

Указатель на структуру POINT, которая содержит логические координаты точки. В случае успеха в эту же структуру будут записаны полученные при пересчете физические координаты.

Возвращаемое значение

На странице msdn, описывающей эту функцию, нет описания возвращаемых функцией значений. Но, исходя из единообразия с другими функциями Win32API, предполагаем, что в случае успеха функция возвращает ненулевое значение, а в случае ошибки - значение нуль.

Пример использования

#include <windows.h>

//Прототип функции

typedef __stdcall BOOL (*LOGICALTOPHYSICALPOINT)(HWND, LPPOINT);

LOGICALTOPHYSICALPOINT lpfLTPP;

int main()

{

//Находим окно калькулятора

HWND hwnd;

hwnd = FindWindow("CalcFrame",NULL);

if(!hwnd) return -1;

//Находим адрес функции

HINSTANCE huser;

huser = GetModuleHandle("user32.dll");

lpfLTPP = (LOGICALTOPHYSICALPOINT)GetProcAddress(huser,"LogicalToPhysicalPoint");

if(!lpfLTPP) return -1;

//Вызываем функцию

POINT Point = {50,30};

if(lpfLTPP(hwnd,&Point))

printf("success\n");

else

printf("error\n");

//Выводим результаты

printf("(%d;%d)\n",Point.x,Point.y);

getchar();

return 0;

}

Данная программа выводит на экран строковое сообщение "success" и те же самые неизмененные координаты точки.

Примечание

Концепция физических координат появилась в Windows Vista. Диспетчер рабочего стола (Desktop Window Manager - DWM) масштабирует окна, не имеющие совместимости с dpi (dots per inch aware), когда дисплей имеет большое разрешение. Окно отображается на экране в соответствии с физическими координатами. Приложение продолжает работать в логическом пространстве. Поэтому то, как приложение воспринимает отображение ока на экране отличается от его настоящего изображения на экране. Для масштабированного окна логические и физические координаты отличаются друг от друга.

Функция LogicalToPhysicalPoint может быть вызвана процессом, который объявил себя совмесимым с dpi (dpi aware). Функция использует окно, идентифицируемое параметром hWnd и логические координаты переданные в структуре POINT для вычисления физических координат.

Функуция LogicalToPhysicalPoint заменяет логические координаты в структуре POINT на физические координаты. Физические координаты отсчитываются от левого верхнего угла экрана. Координаты находятся внутри клиентской области окна hWnd.

Функция LogicalToPhysicalPoint на всех платформах завершается ошибкой если ширина или высота окна равна нулю; приложения должны установить ненулевую ширину и высоту окна, например, с помощью функции MoveWindow. На некоторых версиях Windows (например, Windows 7) функция LogicalToPhysicalPoint завершается ошибкой, если функция MoveWindow была вызвана после функции ShowWindow с флагом SH_HIDE, который делает окно невидимым.

В Windows 8, системные dpi совместимые приложения пересчитывают логические и физические координаты друг в друга с помощью функций PhysicalToLogicalPoint и LogicalToPhysicalPoint. В Windows 8.1, дополнительная виртуализация системы и межпроцессные коммуникации приводит к тому, что для большинства приложений данные функции не нужны. Поэтому в Windows 8.1 функции PhysicalToLogicalPoint и LogicalToPhysicalPoint не пересчитывают координаты точек. Система возвращает приложению все точки в его собственном координатном пространстве. Такое поведение сохраняет свою функциональность для большинства приложений, но существует ряд исключений, в которых вы должны сделать изменения для обеспечения того, что приложение работает так, как ожидалось. В этих случаях вы должны использовать функции PhysicalToLogicalPointForPerMonitorDPI и LogicalToPhysicalPointForPerMonitorDPI.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


MapWindowPoints

Осуществляет пересчет координат точек из клентской системы координат одного окна в клиентскую систему координат другого окна.

Прототип

int MapWindowPoints(

_In_ HWND hWndFrom,

_In_ HWND hWndTo,

_Inout_ LPPOINT lpPoints,

_In_ UINT cPoints

);

Параметры

hWndFrom[in]

Описатель окна, в клиентской системе координат которого первоначально заданы пересчитываемые координаты точек.

hWndTo[in]

Описатель окна, в клиентскую систему координат которого нужно пересчитать координаты точек.

lpPoints[in, out]

Адрес массива структур POINT, каждая из которых содержит пересчитываемые координаты точек. Координаты точек задаются в единицах устройства.

В результате работы функции MapWindowPoints в каждую структуру POINT этого массива будут записаны пересчитанные координаты соответствующих точек.

Значение данного параметра может указывать на структуру RECT. В этом случае значение параметра cPoints должно быть равно 2.

cPoints[in]

Количество элементов в массиве lpPoints.

Возвращаемое значение

Младшее слово возвращаемого значения содержит количество пикселей добавленных к гориизонтальным координатам каждой точки в порядке вычисления горизонтальной координаты каждой точки.

Старшее слово возвращаемого значения содержит количество пикселей добавленных к вертикальным координатам каждой точки в порядке вычисления вертикальных координат каждой точки.

Возвращаемое значение в случае ошибки

Нуль.

Пример использования

#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)

{

HWND hwndedit;

switch(uMsg){

case WM_INITDIALOG:

//Получаем дескриптор окна поля ввода

hwndedit = GetDlgItem(hwnd,ID_EDIT);

//Инициализирем массив точек, координаты которых будем пересчитывать

POINT p[2];

p[0].x=0;

p[0].y=0;

p[1].x=10;

p[1].y=20;

//Пересчитываем координаты точек

MapWindowPoints(hwndedit,hwnd,p,2);

//Формируем строку с результатами пересчета

char s[20];

snprintf(s,sizeof(s),"(%d;%d),(%d;%d)",p[0].x,p[0].y,p[1].x,p[1].y);

//Показываем результаты пересчета

SetWindowText(hwndedit,s);

break;

case WM_CLOSE:

EndDialog(hwnd,0);

break;

}//switch(uMsg)

return 0;

}

В данном примере создается диалоговое окно с элементом управления поле ввода (edit). Функция MapWindowPoints используется для пересчета координат двух точек из клиентской системы координат окна поля ввода (его дескриптор - hwndedit) в клиентскую систему координат самого диалогового окна (его дескриптор - hwnd).

Примечание

Для обеспечения правильности пересчета координат компания Microsoft рекомендует либо использовать структуру RECT, либо пересчитывать координаты для каждой точки отдельно.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


MoveWindow

Изменяет положение и размер окна.

Прототип

BOOL WINAPI MoveWindow(

_In_ HWND hWnd,

_In_ int X,

_In_ int Y,

_In_ int nWidth,

_In_ int nHeight,

_In_ BOOL bRepaint

);

Параметры

hWnd[in]

Описатель окна.

X[in]

Новая координата левого верхнего угла окна по горизонтали в клиентских координатах.

Y[in]

Новая координата левого верхнего угла окна по вертикали в клиентских координатах.

nWidth[in]

Новая ширина окна в пикселях.

nHeight[in]

Новая высота окна в пикселях.

bRepaint[in]

Указывает должно ли окно быть перерисовано. Если значение этого параметра равно TRUE, то окну отправляется сообщение WM_PAINT. Если значение этого параметра равно FALSE - окно не перерисовывается.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

int main(int argc, char *argv[])

{

HWND hwnd=NULL;

//Ищем главное окно калькулятора

hwnd = FindWindow("SciCalc", NULL);

//Изменяем позицию окна калькулятора

MoveWindow(hwnd, 0, 0, 300, 300, TRUE);

return 0;

}

В данном примере окно калькуятора перемещается в левый верхний угол экрана и уменьшается в размере.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


OpenIcon

Восстанавливает свёрнутое окно в его предыдущем размере и положении, а затем активизирует его.

Прототип

BOOL WINAPI OpenIcon(

_In_ HWND hWnd

);

Параметры

hWnd[in]

Описатель восстанавливаемого и активируемого окна.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Находим главное окно калькулятора

HWND hwnd;

hwnd = FindWindow("SciCalc",NULL);

if(!hwnd) return -1;

//Восстанавливаем окно калькулятора

OpenIcon(hwnd);

return 0;

}

Чтобы увидеть работу этой программы её нужно запсукать вне IDE.

Примечание

Данная функция отправляет заданному окну сообщение WM_QUERYOPEN.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


PhysicalToLogicalPoint

Появилась в Windows Vista. Пересчитывает физические координаты точки внутри окна в логические координаты.

Прототип

BOOL WINAPI PhysicalToLogicalPoint(

_In_ HWND hWnd,

_Inout_ LPPOINT lpPoint

);

Параметры

hWnd[in]

Описатель окна, чей образ используется для преобразования координат. Полностью поддерживаются окна верхнего уровня. В случае использования дочерних окон, пересчитывается только область образованная пересечением родительского и дочернего окна.

lpPoint[in, out]

Указатель на структуру POINT, которая содержит физические/экранные координаты точки. В случае успеха в эту же структуру будут записаны полученные при пересчете логические координаты.

Возвращаемое значение

На странице msdn, описывающей эту функцию, нет описания возвращаемых функцией значений. Но, исходя из единообразия с другими функциями Win32API, предполагаем, что в случае успеха функция возвращает ненулевое значение, а в случае ошибки - значение нуль.

Пример использования

#include <windows.h>

//Прототип функции

typedef __stdcall BOOL (*PHYSICALTOLOGICALPOINT)(HWND, LPPOINT);

PHYSICALTOLOGICALPOINT lpfPTLP;

int main()

{

//Находим окно калькулятора

HWND hwnd;

hwnd = FindWindow("CalcFrame",NULL);

if(!hwnd) return -1;

//Находим адрес функции

HINSTANCE huser;

huser = GetModuleHandle("user32.dll");

lpfPTLP = (PHYSICALTOLOGICALPOINT)GetProcAddress(huser,"PhysicalToLogicalPoint");

if(!lpfPTLP) return -1;

//Вызываем функцию

POINT Point = {50,30};

if(lpfPTLP(hwnd,&Point))

printf("success\n");

else

printf("error\n");

//Выводим результаты

printf("(%d;%d)\n",Point.x,Point.y);

getchar();

return 0;

}

Данная программа выводит на экран строковое сообщение "success" и те же самые не измененные координаты точки.

Примечание

Концепция физических координат появилась в Windows Vista. Диспетчер рабочего стола (Desktop Window Manager - DWM) масштабирует окна, не имеющие совместимости с dpi (dots per inch aware), когда дисплей имеет большое разрешение. Окно отображается на экране в соответствии с физическими координатами. Приложение продолжает работать в логическом пространстве. Поэтому то, как приложение воспринимает отображение ока на экране отличается от его настоящего изображения на экране. Для масштабированного окна логические и физические координаты отличаются друг от друга.

Функция использует окно, идентифицируемое параметром hWnd и физические координаты переданные в структуре POINT для вычисления логических координат. Логические координаты являются немасштабируемыми координатами (unscaled coordinates), с которыми работает приложение. Другими словами, логические координаты - это координаты, которые "понимает" приложение и которые могут отличаться от физических координат. Функция PhysicalToLogicalPoint, вычислив логические координаты, записывает их в структуру POINT на место физических координат. Новые координаты заданы в мировой системе координат (world coordinates), начало которой расположено на рабочем столе (on the desktop). Координаты, переданные в функцию находятся над окном hWnd.

Исходные координаты задаются в единицах устройства (device units).

Функция PhysicalToLogicalPoint на всех платформах завершается ошибкой если ширина или высота окна равна нулю; приложения должны установить ненулевую ширину и высоту окна, например, с помощью функции MoveWindow. На некоторых версиях Windows (например, Windows 7) функция PhysicalToLogicalPoint завершается ошибкой, если функция MoveWindow была вызвана после функции ShowWindow с флагом SH_HIDE, который делает окно невидимым.

В Windows 8, системные dpi совместимые приложения пересчитывают логические и физические координаты друг в друга с помощью функций PhysicalToLogicalPoint и LogicalToPhysicalPoint. В Windows 8.1, дополнительная виртуализация системы и межпроцессные коммуникации приводит к тому, что для большинства приложений данные функции не нужны. Поэтому в Windows 8.1 функции PhysicalToLogicalPoint и LogicalToPhysicalPoint не пересчитывают координаты точек. Система возвращает приложению все точки в его собственном координатном пространстве. Такое поведение сохраняет свою функциональность для большинства приложений, но существует ряд исключений, в которых вы должны сделать изменения для обеспечения того, что приложение работает так, как ожидалось. В этих случаях вы должны использовать функции PhysicalToLogicalPointForPerMonitorDPI и LogicalToPhysicalPointForPerMonitorDPI.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


RealChildWindowFromPoint

Возвращает описатель дочернего окна, которому принадлежит заданная точка. Поиск ограничивается только непосредственно дочерними окнами. "Внучатые" и ниже окна не проверяются.

Прототип

HWND WINAPI RealChildWindowFromPoint(

_In_ HWND hwndParent,

_In_ POINT ptParentClientCoords

);

Параметры

hwndParent[in]

Описатель родительского окна.

ptParentClientCoords[in]

Структура POINT, которая описывает точку в клиентских координатах.

Возвращаемое значение

Описатель дочернего окна, которому принадлежит заданная точка.

Пример использования

#include <windows.h>

#include "Resource.h"

#define CLICKONBUTTON ((BN_CLICKED<<8) + ID_BUTTON)

//Прототип Диалоговой процедуры

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;

}

//Обработчик нажатия на кнопку

void FindWindowInPoint(HWND hwndParent, HWND hwndButton){

POINT point;

//Получаем положение курсора в экранных координатах

GetCursorPos(&point);

//Пересчитываем экранные координаты в клиентские

ScreenToClient(hwndParent,&point);

HWND hwndButton1;

//Получаем дескриптор окна по точке

hwndButton1 = RealChildWindowFromPoint(hwndParent, point);

char s[20]="";

//Формируем сообщение

snprintf(s,20,"%x;%x\x00", hwndButton, hwndButton1);

//Выводим результат

MessageBox(hwndParent,s,"",MB_OK);

}

//Диалоговая процедура

INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

switch(uMsg){

case WM_COMMAND:

if(wParam == CLICKONBUTTON)

FindWindowInPoint(hwnd, (HWND)lParam);

break;

case WM_CLOSE:

EndDialog(hwnd,0);

}

return 0;

}

В данном примере создаётся простое диалоговое окно с одной кнопкой. При нажатии на эту кнопку вызывается функция FindWindowInPoint. Мы исходим из предположения, что пользователь нажал на кнопку с помощью мыши. Вначале определяем положение курсора мыши (если наше предположение верно, то он располагается над кнопкой). Так как положение курсора задается экранными координатами а нам нужны клиентские, то с помощью функции ScreenToClient мы пересчитываем координаты точки.

Так как курсор располагался над кнопкой, то функция RealChildWindowFromPoint должна вернуть дескриптор кнопки. hwndButton - дескриптор кнопки переданный в сообщении WM_COMMAND. hwndButton1 - дескриптор кнопки, полученный функцией RealChildWindowFromPoint. Понятно, что эти значения должны совпадать.

Примечание

Функция RealChildWindowFromPoint обрабатывает перекрывающиеся области элементов управления иначе, чем другие области элемента управления. Она возвращает дочернее окно, расположенное под прозрачной (transparent) частью элемента управления. В отличие от неё функция ChildWindowFromPoint обрабатывает перекрывающиеся области элементов управления точно так же как и другие области элементов управления. Например, если точка принадлежит прозрачной части жлемента управления groupbox, то функция RealChildWindowFromPoint вернет дочернее окно, расположенное за элементом управления groupbox, в то время как функция ChildWindowFromPoint вернет элемент управления groupbox. Однако обе эти функции вернут статический элемент управления, даже если он тоже перекрывает кого-либо.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


RegisterShellHookWindow

[Данная функция не предназначена для общего использования. Она может быть убрана или заменена в новых версиях Windows.]

Регистрирует окно на получение определенных уведомлений.

Уведомительные сообщения отправляются зарегистрированному окну, связанному с заданным рабочем столом. Многие из уведомительны сообщений могут быть получены с помощью функции SetWindowsHookEx с флагом WH_SHELL. Отличие RegisterShellHookWindow состоит в том, что зарегистрированное с помощью неё окно получает уведомительные сообщения посредством своей оконной процедуры WindowProc, а не посредством специальной функции обратного вызова.

Прототип

BOOL WINAPI RegisterShellHookWindow(

_In_ HWND hWnd

);

Параметры

hWnd[in]

Описатель регистрируемого окна.

Возвращаемое значение

TRUE.

Возвращаемое значение в случае ошибки

FALSE.

Пример использования

Пример использования приведен здесь.

Примечание

Уведомление о том или ином событии приходит с сообщением WM_SHELLHOOKMESSAGE. Однако, данная константа не предопределена, как например, константа WM_COMMAND. Получать значение константы WM_SHELLHOOKMESSAGE нужно динамически с помощью функции RegisterWindowMessage так, как показано ниже.

RegisterWindowMessage(TEXT("SHELLHOOK"));

Параметр wparam содержит тип уведомления. Его допустимые значения перечислены здесь. Содержимое параметра lparam зависит от содержимого параметра wparam.

Экспортирующая библиотека

user32.dll


ScreenToClient

Осуществляет пересчет заданных координат точки из экранной системы координат в клиентскую систему координат.

Прототип

BOOL ScreenToClient(

_In_ HWND hWnd,

LPPOINT lpPoint

);

Параметры

hWnd[in]

Дескриптор окна, чья клиентская область будет использоваться для пересчета координат.

lpPoint[in,out]

Адрес структуры POINT, которая содержит координаты точки в экранной системе координат. В эту же структуру будут записаны пересчитанные координаты этой же точки в клиентской системе координат заданного окна.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль.

Пример использования

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

int main(int argc, char *argv[])

{

HWND hwnd;

//Находим главное окно калькулятора

hwnd = FindWindow("SciCalc",NULL);

POINT p;

p.x = 389;

p.y = 82;

//Пересчитываем координаты

ScreenToClient(hwnd, &p);

//Выводим новые координаты пользователю

printf("(%d;%d)\n", p.x,p.y);

getch();

return 0;

}

Примечание

Все координаты задаются в единицах устройства.

Не используйте эту функцию в случае зеркалирования окон.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


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


SetFocus

Устанавливает фокус ввода в заданном окне.

Прототип

HWND WINAPI SetFocus(

_In_opt_ HWND hWnd

);

Параметры

hWnd[in,opt]

Описатель окна, которому передается фокус ввода.

Возвращаемое значение

В случае успеха функция возвращает описатель окна, которому принадлежал фокус ввода.

Возвращаемое значение в случае ошибки

NULL. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#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)

{

HWND hwndbutton;

switch(uMsg){

case WM_INITDIALOG:

//Получаем дескриптор окна-кнопки

hwndbutton = GetDlgItem(hwnd, ID_BUTTON);

//Передаем кнопке фокус ввода

SetFocus(hwndbutton);

break;

case WM_CLOSE:

EndDialog(hwnd,0);

}

return 0;

}

В данном примере создается диалоговое окно с элементом управления кнопка. Именно на эту кнопку и передается фокус ввода при создании диалогового окна.

Примечание

В том случае, если заданное окно не связано с очередью сообщений текущего потока, функция SetFocus вернет значение NULL.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


SetForegroundWindow

Повышает приоритет потока, который создал заданное окно и активизирует это окно. Клавиатурный ввод направляется в заданное окно.

Прототип

BOOL WINAPI SetForegroundWindow(

_In_ HWND hWnd

);

Параметры

hWnd [in]

Описатель окна, которое будет активизировано.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль.

Пример использования

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

HWND hwnd;

//Находим окно приложения "калькулятор"

hwnd = FindWindow("SciCalc",NULL);

//Размещаем его окно поверх других окон

SetForegroundWindow(hwnd);

return 0;

}

Примечание

Система жестко ограничивает процессы, которые могут устанавливать верхние окна (foreground window). Процесс может установить такое окно только если выполнено одно из следующих условий:

· процесс является приоритетным процессом (foreground process);
· процесс был запущен приоритетным процессом;
· процесс обрабатывал последнее событие ввода;
· нет приоритетного процесса;
· процесс отлаживается;
· прироритетный процесс не является современным приложением (Modern Application) или начальным экраном (Start Screen);
· окно переднего плана не заблокировано (см. описание функции LockSetForegroundWindow);
· истекла задержка на срабатывание функции SetForegroundWindow (см. описание параметра SPI_GETFOREGROUNDLOCKTIMEOUT функции SystemParametersInfo);
· нет активных меню.

Приложение не может установить окно на передний план пока пользователь работает с другим окном. Вместо замещения окна, система заставляет мигать кнопку на панели задач.

Процесс, который имеет право устанавливать верхние окна может разрешить устанавливать верхние окна другим приложениям с помощью функции AllowSetForegroundWindow. Процесс, указанный в параметре dwProcessId теряет возможность устанавливать верхнее окно до тех пор, пока пользователь не сгенерирет ввод, направленный в этот процесс, или процесс не вызовет функцию AllowSetForegroundWindow, в параметре которой указан данный процесс.

Приоритетный процесс может запретить вызов функции SetForegroundWindow с помощью функции LockSetForegroundWindow.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


SetLayeredWindowAttributes

Устанавливает степень прозрачности заданного окна.

Прототип

BOOL WINAPI SetLayeredWindowAttributes(

_In_ HWND hwnd,

_In_ COLORREF crKey,

_In_ BYTE bAlpha,

_In_ DWORD dwFlags

);

Параметры

hwnd[in]

Описатель слоистого (layered) окна, прозрачность которого мы изменяем. Слоистое окно - это окно, которое было создано функцией CreateWindowEx с установленным стилем WS_EX_LAYERED, или окно, у которого был установлен стиль WS_EX_LAYERED с помощью функции SetWindowLong.

Windows 8: стиль WS_EX_LAYERED поддерживается для окон верхнего уровня и дочерних окон. В предыдущих версиях Windows этот стиль поддерживался только для окон верхнего уровня.

crKey[in]

Цвет, прозрачность которого изменяется. Функция изменит прозрачность всех пикселей окна hwnd с данным цветом. Тип COLORREF эквивалентен типу DWORD. Для формирования значения этого параметре используйте макрос RGB.

bAlpha[in]

Устанавливаемая степень прозрачности окна. Если значение bAlpha равно нулю, то окно полностью прозрачно. Если же значение bAlpha равно 255, то окно непрозрачно.

dwFlags[in]

Выполняемое действие. Принимает одно из двух значений, перечисленных ниже.

LWA_ALPHA - использует значение bAlpha для определения новой прозрачности заданного окна.

LWA_COLORKEY - использует значение crKey для определения цвета, прозрачность которого будет изменена.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#define _WIN32_WINNT 0x0500

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

HWND hwnd;

//Находим главное окно калькулятора

hwnd = FindWindow("SciCalc",NULL);

if(!hwnd) return -1;

//Устанавливаем для него стиль WS_EX_LAYERED

SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED);

//Делаем его полупрозрачным

SetLayeredWindowAttributes(hwnd, 0, (255*50)/100, LWA_ALPHA);

}

Обратите внимание, что здесь мы переопределяем константу _WIN32_WINNT.

Чуть более сложный пример использования функции SetLayeredWindowAttributes приведен здесь.

Примечание

Учтите, что после вызова функции SetLayeredWindowAttributes последующие за ней вызовы функции UpdateLayeredWindow завершатся ошибкой до тех пор пока бит распределения по слоям (layering style bit) не будет сброшен и установлен снова.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


SetParent

Устанавливает нового родителя для заданного окна.

Прототип

HWND WINAPI SetParent(

_In_ HWND hWndChild,

_In_opt_ HWND hWndNewParent

);

Параметры

hWndChild[in]

Описатель окна, родителя которого мы изменяем.

hWndNewParent[in,opt]

Описатель окна, которое становится родительским по отношению к окну hWndChild. Если значение этого параметра равно HWND_MESSAGE окно hWndChild становится окном для сообщений (оно не отображается на экране, не выводиться в списке окон, но способно принимать и отправлять оконные сообщения).

Возвращаемое значение

Описатель окна, являющегося родительским по отношению к окну hWndChild, до вызова функции.

Возвращаемое значение в случае ошибки

NULL. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#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)

{

HWND hwndnewparent, hwndnewchild;

switch(uMsg){

case WM_INITDIALOG:

//Получаем дескрипторы окон

hwndnewparent = GetDlgItem(hwnd, ID_EDIT);

hwndnewchild = GetDlgItem(hwnd, ID_BUTTON);

//Меняем иерархию окон

SetParent(hwndnewchild, hwndnewparent);

break;

case WM_CLOSE:

EndDialog(hwnd,0);

}

return 0;

}

В данном примере создается диалоговое окно с двумя элементами управления: полем ввода (edit) и кнопкой (button). По умолчанию окна этих элементов управления имеют одного общего родителя (само диалоговое окно). Однако при обработке оконного сообщения WM_INITDIALOG мы вызовом функции SetParent меняем иерархию окон. Теперь окно кнопки является дочерним окном по отношению к окну поля ввода.

Примечание

Для установки родителя окна верхнего уровня перед вызовом SetParent, у этого окна нужно отменить стиль WS_POPUP и установить стиль WS_CHILD.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


SetProcessDefaultLayout

Изменяет раскладку (layout) по умолчанию для создаваемого окна без родителя или владельца для текущего процесса.

Прототип

BOOL WINAPI SetProcessDefaultLayout(

_In_ DWORD dwDefaultLayout

);

Параметры

dwDefaultLayout[in]

Раскладка по умолчанию для текущего процесса. Данный параметр может принимать либо значение нуль, ли значение

LAYOUT_RTL - устанавливает по умолчанию горизонтальную ориентацию справа налево.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Раскладка (layout) определяет ориентацию текста и графики; по умолчанию - слева направо. Функция SetProcessDefaultLayout изменяет эту ориентацию и делает текущей ориентацию справа налево, которая является стандартной в арабской и еврейской культурах.

После установки флага LAYOUT_RTL, флаги обычно определяющие "право" и "лево" инвертируются. Для избежания неоднозначности рассмотрите следующие алтернативные обозначения для стандартных флагов, например, такие как представлены в таблице ниже:

Стандартный флаг | Предлагаемое альтернативное обозначение
WS_EX_RIGHT | WS_EX_TRAILING
WS_EX_RTLREADING | WS_EX_REVERSEREADING
WS_EX_LEFTSCROLLBAR | WS_EX_LEADSCROLLBAR
ES_LEFT | ES_LEAD
ES_RIGHT | ES_TRAIL
EC_LEFTMARGIN | EC_LEADMARGIN
EC_RIGHTMARGIN | EC_TRAILMARGIN

При использовании этой функции для зеркалированных (mirrored) окон, помнитие, что функция SetProcessDefaultLayout не зеркалирует весь процесс и все контексты устройств (DC), которые он создал. Она зеркалирует только DC зеркалированных окон. Для зеркалирования DC всех окон используйте функцию SetLayout.

Зеркалировать с помощью этой функции диалоговые окна нельзя.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


SetProcessDPIAware

Появилась в Windows Vista. Данная функция может быть изменена или удалена в более новых версиях Windows. Используйте вместо неё функцию SetProcessDPIAwareness.

Устанавливает для текущего процесса совместимость с dpi (dots per inch (dpi) aware).

Если динамическая библиотека во время иницилизации кэширует настройки dpi, то функция SetProcessDPIAware может приводить к состоянию гонки. Поэтому рекомендуется чтобы совместимость с dpi устанавливалась в манифесте приложения, а не путём вызова функции SetProcessDPIAware.

Прототип

BOOL WINAPI SetProcessDPIAware(void);

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль.

Пример использования

#include <windows.h>

//Прототип функции

typedef BOOL (*SETPROCESSDPIAWARE)(void);

SETPROCESSDPIAWARE lpfSPDPIA;

int main()

{

//Находим адрес функции

HINSTANCE huser;

huser = LoadLibrary("user32.dll");

lpfSPDPIA = (SETPROCESSDPIAWARE)GetProcAddress(huser,"SetProcessDPIAware");

//Вызываем функцию

if(lpfSPDPIA){

if(lpfSPDPIA())

printf("success\n");

else

printf("fail\n");

}

getchar();

return 0;

}

Данная программа вывозит на экран строку "success".

Примечание

Динамические библиотеки должны принимать настройку dpi процесса, в который они загружаются, а не вызывать функцию SetProcessDPIAware самостоятельно. Правильным будет устанавливать совместимость с dpi в манифесте приложения (application manifest).

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


SetWindowDisplayAffinity

Появилась в Windows 7. Сохраняет в режиме ядра родственность (affinity) заданного окна и монитора. (если по простому: позволяет защитить содержимое окна от копирования посредством снятия скриншота с экрана - прим. составителя).

Прототип

BOOL WINAPI SetWindowDisplayAffinity(

_In_ HWND hWnd,

_In_ DWORD dwAffinity

);

Параметры

hWnd[in]

Описатель окна.

dwAffinity[in]

Настройка родственности с монитором (display affinity). Эта настройка определяет где может отображаться соержимое окна. Установите значение этого параметра равным WDA_MONITOR (1) для того, чтобы содержимое окна могло отображаться только на мониторе. Установите значение этого параметра равным WDA_NONE (0) для отмены настройки.

Возвращаемое значение

TRUE.

Возвращаемое значение в случае ошибки

FALSE. Это возможно, например, когда функция используется для окна, не являющегося окном верхнего уровня. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Эта функция и функция GetWindowDisplayAffinity созданы для предоставления окнам возможности защищать своё содержимое. Такая возможность появилась в Windows 7. Данная возможность позволяет приложениям защищать содержимое своих окон от захвата или копирования посредством определенного набора механизмов операционной системы (public operating system features) и API. Однако, данная возможность работает только при включенном построении окон посредством диспетчера рабочего стола (Desktop Window Manager - DWM).

Важно отметить, что данная возможность в отличие от подсистемы безопасности (security feature) или механизма управления цифровыми правами (Digital Rights Management - DRM), не дает гарантии, что использование функций SetWindowDisplayAffinity и GetWindowDisplayAffinity или других необходимых функций, таких как, например, DwmIsCompositionEnabled, надежно защитит содержимое окна, в тех случаях, когда например, кто-то делает фотографию экрана.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


SetWindowLong

Изменяет заданный атрибут заданного окна. Функция также устанавливает 32-разрядное значение по заданному смещению в дополнительной памяти окна.

Прототип

LONG WINAPI SetWindowLong(

_In_ HWND hWnd,

_In_ int nIndex,

_In_ LONG dwNewLong

);

Параметры

hWnd[in]

Описатель окна, информацию о котором мы меняем.

nIndex[in]

Аналогичен параметру nIndex функции GetWindowLong.

dwNewLong[in]

Новое устанавливаемое значение изменяемого свойства.

Возвращаемое значение

Предыдущее значение изменяемого свойства.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

HWND hwnd;

//Получаем дескриптор главного окна калькулятора

hwnd = FindWindow("SciCalc", NULL);

if(!hwnd) return 0;

int wndstyle;

//Запрашиваем набор стилей окна калькулятора

wndstyle = GetWindowLong(hwnd, GWL_STYLE);

//Добавляем стиль WS_SIZEBOX (делаем размеры окна изменяемыми)

wndstyle = wndstyle | WS_SIZEBOX;

//Устанавливаем новый набор стилей окна калькулятора

SetWindowLong(hwnd, GWL_STYLE, wndstyle);

return 0;

}

Примечание

В том случае, если предыдущим значением изменяемого свойства было значение нуль. Функция вернет значение нуль. При этом функция SetWindowLong не изменяет код последней ошибки.

Изменять адрес оконной (диалоговой) процедур разрешено только у окон, созданных текущим потоком.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | SetWindowLongA и SetWindowLongW


SetWindowPlacement

Устанавливает состояние отображения (show state) и положения в восстановленном, свёрнутом и развёрнутом состояниях заданного окна.

Прототип

BOOL WINAPI SetWindowPlacement(

_In_ HWND hWnd,

_In_ const WINDOWPLACEMENT *lpwndpl

);

Параметры

hWnd[in]

Описатель окна.

lpwndpl[in]

Указатель на структуру WINDOWPLACEMENT, кторая содержит информацию о новом состоянии отображении (show state) и положениях окна (window positions).

Перед вызовом функции SetWindowPlacement установите значение поля length структуры WINDOWPLACEMENT равным sizeof(WINDOWPLACEMENT). Функция SetWindowPlacement завершается ошибкой если значение этого поля установлено некорректно.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#include <windows.h>

int main()

{

HWND hwnd;

//Находим главное окно калькулятора

hwnd = FindWindow("SciCalc",NULL);

if(!hwnd) return -1;

//Получаем координаты окна в рабочей области

WINDOWPLACEMENT wp;

wp.length = sizeof(WINDOWPLACEMENT);

GetWindowPlacement(hwnd,&wp);

//Сворачиваем окно

wp.showCmd = SW_MINIMIZE;

SetWindowPlacement(hwnd,&wp);

return 0;

}

В данном примере мы сворачиваем главное окно калькулятора. Вызов функции GetWindowPlacement необходим для установки корректных значений координат в системе координат рабочей области. Более подробно про эти координаты смотрите в описании структуры WINDOWPLACEMENT.

Примечание

Если информация заданная в структуре WINDOWPLACEMENT приводит к тому, что окно полностью выходит за пределы экрана, то система автоматически корректирует координаты так, чтобы окно оставалось видимым, с учетом изменения разрешения экрана и наличия конфигурации из нескольких мониторов.

Значение поля length структуры WINDOWPLACEMENT должно быть равно sizeof(WINDOWPLACEMENT). Если значение этого поля установлено не корректно, то функция вернет значение FALSE. Для дополнительной информации по возможному использованию координат положения окна смотрите описание структуры WINDOWPLACEMENT.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


SetWindowPos

Изменяет размер, позицию на экране и положение в Z-последовательности окна.

Прототип

BOOL WINAPI SetWindowPos(

_In_ HWND hWnd,

_In_opt_ HWND hWndInsertAfter,

_In_ int X,

_In_ int Y,

_In_ int cx,

_In_ int cy,

_In_ UINT uFlags

);

Параметры

hwnd[in]

Описатель окна, позиция которого изменяется

hWndInsertAfter[in, opt]

Либо дескриптор окна, которое предшествует окну hwnd в Z-последовательности, либо одно из значений перечисленных ниже.

HWND_BOTTOM - Помещает окно внизу Z-последовательности. Если параметр hwnd определяет системно модальное (topmost) окно, то оно теряет этот статус и располагается ниже других окон.

HWND_NOTOPMOST - поместить окно ниже всех системно-модальных (topmost) окон. Этот параметр игнорируется если окно не является системно-модальным окном.

HWND_TOP - Поместить окно на вершине Z-последовательности.

HWND_TOPMOST - Поместить окно над всеми окнами, не являющимися системно-модальными (topmost) окнами. Окно сохраняет эту позицию даже когда становится не активным.

X[in]

Новая горизонтальная координата окна в клиентской системе координат.

Y[in]

Новая вертикальная координата окна в клиентской системе координат

cx[in]

Новая ширина окна в пикселях

cy[in]

Новая высота окна в пикселях

uFlags[in]

Набор флагов. Этот параметр представляет собой комбинацию перечисленных флагов, перечисленных здесь.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

int main(int argc, char *argv[])

{

HWND hwnd=NULL;

//Ищем главное окно калькулятора

hwnd = FindWindow("SciCalc", NULL);

if(!hwnd){

printf("calc is not run\n");

getch();

return 0;

}

//Изменяем позицию окна калькулятора

SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE);

getch();

return 0;

}

В результате работы этой программы окно калькулятора будет перемещено в левый верхний угол экрана и станет окном верхнего уровня.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


SetWindowText

Устанавливает новый заголовок заданного окна.

Прототип

BOOL WINAPI SetWindowText(

_In_ HWND hWnd,

_In_opt_ LPCTSTR lpString

);

Параметры

hWnd[in]

Описатель окна, заголовок которого мы изменяем.

lpString

Строка с новым заголовком окна.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

int main(int argc, char *argv[])

{

HWND hwnd=NULL;

//Ищем главное окно калькулятора

hwnd = FindWindow("SciCalc", NULL);

if(!hwnd){

printf("calc is not run\n");

getch();

return 0;

}

//Устанавливаем новый заголовок окна

SetWindowText(hwnd, "New title");

getch();

return 0;

}

В результате работы этой программы окно стандартного калькулятора Windows примет вид как на рисунке ниже:

Calc with new title

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | SetWindowTextA и SetWindowTextW


ShowOwnedPopups

Показывает или скрывает все всплывающие окна (pop-up windows), принадлежащие заданному окну.
Прототип

BOOL WINAPI ShowOwnedPopups(

_In_ HWND hWnd,

_In_ BOOL fShow

);

Параметры

hWnd[in]

Описатель окна, который владеет всплывающими окнами, которые мы хотим отобразить или скрыть.

fShow[in]

Если значение этого параметра равно TRUE, то все скрытые вспывающие окна будет отображены на экране. Если значение этого параметра равно FALSE, то все видимые всплывающие окна будут скрыты.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#include <windows.h>

int main()

{

//Находим главное окно калькулятора

HWND hwnd;

hwnd = FindWindow("SciCalc", NULL);

if(!hwnd) return -1;

//Вызываем функцию и выводим её результат

if(ShowOwnedPopups(hwnd,TRUE))

printf("success\n");

else

printf("fail\n");

getchar();

return 0;

}

Данная программа выводлит на экран сообщение "success".

Примечание

Данная функция показывает только те окна, которые были скрыты предыдущим вызовом функции ShowOwnedPopups. Например, если всплывающее окно было закрыто с помощью функции ShowWindow, то последующий вызов функции ShowOwnedPopups с параметром fShow равным TRUE не отобразит данное окно.

Заголовочный файл | 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


ShowWindowAsync

Изменяет видимость окна, созданного другим потоком.

Прототип

BOOL WINAPI ShowWindowAsync(

_In_ HWND hWnd,

_In_ int nCmdShow

);

Параметры

hWnd[in]

Описатель окна.

nCmdShow[in]

Задает новое состояние видимости окна. Возможные значения этого параметра приводились при описании функции ShowWindow.

Возвращаемое значение

Если окно было видимым, то возвращается ненулевое значение.

Если окно было невидимым, то возвращается нуль.

Пример использования

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

int main(int argc, char *argv[])

{

HWND hwnd=NULL;

//Ищем главное окно калькулятора

hwnd = FindWindow("SciCalc", NULL);

//Сворачиваем главное окно калькулятора

ShowWindowAsync(hwnd,SW_MINIMIZE);

return 0;

}

Примечание

Единственное отличие данной функции от функции ShowWindow состоит в том, что функция ShowWindowAsync возвращает управление не дожидаясь когда окно hWnd выполнит нужное действие.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


SoundSentry

Появилась в Windows Vista. Включает графический сигнал, оповещающий о воспроизведении звука.

Прототип

BOOL WINAPI SoundSentry(void);

Возвращаемое значение

Данная функция возвращает одно из значений перечисленных ниже.

TRUE - графический сигнал был или будет корректно отображен.

FALSE - ошибка не позволила отобразить сигнал.

Пример использования

#include <windows.h>

typedef BOOL (*FSOUNDSENTRY)(void);

FSOUNDSENTRY lpfSS;

int main()

{

//Находим адрес функции

HINSTANCE huser;

huser = LoadLibrary("user32.dll");

lpfSS = (FSOUNDSENTRY)GetProcAddress(huser,"SoundSentry");

//Вызываем функцию и выводим её результат

if(lpfSS){

if(lpfSS())

printf("success\n");

else

printf("fail\n");

}

getchar();

return 0;

}

Данная программа выводит на экран сообщение "fail". К сожалению, мне так и не удалось добиться корректного выполнения этой функции.

Примечание

Поведение графического сигнала можно настроить с помощью функции SystemParametersInfo с параметром SPI_SETSOUNDSENTRY.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


SwitchToThisWindow

Данная функция не предназначена для основного использования. Она может быть изменена или удалена в последующих версиях Windows.

Переключает фокус ввода на заданное окно и поднимает это окно на вершину Z последовательности.

Прототип

VOID WINAPI SwitchToThisWindow(

_In_ HWND hWnd,

_In_ BOOL fAltTab

);

Параметры

hWnd[in]

Описатель окна.

fAltTab[in]

Если значение этого параметра равно TRUE, то переключение на окно было осуществлено с использованием последовательности клавиш Alt/Ctrl + Tab. В противном случае значение этого параметра должно быть равно FALSE.

Пример использования

#include <windows.h>

//Прототип функции

typedef void (*SWITCHTOTHISWINDOW)(HWND,BOOL);

SWITCHTOTHISWINDOW lpfSTTW;

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Ищем главное окно калькулятора

HWND hwnd;

hwnd = FindWindow("SciCalc",NULL);

if(!hwnd) return;

//Находим адрес функции

HINSTANCE huser;

huser = GetModuleHandle("user32.dll");

lpfSTTW = (SWITCHTOTHISWINDOW)GetProcAddress(huser,"SwitchToThisWindow");

//Вызываем функцию

if(lpfSTTW)

lpfSTTW(hwnd,TRUE);

return 0;

}

В данном примере мы передаем фокус ввода калькулятору.

Примечание

Данная функция обычно вызывается для изменения Z-последовательности окон.

Данная функция не включалась в заголовочные файлы и библиотеки SDK до Windows XP Service Pack 1 (SP1) и Windows Server 2003. Если у вас нет заголовочного файла библиотеки импорта для этой функции вы можете вызвать эту функцию с помощью функций LoadLibrary и GetProcAddress.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


TileWindows

Упорядочивает в виде плитки заданные дочерние окна заданного родительского окна.

Прототип

WORD WINAPI TileWindows(

_In_opt_ HWND hwndParent,

_In_ UINT wHow,

_In_opt_ const RECT *lpRect,

_In_ UINT cKids,

_In_opt_ const HWND *lpKids

);

Параметры

hwndParent[in,opt]

Описатель родительского окна. Если значение этого параметра равно NULL, то в качестве родительского окна принимается окно рабочего стола (desktop window).

hHow[in]

Набор флагов. Данный параметр принимает одно из значений перечисленных ниже, возможно, в сочетании с флагом MDITILE_SKIPDISABLED, который исключает из упорядочивания недоступные дочерние MDI окна.

MDITILE_HORIZONTAL - окна упорядочиваются по горизонтали.

MDITILE_VERTICAL - окна упорядочиваются по вертикали.

lpRect[in,opt]

Указатель на структуру RECT, которая определяет прямоугольную область, в клиентских координатах, внутри которой располагаются упорядоченные окна. Если значение этого параметра равно NULL, то используется клиентская область родительского окна.

cKids[in]

Количество элементов в массиве lpKids. Значение этого параметра игнорируется если значение параметра lpKids равно NULL.

lpKids[in,NULL]

Массив описателей дочерних окон. Если заданное дочернее окно является окном верхнего уровня с установленным стилем WS_EX_TOPMOST или WS_EX_TOOLWINDOW, то оно не упорядочивается.

Возвращаемое значение

Количество упорядоченных окон.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

TileWindows(NULL,MDITILE_HORIZONTAL,NULL,0,NULL);

return 0;

}

Примечание

Вызов функции TileWindows приводит к тому, что все развёрнутые окна восстанавливаются в своих предыдущих размерах.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


UpdateLayeredWindow

Обновляет положение, размер, форму, содержимое и прозрачность слоистого окна.

Прототип

BOOL WINAPI UpdateLayeredWindow(

_In_ HWND hwnd,

_In_opt_ HDC hdcDst,

_In_opt_ POINT *pptDst,

_In_opt_ SIZE *psize,

_In_opt_ HDC hdcSrc,

_In_opt_ POINT *pptSrc,

_In_ COLORREF crKey,

_In_opt_ BLENDFUNCTION *pblend,

_In_ DWORD dwFlags

);

Параметры

hwnd[in]

Описатель слоистого окна. Слоистое окно - это окно с установленным стилем WS_EX_LAYERED.

Windows 8: стиль WS_EX_LAYERED поддерживается для окон верхнего уровня и для дочерних окон. Предыдущие версии Windows поддерживали данный стиль только для окон верхнего уровня.

hdcDst[in,opt]

Контекст устройства (DC) экрана. Он используется для подбора набора цветов при обновлении содержимого окна. Если значение параметра равно NULL, то будет использована палитра по умолчанию.

Если значение параметра hdcSrc равно NULL, то значение параметра hdcDst также должно быть равно NULL.

pptDst[in,opt]

Указатель на структуру POINT, которая определяет новое положение слоистого окна на экране. Если текущее положение окна остается без изменений, то значение данного параметра может быть равно NULL.

pSize[in,opt]

Указатель на структуру SIZE, которая определяет новые размеры слоистого окна. Если размер окна не изменяется, то значение этого параметра может быть равно NULL. Если значение параметра hdcSrc равно NULL, то значение параметра pSize также должно быть равно NULL.

hdcSrc[in,opt]

Описатель контекста устройства (DC), который определяет поверхность описывающую слоистое окно. Данный параметр может быть получен с помощью функции CreateCompatibleDC. Если форма и контекст отображения окна не изменяются, то данный параметр может быть равен NULL.

pptSrc[in,opt]

Указатель на структуру POINT, которая определяет положение слоя в контексте устройства. Если значение параметра hdcSrc равно NULL, то pptSrc также должен быть равен NULL.

crKey[in]

Цвет используемый при построении слоистого окна. Для формирования значения этого параметра может быть использован макрос RGB.

pBlend[in,opt]

Указатель на структуру BLENDFUNCTION, которая определяет значение прозрачности используемое при построении слоистого окна.

dwFlags[in]

Принимает одно из значений, перечисленных ниже.

ULW_ALPHA - использует структуру в параметре pBlend в качестве функции смешивания. Если режим монитора составляет 256 цветов или меньше, то эффект от этого флага будет таким же как и в случае применения флага ULW_OPAQUE.

ULW_COLORKEY - исползует значение параметра crKey для определения прозрачного цвета (transparency color).

ULW_OPAQUE - рисует непрозрачное слоистое око.

Если значение параметра hdcSrc равно NULL, то параметр dwFlags должен быть равен нулю.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Контекст устройства источника должен содержать поверхность, которая описывает видимое содержимое слоистого окна. Например, вы можете выбрать растровое изображение в контексте полученным с помощью функции CreateCompatibleDC.

Приложения должны вызвать функцию SetLayout для контекста hdcSrc для правильной установки режима зеркалирования (mirroring mode). Функция SetLayout корректно зеркалирует всё что отрисовывается в HDC при надлежащем сохранении символов и (дополнительно) направления растрового изображения. Это не изменяет изображения в битах независимого от оборудования растрового изображения (device-independent bitmap - DIB).

Функция UpdateLayeredWindow поддерживает отображение окон на экране. Окна расположенные под слоистым окном не должны перерисовывать себя из-за вызова UpdateLayeredWindow, так как система сама перерисует их. Такое поведение разрешает плавную анимацию слоистого окна.

Функция UpdateLayeredWindow всегда обновляет всё окно. Для обновления части окна используйте сообщение WM_PAINT и установите значение смешивания (blend value) с помощью функции SetLayeredWindowAttributes.

Для наилучшей производительности перерисовки слоистое окно и перекрытые им окна должны быть как можно меньше. Приложение должно также обработать сообщение и пересоздать своё слоистое окно при изменении глубины цвета.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


UpdateLayeredWindowIndirect

Появилась в Windows Vista. Обновляет положение, размер, форму, содержимое и прозрачность слоистого окна.

Прототип

BOOL WINAPI UpdateLayeredWindowIndirect(

_In_ HWND hwnd,

_In_ const UPDATELAYEREDWINDOWINFO *pULWInfo

);

Параметры

hwnd[in]

Описатель слоистого окна. Слоистое окно создается путем указания стиля WS_EX_LAYERED при создании окна функцией CreateWindowEx.

Windows 8: стиль WS_EX_LAYERED поддерживается как для окон верхнего уровня, так и для дочерних окон. Предыдущие версии Windows поддерживали данный стиль только для окон верхнего уровня.

pULWInfo

Указатель на структуру UPDATELAYEREDWINDOWINFO, которая содержит необходимую информацию об обновляемом окне.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Функция UpdateLayeredWindowIndirect похожа на функцию UpdateLayeredWindow, но использует структуру UPDATELAYEREDWINDOWINFO, содержащую ту информацию, которая передается в функцию UpdateLayeredWindow в виде параметров.

Функция UpdateLayeredWindowIndirect сохраняет на экране внешний вид окна. Окна, расположенные под слоистым окном не нуждаются в перерисовке после вызова функции UpdateLayeredWindowIndirect, так как система автоматически перерисует их. Это позволяет реализовать плавную анимацию слоистого окна.

Функция UpdateLayeredWindowIndirect всегда обновляет всё окно. Для обновления части окна используйте сообщение WM_PAINT и установите прозрачность с помощью функции SetLayeredWindowAttributes.

Для наиболее эффективного рисования слоистых окон и расположенных под ними окон, слоистые окна должны иметь как можно меньший размер. Приложения должны также обработать сообщение и пересоздать все свои слоистые окна при изменении глубины цвета экрана.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


UpdateWindow

Обновляет клиентскую область окна путем отправки окну сообщения WM_PAINT. Сообщение отправляется прямиком в оконную процедуру окна, минуя очередь сообщений.

Прототип

BOOL UpdateWindow(

_In_ HWND hWnd

);

Параметры

hWnd[in]

Описатель окна.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль.

Пример использования

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

int main(int argc, char *argv[])

{

HWND hwnd=NULL;

//Ищем главное окно калькулятора

hwnd = FindWindow("SciCalc", NULL);

//Обновляем окно калькулятора

UpdateWindow(hwnd);

return 0;

}

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


WindowFromPhysicalPoint

Появилась в Windows Vista. Возвращает описатель окна, внутри которого находится заданная физическая точка.

Прототип

HWND WINAPI WindowFromPhysicalPoint(

_In_ POINT Point

);

Параметры

Point[in]

Структура POINT, которая содержит физические координаты точки.

Возвращаемое значение

Описатель окна, который содержит заданную точку. Если такого окна не существует, то возвращается значение NULL.

Пример использования

#include <windows.h>

//Прототип функции

typedef __stdcall HWND(*WINDOWFROMPHYSICALPOINT)(POINT);

WINDOWFROMPHYSICALPOINT lpfWFPP;

int main()

{

//Находим адрес функции

HINSTANCE huser;

huser = LoadLibrary("user32.dll");

lpfWFPP = (WINDOWFROMPHYSICALPOINT)GetProcAddress(huser,"WindowFromPhysicalPoint");

//Вызываем функцию

POINT p = {100,100};

HWND hwnd = NULL;

if(lpfWFPP)

hwnd = lpfWFPP(p);

//Выводим результат

printf("%x\n",hwnd);

getchar();

return 0;

}

Примечание

Данная функция не возвращает описатели скрытых или недоступных окон, даже если заданная точка находится внутри такого окна.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll


WindowFromPoint

Возвращает описатель окна, внутри которого находится заданная точка.

Прототип

HWND WINAPI WindowFromPoint(

_In_ POINT Point

);

Параметры

Point[in]

Структура POINT, в которой содержатся координаты точки.

Возвращаемое значение

Описатель окна, внутри которого находится заданная точка. Если такого окна не существет, то возвращается значение NULL. Если точка расположена над статическим элементом управления (static text control), то возвращается описатель окна, расположенного под этим элементом управления.

Пример использования

#include <windows.h>

int main()

{

POINT p = {100, 100};

HWND hwnd = NULL;

hwnd = WindowFromPoint(p);

printf("%x\n",hwnd);

getchar();

return 0;

}

Примечание

Данная функция не возвращает дескрипторы скрытых или недоступных окон, даже если заданная точка расположена над таким окном. Для ничем не ограниченного поиска приложения должны использовать функцию ChildWindowFromPoint.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll


GetClassInfo

Возвращает информацию об оконном классе.

Функция GetClassInfo заменена функцией GetClassInfoEx. Вы можете по-прежнему использовать функцию GetClassInfo, но с помощью неё вы не сможете получить информацию о маленькой иконке класса (class small icon).

Прототип

BOOL WINAPI GetClassInfo(

_In_opt_ HINSTANCE hInstance,

_In_ LPCTSTR lpClassName,

_Out_ LPWNDCLASS lpWndClass

);

Параметры

hInstance[in,opt]

Описатель экземпляра приложения, который создал класс. Для получения информации о системном классе (например, кнопке или списке (list box)), установите значение этого параметра равным NULL.

lpClassName[in]

Наименование класса. Наименование должно сответствовать предварительно зарегистрированному классу, или классу, зарегистрированному вызовом функции RegisterClass или RegisterClassEx.

Так же данный параметр может быть атомом. В этом случае он должен являться атомом, созданным функцией RegisterClass или RegisterClassEx. Атом должен быть записан в младшее слово параметра lpClassName; старшее слово должно быть равно нулю.

lpWndClass[out]

Указатель на структуру WNDCLASS, в которую будет записана запрашиваемая информация о классе.

Возвращаемое значение

Ненулевое значение

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#include <windows.h>

int main()

{

WNDCLASS ClassInfo;

GetClassInfo(NULL,"Button",&ClassInfo);

printf("%s\n",ClassInfo.lpszClassName);

getchar();

return 0;

}

Заголовочный файл | winuser.h (включен в Windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | GetClassInfoA и GetClassInfoW


GetClassInfoEx

Возвращает информацию об оконном классе, включая описатель маленькой иконки оконного класса. Функция GetClassInfo не возвращает описатель маленькой иконки.

Прототип

BOOL WINAPI GetClassInfoEx(

_In_opt_ HINSTANCE hinst,

_In_ LPCTSTR lpszClass,

_Out_ LPWNDCLASSEX lpwcx

);

Параметры

hinst[in, opt]

Описатель экземпляра приложения, который создал класс. Для получения информации о системном классе (например, кнопке или списке (list box)), установите значение этого параметра равным NULL.

lpszClass[in]

Наименование класса. Наименование должно сответствовать предварительно зарегистрированному классу, или классу, зарегистрированному вызовом функции RegisterClass или RegisterClassEx.

Так же данный параметр может быть атомом. В этом случае он должен являться атомом, созданным функцией RegisterClass или RegisterClassEx. Атом должен быть записан в младшее слово параметра lpszClass; старшее слово должно быть равно нулю.

lpwcx[out]

Указатель на структуру WNDCLASSEX, в которую будет записана запрошенная информация о классе.

Возвращаемое значение

Ненулевое значение

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#include <windows.h>

int main()

{

WNDCLASSEX ClassInfoEx;

GetClassInfoEx(NULL,"Button",&ClassInfoEx);

printf("%s\n",ClassInfoEx.lpszClassName);

getchar();

return 0;

}

Примечание

Атом класса создаётся функцией RegisterClass или RegisterClassEx, а не функцией GlobalAddAtom.

Заголовочный файл | winuser.h (включен в Windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | GetClassInfoExA и GetClassInfoExW


GetClassLong

Возвращает 32-разрядное значение из структуры WNDCLASSEX заданного окна.

Если вы запрашиваете указатель или описатель, то имейте в виду, что эта функция заменяется функцией GetClassLongPtr (Указатели и описатели являются 32-разрядными на 32-разрядной Windows и 64-разрядными на 64-разрядной Windows).

Прототип

DWORD WINAPI GetClassLong(

_In_ HWND hWnd,

_In_ int nIndex

);

Параметры

hWnd[in]

Описатель окна, информацию об оконном классе которого мы запрашиваем.

nIndex[in]

Значение, которое мы запрашиваем. Для получения значения из дополнительной памяти класса укажите в этом параметре положительное смещение запрашиваемого значения. Смещение первого числа равно нулю. Допустимые значения смещения находятся в интервале от нуля до размера, в байтах, дополнительной памяти класса минус 4. Например, если вы задали размер дополнительной памяти равным 12 или более байт, то смещение 8 соответствует третьему целому числу в этой памяти.

Для получения других значений из WNDCLASSEX используйте значения nIndex, перечисленные здесь.

Возвращаемое значение

Запрошенное значение.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#include <windows.h>

int main()

{

//Находим главное окно калькулятора

HWND hwnd;

hwnd = FindWindow("SciCalc",NULL);

if(!hwnd) return -1;

//Запрашиваем информацию об оконном классе

DWORD dw = 0;

dw = GetClassLong(hwnd,GCL_HBRBACKGROUND);

//Выводим полученную информацию

printf("%x\n",dw);

getchar();

return 0;

}

Примечание

Для резервирования дополнительной памяти класса укажите ненулевое значение в поле cbClsExtra структуры WNDCLASSEX во время использования функции RegisterClassEx.

Функция GetClassLongPtr является документированной функцией и описана в msdn. Согласно msdn данная функция экспортируется библиотекой user32.dll. Однако, при просмотре таблицы экспорта последней, найти там функцию GetClassLongPtr (или аналогичную ей) не удалось.

Заголовочный файл | winuser.h (включен в Windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | GetClassLongA и GetClassLongW


GetClassName

Возвращает наименование оконного класса для заданного окна.

Прототип

int WINAPI GetClassName(

_In_ HWND hWnd,

_Out_ LPTSTR lpClassName,

_In_ int nMaxCount

);

Параметры

hWnd[in]

Описатель окна, наименование оконного класса которого мы запрашиваем.

lpClassName[out]

Адрес буфера, в который будет записана строка с именем класса.

nMaxCount[in]

Длина, в символах, буфера lpClassName. Данный буфер должен быть достаточно большим для того, чтобы вместить завершающий NULL символ; если это не так, то строка с именем оконного класса обрезается до nMaxCount-1 символов.

Возвращаемое значение

Количество символов, записанных в буфер lpClassName без учета завершающего NULL символа.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#include <windows.h>

#define SIZE_BUFFER 20

int main()

{

//Находим окно калькулятора

HWND hwnd;

hwnd = FindWindow("SciCalc",NULL);

if(!hwnd) return -1;

//Получаем тип окна

char ClassName[SIZE_BUFFER];

GetClassName(hwnd,ClassName,SIZE_BUFFER);

//Выводим тип окна

printf("%s\n",ClassName);

getchar();

return 0;

}

Заголовочный файл | winuser.h (включен в Windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | GetClassNameA и GetClassNameW


GetClassWord

Возвращает 16-разрядное значение, хранящееся по заданому смещению в дополнительной памяти класса, на основе которого было создано заданное окно.

Использование данной функции не одобряется при значении параметра nIndex отличного от GCW_ATOM. Данная функция поддерживается только для совместимости с 16-разрядными версиями Windows. Приложения должны использовать функцию GetClassLongPtr.

Прототип

WORD WINAPI GetClassWord(

_In_ HWND hWnd,

_In_ int nIndex

);

Параметры

hWnd[in]

Описатель окна, созданного на основе нужного нам оконного класса.

nIndex[in]

Смещение запрашиваемого значения в дополнительной памяти класса. Смещение первого числа равно нулю. Допустиыме значения смещения находятся в интервале от нуля до размера дополнительной памяти класса, в байтах, минус два. Например, если вы задали размер дополнительной памяти равным 10 или более байт. То значение восемь является смещением пятого 16-разрядного числа, хранящегося в этой памяти. Существует дополнительное допустимое значение, предусмотренное для этого параметра.

GCW_ATOM - возвращает значение атома идентифицирующего оконный класс. Это тот же самый атом, который возвращают функции RegisterClass и RegisterClassEx.

Возвращаемое значение

Запрошенное 16-разрядное значение.

Возвращаемое значение в случае ошибки

Нуль. Получить дополнительную информацию об ошибке можно с помощью функции GetLastError.

Пример использования

#include <windows.h>

int main()

{

//Находим главное окно калькулятора

HWND hwnd;

hwnd = FindWindow("SciCalc",NULL);

if(!hwnd) return -1;

//Запрашиваем информацию об оконном классе

WORD dw = 0;

dw = GetClassWord(hwnd,GCW_ATOM);

//Выводим полученную информацию

printf("%x\n",dw);

getchar();

return 0;

}

Примечание

Для резервирования дополнительной памяти класса укажите ненулевое значение в поле cbClsExtra структуры WNDCLASS перед вызовом функции RegisterClass.

Функция GetClassLongPtr является документированной функцией и описана в msdn. Согласно msdn данная функция экспортируется библиотекой user32.dll. Однако при просмотре таблицы экспорта последней, найти там функцию GetClassLongPtr (или аналогичную ей) не удалось.

Заголовочный файл | Winuser.h (включен в Windows.h)
Экспортирующая библиотека | User32.dll


RealGetWindowClass

Возвращает строку, которая определяет тип окна.

Прототип

UINT WINAPI RealGetWindowClass(

_In_ HWND hwnd,

_Out_ LPTSTR pszType,

_In_ UINT cchType

);

Параметры

hwnd[in]

Описатель окна, тип которого мы определяем.

pszType[out]

Указатель на строку, в которую будет записан тип окна.

cchType[in]

Длина, в символах, буфера pszType.

Возвращаемое значение

Количество символов, записанных в буфер pszType.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#include <windows.h>

#define SIZE_BUFFER 20

int main()

{

//Находим окно калькулятора

HWND hwnd;

hwnd = FindWindow("SciCalc",NULL);

if(!hwnd) return -1;

//Получаем тип окна

char ClassName[SIZE_BUFFER];

RealGetWindowClass(hwnd,ClassName,SIZE_BUFFER);

//Выводим тип окна

printf("%s\n",ClassName);

getchar();

return 0;

}

При этом програма выводит строку "#32770".

Примечание

В msdn говорится, что библиотека user32.dll экспортирует только Unicode версию этой функции (RealGetWindowClassW). Однако, просмотр таблицы экспорта этой библиотеки показывает, что она экспортирует обе функции (RealGetWindowClassW и RealGetWindowClassA).

В отличие от функции GetClassName данная функция возвращает наименование базового класса для вышестоящего класса окна (base class for superclassed windows).

Заголовочный файл | Winuser.h (включен в Windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | RealGetWindowClassW(Unicode)


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


SetClassLong

Заменяет заданное 32-разрядное значение в дополнительной памяти класса или в структуре WNDCLASSEX для оконного класса заданного окна.

Данная функция заменяется функцией SetClassLongPtr. Для написания кода совместимого с 32-разрядными и 64-разрядными версиями Windows используйте функцию SetClassLongPtr.

Прототип

DWORD WINAPI SetClassLong(

_In_ HWND hWnd,

_In_ int nIndex,

_In_ LONG dwNewLong

);

Параметры

hWnd[in]

Описатель окна, в информацию об оконном классе которого мы вносим изменения.

nIndex[in]

Заменяемое значение. Для изменения значения, хранящегося в дополнительной памяти класса, укажите в этом параметре положительное смещение изменяемого значения. Смещение первого числа равно нулю. Допустиыме значения смещения находятсяв интервале от нуля до размера дополнительной памяти, в байтах, минус 4. Например, если вы задали размер дополнительной памяти равным 12 или более байт, то смещение 8 определяет третье 32-разрядное число в этой памяти.

Для изменения других значений из структуры WNDCLASSEX укажите в этом параметре одно из значений, перечисленных здесь.

dwNewLong[in]

Новое значение, которое будет записано в дополнительную память класса или в структуру WNDCLASSEX.

Возвращаемое значение

Предыдущее значение, на место которого было записано значение dwNewLong. Если изменяемое значение ранее не устанавливалось, то функция возвращает значение нуль.

Возвращаемое значение в случае ошибки

Нуль. Получить дополнительную информацию об ошибке можно с помощью функции GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Если вы используете функцию SetClassLong с параметром GCL_WNDPROC для изменения оконной процедуры, то новая оконная процедура должна соответствовать требованиям, указанным в описаннии оконной процедуры.

Функция SetClassLong с параметром GCL_WNDPROC создаёт производный класс по отношению к оконному классу. Это оказывает влияние на все окна, создаваемые впоследствии на основе измененного класса. Приложение может создавать производные классы от системных классов, но не должно создавать производные классы от классов, созданных в другом процессе.

Для резервирования дополнительной памяти класса укажите ненулевое значение в поле cbClsExtra структуры WNDCLASSEX перед вызовом функции RegisterClassEx.

Используйте функцию SetClassLong с отсрожностью. Например, с помощью этой функции можно изменить цвет фона для класса, но это изменение не приведет к немедленной перерисовке всех окон, созданных на основе данного класса.

Функция SetClassLongPtr является документированной функцией и описана в msdn. Согласно msdn данная функция экспортируется библиотекой user32.dll. Однако, при просмотре таблицы экспорта последней, найти там функцию SetClassLongPtr (или аналогичную ей) не удалось.

Заголовочный файл | winuser.h (включен в Windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | SetClassLongA и SetClassLongW


SetClassWord

Замещает 16-разрядное значение, хранящееся по заданному смещению в дополнительной памяти класса, на основе которого было создано заданное окно.

Данная функция поддерживается только для совместимости с 16-разрядными версиями Windows. Приложения должны использовать функцию SetClassLong.

Прототип

WORD WINAPI SetClassWord(

_In_ HWND hWnd,

_In_ int nIndex,

_In_ WORD wNewWord

);

Параметры

hWnd[in]

Описатель окна, построенного на основе оконного класса, дополнительную память которого мы хотим изменить.

nIndex[in]

Смещение значение, которое мы хотим изменить. Смещение первого элемента равно нулю. Допустимые значения находятся в интервале от нуля до размера дополнительной памяти класса, в байтах, минус два. Например, если вы задали размер дополнительной памяти равным 10 или более байт, то значение этого параметра равное 8 является смещением пятого 16-разрядного значения в этой памяти.

wNewWord[in]

Новое значение, записываемое поверх старого.

Возвращаемое значение

Предыдущее значение, на место которого было записано значение wNewWord. Если изменяемое значение ранее не устанавливалось, то функция возвращает значение нуль.

Возвращаемое значение в случае ошибки

Нуль. Получить дополнительную информацию об ошибке можно с помощью функции GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Для резервирования дополнительной памяти класса укажите ненулевое значение в поле cbClsExtra структуры WNDCLASS перед вызовом функции RegisterClass.

Заголовочный файл | Winuser.h (включен в Windows.h)
Экспортирующая библиотека | User32.dll


UnregisterClass

Снимает с регистрации зарегистрированный ранее оконный класс.

Прототип

BOOL WINAPI UnregisterClass(

_In_ LPCTSTR lpClassName,

_In_opt_ HINSTANCE hInstance

);

Параметры

lpClassName[in]

Строка с наименованием оконного класса, который нужно снять с регистрации.

hInstance[in, opt]

Дескриптор модуля, в котором был зарегистрирован оконный класс, снимаемый с регистрации.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Получить дополнительную информацию об ошибке можно с помощью функции GetLastError.

Пример использования

Смотри в примере оконного приложения.

Заголовочный файл | Winuser.h (включен в Windows.h)
Экспортирующая библиотека | User32.dll
ANSI и Unicode наименования | UnregisterClassA и UnregisterClassW


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

Описывает элемент управления автоматический переключатель (automatic radio button). Данный элемент управления обеспечивает взаимное исключение выбора с другими элементами управления того же типа. При выборе элемента управления, приложению отправляется уведомление 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.


BITMAP

Описывает растровое изображение, которое приложение отображает на экране, в пункте меню или в отдельном элементе управления.

nameID BITMAP filename

nameID

Уникальное наименование или 16-разрядное беззнаковое целое задающее ресурс.

filename

Наименование файла, содержащего ресурс. Оно должно содержать корректный путь к файлу. Если файл располагается не в текущем рабочем каталоге, то наименование должно содержать полный путь к файлу. Путь должен быть заключен в кавычки.

В целях обратной совместимости поддерживаются некоторые дополнительные атрибуты.

Пример, приведенный ниже, описывает два растровых изображения.

disk1 BITMAP "disk.bmp"

12 BITMAP "diskette.bmp"


CAPTION

Описывает текст заголовка диалогового окна. По умолчанию он пустой.

CAPTION "captiontext"

captiontext

Строка символов, заключенная в двойные кавычки (").

Ниже приводится пример использования.

CAPTION "Error!"


CHARACTERISTICS

Описывает информацию о ресурсе, которая может быть использована утилитами чтения и записи файлов, содержащих ресурсы. Заданное значение типа DWORD хранится вместе с ресурсом в скомпилированном res файле. Тем не менее, данное значение не сохраняется в исполняемом файле и не используется системой.

Объявление CHARACTERISTICS используется внутри таких ресурсов, как: ACCELERATORS, DIALOG, MENU, RCDATA и STRINGTABLE. Заданное значение используется только для ресурса, внутри которого оно объявлено.

CHARACTERISTICS dword

dword

Определенное пользователем значение типа DWORD.


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.


CLASS

Описывает класс диалогового окна.

Данное объявление указывается в опциональной секции перед началом объявления DIALOG. Если класс не указан, то используется стандартный диалоговый класс.

CLASS class

class

16-битное беззнаковое целое или строка, заключеная в двойные кавычки ("), описывающие класс диалогового окна. Если оконная процедура класса не обрабатывает отправленное ему сообщение, оно должно вызвать функцию DefDlgProc для обеспечения того, что все сообщения диалогового окна будут правильно обработаны. Закрытый класс может использовать функцию DefDlgProc в качестве оконной процедуры по умолчанию. Класс должен быть зарегистрирован, путём указания в поле cbWndExtra структуры WNDCLASS значения DLGWINDOWEXTRA.

Объявление CLASS должно использоваться только в особых случаях, так как оно отменяет стандартную обработку диалоговых окон. Объявление CLASS конвертирует диалговое окно в окно заданного класса; в зависимости от класса, это может привести к нежелательным результатам. Не используйте в этом определении переопределенные классы элементов управления.

Ниже приводится пример использования этого объявления.

CLASS "myclass"


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 задает высоту комбинированного списка с полностью раскрытым списком.


CONTROL

Описывает определенный пользователем элемент управления.

CONTROL text, id, class, style, x, y, width, height [, extended-style]

class

Предопределенное наименование, или 16-битное беззнаковое целое значение, описывающее класс. Это может быть один из классов элементов управления, перечисленных ниже. Если класс задается в виде строки, то она должна заключаться в двойные кавычки ("").

style

Предопределенное наименование или целое число, задающее стиль элемента управления. Точное значение этого параметра зависит от класса элемента управления.

Шесть допустимых классов элементов управления перечислены ниже.

Button (кнопка)

Небольшое прямоугольное дочернее окно, которое пользователь может включать или выключать путём наджатия на него кнопкой мыши. Кнопка может использоваться самостоятельно или быть частью группы. На кнопке может отображаться текст, или же кнопка может быть без текста. Кнопка обычно меняет своё отображение когда пользователь нажимает на неё.

Combo Box (комбинированный список)

Комбинированный список состоит из поля выбора, аналогичному элементу управления "поле ввода" и списка. Список может отобрпадаться постоянно или же может раскрываться когда пользователь нажимает на кнопку в поле выбора комбинированного списка.

В зависимости от стиля комбинированного списка пользователь может или не может редактировать содержимое поле выбора. Если на экране отображается список, вводимые символы будут приводить к выделению элемента списка, начинающегося с тех же символов. С другой стороны, выбор элемента списка приведет к его отображению в поле выбора.

Edit (поле ввода)

Прямоугольное дочернее окно в которое пользователь может вводить текст. Пользователь устанавливает фокус ввода путём щелчка мышью на этом окне или же нажатием на клавишу TAB. Пользователь может вводить текст когда элемент управления отображает точку вставки (insertion point). Мышь может использоваться для перемещения курсора, выделения замещаемых символов, или позиционирования курсора для последующей вставки символов. Для удаления символов может использоваться клавиша BACKSPACE.

Элемент управления использует моноширинный шрифт и отображает символы Unicode. Они раскрывают символы табуляции в такое количество символов, которое необходимо для перемещения курсора в следующую позицию табуляции (tab stop). Позиция табуляции располагается через каждые 8 символов.

List Box (список)

Элемент управления состоит из списка строк символов. Он используется когда приложению нужно отобразить список имен, таких как имен файлов, которые пльзователь может просматривать и выбирать. Пользователь может выбрать строку путём наведения на неё курсора мыши с последующим нажатием на кнопку мыши. При выборе строки, она подсвечивается, а родительскому окну отправляется уведомительное сообщение. Для просмотра слишком длинного или слишком широкого списка может использоваться полоса прокрутки (scroll bar).

Scroll bar (полоса прокрутки)

Прямоугольник, содержащий "ползунок" и стрелки направления в обоих концах. Элемент управления отправляет родительскому окну уведомительное сообщение когдла пользователь щелкает мышью на элементе управления. Родитель ответственен за обновление положения "ползунка", если оно необходимо. Элемент управления имеет такое же отображение и назначение, что и полосы прокрутки в обычных окнах. Но, в отличие от последних, элемент управления может располагаться где угодно в пределах окна ииспользоваться когда угодно для обеспечения прокрутки ввода в окно.

Static (статический элемент управления)

Статический элемент управления - это простое текстовое поле и прямоугольник, используемые для маркирования или разделения других элементов управления. Он не имеет ввода и не предоставляет вывода.


CTEXT

Описывает элемент управления "выровненный по центру текст". Это простой прямоугольник, отображающий заданный текст, выровненный по центру прямоугольника. Текст форматируется до отображения. Слова, не умещающиеся в строке автоматичесски переносятся на новую строку. Слова, длина которых превышает ширину элемента управления, обрезаются.

CTEXT text, id, x, y, width, height [, style [, extended-style]]

text

Текст, размещаемый по центру элемента управления.

style

Стили элемента управления. Представляет собой комбинацию следующих стилей: SS_CENTER, WS_TABSTOP и WS_GROUP.

Если стиль не задан, то используется комбинация: SS_CENTER | WS_GROUP.

Пример ниже демонстрирует элемент управления, отображающий текст "Filename".

CTEXT "Filename", 101, 10, 10, 100, 100


CURSOR

Описывает растровое изображение, которое описывает форму курсора или анимированного курсора на экране.

nameID CURSOR filename

nameID

Уникальное имя или 16-битное беззнаковое целое идентифицирующее ресурс.

filename

Наименование файла, содержащего ресурс. Имя должно быть правильным; это должен полный путь к файлу, если последний расположен не в текущем рабочем каталоге. Имя представляется в виде взятой в кавычки строки.

Ресурсы иконки и курсора могут содержать несколько изображений.


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.


DIALOG

Описывает диалоговое окно. Данное объявление задает положение и размеры диалогового окна на экране, а также стили диалогового окна.

Объявление DIALOG устарело. Новые приложения должны использовать объявление DIALOGEX.

nameID DIALOG x, y, width, height [optional-statements] {control-statement . . . }

nameID

Уникальное наименование или уникальное 16-разрядное беззнаковое целое, идентифицирующее диалогового окно.

optional-statements

Дополнительные настройки диалогового окна. Представляют собой серию объявлений перечисленных ниже.

CAPTION - заголовок диалогового окна, если оно имеет область заголовка.

CHARACTERISTICS - определенное пользователем значение типа DWORD, используемое утилитами работающими с ресурсами. Данное значение системой не используется.

CLASS - 16-разрядное беззнаковое целое или строка, заключенная в двойные кавычки ("), идентифицирующие класс диалогового окна.

EXSTYLE - расширенные оконные стили диалогового окна.

FONT - шрифт текста и его размер в пунктах.

LANGUAGE - язык диалогового окна.

MENU menuname - используемое меню. В данном объявлении задается наименование меню или его целочисленный идентификатор.

STYLE - стили диалогового окна.

VERSION - определенное пользователем значение типа DWORD. Данное объявление используется утилитами работы с ресурсами и не используется системой.

В целях обратной совместимости также поддерживаются некоторые устаревшие настройки.

Функция GetDialogBaseUnits возвращает размер шаблонных единиц (dialog base units) в пикселях. Точное значение координат зависит от стилей, заданных в объявлении STYLE. Для дочерних диалоговых окон, если не задан стиль DS_ABSALIGN, координаты отсчитываются относительно родительского окна. Если же данный стиль определен, то координаты отсчитываются от экрана.

Не используйте стиль WS_CHILD для модальных диалоговых окон. Функция DialogBox всегда отключает отношение родитель/владелец для создаваемых диалоговых окон. Когда родительское окно недоступно, его дочерние окна также недоступны. Поскольку родительское окно диалогового окна недоступно, то и само диалоговое окно недоступно.

Если у диалогового окна усановлен стиль DS_ABSALIGN, координаты его левого верхнего угла задаются в экранных координатах, а не относительно левого верхнего угла родительского окна. Вы должны использовать этот стиль когда желаете, диалоговое окно появлялось в заданном месте экрана вне зависимости от расположения на экране родительского окна.

Наименование DIALOG также может быть использовано в функции CreateWindow для создания окна, имеющего атрибуты диалогового окна.

Пример ниже демонстрирует использование объявления DIALOG.

#include <windows.h>

ErrorDialog DIALOG 10, 10, 300, 110

STYLE WS_POPUP | WS_BORDER

CAPTION "Error!"

{

CTEXT "Select One:", 1, 10, 10, 280, 12

PUSHBUTTON "&Retry", 2, 75, 30, 60, 12

PUSHBUTTON "&Abort", 3, 75, 50, 60, 12

PUSHBUTTON "&Ignore", 4, 75, 80, 60, 12

}


DIALOGEX

Описывает диалоговое окно. Данное объявление задает положение и размеры диалогового окна а также его стили. С помощью него также можно задать:

· идентификаторы помощи (help IDs) диалогового окна и его элементов управления;
· используемые расширенные стили (EXSTYLE) для диалогового окна и его элементов управления;
· настройки насыщенности и курсивного начертания шрифта, используемого в диалоговом окне;
· специфичные для элементов управления данные;
· использование предопределенных системных классов BEDIT, IEDIT и HEDIT.

nameID DIALOGEX x, y, width, height [ , helpID] [optional-statements] {control-statements}

nameID

Уникальное наименование или уникальное 16-разрядное целое, идентифицирующее диалоговое окно.

x

Координата по горизонтали левого края диалогового окна, в шаблонных единицах.

y

Координата по вертикали верхнего края диалогового окна, в шаблонных единицах.

width

Ширина диалогового окна, в шаблонных единицах.

height

Высота диалогового окна, в шаблонных единицах.

helpID

Числовое выражение (ID), используемым для идентификации диалогового окна при обработке сообщения WM_HELP.

optional-statements

Дополнительные настройки диалогового окна. Здесь могут задаваться следующие настройки.

CAPTION - заголовок диалогового окна, если у него есть область заголовка.

CHARACTERISTICS - определенное пользователем значение типа DWORD, используемое утилитами работы с ресурсами. Система его не использует.

CLASS - 16-рязрядное беззнаковое целое или заключенная в двойные кавычки строка, идентифицирующая класс диалогового окна.

EXSTYLE - расширенные оконные стили диалогового окна.

FONT - шрифт текста и его размер в пунктах. Для параметра weight настройки используйте значения FW_* определенные в заголовочном файле WinGDI.h (они перечислены здесь). Для параметра italic используйте значение TRUE для курсивного начертания, или же значение FALSE для обычного начертания. Для параметра charset используйте значение поля lfCharSet структуры LOGFONT. Для определения собственного шрифта, приложение должно задать набор символов (charset) вместе с другими свойствами шрифта.

LANGUAGE - язык диалогового окна.

MENU - используемое меню. В данном объявлении задается наименование меню или его целочисленный идентификатор.

STYLE - стили диалогового окна.

VERSION - определенное пользователем значение типа DWORD. Данная настройка используется утилитами работы с ресурсами и не используется системой.

control-statements

Тело ресурса DIALOGEX, состоящее из ряда объявлений элементов управления. Существует 4 семейства элементов управления: основные, статические, кнопки и поля ввода. Они описаны ниже.

В целях обратной совместимости также поддерживаются некоторые устаревшие настройки.

В числовых выражениях объявлений внутри DIALOGEX могут использоваться следующие операции:

· сложение ("+");
· вычитание ("-");
· унарный минус ("-");
· унарное отрицание ("~");
· поразрядный И ("&");
· поразрядный ИЛИ ("|").

Тело ресурса состоит из объявлений элементов управления. Данные объявления условно можно разделить на 4 семейства: основные, статические, кнопки и поля ввода. В то время как каждое из этих семейств использует свой синтаксис для описания отдельных свойств элементов управления, все они имеют общий синтаксис для описания положения, размера, расширенных стилей, идентификационного номера помощи и ассоциированных с элементом управления данных.

Основной элемент управления

CONTROL controlText, id, className, style

controlText

Текст в окне элемента управления.

id

Идентификатор элемента управления.

className

Наименование класса. Это может быть заключенная в двойные кавычки строка или один из предопределенных системных классов: BUTTON, STATIC, EDIT, LISTBOX, SCROLLBAR или COMBOBOX.

style

Оконные стили (могут быть использованы значения WS_*, BS_*, SS_*, ES_*, LBS_*, SBS_* и CBS_* определенные в заголовочном файле Winuser.H.).

Статические элементы управления

staticClass controlText, id

staticClass

LTEXT, RTEXT или CTEXT.

controlText

Текст в элементе управления.

id

Идентификатор элемента управления.

Кнопка

buttonClass controlText, id

buttonClass

AUTO3STATE, AUTOCHECKBOX, AUTORADIOBUTTON, CHECKBOX, PUSHBOX, PUSHBUTTON, RADIOBUTTON, STATE3 или USERBUTTON.

controlText

Текст в элементе управления.

id

Идентификатор элемента управления.

Поле ввода

editClass id

editClass

EDITTEXT, BEDIT, HEDIT или IEDIT.

id

Идентификатор элемента управления.


EDITTEXT

Описывает элемент управления поле ввода, являющееся окном класса EDIT. Он создает прямоугольную область, в которую пользователь может вводить и редактировать текст. Когда пользователь щелкает мышью внутри него элемента управления, последний отображает курсор. Пользователь может использовать клавиатуру для ввода или редактирования имеющегося в элементе управления текста. Он может пользоваться клавишами BACKSPACE и DELETE. Также он может использовать мышь для выделения удаляемых символов или для указания места вставки новых символов.

EDITTEXT id, x, y, width, height [, style [, extended-style]]

style

Стили элемента управления. Это поле может содержать комбинацию стилей класса edit и следующих стилей: WS_TABSTOP, WS_GROUP, WS_VSCROLL, WS_HSCROLL и WS_DISABLED.

Если стиль не задан, то используется комбинация: ES_LEFT | WS_BORDER | WS_TABSTOP.

Пример ниже демонстрирует использование объявления EDITTEXT.

EDITTEXT 3, 10, 10, 100, 10


EXSTYLE

Описывает расширенные оконные стили для диалогового окна. При описании ресурса, объявление EXSTYLE располагается в опциональной части до начала тела ресурса.

EXSTYLE extended-style

extended-style

Расширенные оконные стили для диалогового окна или элемента управления. Расширенные оконные стили перечислены здесь.

Для элементов управления расширенные стили задаются после опции style в объявлении элемента управления. Более подробно смотрите в описании ресурса отдельных элементов управления.


FILE

Частный случай ресурса. Описывает файл, включаемый в качестве ресурса в исполняемый модуль.

nameID FILE filename

nameID

Уникальное наименование или 16-разрядное беззнаковое целое, идентифицирующее ресурс.

filename

Путь к файлу, содержащему двоичные данные ресурса. Если файл находится не в текущем рабочем каталоге, то данный параметр должен содержать полный путь к файлу. Формат файла может быть любым. Компилятор ресурсов не анализирует содержимое файла.

Ниже приводится пример использования этого объявления.

0x100 FILE "MyFile.txt"


FONT

Описывает файл, содержащий шрифт.

nameID FONT filename

nameID

Уникальное 16-разрядное беззнаковое целое, идентифицирующее ресурс.

filename

Наименование файла, содержащего шрифт. Наименование должно быть корректным наименованием файла; оно должно содержать полный путь к файлу если он находится не в текущем рабочем каталоге. Путь должен записываться в виде заключенной в кавычки строки.

В целях обратной совместимости также поддерживаются некоторые устаревшие атрибуты.

Пример ниже демонстрирует описание одиночного ресурса шрифта.

5 FONT "cmroman.fnt"


FONT

Описывает шрифт, которым система будет отрисовывать текст в диалоговом окне. Шрифт дожен быть предварительно загружен, например, вызовом функции LoadResource.

FONT pointsize, "typeface", weight, italic, charset

pointsize

Размер шрифта, в пунктах.

typeface

Наименование начертания шрифта. Значение данного параметра должно быть заключено в кавычки.

weight

Насыщенность шрифта в диапазоне от нуля до 1000. Значение 400 соответствует нормальной насыщенности символов, значение 700 - полужирному начертанию. Если значение этого параметра равно нулю, то используется насыщенность по умолчанию. Предопределенные значения этого параметра перечислены здесь.

italic

Если значение этого параметра равно TRUE, то используется курсивное начертание.

charset

Набор символов. Данный параметр аналогичен полю lfCharSet структуры LOGFONT.

Пример ниже демонстрирует использование этого объявления.

FONT 12, "MS Shell Dlg"


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) перемещает фокус ввода на первый элемент внутри группы.


HTML

Описывает HTML файл.

nameID HTML filename

nameID

Уникальное наименование или 16-разрядное беззнаковое целое, идентифицирующее ресурс.

filename

Наименование HTML файла. Это может быть полный или относительный путь к файлу, если последний находится не в текущем каталоге. Путь представляется в виде строки заключенной в кавычки.

Пример ниже демонстрирует использование этого ресурса.

ID_RESPONSE_ERROR_PAGE HTML "res\\responseerorpage.htm"


ICON

Описывает растровое изображение, которое описывает форму иконки, используемой приложением или анимированной иконки.

nameID ICON filename

nameID

Уникальное наименование или 16-битное целое без знака, идентифицирующее ресурс.

filename

Наименование файла, содержащего ресурс. Это должно быть корректное имя файла. Если файл находится не в текущем каталоге, то имя должно содержать полный путь к файлу. Путь представляется в виде взятой в кавычки строки.


ICON

Описывает элемент управления иконка. Этот элемент управления задает иконку, отображаемую в диалоговом окне.

Объявление ICON используется внутри объявления DIALOGEX и описывает: идентификатор ресурса иконки, идентификатор элемента управления иконки, положение и другие атрибуты элемента управления.

ICON text, id, x, y [, width, height, style [, extended-style]]

text

Наименование иконки (не файла), также заданной в файле ресурсов.

width

Данное значение игнорируется и должно быть равно нулю.

height

Данное значение игнорируется и должно быть равно нулю.

style

Стили элемента управления. Данный параметр является дополнительным. В нём может быть определен только стиль SS_ICON. Это стиль по умолчанию, который используется вне зависимости от того, задали вы стиль или нет.

Пример ниже демонстрирует использование этого объявления.

ICON "myicon", 901, 30, 30


LANGUAGE

Описывает язык ресурсов до следующего объявления LANGUAGE или до конца файла.

Когда объявление LANGUAGE используется внутри объявления ACCELERATORS, DIALOGEX, MENU, RCDATA или STRINGTABLE, то объявленный язык используется только для данного ресурса.

LANGUAGE language, sublanguage

language

Идентификатор языка.

sublanguage

Идентификатор диалекта.


LISTBOX

Описывает элемент управления ListBox для диалогового или обычного окна. Данный элемент управления представляет собой список строк (таких, как имена файлов) из которого пользователь может выбирать одну или несколько строк.

Объявление LISTBOX может использоваться только внутри объявления DIALOGEX или DIALOG, задавая идентификатор, размеры и атрибуты окна элемента управления.

LISTBOX id, x, y, width, height [, style [, extended-style]]

style

Стили элемента управления. Значение данного параметра представляет собой комбинацию стилей окна класса ListBox и стилей: WS_BORDER и WS_VSCROLL.

Если стили явно не определены, то используется комбинация: LBS_NOTIFY | WS_BORDER.

Пример ниже демонстрирует использование этого объявления:

LISTBOX 101, 10, 10, 100, 100


LTEXT

Описывает элемент управления, представляющий собой простой прямоугольник отображающий заданный текст, выровненный по левому краю. Текст форматируется до отображения на экране. Слова, не помещающиеся в строке, автоматически переносятся на новую строку. Слова, длина которых, превышает ширину элемента управления, обрезаются.

Объявление LTEXT используется только внутри объявления DIALOGEX и задает текст, идентификатор, размеры и атрибуты элемента управления.

LTEXT text, id, x, y, width, height [, style [, extended-style]]

style

Стили элемента управления. Значение этого параметра представляет собой комбинацию стилей: SS_LEFT, WS_TABSTOP и WS_GROUP.

Если стили явно не заданы, то используется комбинация: SS_LEFT | WS_GROUP.

Пример ниже демонстрирует использование этого объявление.

LTEXT "Filename", 101, 10, 10, 100, 100


MANIFEST

Частный случай ресурса. Описывает манифест приложения.

nameID MANIFEST filename

nameID

Уникальное наименование или 16-разрядное беззнаковое целое, идентифицирующее ресурс.

filename

Путь к файлу, содержащему манифест. Если файл находится не в текущем рабочем каталоге, то данный параметр должен содержать полный путь к файлу. Манифест является xml файлом.

Ниже приводится пример использвания этого ресурса.

1 MANIFEST "Manifest.xml"

Вместо ключевого слова MANIFEST может быть явно указан тип ресурса - RT_MANIFEST.

Ниже приводится пример манифеста.

<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" />

</requestedPrivileges>

</security>

</trustInfo>

<dependency>

<dependentAssembly>

<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*" />

</dependentAssembly>

</dependency>

</assembly>


MENU

Описывает меню. Он содержит информацию об отображении и поведении меню приложения. Меню - это специальное средство ввода, которое позволяет пользователю выбрать команду и открыть подменю из списка пунктов меню.

menuID MENU [optional-statements] {item-definitions ... }

menuID

Идентификатор меню. Должно содержать уникальную строку или уникальное беззнаковое 16-разрядное целое в диапазоне от 1 до 65 535.

optional-statements

Данный параметр может содержать нуль, или одно из объявлений, перечисленных ниже.

CHARACTERISTICS - определенная пользователем информация о ресурсе, которая может быть использована утилитами, читающими и редактирующими ресурсы.

LANGUAGE - язык ресурса.

VERSION - определенный пользователем номер версии ресурса, который может быть использован утилитами, читающими и редактирующими ресурсы.

Также, в целях обратной совместимости, поддерживаются некоторые дополнительные атрибуты.

Пример ниже демонстрирует описание ресурса.

sample MENU

{

MENUITEM "&Soup", 100

MENUITEM "S&alad", 101

POPUP "&Entree"

{

MENUITEM "&Fish", 200

MENUITEM "&Chicken", 201, CHECKED

POPUP "&Beef"

{

MENUITEM "&Steak", 301

MENUITEM "&Prime Rib", 302

}

}

MENUITEM "&Dessert", 103

}


MENU

Описывает меню диалогового окна. Если данное объявление не указано, то у диалогового окна нет меню.

MENU menuname

menuname

Наименование или идентификатор используемого меню.

Ниже приводится пример использования данного объявления.

MENU errmenu


MENUEX

Описывает содержимое ресурса меню. Ресурс меню содержит информацию, задающую отображение и функциональность меню приложения. Меню - это специальное средство ввода, которое позволяет пользователю выбрать команду или открыть подменю в списке пунктов меню. Ресурс также описывает:

· идентификаторы помощи меню;
· идентификаторы меню;
· флаги типа (MFT_*) и состояния (MFS_*).

menuID MENUEX{ [{[MENUITEM itemText [,[id][, [type][, state]]]] |

POPUP itemText [,[id][, [type][, [state][, helpID]]]] { popupBody } } . . .]}

MENUITEM

Описывает пункт меню.

itemText

Строка содержащая текст пункта меню.

id

Числовое выражение, задающее идентификатор пункта меню

type

Числовое выражение, задающее тип пункта меню. Для использования предопределенных MFT_* значений, подкючите заголовочный файл winuser.h.

state

Числовое выражение, задающее состояние пункта меню. Для использования предопределенных MFS_* значений, подключите заголовочный файл winuser.h.

POPUP

Описывает пункт меню, имеющий ассоциированое с ним подменю.

itemText

Строка, содержащая текст пункта меню.

id

Числовое выражение, задающее идентификатор пункта меню.

type

Числовое выражение, задающее тип пункта меню. Для использования предопределенных MFT_* значений, подключите заголовочный файл winuser.h.

state

Числовое выражение, задающее состояние пункта меню. Для использования предопределенных MFS_* значений, подключите заголовочный файл winuser.h.

helpID

Числовое выражение, задающее идентификатор помощи, используемый при обработке сообщения WM_HELP.

popupBody

Содержит произвольную последовательность объявлений MENUITEM и POPUP.

В целях обратной совместимости, также поддерживаются некоторые дополнительные атрибуты.

В объявлении MENUEX допустимы арифметические и логические операции над числовыми выражениями. Допустимые операции перечислены ниже.

· сложение (+);
· вычитание (-);
· унарный минус (-);
· отрицание (~);
· И (&);
· ИЛИ (|).


MENUITEM

Описывает пункт меню.

MENUITEM text, result, [optionlist]

MENUITEM SEPARATOR

text

Наименование пункта меню.

Строка может содержать управляющие символы \t и \a. Символ \t вставляет в строку символ табуляции, он используется для выравнивания текста в колонках. Символы табуляции долны использоваться только в меню (menus), но не в полосках меню (menu bars). Символ \a выравнивает по правому краю весь текст, следующий за ним.

result

Число, задающее результат получаемое при выборе пользователем данного пункта. Данный параметр содержит целое число. Результаты пунктов меню - всегда целые числа; когда пользователь щелкает по пункту меню, результат отправляется окну, которому принадлежит меню.

optionlist

Отображение пункта меню. Данный необязательный параметр состоит из одного или нескольких флагов, разделенных запятыми или пробелами.

CHECKED - пункт меню имеет галочку выбора.

GRAYED - пункт меню изначально неактивен. Текст пункта меню имеет серый цвет или подсвещенный оттенок.

HELP - идентифицирует пункт помощи. Данный флаг никак не влияет на отображение пункта меню.

INACTIVE - пункт меню отображается, но не может быть выбран. Этот флаг не может использоваться совместно с флагом GRAYED.

MENUBARBREAK - аналогично MENUBREAK, но для выскакивающего (pop-up) меню. Он отделяет вертикальной линией новую колонку от старой.

MENUBREAK - располагает пункт меню на новой строке для статической полоски пунктов меню. Для меню, он располагает пункт в новой колонке без разделительной линии между колонками.

MENUITEM SEPARATOR

Форма использования объявления MENUITEM, при которой создается неиспользуемый пункт меню, который является разделительной полоской между двумя пунктами меню.

Ниже приводится пример использования объявления MENUITEM.

MENUITEM "&Roman", 206, CHECKED, GRAYED

MENUITEM SEPARATOR

MENUITEM "&Blackletter", 301


MESSAGETABLE

Описывает идентификатор и файл таблицы сообщений приложения. Таблица сообщений - это строковый ресурс используемый при журналирировании событий и функцией FormatMessage. Файл содержит двоичную таблицу сообщений, сгенерированную компилятором сообщений MC.EXE.

Компилятор сообщений также генерирует скриптовый файл ресурса, содержащий объявления MESSAGETABLE. Вы должны включить этот файл в своем файле ресурсов. Для его включения используйте директиву #include.

nameID MESSAGETABLE filename

nameID

Уникальное наименование или 16-разрядное беззнаковое целое, идентифицирующее ресурс.

filename

Наименование файла, содержащего ресурс. Наименование должно быть корректным наименованием файла; если файл находится не в текущем рабочем каталоге, то наименование должно содержать полный путь.

Пример ниже демонстрирует использование этого объявления.

1 MESSAGETABLE MSG00409.bin


POPUP

Описывает пункт меню, который может содержать другие пункты меню и подменю.

POPUP text, [optionlist] {item-definitions ...}

text

Строка, содержащая наименование меню. Данная строка должна быть заключена в двойные кавычки ("").

optionlist

Задает предопределенные опции меню, которые определяют отображение пункта меню. Этот параметр задается в виде набора флагов, перечисленных ниже.

CHECKED - пункт меню имеет галочку выбора. Данный флаг недопустим для пунктов меню верхнего уровня.

GRAYED - пункт меню изначально неактивен. Текст пункта меню имеет серый цвет или подсвещенный оттенок.

HELP - идентифицирует пункт помощи. Пункт меню размещается в крайним правым в строке меню (menu bar).

INACTIVE - пункт меню отображается, но не может быть выбран. Этот флаг не может использоваться совместно с флагом GRAYED.

MENUBARBREAK - аналогично MENUBREAK, но для выскакивающего (pop-up) меню. Он отделяет вертикальной линией новую колонку от старой.

MENUBREAK - располагает пункт меню на новой строке для статической полоски пунктов меню. Для меню, он располагает пункт в новой колонке без разделительной линии между колонками.

В целях обратной совместимости, поддерживаются некоторые дополнительные атрибуты.

Пример ниже демонстрирует использование объявления POPUP.

chem MENU

{

POPUP "&Elements"

{

MENUITEM "&Oxygen", 200

MENUITEM "&Carbon", 201, CHECKED

MENUITEM "&Hydrogen", 202

MENUITEM SEPARATOR

MENUITEM "&Sulfur", 203

MENUITEM "Ch&lorine", 204

}

POPUP "&Compounds"

{

POPUP "&Sugars"

{

MENUITEM "&Glucose", 301

MENUITEM "&Sucrose", 302, CHECKED

MENUITEM "&Lactose", 303, MENUBREAK

MENUITEM "&Fructose", 304

}

POPUP "&Acids"

{

"&Hydrochloric", 401

"&Sulfuric", 402

}

}

}


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.


RCDATA

Описывает "сырые" данные ресурса приложения. Ресурсы позволяют включать двоичные данные в исполняемом файле.

nameID RCDATA [optional-statements] {raw-data ...}

nameID

Уникальное наименование или 16-разрядное беззнаковое целое, идентифицирующее ресурс.

optional-statements

Значение данного параметра может быть равно нулю или перечисленными ниже объявлениями.

CHARACTERISTICS - определенная пользователем информация о ресурсе, которая может использоваться утилитами работающими с ресурсами.

LANGUAGE - язык ресурса.

VERSION - определенный пользователем номер версии ресурса, используемый утилитами, работающими с ресурсами.

raw-data

"Сырые" данные, состоящие из одного или нескольких целочисленных значений или строк символов. Целые числа могут задаваться в десятичной, восьмеричной или шестнадцатеричной системах счисления. В целях совместимости с 16-разрядными версиями Windows, целые числа сохраняются как значения типа WORD. Вы можете явно сохранять целые числа как значения типа DWORD путем определения целого числа с суффиксом "L".

Строки заключаются в кавычки. Компилятор ресурсов автоматически не добавляет завершающий NULL символ в конец строки. Каждая строка является последовательностью заданных ANSI символов, даже если вы явно определили их как Unicode строки.

Блок данных начинается на границе двойного слова, однако компилятор ресурсов не дополняет и не выравнивает данные внутри блока. Поэтому за выравниваем данных внутри блока вы должны следить самостоятельно.

Некоторые дополнительные атрибуты поддерживаются для обеспечения обратной совместимости.

Пример ниже демонстрирует использование объявления RCDATA.

resname RCDATA

{

"Here is an ANSI string\0",

L"Here is a Unicode string\0",

1024,

7L,

0x029a,

0o733,

}


RTEXT

Описывает элемент управления "текст выровненный по правому краю". Данный элемент управления представляет собой простой прямоугольник, отображающий заданный выровненный по правому краю текст. Текст форматируется до отображения на экране. Сова, которые выходят за границу строки автоматически переносятся на новую строку. Слова, длина которых превышает размер строки - обрезаются.

Объявление RTEXT может использоваться только внутри объявления DIALOGEX. Оно должно задавать текст, идентификатор, размеры и атрибуты лемента управления.

RTEXT text, id, x, y, width, height [, style [, extended-style]]

style

Набор стилей элемента управления. Представляет собой комбинацию флагов: WS_TABSTOP и WS_GROUP.

Если стиль явно не задан, то используется: SS_RIGHT | WS_GROUP.

Ниже приводится пример использования этого объявления.

RTEXT "Number of Messages", 4, 30, 50, 100, 10


SCROLLBAR

Описывает элемент управления "полоса прокрутки". Данный элемент управления состоит из ползунка и стрелок на концах полосы. Он отправляет своему родителю уведомительное сообщение всякий раз когда пользователь щелкает по нему мышью. Родительское окно должно обновить положение ползунка. Полосы прокрутки могут быть размещены в любом месте окна и предоставлять воможность ввода.

SCROLLBAR id, x, y, width, height [, style [, extended-style]]

style

Нуль или комбинация следующих флагов: WS_TABSTOP, WS_GROUP и WS_DISABLED.

Дополнительно к ним могут быть использованы стили оконного класса SCROLLBAR.

Если стиль явно не задан, то используется стиль SBS_HORZ.

Пример ниже демонстрирует использование этого объявления.

#define IDC_SCROLLBARV 1010

SCROLLBAR IDC_SCROLLBARV, 7, 55, 187, 44, SBS_VERT


STATE3

Описывает элемент управления флажок с тремя состояниями. Данный элемент управления аналогичен элементу управления CHECKBOX, за тем исключением, что он имеет три состояния: выбран, невыбран и неопределено.

STATE3 text, id, x, y, width, height [, style [, extended-style]]

text

Заголовок, который отображается справа от элемента управления.

style

Набор стилей элемента управления. Данное значение может быть комбинацией стиля BS_3STATE и стилей: WS_TABSTOP и WS_GROUP.

Если стиль не указан, то используется стиль по умолчанию: BS_3STATE|WS_TABSTOP.


STRINGTABLE

Описывает один или несколько строковых ресурсов приложения. Строковый ресурс является простой ANSI или Unicode строкой, завершающейся NULL символом, которая может быть загружена приложением из исполняемого файла с помощью функции LoadString.

Существует два способа записи объявления STRINGTABLE

STRINGTABLE [optional-statements] {stringID string ...}

и

STRINGTABLE

[optional-statements]

BEGIN

stringID string

. . .

END

optional-statements

Данный параметр может быть равен нулю или содержать объявления, приведенные ниже.

Объявление | Описание
CHARACTERISTICS dword | Определенная пользователем информация о ресурсе, которая может быть использована утилитами, читающими и записывающими файл ресурсов
LANGUAGE language | Язык ресурса
VERSION dword | Определенный пользователем номер версии ресурса, которые может использоваться утилитами читающими и записывающими файл ресурсов.

stringID

Беззнаковое 16-битное целое, идентифицирующее ресурс.

string

Одна или несколько строк, заключенная в кавычки. Строка не должна превышать 4097 символов и должна занимать одну строку в исходном файле. Для вставки в строку символа возврата каретки, используйте последовательность символов \012. Например, строка "Строка один\012Строка два" будет выглядеть так, как приведено ниже.

Строка один

Строка два

Для вставки кавычек, используйте последовательность "". Например, строка """Строка три""" будет выглядеть так, как приведено ниже.

"Строка три"

Для задания символов Unicode используйте символ L перед Unicode символами, заключенными в кавычки.

Компилятор ресурсов также поддерживает продолжительные строки.

Также, в целях обратной совместимости, поддерживаются некоторые дополнительные атрибуты.

Компилятор ресурсов (RC) выделяет 16 строк на секцию и использует идентификатор для определения того, какой секции принадлежит заданная строка. Строки, идентификаторы которых отличаются только в младших 4 битах размещаются в одной секции.

Пример ниже демонстрирует использование объявление STRINGTABLE для отображение ASCII строк.

#define IDS_HELLO 1

#define IDS_GOODBYE 2

STRINGTABLE

{

IDS_HELLO, "Hello"

IDS_GOODBYE, "Goodbye"

}

Пример ниже демонстрирует кодирование символов Unicode.

STRINGTABLE

BEGINIDS_CHINESESTRING L"\x5e2e\x52a9"

IDS_RUSSIANSTRING L"\x0421\x043f\x0440\x0430\x0432\x043a\x0430"

IDS_ARABICSTRING L"\x062a\x0639\x0644\x064a\x0645\x0627\x062a"

END

Пример ниже демонстрирует одновременное использование ASCII и Unicode строк. Обратите внимание: последовательности символов без начального символа L используют двухразрядный формат (2-digit escape format).

STRINGTABLE

BEGIN

IDS_1 L"5\x00BC-Inch Floppy Disk"

IDS_1a "5\xBC-Inch Floppy Disk"

IDS_2 L"Don't confuse \x2229 (intersection) with \x222A (union)"

IDS_3 "Copyright \xA92001"

IDS_3a L"Copyright \x00a92001"

END

Пример ниже демонстрирует использование продолжительных строк.

STRINGTABLE

BEGIN

IDS_VERYLONGSTRING "blah blah blah blah blah blah \

blah blah blah blah blah blah \

blah blah blah blah blah blah \

blah blah blah blah blah blah"

END


STYLE

Описывает оконные стили диалогового окна. Оконные стили определяют являются ли окно выскакивающим (pop-up) или дочерним окном.

STYLE style

style

Оконные стили. Данный параметр может быть целочисленным значением или комбинацией стилей окон (таких как WS_CAPTION и WS_SYSMENU) и диалоговых окон (таких как DS_CENTER).

Перечень стилей окон приведен здесь. Перечень стилей диалоговых окон приведен здесь. При использовании стилей окон и диалоговых окон, вы должны подключить заголовочный файл Windows.h.


VERSION

Описывает информацию о версии, которая используется утилитами работы с ресурсами. Заданное значение dword записывается в скомпилированный res файл. Однако, данное значение не сохраняется в исполняемом файле и не обраатывается системой.

Объявление VERSION используют перед началом тела таких ресурсов, как ACCELERATORS, DILAOGEX, MENU, RCDATA или STRINGTABLE. Заданное значение применяется только к этому ресурсу.

VERSION dword

dword

Определенное пользователем значение типа DWORD.


Пользовательский ресурс

Описывает ресурс, содержащий определенные приложением данные. Данные могут иметь произвольный формат и быть заданы как содержимое файла (если задан параметр filename), или в виде последовательности чисел или строк (если задан блок raw-data).

nameID typeID filename

filename

Наименование файла, содержащего двоичные данные ресурса. Содержимое файла добавляется в ресурсы. Компилятор ресурсов его не интерпретирует. Программист сам должен следить за тем, чтобы двоичные данные файла соотвествовали целевой архитектуре ЭВМ.

Пользовательский ресурс также может задаваться так, как показано ниже.

nameID typeID { raw-data }

nameID

Уникальное наименование или 16-разрядное беззнаковое целое, идентифицирующее ресурс.

typeID

Уникальное наименование или 16-разрядное беззнаковое целое, идентифицирующее тип ресурса. Число должно быть больше чем 255. Числа от 1 до 255 зарезервированы под существующие и определенные в будущем типы ресурсов.

filename

Наименование файла, содержащего данные ресурса. Параметр должен содержать корректное наименование файла. Он должен быть задан в виде полного пути к файлу, если файл расположен не в текущем рабочем каталоге.

raw-data

"Сырые" данные, состоящие из одного или нескольких чисел или симвользных строк. Целые числа могут быть предсавлены в десятичной, восьмеричной или шестнадцатеричной системе счисления. В целях совместимости с 16-разрядными версиями Windows, целые числа сохраняются как значения типа WORD. Вы можете сохранять их как значения типа DWORD путем указания суффикса "L".

Строки заключаются в кавычки. Компилятор ресурсов не добавляет NULL символ в конце строки. Каждая строка является последовательностью ANSI символов, если с помощью префикса "L" не задано использование "широких" символов.

Начало блока данных автоматически выравнивается по границе двойного слова (DWORD), но компилятор ресурсов не выравнивает данные внутри блока raw-data. Программист должен сам следить за выравниваем внутри этого блока.

Пример ниже демонстрирует использование этого ресурса.

array MYRES data.res

14 300 custom.res

18 MYRES2

{

"Here is an ANSI string\0", // ANSI строка

L"Here is a Unicode string\0", // Unicode строка

1024, // Целое число типа WORD

7L, // Целое число типа DWORD

0x029a, // Целое число в шестнадцатеричной системе счисления

0o733, // Целое число в восьмеричной системе счисления

}


CreatePen

Создает логическое перо, имеющее заданный стиль, ширину и цвет. Впоследствии данное перо может быть выбрано в контексте устройства и использовано для рисования линий и кривых.

Прототип

HPEN CreatePen(

_In_ int fnPenStyle,

_In_ int nWidth,

_In_ COLORREF crColor

);

Параметры

fnPenStyle [in]

Стиль пера. Допустимые значения перечислены здесь.

nWidth [in]

Ширина пера в логических единицах. Если значение этого параметра равно нулю, то ширина пера равна одному пикселю, независимо от текущего преобразования.

Если вы пытаетесь создать перо со стилем PS_DASH, PS_DOT, PS_DASHDOT или PS_DASDOTDOT, имеющее ширину больше единицы, то функция CreatePen вернет перо, имеющее заданную ширину, но со стилем PS_SOLID.

crColor [in]

Цвет пера. Для создания значения типа COLORREF используйте макрос RGB.

Возвращаемое значение

Описатель логического пера.

Возвращаемое значение в случае ошибки

Значение NULL.

Пример использования

Ниже приводится пример использования.

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Создаем перо

HPEN hpen;

hpen = CreatePen(PS_SOLID, 0, RGB(0, 0xFF, 0));

//Выводим описатель пера в строку

char s[32];

sprintf(s,"%X", hpen);

//Удаляем перо

DeleteObject(hpen);

//Выводим строку с описателем пера

MessageBox(NULL, s, "", MB_OK);

return 0;

}

В данном примере создается перо и на экран выводится его описатель.

Примечание

После того как приложение создало логическое перо, оно может с помощью функции SelectObject выбрать это перо в контексте устройства. После того как перо выбрано в контексте устройства, оно может быть использовано для рисования линий и кривых.

Если значение параметра nWidth равно нулю, то линии рисуемые созданным пером имеют ширину один пиксель, независимо от текущего преобразования (transformation).

Если значение параметра nWidth больше единицы, то значение параметра fnPenStyle должно быть равно PS_NULL, PS_SOLID или PS_INSIDEFRAME.

Если значение параметра nWidth больше единицы, а значение параметра fnPenStyle равно PS_INSIDEFRAME, то линия рисуемая этим пером для всех примитивов кроме полигонов и ломаных линий размещается внутри фрейма (frame).

Если значение параметра nWidth больше единицы, значение параметра fnPenStyle равно PS_INSIDEFRAME, а цвет, заданный параметром crColor не принадлежит текущей логической палитре, система отрисовывает линии с использованием смешанного (dithered) цвета. Смешанные цвета не доступны для сплошных (solid) перьев.

Когда перо вам больше не нужно вызовите функцию DeleteObject для его удаления.

Подбор цвета (ICM): при создании пера управление цветом не осуществляется. Тем не менее, управление цветом осуществляется когда перо выбрано в контексте устройства, разрешающего подбор цвета (Image Color Matching).

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


CreatePenIndirect

Создает логическое косметическое (cosmetic) перо, имеющее стиль, ширину и цвет заданные в виде структуры.

Прототип

HPEN CreatePenIndirect(

_In_ const LOGPEN *lplgpn

);

Параметры

lplgpn [in]

Указатель на структуру LOGPEN, описывающую стиль, ширину и цвет пера.

Возвращаемое значение

Описатель логического косметического пера.

Возвращаемое значение в случае ошибки

Значение NULL.

Пример использования

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Подготавливаем структуру LOGPEN

LOGPEN logpen;

logpen.lopnStyle = PS_SOLID;

logpen.lopnWidth.x = 2;

logpen.lopnColor = RGB(0, 0xFF, 0);

//Создаем перо

HPEN hpen;

hpen = CreatePenIndirect(&logpen);

//Выводим описатель пера в строку

char s[32];

sprintf(s,"%X", hpen);

//Удаляем перо

DeleteObject(hpen);

//Выводим строку с описателем пера

MessageBox(NULL, s, "", MB_OK);

return 0;

}

В данном примере мы создаем перо и выводим на экран его описатель.

Примечание

После того как перо создано, оно, с помощью функции SelectObject может быть выбрано в контексте устройства.

Когда перо вам больше не нужно уничтожьте его с помощью функции DeleteObject.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


ExtCreatePen

Создает логическое косметическое или геометрическое перо, имеющее заданный стиль, ширину и атрибуты кисти.

Прототип

HPEN ExtCreatePen(

_In_ DWORD dwPenStyle,

_In_ DWORD dwWidth,

_In_ const LOGBRUSH *lplb,

_In_ DWORD dwStyleCount,

_In_ const DWORD *lpStyle

);

Параметры

dwPenStyle [in]

Набор флагов задающих тип, стиль, концевой элемент (end cap) и атрибуты соединения (join). Флаги из каждой группы объединяются с помощью побитовой операции ИЛИ (|).

Типы перьев перечислены ниже.

PS_GEOMETRIC - геометрическое перо.

PS_COSMETIC - косметическое перо.

Допустимые стили перьев перечислены здесь.

Концевой элемент задается только для геометрических перьев. Допустимые значения перечислены ниже.

PS_ENDCAP_ROUND - окружность.

PS_ENDCAP_SQUARE - квадрат.

PS_ENDCAP_FLAT - грань (flat).

Соединение задается только для геометрических перьев. Допустимые значения перечислены ниже.

PS_JOIN_BEVEL - конические соединения (beveled).

PS_JOIN_MITER - если соединения находятся в границах, установленных функцией SetMiterLimit, то они скашиваются под углом в 45 градусов (mitered). Если же они превышают это ограничение, соединения конические (beveled).

PS_JOIN_ROUND - соединения имеют форму окружности.

dwWidth [in]

Ширина пера. Если параметр dwPenStyle содержит флаг PS_GEOMETRIC, то ширина задается в логических единицах. Если же параметр dwPenStyle содержит флаг PS_COSMETIC, то ширина должна равняться единице.

lplb [in]

Указатель на структуру LOGBRUSH. Если параметр dwPenStyle содержит флаг PS_COSMETIC, то поле lbColor этой структуры задает цвет пера, а поле lpStyle должно содержать значение BS_SOLID. Если же параметр dwPenStyle содержит флаг PS_GEOMETRIC, то все поля структуры задают атрибуты кисти для пера.

dwStyleCount [in]

Длина, в двойных словах (DWORD), массива lpStyle. Если параметр dwPenStyle не содержит флага PS_USERSTYLE, то значение параметра dwStyleCount должно быть равно нулю.

Количество стилей ограничено 16.

lpStyle [in]

Указатель на массив. Первое значение задает длину первого тире (dash) в пользовательском стиле; второе значение задает длину первого пробела и так далее. Если значение параметра dwPenStyle не содержит флага PS_USERSTYLE, то значение параметра lpStyle должно быть равно NULL.

Если во время рисования система вышла за пределы массива lpStyle, то она сбрасывает указатель и начинает с начала массива. Когда это происходит при четном значении параметра dwStyleCount, шаблон тире и пробелов повторяется. Однако, если значение параметра dwStyleCount нечетно, то при сбрасывании указателя шаблон разворачивается. Теперь первый элемент массива lpStyle описывает пробелы, а второй элемент - тире; и так далее.

Возвращаемое значение

Описатель логического пера.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Заполняем LOGBRUSH

LOGBRUSH lbr;

lbr.lbStyle = BS_SOLID;

lbr.lbColor = RGB(0, 0xFF, 0);

lbr.lbHatch = 0;

//Создаем перо

HPEN hpen;

hpen = ExtCreatePen(PS_GEOMETRIC | PS_SOLID, 1, &lbr, 0, NULL);

//Выводим описатель пера в строку

char s[30];

sprintf(s, "%X", hpen);

//Отображаем строку с описателем пера

MessageBox(NULL, s, "", MB_OK);

//Удаляем перо

DeleteObject(hpen);

return 0;

}

В данном примере мы создаем простое геометрическое перо и выводим на экран его описатель.

Примечание

Геометрическое перо может иметь произвольную ширину и такие атрибуты кисти, как сглаживание цветовых переходов (dithers) и шаблоны. Косметические перья могут иметь ширину только 1 пиксель и должны быть сплошными (solid), но косметические перья обычно быстрее геометрических.

Ширина шеометрических перьев всегда задается в мировых единицах (world units). Ширина косметического пера всегда равна единице.

Концевые элементы (end caps) и соединения (joins) задаются только для геометрических перьев.

После того как приложение создало логическое перо, оно может выбрать его в контексте устройства с помощью функции SelectObject. После того как перо выбрано в контексте устройства, оно может использоваться при рисовании линий и кривых.

Если значение параметра dwPenStyle содержит флаги PS_COSMETIC и PS_USERSTYLE, то элементы массива lpStyle задают длины тире и пробелов в едингицах стиля (style units). Единица стиля задается устройством, в котором перо отрисовывает линию.

Если значение параметра dwPenStyle содержит флаги PS_GEOMETRIC и PS_USERSTYLE, то элементы массива lpStyle задают длины тире и пробелов в логических единицах.

Если значение параметра dwPenStyle содержит флаг PS_ALTERNATE, то единица стиля игнорируется и устанавливается каждый второй (every other) пиксель

Если поле lbStyle структуры LOGBRUSH, на которую указывает значение параметра lplb, содержит флаг BS_PATTERN, то битовая карта, на которую указывает поле lbHatch этой же структуры не может быть секцией растрового изображения независящего от устройства (DIB section). Секция DIB - это битовая карта созданная функцией CreateDIBSection. Если битовая карта является секцией DIB, то функция ExtCreatePen завершится ошибкой.

Когда приложению больше не нужно созданное перо, оно должно вызвать функцию DeleteObject для его удаления.

При создании пера управление цветом не выполняется. Однако если перо выбрано в контексте устройства, осуществляющем подгонку цвета (ICM), то осуществляется управление цветом.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


GetDCPenColor

Возвращает цвет текущего пера для заданного контекста устройства (DC).

Прототип

COLORREF GetDCPenColor(

_In_ HDC hdc

);

Параметры

hdc [in]

Описатель контекста устройства, для которого запрашивается цвет пера.

Возвращаемое значение

Цвет текущего пера в виде значения типа COLORREF.

Возвращаемое значение в случае ошибки

Значение CLR_INVALID (0xFFFFFFFF).

Пример использования

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Получаем цвет пера

COLORREF color;

color = GetDCPenColor(GetDC(NULL));

if(color == CLR_INVALID){

MessageBox(NULL, "Ошибка", "", MB_OK);

return -1;

}

//Выводим цвет в строку

char s[32];

sprintf(s,"%X", color);

//Выводим строку с цветом пера

MessageBox(NULL, s, "", MB_OK);

return 0;

}

В данном примере на экран выводится цвет пера контекста устройства экрана. Цвет выводится в виде шестнадцатеричного числа.

Примечание

Управление цветом выполняется только при включенном механизме подгонки цвета изображения (Image Color Matching - ICM).

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


SetDCPenColor

Устанавливает цвет пера в заданном контексте устройства (DC). Если устройство не может отобразить заданный цвет, то вместо него используется ближайший к нему физический цвет.

Прототип

COLORREF SetDCPenColor(

_In_ HDC hdc,

_In_ COLORREF crColor

);

Параметры

hdc [in]

Описатель контекста устройства (DC).

crColor [in]

Новый цвет пера.

Возвращаемое значение

Предыдущий цвет пера в виде значения типа COLORREF.

Возвращаемое значение в случае ошибки

Значение CLR_INVALID (0xFFFFFFFF).

Пример использования

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Меняем цвет пера

COLORREF prevcolor;

prevcolor = SetDCPenColor(GetDC(NULL), RGB(0,0xFF,0));

if(prevcolor == CLR_INVALID)

MessageBox(NULL, "Ошибка", "", MB_OK);

else

MessageBox(NULL, "Цвет изменен", "", MB_OK);

return 0;

}

Примечание

Функция возвращает предыдущий цвет пера DC_PEN, даже если предварительно подготовленное перо не выбрано в контексте устройства. Однако оно не будет использоваться в операциях рисования до тех пор, пока перо DC_PEN не будет выбрано в контексте устройства (DC).

Функция GetStockObject с параметром DC_BRUSH или DC_PEN может поочередно использоваться с функциями SetDCPenColor или SetDCBrushColor.

Управление цветом выполняется только при включенном механизме подгонки цвета изображения (Image Color Matching - ICM).

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


AddFontMemResourceEx

Демонстрация использования функции AddFontMemResourceEx. Она используется для добавления в систему шрифта, хранящегося в памяти.

Изначально шрифт хранится в ресурсах приложения, поэтому перед вызовом функции AddFontMemResourceEx необходимо сделать несколько подготовительных шагов. Приложение работает следующим образом.

· Вызывается функция FindResource для того, чтобы найти ресурс и получить его описатель.
· Вызывается LoadResource для загрузки найденного ресурса в память.
· Вызывается LockResource для получения указателя на загруженный ресурс.
· Вызывается функция SizeofResource для определения размера ресурса.
· К этому моменту ресурс шрифта подготовлен и мы вызываем функцию AddFontMemResourceEx.
· С помощью функции MessageBox уведомляем пользователя о том, что вызов функции завершился успешно. Пользователю выводится описатель шрифта. В случае ошибки он равен нулю.
· Вызывается функция RemoveFontMemResourceEx для освобождения ресурсов.

Ниже приводится полный исходный код разработанного приложения.

#include <windows.h>

#include "Constants.h"

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Находим ресурс шрифта

HRSRC hResource;

hResource = FindResource(hThisInstance, MAKEINTRESOURCE(IDRESFONT), RT_FONT);

//Загружаем ресурс шрифта в память

HGLOBAL hMem;

hMem = LoadResource(hThisInstance, hResource);

BYTE *lpResource;

lpResource = LockResource(hMem);

//Добавляем шрифт в систему

HANDLE hFont;

DWORD r = 0;

hFont = AddFontMemResourceEx(lpResource, SizeofResource(hThisInstance, hResource), 0, &r);

//Выводим его на экран

char s[50];

snprintf(s, 50, "%X", (UINT)hFont);

MessageBox(NULL, s, "", MB_OK);

//Освобождаем ресурсы

RemoveFontMemResourceEx(hFont);

return 0;

}

Ниже приводится содержимое файла ресурсов приложения. В нем задается сам шрифт, хранящийся в ресурсах. Ресурс шрифта объявляется с помощью директивы FONT.

#include "Constants.h"

IDRESFONT FONT "CyrilicOld.TTF"

Ниже приводится содержимое заголовочного файла Constants.h, в котором хранится идентификатор ресурса шрифта IDRESFONT

#define IDRESFONT 0x200


AddFontResource

Данный пример демонстрирует использование функций AddFontResource и RemoveFontResource. В разработанном приложении шрифт добавляется в систему (функцией AddFontResource), а потом удаляется (функцией RemoveFontResource). После каждого изменения шрифтов осуществляется широковещательная рассылка сообщения WM_FONTCHANGE. Для этого используется функция SendMessage с параметром HWND_BROADCAST.

Ниже приводится полный исходный текст примера.

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Наименование файла со шрифтом

char FileName[] = "CyrilicOld.TTF";

//Добавляем шрифт в системную таблицу

AddFontResource(FileName);

//Оповещаем окна об изменении шрифтов

SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);

//Удаляем шрифт

while(RemoveFontResource(FileName)){}

//Оповещаем окна об изменении шрифтов

SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);

return 0;

}


AddFontResourceEx

Данный пример аналогичен примеру, но с двумя отличиями: вместо функции AddFontResource используется функция AddFontResourceEx; вместо функции RemoveFontResource - RemoveFontResourceEx. После каждого изменения шрифтов осуществляется широковещательная рассылка сообщения WM_FONTCHANGE. Для этого используется функция SendMessage с параметром HWND_BROADCAST.

Ниже приводится полный исходный текст примера.

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Наименование файла со шрифтом

char FileName[] = "CyrilicOld.TTF";

//Добавляем шрифт в системную таблицу

AddFontResourceEx(FileName, FR_PRIVATE, 0);

//Оповещаем окна об изменении шрифтов

SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);

//Удаляем шрифт

while(RemoveFontResourceEx(FileName,FR_PRIVATE, 0)){}

//Оповещаем окна об изменении шрифтов

SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);

return 0;

}


BroadcastSystemMessage

Для демонстрации работы функции (и её наиболее частого применения) BroadcastSystemMessage мы создадим два приложения. Первое приложение будет создавать простое окно и ждать определенного сообщения. Второе приложение будет использовать функцию BroadcastSystemMessage для рассылки сообщения. Для гарантии того, что оба приложения работают с одним и тем же сообщением мы будем использовать функцию RegisterWindowMessage.

Первое приложение (получатель):

#include <windows.h>

int iMessage = 0;

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

//Проверяем не получили ли мы "наше" сообщение

if(uMsg == iMessage){

MessageBox(hwnd,"Я получил сообщение","",MB_OK);

return 0;

}

switch(uMsg){

case WM_CLOSE:

DestroyWindow(hwnd);

break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

return 0;

}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

//Регистрируем сообщение

iMessage = RegisterWindowMessage("Broadcast_Message");

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

MSG msg;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = CS_HREDRAW|CS_VREDRAW;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = sizeof(WORD);

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, "MyWindow",

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);

return 0;

}

Данное приложение при получении заданного сообщения выводит на экран строку "Я получил сообщение".

Второе приложение (отправитель):

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Регистрируем сообщение

int iMessage;

iMessage = RegisterWindowMessage("Broadcast_Message");

DWORD dw;

dw = BSM_APPLICATIONS;

//Рассылаем сообщение

BroadcastSystemMessage(BSF_FORCEIFHUNG,&dw,iMessage,0,0);

return 0;

}

Отправитель ничего не знает о получателе сообщения (ни класса окна, ни заголовка), поэтому он не может использовать функцию FindWindow или FindWindowEx. Использование функции BroadcastSystemMessage позволяет отправить ему сообщение вопреки отсутствию информации о получателе.

Если вы используете операционную систему Windows Vista (или более новую), и отправитель и получатель запущены от разных пользователей, то, возможно, вам придется дополнительно использовать функцию ChangeWindowMessageFilter или ChangeWindowMessageFilterEx.


ChangeWindowMessageFilter

Для демонстрации работы функции ChangeWindowMessageFilter разработаем два приложения. Первое приложение будет создавать простое диалоговое окно и редактировать фильтр. Второе приложение с помощью функции FindWindow будет находить окно, принадлежащее первому приложению и отправлять ему оконное сообщение.

Как показывает эксперимент (проверял в Windows 7) приложение запущенное с правами обычного пользователя не может отправлять сообщение WM_CLOSE приложению, запущенному с правами администратора. Этим обстоятельством мы и воспользуемся для демонстрации работы функции ChangeWindowMessageFilter.

Наше первое приложение (с диалоговым окном) будет явно разрешать отправку ему сообщения WM_CLOSE. Его мы будем запускать с правами администратора. Наше второе приложение (запускаемое от имени обычного пользователя) будет отправлять ему сообщение WM_CLOSE. При этом первое приложение (с более высокими правами) завершит свою работу.

Вот исходный код первого приложения.

#include <windows.h>

#include "Resource.h"

#define MSGFLT_ADD 1

typedef BOOL (*CHANGEWINDOWMESSAGEFILTER)(UINT,DWORD);

//Прототип Диалоговой процедуры

INT_PTR WINAPI Dlg_Proc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int hFunsterStil)

{

HINSTANCE huser32;

huser32 = LoadLibrary("user32");

if(!huser32) return -1;

//Находим адрес функции ChangeWindowMessageFilter

CHANGEWINDOWMESSAGEFILTER lpChangeWindowMessageFilter;

lpChangeWindowMessageFilter = (CHANGEWINDOWMESSAGEFILTER)GetProcAddress(huser32,"ChangeWindowMessageFilter");

if(!lpChangeWindowMessageFilter) return -1;

//Разрешаем приём сообщения WM_CLOSE

lpChangeWindowMessageFilter(WM_CLOSE,MSGFLT_ADD);

//Создаем диалоговое окно

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)

{

if(uMsg==WM_CLOSE)

EndDialog(hwnd,0);

return 0;

}

Вот исходный код второго приложения.

#include <windows.h>

int main()

{

HWND hwnd;

hwnd = FindWindow(NULL,"ChangeWindowMessageFilter");

if(!hwnd) return -1;

SendMessage(hwnd,WM_CLOSE,0,0);

}


ChangeWindowMessageFilterEx

Демонстрация работы функции ChangeWindowMessageFilterEx аналогична демонстрации работы функции ChangeWindowMessageFilter, которая приведена здесь. С той лишь разницей, что вместо ChangeWindowMessageFilter мы будем использовать ChangeWindowMessageFilterEx.

Исходный код первого приложения.

#include <windows.h>

#include "Resource.h"

#define MSGFLT_ALLOW 1

typedef struct tagCHANGEFILTERSTRUCT {

DWORD cbSize;

DWORD ExtStatus;

} CHANGEFILTERSTRUCT, *PCHANGEFILTERSTRUCT;

typedef BOOL (*CHANGEWINDOWMESSAGEFILTEREX)(HWND,UINT,DWORD,PCHANGEFILTERSTRUCT);

CHANGEWINDOWMESSAGEFILTEREX lpChangeWindowMessageFilterEx;

//Прототип Диалоговой процедуры

INT_PTR WINAPI Dlg_Proc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int hFunsterStil)

{

HINSTANCE huser32;

huser32 = LoadLibrary("user32");

if(!huser32) return -1;

//Находим адрес функции ChangeWindowMessageFilterEx

lpChangeWindowMessageFilterEx = (CHANGEWINDOWMESSAGEFILTEREX)GetProcAddress(huser32,"ChangeWindowMessageFilterEx");

if(!lpChangeWindowMessageFilterEx) return -1;

//Создаем диалоговое окно

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)

{

CHANGEFILTERSTRUCT ChangeFilterStruct;

switch(uMsg){

case WM_INITDIALOG:

ChangeFilterStruct.cbSize = sizeof(CHANGEFILTERSTRUCT);

//Разрешаем приём сообщения WM_CLOSE

lpChangeWindowMessageFilterEx(hwnd,WM_CLOSE,MSGFLT_ALLOW,&ChangeFilterStruct);

SetDlgItemInt(hwnd,ID_STATIC,ChangeFilterStruct.ExtStatus,FALSE);

break;

case WM_CLOSE:

EndDialog(hwnd,0);

}

return 0;

}

В статический элемент управления здесь выводится значение, записанное функцией ChangeWindowMessageFilterEx в поле ExtStatus структуры CHANGEFILTERSTRUCT.

Исходный код второго приложения.

int main()

{

HWND hwnd;

hwnd = FindWindow(NULL,"ChangeWindowMessageFilterEx");

if(!hwnd) return -1;

SendMessage(hwnd,WM_CLOSE,0,0);

}


CreateCursor

Демонстрация работы функции CreateCursor. В данном примере мы создаём курсор, выводим на экран его описатель и уничтожаем курсор (с помощью функции DestroyCursor). Сам пример создан на основе примера из msdn.

#include <windows.h>

BYTE ANDmaskCursor[] =

{

0xFF, 0xFC, 0x3F, 0xFF, // line 1

0xFF, 0xC0, 0x1F, 0xFF, // line 2

0xFF, 0x00, 0x3F, 0xFF, // line 3

0xFE, 0x00, 0xFF, 0xFF, // line 4

0xF7, 0x01, 0xFF, 0xFF, // line 5

0xF0, 0x03, 0xFF, 0xFF, // line 6

0xF0, 0x03, 0xFF, 0xFF, // line 7

0xE0, 0x07, 0xFF, 0xFF, // line 8

0xC0, 0x07, 0xFF, 0xFF, // line 9

0xC0, 0x0F, 0xFF, 0xFF, // line 10

0x80, 0x0F, 0xFF, 0xFF, // line 11

0x80, 0x0F, 0xFF, 0xFF, // line 12

0x80, 0x07, 0xFF, 0xFF, // line 13

0x00, 0x07, 0xFF, 0xFF, // line 14

0x00, 0x03, 0xFF, 0xFF, // line 15

0x00, 0x00, 0xFF, 0xFF, // line 16

0x00, 0x00, 0x7F, 0xFF, // line 17

0x00, 0x00, 0x1F, 0xFF, // line 18

0x00, 0x00, 0x0F, 0xFF, // line 19

0x80, 0x00, 0x0F, 0xFF, // line 20

0x80, 0x00, 0x07, 0xFF, // line 21

0x80, 0x00, 0x07, 0xFF, // line 22

0xC0, 0x00, 0x07, 0xFF, // line 23

0xC0, 0x00, 0x0F, 0xFF, // line 24

0xE0, 0x00, 0x0F, 0xFF, // line 25

0xF0, 0x00, 0x1F, 0xFF, // line 26

0xF0, 0x00, 0x1F, 0xFF, // line 27

0xF8, 0x00, 0x3F, 0xFF, // line 28

0xFE, 0x00, 0x7F, 0xFF, // line 29

0xFF, 0x00, 0xFF, 0xFF, // line 30

0xFF, 0xC3, 0xFF, 0xFF, // line 31

0xFF, 0xFF, 0xFF, 0xFF // line 32

};

BYTE XORmaskCursor[] =

{

0x00, 0x00, 0x00, 0x00, // line 1

0x00, 0x03, 0xC0, 0x00, // line 2

0x00, 0x3F, 0x00, 0x00, // line 3

0x00, 0xFE, 0x00, 0x00, // line 4

0x0E, 0xFC, 0x00, 0x00, // line 5

0x07, 0xF8, 0x00, 0x00, // line 6

0x07, 0xF8, 0x00, 0x00, // line 7

0x0F, 0xF0, 0x00, 0x00, // line 8

0x1F, 0xF0, 0x00, 0x00, // line 9

0x1F, 0xE0, 0x00, 0x00, // line 10

0x3F, 0xE0, 0x00, 0x00, // line 11

0x3F, 0xE0, 0x00, 0x00, // line 12

0x3F, 0xF0, 0x00, 0x00, // line 13

0x7F, 0xF0, 0x00, 0x00, // line 14

0x7F, 0xF8, 0x00, 0x00, // line 15

0x7F, 0xFC, 0x00, 0x00, // line 16

0x7F, 0xFF, 0x00, 0x00, // line 17

0x7F, 0xFF, 0x80, 0x00, // line 18

0x7F, 0xFF, 0xE0, 0x00, // line 19

0x3F, 0xFF, 0xE0, 0x00, // line 20

0x3F, 0xC7, 0xF0, 0x00, // line 21

0x3F, 0x83, 0xF0, 0x00, // line 22

0x1F, 0x83, 0xF0, 0x00, // line 23

0x1F, 0x83, 0xE0, 0x00, // line 24

0x0F, 0xC7, 0xE0, 0x00, // line 25

0x07, 0xFF, 0xC0, 0x00, // line 26

0x07, 0xFF, 0xC0, 0x00, // line 27

0x01, 0xFF, 0x80, 0x00, // line 28

0x00, 0xFF, 0x00, 0x00, // line 29

0x00, 0x3C, 0x00, 0x00, // line 30

0x00, 0x00, 0x00, 0x00, // line 31

0x00, 0x00, 0x00, 0x00 // line 32

};

int main()

{

HCURSOR hCur;

//Создаём курсор

hCur = CreateCursor(GetModuleHandle(NULL),19,2,32,32,ANDmaskCursor,XORmaskCursor);

printf("%X\n",hCur);

//Уничтожаем курсор

DestroyCursor(hCur);

getchar();

return 0;

}


CreateDialog

Демонстрация использования функции CreateDialog для создания немодального диалогового окна. Данный пример аналогичен примеру с тем лишь отличием, что вместо функции CreateDialogParam используется функция CreateDialog.

Ниже приводится полный исходный текст примера.

#include <windows.h>

#include "Resource.h"

INT_PTR CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Создаем диалоговое окно

HWND hwnd;

hwnd = CreateDialog(hThisInstance, MAKEINTRESOURCE(ID_DIALOG), NULL, DialogProc);

//Цикл обработки сообщений

MSG msg;

while (GetMessage(&msg, NULL, 0, 0))

IsDialogMessage(hwnd, &msg);

return 0;

}

//Диалоговая процедура

INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

if(uMsg==WM_CLOSE){

DestroyWindow(hwndDlg);

PostQuitMessage(0);

}

return 0;

}

Ниже приводится содержимое файла ресурсов с шаблоном диалогового окна.

#include "Resource.h"

#include <windows.h>

ID_DIALOG DIALOG 0, 0, 100, 100

STYLE DS_CENTER | WS_VISIBLE| WS_CAPTION | WS_SYSMENU

CAPTION "CreateDialog"

BEGIN

CTEXT "CreateDialog", 1, 15, 45, 70, 12

END

Заголовочный файл Resource.h содержит идентификатор ресурса.

#define ID_DIALOG 0x0100


CreateDialogIndirect

Демонстрация создания немодального диалогового окна с использованием функции CreateDialogIndirect. Данный пример аналогичен примеру с той лишь разницей, что вместо функции CreateDialogIndirectParam мы используем функцию CreateDialogIndirect.

#include <windows.h>

#include "Resource.h"

//Прототип Диалоговой процедуры

INT_PTR WINAPI Dlg_Proc(HWND, UINT, WPARAM, LPARAM);

//Осуществляет выравнивание указателя по границе DWORD

LPWORD Align(LPWORD lpw){

LPBYTE lpb;

lpb = (LPBYTE)lpw;

//На сколько нужно сдвинуть указатель до границы DWORD

UCHAR offset;

offset = sizeof(DWORD) - ((UINT)lpb)%sizeof(DWORD);

offset %= sizeof(DWORD);

//Сдвигаем указатель

while(offset){

*lpb = 0;

lpb++;

offset--;

}

return (LPWORD)lpb;

}

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int hFunsterStil)

{

void* pTemplate;

//Выделяем память под шаблон

pTemplate = malloc(1024);

if(!pTemplate) return -1;

//Заполняем структуру DLGTEMPLATE

LPDLGTEMPLATE lpdt;

lpdt = (LPDLGTEMPLATE)pTemplate;

lpdt->style = WS_CAPTION | WS_VISIBLE | WS_SYSMENU | DS_CENTER | WS_MINIMIZEBOX;

lpdt->dwExtendedStyle = 0;

lpdt->cdit = 2; //Количество элементов управления

lpdt->x = lpdt->y = 0;

lpdt->cx = lpdt->cy = 130;

LPWORD lpw;

lpw = (LPWORD)(lpdt+1);

*lpw = 0; lpw++; //Меню нет

*lpw = 0; lpw++; //Используем класс по умолчанию

//Записываем заголовок диалогового окна

LPWSTR lpwsz;

lpwsz = (LPWSTR)lpw;

UINT nchar;

nchar = MultiByteToWideChar(CP_ACP, 0, "CreateDialogIndirect", -1, lpwsz, 50);

lpw += nchar;

//Выравниваем указатель

lpw = Align(lpw);

/*************************

Описываем элемент управления

*************************/

LPDLGITEMTEMPLATE lpdit;

lpdit = (LPDLGITEMTEMPLATE)lpw;

lpdit->dwExtendedStyle = 0;

lpdit->x = 20;

lpdit->y = 50;

lpdit->cx = 90;

lpdit->cy = 12;

lpdit->id = 1;

lpdit->style = WS_CHILD | WS_VISIBLE | SS_CENTER;

lpw = (LPWORD)(lpdit + 1);

*lpw = 0xFFFF; lpw++; //Стандартный класс

*lpw = 0x0082; lpw++; //Класс "Static"

//Записываем заголовок элемента управления

lpwsz = (LPWSTR)lpw;

nchar = MultiByteToWideChar(CP_ACP, 0, "CreateDialogIndirect", -1, lpwsz, 50);

lpw += nchar;

//Начальные данные

*lpw = 0x0000; lpw++;

/*************************

Описываем второй элемент управления

*************************/

//Выравниваем указатель

lpw = Align(lpw);

lpdit = (LPDLGITEMTEMPLATE)lpw;

lpdit->dwExtendedStyle = 0;

lpdit->x = 40;

lpdit->y = 100;

lpdit->cx = 50;

lpdit->cy = 20;

lpdit->id = 1;

lpdit->style = WS_CHILD | WS_VISIBLE | WS_BORDER;

lpw = (LPWORD)(lpdit + 1);

*lpw = 0xFFFF; lpw++; //стандартный класс

*lpw = 0x0080; lpw++; //Класс "Button"

//Записываем заголовок элемента управления

lpwsz = (LPWSTR)lpw;

nchar = MultiByteToWideChar(CP_ACP, 0, "OK", -1, lpwsz, 50);

lpw += nchar;

//начальные данные

*lpw = 0x0000; lpw++;

/*************************

//Создаем диалоговое окно

*************************/

HWND hwnd;

hwnd = CreateDialogIndirect(hThisInstance, pTemplate, NULL, Dlg_Proc);

//Освобождаем память

free(pTemplate);

//Цикл обработки сообщений

MSG msg;

while(GetMessage(&msg, NULL, 0, 0))

IsDialogMessage(hwnd, &msg);

return 0;

}

//Диалоговая процедура

INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

HICON hicon;

switch(uMsg){

case WM_INITDIALOG:

//Загружаем иконку

hicon = LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(ID_ICON),IMAGE_ICON,0,0,LR_DEFAULTSIZE);

//Устанавливаем иконку

SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)hicon);

break;

case WM_CLOSE:

//Закрываем диалоговое окно

DestroyWindow(hwnd);

PostQuitMessage(0);

}

return 0;

}

Ниже приводится содержимое файла ресурсов (там хранится только иконка, устанавливаемаая при обработке сообщения WM_INITDIALOG).

#include "Resource.h"

ID_ICON ICON "MyIcon.ico"

Заголовочный файл "Resource.h" используется для хранения идентификатора иконки. Его содержимое приведено ниже.

#define ID_ICON 0x10


CreateDialogIndirectParam

Демонстрация использования функции CreateDialogParam для создания немодального диалогового окна. Данный пример аналогичен примеру, с тем лишь отличием, что вместо функции DialogBoxIndirectParam мы используем функцию CreateDialogParam.

Ниже приводится полный исходный код примера.

#include <windows.h>

#include "Resource.h"

//Прототип Диалоговой процедуры

INT_PTR WINAPI Dlg_Proc(HWND, UINT, WPARAM, LPARAM);

//Осуществляет выравнивание указателя по границе DWORD

LPWORD Align(LPWORD lpw){

LPBYTE lpb;

lpb = (LPBYTE)lpw;

//На сколько нужно сдвинуть указатель до границы DWORD

UCHAR offset;

offset = sizeof(DWORD) - ((UINT)lpb)%sizeof(DWORD);

offset %= sizeof(DWORD);

//Сдвигаем указатель

while(offset){

*lpb = 0;

lpb++;

offset--;

}

return (LPWORD)lpb;

}

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int hFunsterStil)

{

void* pTemplate;

//Выделяем память под шаблон

pTemplate = malloc(1024);

if(!pTemplate) return -1;

//Заполняем структуру DLGTEMPLATE

LPDLGTEMPLATE lpdt;

lpdt = (LPDLGTEMPLATE)pTemplate;

lpdt->style = WS_CAPTION | WS_VISIBLE | WS_SYSMENU | DS_CENTER | WS_MINIMIZEBOX;

lpdt->dwExtendedStyle = 0;

lpdt->cdit = 2; //Количество элементов управления

lpdt->x = lpdt->y = 0;

lpdt->cx = lpdt->cy = 170;

LPWORD lpw;

lpw = (LPWORD)(lpdt+1);

*lpw = 0; lpw++; //Меню нет

*lpw = 0; lpw++; //Используем класс по умолчанию

//Записываем заголовок диалогового окна

LPWSTR lpwsz;

lpwsz = (LPWSTR)lpw;

UINT nchar;

nchar = MultiByteToWideChar(CP_ACP, 0, "CreateDialogIndirectParam", -1, lpwsz, 50);

lpw += nchar;

//Выравниваем указатель

lpw = Align(lpw);

/*************************

Описываем элемент управления

*************************/

LPDLGITEMTEMPLATE lpdit;

lpdit = (LPDLGITEMTEMPLATE)lpw;

lpdit->dwExtendedStyle = 0;

lpdit->x = 40;

lpdit->y = 60;

lpdit->cx = 90;

lpdit->cy = 12;

lpdit->id = 1;

lpdit->style = WS_CHILD | WS_VISIBLE | SS_CENTER;

lpw = (LPWORD)(lpdit + 1);

*lpw = 0xFFFF; lpw++; //Стандартный класс

*lpw = 0x0082; lpw++; //Класс "Static"

//Записываем заголовок элемента управления

lpwsz = (LPWSTR)lpw;

nchar = MultiByteToWideChar(CP_ACP, 0, "CreateDialogIndirectParam", -1, lpwsz, 50);

lpw += nchar;

//Начальные данные

*lpw = 0x0000; lpw++;

/*************************

Описываем второй элемент управления

*************************/

//Выравниваем указатель

lpw = Align(lpw);

lpdit = (LPDLGITEMTEMPLATE)lpw;

lpdit->dwExtendedStyle = 0;

lpdit->x = 60;

lpdit->y = 140;

lpdit->cx = 50;

lpdit->cy = 20;

lpdit->id = 1;

lpdit->style = WS_CHILD | WS_VISIBLE | WS_BORDER;

lpw = (LPWORD)(lpdit + 1);

*lpw = 0xFFFF; lpw++; //стандартный класс

*lpw = 0x0080; lpw++; //Класс "Button"

//Записываем заголовок элемента управления

lpwsz = (LPWSTR)lpw;

nchar = MultiByteToWideChar(CP_ACP, 0, "OK", -1, lpwsz, 50);

lpw += nchar;

//начальные данные

*lpw = 0x0000; lpw++;

/*************************

//Создаем диалоговое окно

*************************/

HWND hwnd;

hwnd = CreateDialogIndirectParam(hThisInstance, pTemplate, NULL, Dlg_Proc, 0);

//Освобождаем память

free(pTemplate);

//Цикл обработки сообщений

MSG msg;

while(GetMessage(&msg, NULL, 0, 0))

IsDialogMessage(hwnd, &msg);

return 0;

}

//Диалоговая процедура

INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

HICON hicon;

switch(uMsg){

case WM_INITDIALOG:

//Загружаем иконку

hicon = LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(ID_ICON),IMAGE_ICON,0,0,LR_DEFAULTSIZE);

//Устанавливаем иконку

SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)hicon);

break;

case WM_CLOSE:

//Закрываем диалоговое окно

DestroyWindow(hwnd);

PostQuitMessage(0);

}

return 0;

}

Ниже приводится содержимое файла ресурсов (там хранится только иконка, устанавливаемаая при обработке сообщения WM_INITDIALOG).

#include "Resource.h"

ID_ICON ICON "MyIcon.ico"

Заголовочный файл "Resource.h" используется для хранения идентификатора иконки. Его содержимое приведено ниже.

#define ID_ICON 0x10


CreateDialogParam

Демонстрация использования функции CreateDialogParam для создания немодального диалогового окна. Цикл обработки сообщений такого окна состоит из функций GetMessage и IsDialogMessage.

Ниже приводится полный исходный текст примера.

#include <windows.h>

#include "Resource.h"

INT_PTR CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Создаем диалоговое окно

HWND hwnd;

hwnd = CreateDialogParam(hThisInstance, MAKEINTRESOURCE(ID_DIALOG), NULL, DialogProc, 0);

//Цикл обработки сообщений

MSG msg;

while (GetMessage(&msg, NULL, 0, 0))

IsDialogMessage(hwnd, &msg);

return 0;

}

//Диалоговая процедура

INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

if(uMsg==WM_CLOSE){

DestroyWindow(hwndDlg);

PostQuitMessage(0);

}

return 0;

}

Ниже приводится содержимое файла ресурсов с шаблоном диалогового окна.

#include "Resource.h"

#include <windows.h>

ID_DIALOG DIALOG 0, 0, 100, 100

STYLE DS_SETFOREGROUND | DS_CENTER | WS_VISIBLE| WS_CAPTION | WS_SYSMENU

CAPTION "CreateDialogParam"

BEGIN

CTEXT "CreateDialogParam", 1, 15, 45, 70, 12

END

Заголовочный файл Resource.h содержит идентификатор ресурса.

#define ID_DIALOG 0x0100


CreateDIBSection

Демонстрация использования функции CreateDIBSection. В данном небольшом примере мы изменяем цвета в главном окне стандартного калькулятора Windows. Пример работает следующим образом.

· С помощью функции FindWindow находит окно калькулятора. Если оно не найдено, то завершается с ошибкой.
· С помощью функции GetDC и GetWindowRect получает контекст устройства окна калькулятора и его координаты.
· Функцией CreateCompatibleDC создает временный контекст устройства. Он будет использоваться для манипуляций над пикселями битовой карты окна калькулятора.
· Функция CreateDIBSection создает DIB секцию и связывает ее с созданным временным контекстом устройством (функция SelectObject). Эта секция будет использоваться для хранения растрового изображения окна калькулятора.
· Вызывает функцию BitBlt для копирования содержимого контекста устройства окна калькулятора в наш временный контекст устройства. Теперь оно хранится в созданной ранее DIB секции.
· Вызывает функцию GetDIBits для извлечения из секции набора байт. Теперь содержимое DIB секции хранится в буфере.
· Меняет цвета.
· С помощью функции SetDIBitsToDevice заносит измененные биты во временный контекст устройства (а значит и в DIB секцию).
· Вызывает функцию BitBlt для переноса содержимого временного контекста в контекст устройства окна калькулятора. В результате этого мы получаем окно калькулятора с измененными цветами.
· Освобождает ресурсы.

Ниже приводится полный исходный текст данного примера с комментариями.

#include <windows.h>

#include <stdio.h>

//Структура описывающая отдельные пиксели

typedef struct {

unsigned char Blue;

unsigned char Green;

unsigned char Red;

} RGB;

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Находим окно калькулятора

HWND hwnd;

hwnd = FindWindow(NULL, "Калькулятор");

if(! hwnd){

MessageBox(NULL, "Окно калькулятора не найдено", "", MB_OK | MB_ICONERROR);

return -1;

}

//Получаем контекст устройства и размеры окна калькулятора

HDC dc_calc;

dc_calc = GetDC(hwnd);

RECT rc;

GetWindowRect(hwnd, &rc);

//Подготавливаем структуру BITMAPINFO

BITMAPINFO bitinfo;

bitinfo.bmiHeader.biBitCount = 24; //8 байт на цвет

bitinfo.bmiHeader.biCompression = BI_RGB; //формат RGB

bitinfo.bmiHeader.biPlanes = 1;

bitinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);

bitinfo.bmiHeader.biWidth = rc.right - rc.left; //Ширина окна

bitinfo.bmiHeader.biHeight = rc.bottom - rc.top; //Высота окна

//Подготавливаем буфер под пиксели

unsigned char* pbytes;

pbytes = (unsigned char*) malloc(bitinfo.bmiHeader.biWidth * bitinfo.bmiHeader.biHeight * 3);

//Создаем временный контекст устройства, в котором будем хранить изображение

HDC dc_temp;

dc_temp = CreateCompatibleDC(NULL);

//Создаем DIB секцию для изображения

HBITMAP hbitmap;

hbitmap = CreateDIBSection(dc_temp, &bitinfo, DIB_RGB_COLORS, 0, 0, 0);

//Выбираем созданную секцию во временном контексте устройства

SelectObject(dc_temp, hbitmap);

//Переводим окно калькулятора на передний план

SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE);

//Пусть оно перерисуется до наших издевательств

SendMessage(hwnd, WM_PAINT, 0, 0);

//Копируем содержимое контекста устройства окна калькулятора в наш временный контекст устройства

BitBlt(dc_temp, 0, 0, bitinfo.bmiHeader.biWidth, bitinfo.bmiHeader.biHeight, dc_calc, 0, 0, SRCCOPY);

//Извлекаем пиксели из скопированного содержимого

GetDIBits(dc_temp, hbitmap, 0, bitinfo.bmiHeader.biHeight, pbytes, &bitinfo, DIB_RGB_COLORS);

//Изменяем цвет в каждом пикселе

int i;

for(i = 0; i < bitinfo.bmiHeader.biWidth * bitinfo.bmiHeader.biHeight * 3; i += 3){

RGB* prgb;

prgb = (RGB*)&pbytes[i];

unsigned char temp;

temp = prgb->Red;

prgb->Red = prgb->Green;

prgb->Blue = prgb->Red;

prgb->Green = temp;

}

//Заносим искаженные пиксели в наш временный контекст устройства

SetDIBitsToDevice(dc_temp, 0, 0, bitinfo.bmiHeader.biWidth, bitinfo.bmiHeader.biHeight, 0, 0, 0, bitinfo.bmiHeader.biHeight, pbytes, &bitinfo, DIB_RGB_COLORS);

//Переносим содержимое нашего контекста устройства в контекст устройства окна калькулятора

BitBlt(dc_calc, 0, 0, bitinfo.bmiHeader.biWidth, bitinfo.bmiHeader.biHeight, dc_temp, 0, 0, SRCCOPY);

//Освобождаем ресурсы

DeleteDC(dc_temp);

ReleaseDC(hwnd, dc_calc);

DeleteObject(hbitmap);

free(pbytes);

return 0;

}

Ниже приводятся изображения окна калькулятора до запуска программы (вверху) и после (внизу).


CreateIcon

Демонстрация работы функции CreateIcon. В данном примере мы создаём иконку (с помощью функции CreateIcon), выводим на экран её описатель и уничтожаем иконку (с помощью функции DestroyIcon). Этот пример взят из msdn.

#include <windows.h>

//AND маска

BYTE ANDmaskIcon[] = {0xFF, 0xFF, 0xFF, 0xFF, // line 1

0xFF, 0xFF, 0xC3, 0xFF, // line 2

0xFF, 0xFF, 0x00, 0xFF, // line 3

0xFF, 0xFE, 0x00, 0x7F, // line 4

0xFF, 0xFC, 0x00, 0x1F, // line 5

0xFF, 0xF8, 0x00, 0x0F, // line 6

0xFF, 0xF8, 0x00, 0x0F, // line 7

0xFF, 0xF0, 0x00, 0x07, // line 8

0xFF, 0xF0, 0x00, 0x03, // line 9

0xFF, 0xE0, 0x00, 0x03, // line 10

0xFF, 0xE0, 0x00, 0x01, // line 11

0xFF, 0xE0, 0x00, 0x01, // line 12

0xFF, 0xF0, 0x00, 0x01, // line 13

0xFF, 0xF0, 0x00, 0x00, // line 14

0xFF, 0xF8, 0x00, 0x00, // line 15

0xFF, 0xFC, 0x00, 0x00, // line 16

0xFF, 0xFF, 0x00, 0x00, // line 17

0xFF, 0xFF, 0x80, 0x00, // line 18

0xFF, 0xFF, 0xE0, 0x00, // line 19

0xFF, 0xFF, 0xE0, 0x01, // line 20

0xFF, 0xFF, 0xF0, 0x01, // line 21

0xFF, 0xFF, 0xF0, 0x01, // line 22

0xFF, 0xFF, 0xF0, 0x03, // line 23

0xFF, 0xFF, 0xE0, 0x03, // line 24

0xFF, 0xFF, 0xE0, 0x07, // line 25

0xFF, 0xFF, 0xC0, 0x0F, // line 26

0xFF, 0xFF, 0xC0, 0x0F, // line 27

0xFF, 0xFF, 0x80, 0x1F, // line 28

0xFF, 0xFF, 0x00, 0x7F, // line 29

0xFF, 0xFC, 0x00, 0xFF, // line 30

0xFF, 0xF8, 0x03, 0xFF, // line 31

0xFF, 0xFC, 0x3F, 0xFF}; // line 32

//XOR маска

BYTE XORmaskIcon[] = {0x00, 0x00, 0x00, 0x00, // line 1

0x00, 0x00, 0x00, 0x00, // line 2

0x00, 0x00, 0x00, 0x00, // line 3

0x00, 0x00, 0x00, 0x00, // line 4

0x00, 0x00, 0x00, 0x00, // line 5

0x00, 0x00, 0x00, 0x00, // line 6

0x00, 0x00, 0x00, 0x00, // line 7

0x00, 0x00, 0x38, 0x00, // line 8

0x00, 0x00, 0x7C, 0x00, // line 9

0x00, 0x00, 0x7C, 0x00, // line 10

0x00, 0x00, 0x7C, 0x00, // line 11

0x00, 0x00, 0x38, 0x00, // line 12

0x00, 0x00, 0x00, 0x00, // line 13

0x00, 0x00, 0x00, 0x00, // line 14

0x00, 0x00, 0x00, 0x00, // line 15

0x00, 0x00, 0x00, 0x00, // line 16

0x00, 0x00, 0x00, 0x00, // line 17

0x00, 0x00, 0x00, 0x00, // line 18

0x00, 0x00, 0x00, 0x00, // line 19

0x00, 0x00, 0x00, 0x00, // line 20

0x00, 0x00, 0x00, 0x00, // line 21

0x00, 0x00, 0x00, 0x00, // line 22

0x00, 0x00, 0x00, 0x00, // line 23

0x00, 0x00, 0x00, 0x00, // line 24

0x00, 0x00, 0x00, 0x00, // line 25

0x00, 0x00, 0x00, 0x00, // line 26

0x00, 0x00, 0x00, 0x00, // line 27

0x00, 0x00, 0x00, 0x00, // line 28

0x00, 0x00, 0x00, 0x00, // line 29

0x00, 0x00, 0x00, 0x00, // line 30

0x00, 0x00, 0x00, 0x00, // line 31

0x00, 0x00, 0x00, 0x00}; // line 32

int main()

{

HICON hicon;

//Создаём иконку

hicon = CreateIcon(GetModuleHandle(NULL),32,32,1,1,ANDmaskIcon,XORmaskIcon);

//Выводим описатель

printf("%X\n",hicon);

//Разрушаем иконку

DestroyIcon(hicon);

getchar();

return 0;

}


CreateIconFromResource

В данном примере демонстрируется использование иконки, хранящейся в ресурсах стороннего приложения. Мы создадим два приложения: первое используется для хранения иконки, а второе будет использовать эту иконку.

Первое приложение ничеге не делает:

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

return 0;

}

Файл ресурсов:

#include "Constants.h"

ID_ICON ICON "MyIcon.ico"

Заголовочный файл "Constants.h" используется для хранения идентификатора иконки.

#define ID_ICON 0x100

Второе приложение создаёт окно и в качестве иконки использует иконку, хранящуюся в первом приложении. Загрузка иконки осуществляется с помощью функций: FindResource (поиск ресурса), LoadResource (загрузка ресурса), LockResource (получение указателя на ресурс в памяти), LookupIconIdFromDirectory (поиск подходящей иконки). Размер ресурса определяется с помощью функции SizeofResource.

#include <windows.h>

#define ID_ICON 0x100

//Извлекает иконку из сторонннего приложения

HICON GetIcon(void){

//Загружаем модуль стороннего приложения

HINSTANCE hExe;

hExe = LoadLibrary("Donor.exe");

//Находим группу иконок

HRSRC hResource;

hResource = FindResource(hExe,MAKEINTRESOURCE(ID_ICON),RT_GROUP_ICON);

//Загружаем группу иконок

HGLOBAL hMem;

hMem = LoadResource(hExe, hResource);

BYTE *lpResource;

lpResource = LockResource(hMem);

//Находим идентификатор иконки

int nID;

nID = LookupIconIdFromDirectory(lpResource,TRUE);

//Находим ресурс найденной конки

hResource = FindResource(hExe,MAKEINTRESOURCE(nID),RT_ICON);

//Загружаем ресурс иконки

hMem = LoadResource(hExe, hResource);

lpResource = LockResource(hMem);

//Создаём иконку из ресурса

HICON hIcon;

hIcon = CreateIconFromResource(lpResource,SizeofResource(hExe,hResource),TRUE,0x00030000);

return hIcon;

}

//Оконная процедура

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;

}

int 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 = GetIcon();

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, 300, 300, NULL, NULL, hInstance, 0);

//Цикл обработки сообщений

while(GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}

Ресурсов у второго приложения нет.


CreateIconFromResourceEx

Данный пример аналогичен примеру, но с рядом отличий: вместо функции CreateIconFromResource используется функция CreateIconFromResourceEx; вместо функции FindResource используется FindResourceEx; вместо LookupIconIdFromDirectory - LookupIconIdFromDirectoryEx. Первое приложение остаётся без изменений. Второе приложение.

#include <windows.h>

#define ID_ICON 0x100

//Размеры иконки

#define XICON 48

#define YICON 48

//Извлекает иконку из сторонннего приложения

HICON GetIcon(void){

//Загружаем модуль стороннего приложения

HINSTANCE hExe;

hExe = LoadLibrary("Donor.exe");

//Находим группу иконок

HRSRC hResource;

hResource = FindResourceEx(hExe,RT_GROUP_ICON,MAKEINTRESOURCE(ID_ICON),MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL));

//Загружаем группу иконок

HGLOBAL hMem;

hMem = LoadResource(hExe, hResource);

BYTE *lpResource;

lpResource = LockResource(hMem);

//Находим идентификатор иконки

int nID;

nID = LookupIconIdFromDirectoryEx(lpResource,TRUE,XICON,YICON,LR_DEFAULTCOLOR);

//Находим ресурс найденной иконки

hResource = FindResourceEx(hExe,RT_ICON,MAKEINTRESOURCE(nID),MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL));

//Загружаем ресурс иконки

hMem = LoadResource(hExe, hResource);

lpResource = LockResource(hMem);

//Создаём иконку из ресурса

HICON hIcon;

hIcon = CreateIconFromResourceEx(lpResource,SizeofResource(hExe,hResource),TRUE,0x00030000,XICON,YICON,LR_DEFAULTCOLOR);

return hIcon;

}

//Оконная процедура

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;

}

int 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 = GetIcon();

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, 300, 300, NULL, NULL, hInstance, 0);

//Цикл обработки сообщений

while(GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}

Собственных ресурсов у второго приложения по-прежнему нет.


DefDlgProc

В данном примере демонстрируется использование функции DefDlgProc. Данная функция позволяет сочетать оконную процедуру с диалоговой процедурой. Ниже приводится полный исходный код примера.

#include <windows.h>

#include "Resource.h"

//Прототип диалоговой процедуры

INT_PTR CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM);

//Прототип оконной процедуры

LRESULT CALLBACK WLWndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

char ClassName[] = CLASSNAME;

WNDCLASSEX wc;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = CS_DBLCLKS | CS_SAVEBITS | CS_BYTEALIGNWINDOW;

wc.lpfnWndProc = WLWndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = DLGWINDOWEXTRA;

wc.hInstance = hThisInstance;

wc.hIcon = NULL;

wc.hCursor = NULL;

wc.hbrBackground = (HBRUSH)COLOR_BTNSHADOW;

wc.lpszMenuName = NULL;

wc.lpszClassName = ClassName;

wc.hIconSm = NULL;

//Регистрируем оконный класс

RegisterClassEx(&wc);

//Создаем дилоговое окно

DialogBoxParam(hThisInstance, MAKEINTRESOURCE(ID_DIALOG), NULL, DialogProc, 0);

return 0;

}

//Оконная процедура

LRESULT CALLBACK WLWndProc(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam)

{

return DefDlgProc(hdlg, uiMsg, wParam, lParam);

}

//Диалоговая процедура

INT_PTR CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

if(uMsg==WM_CLOSE)

EndDialog(hwndDlg, 0);

return FALSE;

}

В данном примере регистрируется оконный класс, а затем на его основе создается диалоговое окно. В результате этого у нас есть оконная процедура WLWndProc, ассоциированная с оконным классом, и диалоговая процедура DialogProc, ассоциированная с диалоговым окном. Система для обработки оконного сообщения вызывает оконную процедуру. Та, в свою очередь, посредством функции DefDlgProc, вызывает диалоговую процедуру.

Ниже приводится файл ресурсов, содержащий шаблон диалогового окна.

#include "Resource.h"

#include <windows.h>

ID_DIALOG DIALOG 0, 0, 100, 100

STYLE DS_CENTER | WS_VISIBLE| WS_CAPTION | WS_SYSMENU

CLASS CLASSNAME

CAPTION "DefDialogProc"

BEGIN

CTEXT "DefDialogProc", 1, 15, 45, 70, 12

END

Обратите внимание: в шаблоне мы, с помощью определения CLASS, явно указываем класс окна.

Ниже приводится заголовочный файл "Resource.h", содержащий идентификатор шаблона диалогового окна и наименование оконного класса.

#define CLASSNAME "MyDialogClass"

#define ID_DIALOG 0x0100


DialogBox

В данном примере демонстрируется создание диалогового окна с помощью функции DialogBox. Данный пример аналогичен примеру, лишь с тем отличием, что вместо функции DialogBoxParam мы используем функцию DialogBox. Ниже приводится исходный код приложения.

#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)

{

//Создаем диалоговое окно

DialogBox(hThisInstance, MAKEINTRESOURCE(ID_DIALOG), HWND_DESKTOP, Dlg_Proc);

return 0;

}

//Диалоговая процедура

INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

HICON hicon;

switch(uMsg){

case WM_INITDIALOG:

//Загружаем иконку

hicon = LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(ID_ICON),IMAGE_ICON,0,0,LR_DEFAULTSIZE);

//Устанавливаем иконку

SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)hicon);

break;

case WM_CLOSE:

//Закрываем диалоговое окно

EndDialog(hwnd,0);

}

return 0;

}

Ниже приводится содержимое файла ресурсов с шаблоном диалогового окна.

#include "Resource.h"

#include <windows.h>

ID_ICON ICON "MyIcon.ico"

ID_DIALOG DIALOGEX 0,0,130,130

STYLE WS_CAPTION | WS_VISIBLE | WS_SYSMENU | DS_CENTER | WS_MINIMIZEBOX

CAPTION "DialogBox"

BEGIN

CTEXT "DialogBox",1, 20,60,80,12, WS_VISIBLE

END

Заголовочный файл "Resource.h" содержит идентификаторы ресурсов.

#define ID_ICON 0x10

#define ID_DIALOG 0x1000


DialogBoxIndirect

В данном примере демонстрируется создание диалогового окна с использованием функции DialogBoxIndirect. Данная функция создаёт диалоговое окно на основе шаблона, главную роль в котором играет структура DLGTEMPLATE и массив структур DLGITEMTEMPLATE.

В приводимом примере мы создаем диалоговое окно с двумя элементами управления: статической текстовой надписью и кнопкой. По нажатию на кнопку ничего не происходит. При обработке сообщения WM_INITDIALOG мы устанавливаем иконку, хранящуюся в ресурсах приложения. Иконка устанавливается с помощью сообщения WM_SETICON.

Функция Align используется для выравнивания указателя по границе двойного слова(DWORD). Она вызывается там, где такое выравнивание необходимо.

Ниже приводится полный исходный код примера.

#include <windows.h>

#include "Resource.h"

//Прототип Диалоговой процедуры

INT_PTR WINAPI Dlg_Proc(HWND, UINT, WPARAM, LPARAM);

//Осуществляет выравнивание указателя по границе DWORD

LPWORD Align(LPWORD lpw){

LPBYTE lpb;

lpb = (LPBYTE)lpw;

//На сколько нужно сдвинуть указатель до границы DWORD

UCHAR offset;

offset = sizeof(DWORD) - ((UINT)lpb)%sizeof(DWORD);

offset %= sizeof(DWORD);

//Сдвигаем указатель

while(offset){

*lpb = 0;

lpb++;

offset--;

}

return (LPWORD)lpb;

}

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int hFunsterStil)

{

void* pTemplate;

//Выделяем память под шаблон

pTemplate = malloc(1024);

if(!pTemplate) return -1;

//Заполняем структуру DLGTEMPLATE

LPDLGTEMPLATE lpdt;

lpdt = (LPDLGTEMPLATE)pTemplate;

lpdt->style = WS_CAPTION | WS_VISIBLE | WS_SYSMENU | DS_CENTER | WS_MINIMIZEBOX;

lpdt->dwExtendedStyle = 0;

lpdt->cdit = 2; //Количество элементов управления

lpdt->x = lpdt->y = 0;

lpdt->cx = lpdt->cy = 130;

LPWORD lpw;

lpw = (LPWORD)(lpdt+1);

*lpw = 0; lpw++; //Меню нет

*lpw = 0; lpw++; //Используем класс по умолчанию

//Записываем заголовок диалогового окна

LPWSTR lpwsz;

lpwsz = (LPWSTR)lpw;

UINT nchar;

nchar = MultiByteToWideChar(CP_ACP, 0, "DialogBoxIndirect", -1, lpwsz, 50);

lpw += nchar;

//Выравниваем указатель

lpw = Align(lpw);

/*************************

Описываем элемент управления

*************************/

LPDLGITEMTEMPLATE lpdit;

lpdit = (LPDLGITEMTEMPLATE)lpw;

lpdit->dwExtendedStyle = 0;

lpdit->x = 25;

lpdit->y = 60;

lpdit->cx = 80;

lpdit->cy = 12;

lpdit->id = 1;

lpdit->style = WS_CHILD | WS_VISIBLE | SS_CENTER;

lpw = (LPWORD)(lpdit + 1);

*lpw = 0xFFFF; lpw++; //Стандартный класс

*lpw = 0x0082; lpw++; //Класс "Static"

//Записываем заголовок элемента управления

lpwsz = (LPWSTR)lpw;

nchar = MultiByteToWideChar(CP_ACP, 0, "DialogBoxIndirect", -1, lpwsz, 50);

lpw += nchar;

//Начальные данные

*lpw = 0x0000; lpw++;

/*************************

Описываем второй элемент управления

*************************/

//Выравниваем указатель

lpw = Align(lpw);

lpdit = (LPDLGITEMTEMPLATE)lpw;

lpdit->dwExtendedStyle = 0;

lpdit->x = 40;

lpdit->y = 100;

lpdit->cx = 50;

lpdit->cy = 20;

lpdit->id = 1;

lpdit->style = WS_CHILD | WS_VISIBLE | WS_BORDER;

lpw = (LPWORD)(lpdit + 1);

*lpw = 0xFFFF; lpw++; //стандартный класс

*lpw = 0x0080; lpw++; //Класс "Button"

//Записываем заголовок элемента управления

lpwsz = (LPWSTR)lpw;

nchar = MultiByteToWideChar(CP_ACP, 0, "OK", -1, lpwsz, 50);

lpw += nchar;

//начальные данные

*lpw = 0x0000; lpw++;

/*************************

//Создаем диалоговое окно

*************************/

DialogBoxIndirect(hThisInstance, pTemplate, NULL, Dlg_Proc);

//Освобождаем память

free(pTemplate);

return 0;

}

//Диалоговая процедура

INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

HICON hicon;

switch(uMsg){

case WM_INITDIALOG:

//Загружаем иконку

hicon = LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(ID_ICON),IMAGE_ICON,0,0,LR_DEFAULTSIZE);

//Устанавливаем иконку

SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)hicon);

break;

case WM_CLOSE:

//Закрываем диалоговое окно

EndDialog(hwnd,0);

}

return 0;

}

Ниже приводится содержимое файла ресурсов (там хранится только иконка).

#include "Resource.h"

ID_ICON ICON "MyIcon.ico"

Заголовочный файл "Resource.h" используется для хранения идентификатора иконки. Его содержимое приведено ниже.

#define ID_ICON 0x10

Ну и наконец, на рисунке ниже представлено главное окно разработанного приложения.


DialogBoxIndirectParam

Данный пример аналогичен примеру, с тем исключением, что здесь вместо функции DialogBoxIndirect мы используем функцию DialogBoxIndirectParam.

Ниже приводится полный исходный код примера.

#include <windows.h>

#include "Resource.h"

//Прототип Диалоговой процедуры

INT_PTR WINAPI Dlg_Proc(HWND, UINT, WPARAM, LPARAM);

//Осуществляет выравнивание указателя по границе DWORD

LPWORD Align(LPWORD lpw){

LPBYTE lpb;

lpb = (LPBYTE)lpw;

//На сколько нужно сдвинуть указатель до границы DWORD

UCHAR offset;

offset = sizeof(DWORD) - ((UINT)lpb)%sizeof(DWORD);

offset %= sizeof(DWORD);

//Сдвигаем указатель

while(offset){

*lpb = 0;

lpb++;

offset--;

}

return (LPWORD)lpb;

}

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int hFunsterStil)

{

void* pTemplate;

//Выделяем память под шаблон

pTemplate = malloc(1024);

if(!pTemplate) return -1;

//Заполняем структуру DLGTEMPLATE

LPDLGTEMPLATE lpdt;

lpdt = (LPDLGTEMPLATE)pTemplate;

lpdt->style = WS_CAPTION | WS_VISIBLE | WS_SYSMENU | DS_CENTER | WS_MINIMIZEBOX;

lpdt->dwExtendedStyle = 0;

lpdt->cdit = 2; //Количество элементов управления

lpdt->x = lpdt->y = 0;

lpdt->cx = lpdt->cy = 150;

LPWORD lpw;

lpw = (LPWORD)(lpdt+1);

*lpw = 0; lpw++; //Меню нет

*lpw = 0; lpw++; //Используем класс по умолчанию

//Записываем заголовок диалогового окна

LPWSTR lpwsz;

lpwsz = (LPWSTR)lpw;

UINT nchar;

nchar = MultiByteToWideChar(CP_ACP, 0, "DialogBoxIndirectParam", -1, lpwsz, 50);

lpw += nchar;

//Выравниваем указатель

lpw = Align(lpw);

/*************************

Описываем элемент управления

*************************/

LPDLGITEMTEMPLATE lpdit;

lpdit = (LPDLGITEMTEMPLATE)lpw;

lpdit->dwExtendedStyle = 0;

lpdit->x = 30;

lpdit->y = 60;

lpdit->cx = 80;

lpdit->cy = 12;

lpdit->id = 1;

lpdit->style = WS_CHILD | WS_VISIBLE | SS_CENTER;

lpw = (LPWORD)(lpdit + 1);

*lpw = 0xFFFF; lpw++; //Стандартный класс

*lpw = 0x0082; lpw++; //Класс "Static"

//Записываем заголовок элемента управления

lpwsz = (LPWSTR)lpw;

nchar = MultiByteToWideChar(CP_ACP, 0, "DialogBoxIndirectParam", -1, lpwsz, 50);

lpw += nchar;

//Начальные данные

*lpw = 0x0000; lpw++;

/*************************

Описываем второй элемент управления

*************************/

//Выравниваем указатель

lpw = Align(lpw);

lpdit = (LPDLGITEMTEMPLATE)lpw;

lpdit->dwExtendedStyle = 0;

lpdit->x = 50;

lpdit->y = 120;

lpdit->cx = 50;

lpdit->cy = 20;

lpdit->id = 1;

lpdit->style = WS_CHILD | WS_VISIBLE | WS_BORDER;

lpw = (LPWORD)(lpdit + 1);

*lpw = 0xFFFF; lpw++; //стандартный класс

*lpw = 0x0080; lpw++; //Класс "Button"

//Записываем заголовок элемента управления

lpwsz = (LPWSTR)lpw;

nchar = MultiByteToWideChar(CP_ACP, 0, "OK", -1, lpwsz, 50);

lpw += nchar;

//начальные данные

*lpw = 0x0000; lpw++;

/*************************

//Создаем диалоговое окно

*************************/

DialogBoxIndirectParam(hThisInstance, pTemplate, NULL, Dlg_Proc, 0);

//Освобождаем память

free(pTemplate);

return 0;

}

//Диалоговая процедура

INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

HICON hicon;

switch(uMsg){

case WM_INITDIALOG:

//Загружаем иконку

hicon = LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(ID_ICON),IMAGE_ICON,0,0,LR_DEFAULTSIZE);

//Устанавливаем иконку

SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)hicon);

break;

case WM_CLOSE:

//Закрываем диалоговое окно

EndDialog(hwnd,0);

}

return 0;

}

Ниже приводится содержимое файла ресурсов (там хранится только иконка).

#include "Resource.h"

ID_ICON ICON "MyIcon.ico"

Заголовочный файл "Resource.h" используется для хранения идентификатора иконки. Его содержимое приведено ниже.

#define ID_ICON 0x10

Главное окно данного приложения аалогично главному окну приложения из примера с одним лишь отличием: вместо строк "DialogBoxIndirect" в них выводится "DialogBoxIndirectParam".


DialogBoxParam

В данном примере демонстрируется создание диалогового окна с помощью функции DialogBoxParam. При обработке сообщения WM_INITDIALOG мы загружаем из ресурсов иконку и устанавливаем её для диалогового окна (с помощью сообщения WM_SETICON). При обработке сообщения WM_CLOSE мы закрываем диалоговое окно с помощью функции EndDialog. Ниже приводится исходный код примера.

#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)

{

HICON hicon;

switch(uMsg){

case WM_INITDIALOG:

//Загружаем иконку

hicon = LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(ID_ICON),IMAGE_ICON,0,0,LR_DEFAULTSIZE);

//Устанавливаем иконку

SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)hicon);

break;

case WM_CLOSE:

//Закрываем диалоговое окно

EndDialog(hwnd,0);

}

return 0;

}

Ниже приводится содержимое файла ресурсов с шаблоном диалогового окна.

#include "Resource.h"

#include <windows.h>

ID_ICON ICON "MyIcon.ico"

ID_DIALOG DIALOGEX 0,0,130,130

STYLE WS_CAPTION | WS_VISIBLE | WS_SYSMENU | DS_CENTER | WS_MINIMIZEBOX

CAPTION "DialogBoxParam"

BEGIN

CTEXT "DialogBoxParam",1, 25,60,80,12, WS_VISIBLE

END

Заголовочный файл "Resource.h" содержит идентификаторы ресурсов.

#define ID_ICON 0x10

#define ID_DIALOG 0x1000


Get/SetDlgItemText

Демонстрация использования функций GetDlgItemText и SetDlgItemText. В данном примере создается диалоговое окно с двумя элементами управления: кнопкой и полем ввода. При нажатии на кнопку текст, введенный в поле ввода устанавливается в заголовке кнопки.

Ниже приводится полный исходный текст примера.

#include <windows.h>

#include "Resource.h"

#define _WPARAM ((WPARAM)((BN_CLICKED<<16)+ID_BUTTON))

//Прототип Диалоговой процедуры

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_COMMAND:

if(wParam == _WPARAM){

//Определяем длину текста в поле ввода

int len;

len = GetWindowTextLength(GetDlgItem(hwnd, ID_EDIT));

//Если текста нет, то ничего не делаем

if(!len) break;

//Увеличиваем длину (для NULL символа)

len++;

//Выделяем память под текст

char* s;

s = (char*)malloc(len);

//Читаем текст из поле ввода

GetDlgItemText(hwnd, ID_EDIT, s, len);

//Устанавливаем прочитанный текст в заголовке кнопки

SetDlgItemText(hwnd, ID_BUTTON, s);

//Освобождаем память

free(s);

}

break;

case WM_CLOSE:

//Закрываем диалоговое окно

EndDialog(hwnd,0);

}

return 0;

}

Ниже приводится содержимое файла ресурсов, в котором задается шаблон диалогового окна.

#include "Resource.h"

#include <windows.h>

ID_DIALOG DIALOGEX 0,0,130,130

STYLE WS_CAPTION | WS_VISIBLE | WS_SYSMENU | DS_CENTER | WS_MINIMIZEBOX

CAPTION "DialogBoxParam"

BEGIN

EDITTEXT ID_EDIT, 25, 30, 80, 12, WS_VISIBLE

PUSHBUTTON "",ID_BUTTON, 25,60,80,12, WS_VISIBLE

END

Ниже приводится содержимое заголовочного файла Resorce.h, в котором задаются идентификаторы шаблона и элементов управления.

#define ID_BUTTON 0x01

#define ID_EDIT 0x02

#define ID_DIALOG 0x1000


Get/SetMessageExtraInfo

Демонстрация работы функций GetMessageExtraInfo и SetMessageExtraInfo. Данные функции используются для передачи дополнительного параметра сообщения. В данном примере мы используем переопределение диалоговой процедуры окна. В результате него каждое оконное сообщение проходит через две диалоговые процедуры: диалоговую процедуру-фильтр (она будет устанавливать дополнительный параметр сообщения с помощью SetMessageExtraInfo) и основную диалоговую процедуру (она будет читать дополнительный параметр сообщения с помощью GetMessageExtraInfo). Для переопределения диалоговой процедуры мы используем функцию SetWindowLong с флагом DWL_DLGPROC. Для вызова основной диалоговой процедуры мы используем функцию CallWindowProc.

#include <windows.h>

#include "Resource.h"

#include <windows.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)

{

int d;

char s[10];

switch(uMsg){

case WM_INITDIALOG:

//Устанавливаем диалоговую процедуру - фильтр

oldwndproc = SetWindowLong(hwnd,DWL_DLGPROC,(LONG)Dlg_Proc_Hook);

break;

case WM_CLOSE:

//Выводим на экран значение дополнительного параметра

d = GetMessageExtraInfo();

sprintf(s,"%d",d);

MessageBox(hwnd,s,s,MB_OK);

//Закрываем окно

EndDialog(hwnd,0);

}

return 0;

}

//Подставная диалоговая процедура - фильтр

INT_PTR WINAPI Dlg_Proc_Hook(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

if(uMsg==WM_CLOSE){

//Устанавливаем значение дополнительного параметра

SetMessageExtraInfo(123);

}

//Вызываем "родную" диалоговую процедуру

return CallWindowProc((WNDPROC)oldwndproc,hwnd,uMsg,wParam,lParam);

}


GetInputState

Демонстрация работы функции GetInputState. В данном примере мы создадим приложение, которое будет регулярно вызывать функцию GetInputState и, в зависимости от вовзращаемого ею значения выводить в заголовке окна либо строку "Да" (функция вернула значение TRUE) или "Нет" (функция вернула значение FALSE). При остутствии активности со стороны пользователя выводится строка "Нет". Однако при интенсивном использовании клавиатуры (или кнопок мыши) строка в заголовке на короткое время изменится.

#include <windows.h>

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

//Проверяем наличие сообщений ввода в очереди сообщений

if(GetInputState()){

SetWindowText(hwnd,"Да");

//Задержка необходимая для того, чтобы мы успели увидеть изменение заголовка

Sleep(50);

SetWindowText(hwnd,"Нет");

}

//Задержка необходимая для того, чтобы сообщения ввода успели накопиться в очереди

Sleep(30);

switch(uMsg){

case WM_CLOSE:

DestroyWindow(hwnd);

break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

return 0;

}

int 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 = sizeof(WORD);

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, "Нет",

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);

return 0;

}


GetNextDlgTabItem

Демонстрация использования функции GetNextDlgTabItem. Данный пример аналогичен примеру, но с одним отличием: мы не используем идентификатор кнопки для вывода заголовка с помощью функции SetDlgItemText, вместо этого мы с помощью функции GetNextDlgTabItem находим описатель окна кнопки и изменяем её заголовок с помощью функции SetWindowText.

Ниже приводится полный исходный текст примера.

#include <windows.h>

#include "Resource.h"

#define _WPARAM ((WPARAM)((BN_CLICKED<<16)+ID_BUTTON))

//Прототип Диалоговой процедуры

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)

{

HWND hwndButton;

switch(uMsg){

case WM_COMMAND:

if(wParam == _WPARAM){

//Определяем длину текста в поле ввода

int len;

len = GetWindowTextLength(GetDlgItem(hwnd, ID_EDIT));

//Если текста нет, то ничего не делаем

if(!len) break;

//Увеличиваем длину (для NULL символа)

len++;

//Выделяем память под текст

char* s;

s = (char*)malloc(len);

//Читаем текст из поле ввода

GetDlgItemText(hwnd, ID_EDIT, s, len);

//Получаем описатель окна кнопки

hwndButton = GetNextDlgTabItem(hwnd, GetDlgItem(hwnd, ID_EDIT), FALSE);

//Устанавливаем прочитанный текст в заголовке кнопки

SetWindowText(hwndButton, s);

//Освобождаем память

free(s);

}

break;

case WM_CLOSE:

//Закрываем диалоговое окно

EndDialog(hwnd,0);

}

return 0;

}

Ниже приводится содержимое файла ресурсов, в котором задается шаблон диалогового окна.

#include "Resource.h"

#include <windows.h>

ID_DIALOG DIALOGEX 0,0,130,130

STYLE WS_CAPTION | WS_VISIBLE | WS_SYSMENU | DS_CENTER | WS_MINIMIZEBOX

CAPTION "GetNextDlgTabItem"

BEGIN

EDITTEXT ID_EDIT, 25, 30, 80, 12, WS_VISIBLE | WS_TABSTOP

PUSHBUTTON "",ID_BUTTON, 25,60,80,12, WS_VISIBLE |WS_TABSTOP

END

Ниже приводится содержимое заголовочного файла Resource.h, в котором задаются идентификаторы элементов управления и шаблона диалогового окна.

#define ID_BUTTON 0x01

#define ID_EDIT 0x02

#define ID_DIALOG 0x1000


GradientFill

Демонстрация использования функции GradientFill. В данном примере создается окно, на поверхность которго выводится треугольник. Каждая вершина этого треугольника имеет свой цвет, а пространство между ними заполняется линейной интерполяцией цветов.

Вся основная работа происходит при получении сообщений WM_CREATE и WM_PAINT.

При получении сообщения WM_CREATE делается следующее.

· Вызывается функция InitVertex. Она подготавливает массивы структур TRIVERTEX и GRADIENT_TRIANGLE, описывающих вершины треугольника и сам треугольник соответственно. В нашем примере треугольник один.
· С помощью функций LoadLibrary и GetProcAddress находится адрес функции GradientFill.

При получении сообщения WM_PAINT треугольник выводится на поверхность окна. Это делается в три шага.

· Вызывается функция BeginPaint для подготоки окна и получения описателя контекста устройства.
· Вызывается функция GradientFill для построения треугольника.
· Вызывается функция EndPaint для завершения операции рисования и освобождения контекста устройства окна.

Ниже приводится полный исходный текст разработанного примера.

#include <windows.h>

#include <math.h>

#define PI ((double)3.14159)

//Длина стороны треугольника

#define SIZE_TRIANGLE 200

//Прототип функции GradientFill

typedef BOOL (*GRADIENTFILL)(HDC,PTRIVERTEX,ULONG,PVOID,ULONG,ULONG);

GRADIENTFILL lpfnGradientFill;

//Вершины треугольника

TRIVERTEX vertex[3];

GRADIENT_TRIANGLE triangle = {0, 1, 2};

/*************************************/

/*Инициализирует вершины треугольника*/

/*************************************/

void InitVertex()

{

vertex[0].x = 10;

vertex[0].y = SIZE_TRIANGLE*sin(PI/3) + 10;

vertex[0].Red = 0xFF00;

vertex[0].Green = 0;

vertex[0].Blue = 0;

vertex[0].Alpha = 255;

vertex[1].x = vertex[0].x + SIZE_TRIANGLE/2;

vertex[1].y = 10;

vertex[1].Red = 0;

vertex[1].Green = 0xFF00;

vertex[1].Blue = 0;

vertex[1].Alpha = 255;

vertex[2].x = vertex[0].x + SIZE_TRIANGLE;

vertex[2].y = vertex[0].y;

vertex[2].Red = 0;

vertex[2].Green = 0;

vertex[2].Blue = 0xFF00;

vertex[2].Alpha = 255;

}

/***************************/

/*****Оконная процедура*****/

/***************************/

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

//Контекст устройства окна

HDC hdc = NULL;

//Используется при рисовании

PAINTSTRUCT ps;

//Описатель библиотеки Msing32.dll

HINSTANCE himg32;

switch(uMsg){

case WM_CREATE:

//Инициализируем вершины треугольника

InitVertex();

//Находим адрес функции GradientFill

himg32 = LoadLibrary("Msimg32.dll");

lpfnGradientFill = (GRADIENTFILL)GetProcAddress(himg32, "GradientFill");

break;

case WM_PAINT:

//Получаем контекст устройства окна

hdc = BeginPaint(hwnd, &ps);

//Рисуем треугольник

if(lpfnGradientFill)

lpfnGradientFill(hdc, vertex, 3, &triangle, 1, GRADIENT_FILL_TRIANGLE);

//Освобождаем ресурсы

EndPaint(hwnd, &ps);

break;

case WM_CLOSE:

DestroyWindow(hwnd);

break;

case WM_DESTROY:

PostQuitMessage(0);

break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg){

return 0;

}

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = 0;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hThisInstance;

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, "GradientFill",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED|WS_BORDER,

400, 300, 225, 230, NULL, 0, hThisInstance, 0);

//Цикл обработки сообщений

MSG msg;

while(GetMessage(&msg,NULL,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hThisInstance);

return 0;

}

Ниже приводится главное окно разработанного приложения.


InSendMessage

Демонстрация работы функции InSendMessage. В данном примере мы создаём оконное приложение, которое при обработке сообщения WM_CLOSE определяет кто его прислал (поток владеющий окном, или поток принадлежащий другому процессу).

#include <windows.h>

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

switch(uMsg){

case WM_CLOSE:

if(InSendMessage())

MessageBox(hwnd,"Из другого потока","",MB_OK);

else

MessageBox(hwnd,"Из своего потока","",MB_OK);

DestroyWindow(hwnd);

break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

return 0;

}

int 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, "InSendMessage",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED|WS_BORDER,

400, 300, 200, 200, NULL, NULL, hInstance, 0);

//Цикл обработки сообщений

while(GetMessage(&msg,NULL,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}

А вот исходный код простого приложения, которое с помощью функции SendMessage отправляет сообщение WM_CLOSE приложению, приведенному выше.

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

HWND hwnd;

//Находим окно

hwnd = FindWindow("MyWindowClass","InSendMessage");

//Отправляем ему сообщение

SendMessage(hwnd, WM_CLOSE,0,0);

return 0;

}


InSendMessageEx

Демонстрация работы функции InSendMessageEx. В данном примере мы создаём оконное приложение, которое при обработке сообщения WM_CLOSE определяет заблокирован ли поток, который его прислал.

#define WINVER 0x0500

#include <windows.h>

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

BOOL res, fBlocked;

switch(uMsg){

case WM_CLOSE:

res = InSendMessageEx(NULL);

fBlocked = ((res&(ISMEX_REPLIED|ISMEX_SEND))==ISMEX_SEND);

if(fBlocked)

MessageBox(hwnd,"Поток заблокирован","",MB_OK);

else

MessageBox(hwnd,"Поток не заблокирован","",MB_OK);

DestroyWindow(hwnd);

break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg){

return 0;

}

int 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, "InSendMessage",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED|WS_BORDER,

400, 300, 200, 200, NULL, NULL, hInstance, 0);

//Цикл обработки сообщений

while(GetMessage(&msg,NULL,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}

Исходный код приложения-отправителя сообщения WM_CLOSE аналогичен коду отправителя из примера.


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.


MessageBoxIndirect

Демонстрация работы с функцией MessageBoxIndirect. Здесь приводится два примера. В первом отображается простое текстовое сообщение с нашей иконкой, хранящейся в ресурсах. Ниже приводится полный исходный текст первого примера.

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Подготавливаем структуру MSGBOXPARAMS

MSGBOXPARAMS msgbp;

msgbp.cbSize = sizeof(MSGBOXPARAMS);

msgbp.hwndOwner = NULL;

msgbp.hInstance= hThisInstance;

msgbp.lpszText = "Hello, World!";

msgbp.lpszCaption = "Hello";

msgbp.dwStyle = MB_OK | MB_USERICON;

msgbp.lpszIcon = MAKEINTRESOURCE(0x100);

msgbp.dwContextHelpId = 0;

msgbp.lpfnMsgBoxCallback = NULL;

msgbp.dwLanguageId = MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL);

//Выводим сообщение

MessageBoxIndirect(&msgbp);

return 0;

}

Ниже приводится содержимое файла ресурсов, в котором задается иконка.

0x100 ICON "MyIcon.ico"

Ниже приводится диалоговое окно, отображаемое в результате работы данной программы.

Во втором примере показывается использование функции обратного вызова MsgBoxCallback, которая вызывается при запросе пользователем помощи. Ниже приводится полный исходный текст второго примера.

#include <windows.h>

VOID CALLBACK MsgBoxCallback(LPHELPINFO lpHelpInfo){

MessageBox(NULL, "HELP", "HELP", MB_OK);

}

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Подготавливаем структуру MSGBOXPARAMS

MSGBOXPARAMS msgbp;

msgbp.cbSize = sizeof(MSGBOXPARAMS);

msgbp.hwndOwner = NULL;

msgbp.hInstance= hThisInstance;

msgbp.lpszText = "Hello, World!";

msgbp.lpszCaption = "Hello";

msgbp.dwStyle = MB_OK | MB_USERICON;

msgbp.lpszIcon = MAKEINTRESOURCE(0x100);

msgbp.dwContextHelpId = 0;

msgbp.lpfnMsgBoxCallback = MsgBoxCallback;//NULL;

msgbp.dwLanguageId = MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL);

//Выводим сообщение

MessageBoxIndirect(&msgbp);

return 0;

}

Файл ресурсов такой же, как и в первом примере. В функции MsgBoxCallback выводится текстовое сообщение "HELP". Вызвать данное окно вы можете нажав на клавишу F1 во время отображения главного окна приложения.


MsgWaitForMultipleObjects

Демонстрация работы функции MsgWaitForMultipleObjects. В данном примере мы создаём оконное приложение, которое при обработке сообщения WM_CLOSE в течение пяти секунд ожидает дополнительный клавиатурный ввод.

#include <windows.h>

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

switch(uMsg){

case WM_CLOSE:

//Ждём дополнительный клавиатурный ввод

MsgWaitForMultipleObjects(0,NULL,FALSE,5000,QS_KEY);

DestroyWindow(hwnd);

break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg){

return 0;

}

int 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, "MsgWaitForMultipleObjects",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED|WS_BORDER,

400, 300, 250, 250, NULL, NULL, hInstance, 0);

//Цикл обработки сообщений

while(GetMessage(&msg,NULL,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}


MsgWaitForMultipleObjectsEx

Демонстрация работы функции MsgWaitForMultipleObjectsEx. Данный пример аналогичен примеру, с той лишь разницей что вместо функции MsgWaitForMultipleObjects мы используем функцию MsgWaitForMultipleObjectsEx.

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

switch(uMsg){

case WM_CLOSE:

//Ждём дополнительный клавиатурный ввод

MsgWaitForMultipleObjectsEx(0,NULL,5000,QS_KEY, 0);

DestroyWindow(hwnd);

break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg){

return 0;

}

int 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, "MsgWaitForMultipleObjectsEx",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED|WS_BORDER,

400, 300, 250, 250, NULL, NULL, hInstance, 0);

//Цикл обработки сообщений

while(GetMessage(&msg,NULL,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}


OpenGL

Демонстрация использования OpenGL. В данном примере создается окно, на поверхности которогго осуществляется рисование средствами OpenGL. Окно настраивается в функции EnableOpenGL, которая с помощью функций ChoosePixelFormat и SetPixelFormat изменяет формат пикселя окна и создает контекст отображения. Самом рисование средствами OpenGL выполняется при обработке сообщения WM_PAINT.

Ниже приводится полный исходный код данного примера.

#include <windows.h>

#include <gl/gl.h>

/********************************************/

/*********Подготавливает OpenGL**************/

/********************************************/

void EnableOpenGL(HWND hWnd, HDC *hDC, HGLRC *hRC)

{

PIXELFORMATDESCRIPTOR pfd;

int iFormat;

//Получаем контекст устройства окна

*hDC = GetDC( hWnd );

//Устанавливаем формат пикселей

ZeroMemory( &pfd, sizeof(PIXELFORMATDESCRIPTOR) );

pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);

pfd.nVersion = 1;

pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;

pfd.iPixelType = PFD_TYPE_RGBA;

pfd.cColorBits = 24;

pfd.cDepthBits = 16;

pfd.iLayerType = PFD_MAIN_PLANE;

iFormat = ChoosePixelFormat(*hDC, &pfd);

SetPixelFormat( *hDC, iFormat, &pfd);

//Создаем и устанавливаем контекст отображения

*hRC = wglCreateContext(*hDC);

wglMakeCurrent(*hDC, *hRC);

}

/********************************************/

/************Отключает OpenGL****************/

/********************************************/

void DisableOpenGL(HWND hWnd, HDC hDC, HGLRC hRC)

{

wglMakeCurrent(NULL, NULL);

wglDeleteContext(hRC);

ReleaseDC(hWnd, hDC);

}

/********************************************/

/************Оконная процедура***************/

/********************************************/

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

static HDC hDC = NULL;

static HGLRC hRC = NULL;

switch (message)

{

case WM_CREATE:

//Подготавливаем OpenGL

EnableOpenGL(hWnd, &hDC, &hRC);

break;

case WM_PAINT:

//Рисуем средствами OpenGL

glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

glClear(GL_COLOR_BUFFER_BIT);

glPushMatrix();

glBegin(GL_TRIANGLES);

glColor3f(1.0f, 0.0f, 0.0f); glVertex2f(0.0f, 1.0f);

glColor3f(0.0f, 1.0f, 0.0f); glVertex2f(0.87f, -0.5f);

glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(-0.87f, -0.5f);

glEnd();

glPopMatrix();

SwapBuffers(hDC);

break;

case WM_CLOSE:

//Отключаем OpenGL

DisableOpenGL(hWnd, hDC, hRC);

//Уничтожаем окно

DestroyWindow(hWnd);

break;

case WM_DESTROY:

//Закрываем приложение

PostQuitMessage(0);

break;

default:

return DefWindowProc(hWnd, message, wParam, lParam);

}//switch (message)

return 0;

}

/********************************************/

/************Оконная процедура***************/

/********************************************/

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPSTR lpCmdLine, int iCmdShow)

{

//Регистрируем оконный класс

WNDCLASS wc;

wc.style = CS_OWNDC;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );

wc.hCursor = LoadCursor( NULL, IDC_ARROW );

wc.hbrBackground = NULL;

wc.lpszMenuName = NULL;

wc.lpszClassName = TEXT("GLSample");

RegisterClass(&wc);

//Создаем главное окно

CreateWindow(TEXT("GLSample"), TEXT("OpenGL"),

WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,

0, 0, 256, 256,

NULL, NULL, hInstance, NULL);

//ЦИкл обработки сообщений

MSG msg;

while (GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

UnregisterClass(TEXT("GLSample"), hInstance);

return 0;

}

На рисунке ниже показано главное окно приложения.


OpenGL2

Демонстрация работы с OpenGL. Данный пример похож на пример, но здесь мы реализуем анимацию. OpenGL код выполняется не при обработке сообщения WM_PAINT, а при отсутствии сообщений. Для этого цикл обработки сообщений осуществляется не с помощью функции GetMessage, а с помощью PeekMessage.

Ниже приводится полный исходный код приложения.

#include <windows.h>

#include <gl/gl.h>

/********************************************/

/*********Подготавливает OpenGL**************/

/********************************************/

void EnableOpenGL(HWND hWnd, HDC *hDC, HGLRC *hRC)

{

PIXELFORMATDESCRIPTOR pfd;

int iFormat;

//Получаем контекст устройства окна

*hDC = GetDC( hWnd );

//Устанавливаем формат пикселей

ZeroMemory( &pfd, sizeof(PIXELFORMATDESCRIPTOR) );

pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);

pfd.nVersion = 1;

pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;

pfd.iPixelType = PFD_TYPE_RGBA;

pfd.cColorBits = 24;

pfd.cDepthBits = 16;

pfd.iLayerType = PFD_MAIN_PLANE;

iFormat = ChoosePixelFormat(*hDC, &pfd);

SetPixelFormat( *hDC, iFormat, &pfd);

//Создаем и устанавливаем контекст отображения

*hRC = wglCreateContext(*hDC);

wglMakeCurrent(*hDC, *hRC);

}

/********************************************/

/************Отключает OpenGL****************/

/********************************************/

void DisableOpenGL(HWND hWnd, HDC hDC, HGLRC hRC)

{

wglMakeCurrent( NULL, NULL );

wglDeleteContext( hRC );

ReleaseDC( hWnd, hDC );

}

/********************************************/

/************Оконная процедура***************/

/********************************************/

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

switch (message)

{

case WM_CLOSE:

PostQuitMessage(0);

break;

default:

return DefWindowProc(hWnd, message, wParam, lParam);

}//switch (message)

return 0;

}

/********************************************/

/************Оконная процедура***************/

/********************************************/

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

LPSTR lpCmdLine, int iCmdShow)

{

//Регистрируем оконный класс

WNDCLASS wc;

wc.style = CS_OWNDC;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hInstance;

wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );

wc.hCursor = LoadCursor( NULL, IDC_ARROW );

wc.hbrBackground = NULL;

wc.lpszMenuName = NULL;

wc.lpszClassName = TEXT("GLSample");

RegisterClass( &wc );

//Создаем главное окно

HWND hWnd;

hWnd = CreateWindow(TEXT("GLSample"), TEXT("OpenGL"),

WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,

0, 0, 256, 256,

NULL, NULL, hInstance, NULL);

//Настраиваем OpenGL

HDC hDC;

HGLRC hRC;

EnableOpenGL( hWnd, &hDC, &hRC );

//ЦИкл обработки сообщений

MSG msg;

BOOL bQuit = FALSE;

float theta = 0.0f;

while (!bQuit)

{

//Проверяем сообщения

if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))

{

//Обрабатываем сообщение

if (msg.message == WM_QUIT)

bQuit = TRUE;

else

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

}//if(PeekMessage(&msg, NULL,...

else

{

//Код анимации OpenGL

glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

glClear(GL_COLOR_BUFFER_BIT);

glPushMatrix();

glRotatef(theta, 0.0f, 0.0f, 1.0f);

glBegin(GL_TRIANGLES);

glColor3f(1.0f, 0.0f, 0.0f); glVertex2f( 0.0f, 1.0f);

glColor3f(0.0f, 1.0f, 0.0f); glVertex2f( 0.87f,-0.5f);

glColor3f(0.0f, 0.0f, 1.0f); glVertex2f(-0.87f,-0.5f);

glEnd();

glPopMatrix();

SwapBuffers(hDC);

theta += 1.0f;

}//if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)... else

}//while(!bQuit)

//Отключаем OpenGL

DisableOpenGL(hWnd, hDC, hRC);

//Уничтожаем главное окно

DestroyWindow( hWnd );

return msg.wParam;

}

Главное окно данного приложения не отличается от главного окна приложения из примера. С той лишь разницей, что теперь треугольник врщается против часовой стрелки.


PolyTextOut

Демонстрация использования функции PolyTextOut. В данном примере эта функция для вывода на экран трех строк. Это осуществляется два этапа. На первом этапе подготавливается массив структур POLYTEXT. За это отвечает процедура PreparePolyTexts. Данная процедура вызывается в самом начале программы до создания основного окна. На втором осуществляется вывод строк с использованием этого массива. Это осуществляется во время обработки сообщения WM_PAINT следующим образом.

· С помощью функции BeginPaint подготавливается контекст устройства.
· Вызывается PolyTextOut для вывода строк.
· C помощью функции EndPaint освобождается контекст устройства.

Ниже приводится полный исходный текст даного приложения.

#include <windows.h>

//Количество выводимых строк

#define COUNT_STRINGS 3

//Массив выводимсы строк

const char *strings[COUNT_STRINGS] = {"Первая строка",

"Вторая строка",

"Третья строка"};

//Массив структур POLYTEXT

POLYTEXT ptxt[COUNT_STRINGS];

//Инициализирует массив ptxt

void PreparePolyTexts(){

unsigned int i;

for(i=0; i<COUNT_STRINGS; ++i){

ptxt[i].x = 20;

ptxt[i].y = (i+1)*30;

ptxt[i].n = strlen(strings[i]);

ptxt[i].lpstr = strings[i];

ptxt[i].uiFlags = ETO_OPAQUE;

ptxt[i].pdx = NULL;

}

}

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

HDC hdc;

PAINTSTRUCT ps;

switch(uMsg){

case WM_PAINT:

//Подготавливаем контекст устройства

hdc = BeginPaint(hwnd, &ps);

//Выводим строки

PolyTextOut(hdc, ptxt, COUNT_STRINGS);

//Освобождаем контекст устройства

EndPaint(hwnd, &ps);

break;

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

return 0;

}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

//ПОдготавливаем массив структур POLYTEXT

PreparePolyTexts();

//ПОдготавливаем класс окна и создаем окно

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, "PolyTextOut",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED,

100, 100, 150, 160, NULL, NULL, hInstance, 0);

//Цикл обработки сообщений

while(GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}

Ниже приводится главное окно приложения.


PostThreadMessage

Демонстрация работы функции PostThreadMessage. В данном примере мы создадим два приложения, потоки которых будут взаимодействовать посредством этой функции. Для того, чтобы не мешать другим приложениям системы наши приложения с помощью функции RegisterWindowMessage зарегистрируют своё сообщение, которое и будут отправлять друг другу. Параметр wParam этого сообщения будет содержать идентификатор потока. Первое приложение создаёт окно и работает как обычное оконное приложение пока не получит зарегистрированное сообщение. Получив его, приложение 1 извлекает из параметра wParam идентификатор потока и с помощью функции PostThreadMessage отправляет ему зарегистрированное сообщение обратно. Вот полный исходный код первого приложения.

#include <windows.h>

//Код сообщения для взаимодействия с потоком

int iMessage;

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

if(uMsg == iMessage){

//Отправляем сообщение указанному потоку

PostThreadMessage(wParam,iMessage,0,0);

//Уведомдляем пользователя о том, что сообщение отправлено

MessageBox(hwnd,"Сообщение отправлено","",MB_OK);

return 0;

}

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;

}

int 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, "PostThreadMessage",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED|WS_BORDER,

400, 300, 250, 250, NULL, NULL, hInstance, 0);

//Регистрируем сообщение для взаимодействия с другим потоком

iMessage = RegisterWindowMessage("PostThreadMessage");

//Цикл обработки сообщений

while(GetMessage(&msg,NULL,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}

Второе приложение не создаёт окна. Оно регистрирует сообщение, с помощью функции BroadcastSystemMessage рассылает его всем приложениям и ждёт получения сообщения. Вот полный исходный код второго приложения.

#include <windows.h>

int main()

{

//Регистрируем сообщение

int iMessage;

iMessage = RegisterWindowMessage("PostThreadMessage");

//Рассылаем сообщение всем окнам

DWORD dw;

dw = BSM_APPLICATIONS;

BroadcastSystemMessage(BSF_IGNORECURRENTTASK,&dw,iMessage,GetCurrentThreadId(),0);

MSG msg;

//Ожидаем приёма сообщения

while(1){

GetMessage(&msg,NULL,0,0);

//Проверяем: то ли это сообщение?

if(msg.message == iMessage) break;

}

//Выводим информацию о том, что сообщение получено

char s[] = "Сообщение получено";

CharToOem(s,s);

printf("%s\n",s);

getchar();

return 0;

}

Идентификатор текущего потока определяется с помощью функции GetCurrentTheadId. Вызов функции CharToOem нужен для корректного отображения кириллицы в окне консоли. В нашем примере приложение 1 должно запускаться до приложения 2. Если этот порядок нарушить, то функция GetMessage в приложении 2 не вернет управления и оно "зависнет".


ReplyMessage

Демонстрация работы функции ReplyMessage. В данном примере мы создаём обычное оконное приложение, которое вызывает эту функцию при обработке сообщения WM_CLOSE.

#include <windows.h>

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

switch(uMsg){

case WM_CLOSE: ReplyMessage(0); DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg){

return 0;

}

int 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, "ReplyMessage",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED|WS_BORDER,

400, 300, 250, 250, NULL, NULL, hInstance, 0);

//Цикл обработки сообщений

while(GetMessage(&msg,NULL,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}


SendMessageCallback

Демонстрация работы функции SendMessageCallback. В данном примере мы создаём окно с кнопкой. При нажатии на кнопку приложение ищет главное окно кальккулятора и с помощью функции SendMessageCallback отправляет ему сообщение WM_CLOSE. В функции обратного вызова SendAsyncProc пользователю выводится сообщение о том, что калькулятор закрыт. В качестве дополнительного параметра в функцию обратного вызова передаётся значение дескриптора главного окна приложения.

#include <windows.h>

//Идентификатор кнопки

#define ID_BUTTON 0x100

//Функция обратного вызова для SendMessageCallback

void SendAsyncProc(HWND hwnd,UINT uMsg,ULONG_PTR dwData,LRESULT lResult){

MessageBox((HWND)dwData,"Калькулятор закрыт","",MB_OK);

}

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

HWND hwndCalc;

switch(uMsg){

case WM_COMMAND:

if((HIWORD(wParam)==BN_CLICKED)&&(LOWORD(wParam)==ID_BUTTON)){

//Обработка нажатия на кнопку

//Ищем окно калькулятора

hwndCalc = FindWindow("SciCalc",NULL);

if(hwndCalc){

//Окно найдено - закрываем его

SendMessageCallback(hwndCalc,WM_CLOSE,0,0,(SENDASYNCPROC)SendAsyncProc,(int)hwnd);

}else{

//Окно не найдено

MessageBox(hwnd,"Окно калькулятора не найдено","",MB_OK);

}//if(hwndCalc){

}//if((HIWORD(wParam)==BN_CLICKED)&&(LOWORD(wParam)==ID_BUTTON)){

break;

case WM_CLOSE:

DestroyWindow(hwnd);

break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg){

return 0;

}

int 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, "MyWindow",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED|WS_BORDER,

500, 500, 200, 200, NULL, NULL, hInstance, 0);

//Создаем кнопку

HWND hwnd_button;

hwnd_button = CreateWindowEx(0,"button", "&Закрыть калькулятор",

WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON|WS_BORDER,

25, 60, 150, 30, hwnd, (HMENU)ID_BUTTON, hInstance, 0);

//Цикл обработки сообщений

while(GetMessage(&msg,NULL,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}


SetBkMode

Демонстрация работы функции SetBkMode. В данном примере демонстрируется вывод строки " Привет, Мир! " с различными параметрами фона (OPAQUE и TRANSPARENT). Вывод текста осуществляется с помощью функции TextOut при обработке сообщения WM_PAINT.

Ниже приводится полный исходный код примера.

#include <windows.h>

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

HDC hdc;

switch(uMsg){

case WM_PAINT:

hdc = GetDC(hwnd);

//Устанавливаем зеленый цвет фона

SetBkColor(hdc, RGB(0, 0xFF, 0));

//С заполнением фона

SetBkMode(hdc, OPAQUE);

TextOut(hdc, 45, 30, " Привет, Мир! ", 14);

//Без заполнения фона

SetBkMode(hdc, TRANSPARENT);

TextOut(hdc, 45, 80, " Привет, Мир! ", 14);

ReleaseDC(hwnd, hdc);

break;

case WM_CLOSE : DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0) ; break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

return 0;

}

int 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, "SetBkMode",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED,

100, 100, 200, 150, NULL, NULL, hInstance, 0);

//Цикл обработки сообщений

while(GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}

Ниже приводится главное окно разработанного приложения. Первая строка выводится в режиме заполнения фона. Вторая строка - без заполнения фона.

Различие между выводами строк состоит в режиме отображения фона. Цвет фона в обоих случаях один и тот же.


SetClassLong

Демонcтрация работы функции SetClassLong. В данном примере мы используем функцию SetClassLong для изменения цета фона окна после его создания.

#include <windows.h>

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

switch(uMsg){

case WM_SHOWWINDOW:

//Изменяем цвет фона

SetClassLong(hwnd,GCL_HBRBACKGROUND,COLOR_CAPTIONTEXT);

break;

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

return 0;

}

int 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);

//Создаем окно

HWND hwnd;

hwnd = CreateWindowEx(0, ClassName, "MyWindow",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED,

100, 100, 200, 200, NULL, NULL, hInstance, 0);

//Цикл обработки сообщений

while(WaitMessage()) {

PeekMessage(&msg, NULL, 0, 0,PM_REMOVE);

TranslateMessage(&msg);

DispatchMessage(&msg);

if(msg.message == WM_QUIT) break;

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}


SetClassWord

Демонстрация работы функций GetClassWord и SetClassWord. В данном примере мы создаём окно, в заголовке которого выводится время, прошедшее с момента запуска приложения (в секундах). При этом прошедшее время сохраняется в дополнительной памяти класса.

#include <windows.h>

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

static int idTimer = 1;

WORD _t=0;

char s[10];

switch(uMsg){

case WM_SHOWWINDOW:

//Устанавливаем таймер

SetTimer(hwnd,idTimer,1000,NULL);

break;

case WM_TIMER:

//Запрашиваем значение из дополнительной памяти

_t = GetClassWord(hwnd,0);

//Выводим его на экран

sprintf(s,"%d",_t);

SetWindowText(hwnd,s);

//Сохраняем новое значение

_t++;

SetClassWord(hwnd,0,_t);

break;

case WM_CLOSE:

KillTimer(hwnd,idTimer);

DestroyWindow(hwnd);

break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

return 0;

}

int 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 = sizeof(WORD);

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, "MyWindow",

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);

return 0;

}


SetMenuItemBitmaps

Демонстрация использования функции SetMenuItemBitmaps. В данном примере создается меню, в котором каждый пункт сопровождается растровым изображением или галочкой. Растровые изображения хранятся в ресурсах исполняемого файла и загружаются с помощью функции LoadBitmap.

Установка растровых изображений осуществляется в оконной процедуре при обработке сообщения WM_INITDIALOG. Для каждого устанавливаемого изображения делается следующее.

1. С помощью функции LoadBitmap изображение загружается из ресурсов в память приложения.
2. С помощью функции SetMenuItemBitmaps загруженное изображение ассоциируется с пунктом меню.

Описатели изображений сохраняются в статической переменной. Это делается для того, чтобы иметь возможность уничтожить эти описатели с помощью функции DeleteObject. Она вызывается при получении сообщения WM_CLOSE.

Для пункта меню с флажком загружать изображение не нужно. Флажок отображается или скрывается автоматически самой системой. Тем не менее мы должны самостоятельно переключать состояние соответствующего пункта меню (выбран или не выбран). Делается это с помощью функции CheckMenuItem при получении соответствующей команды от меню (сообщение WM_COMMAND с надлежащими параметрами).

Ниже приводится полный исходный текст программы.

#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)

{

//Описатель меню

static HMENU hmenu = NULL;

//Признак отображения флажка в пункте меню "Открыть"

static boolean isChecked = TRUE;

//Описатели растровых изображений

static HBITMAP hBitmap_New = NULL;

static HBITMAP hBitmap_Save = NULL;

//Описатель экземпляра приложения

HINSTANCE hInstance = NULL;

switch(uMsg){

case WM_INITDIALOG:

//Получаем описатель экземпляра приложения и меню

hInstance = GetModuleHandle(NULL);

hmenu = GetMenu(hwnd);

//Устанавливаем изображение в пункт меню "Создать"

hBitmap_New = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_NEW));

SetMenuItemBitmaps(hmenu, IDM_NEW, MF_BYCOMMAND, hBitmap_New, hBitmap_New);

//Устанавливаем изображение в пункт меню "Сохранить"

hBitmap_Save = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_SAVE));

SetMenuItemBitmaps(hmenu, IDM_SAVE, MF_BYCOMMAND, hBitmap_Save, hBitmap_Save);

break;

case WM_COMMAND:

if(LOWORD(wParam) == IDM_OPEN){

//Изменяем состояние флажка

CheckMenuItem(hmenu, IDM_OPEN, MF_BYCOMMAND | (isChecked ? MF_UNCHECKED : MF_CHECKED));

isChecked = ! isChecked;

}

break;

case WM_CLOSE:

//Закрываем диалоговое окно

EndDialog(hwnd,0);

//Освобождаем ресурсы

DeleteObject(hBitmap_New);

DeleteObject(hBitmap_Save);

}//switch(uMsg){

return 0;

}

Ниже приводится содержимое файла ресурсов. В них сохраняются шаблон диалогового окна, растровые изображения и меню. Для пункта меню с флажком ("Открыть") в ресурсах указывается начальное состояние - выбран.

#include "Resource.h"

#include <windows.h>

//Меню

ID_MENU MENU{

POPUP "Файл"{

MENUITEM "Создать" , IDM_NEW

MENUITEM "Открыть" , IDM_OPEN, CHECKED

MENUITEM "Сохранить", IDM_SAVE

}

}

//Растровые изображения

IDB_NEW BITMAP "new_bitmap.bmp"

IDB_SAVE BITMAP "save_bitmap.bmp"

//Шаблон диалогового окна

ID_DIALOG DIALOGEX 0,0,130,130

STYLE WS_CAPTION | WS_VISIBLE | WS_SYSMENU | DS_CENTER | WS_MINIMIZEBOX

CAPTION "Меню"

MENU ID_MENU

BEGIN

END

Ниже приводится содержимое заголовочного файла Resource.h. В нём задаются идентификаторы ресурсов.

//Шаблон диалогового окна

#define ID_DIALOG 0x1000

//Меню

#define ID_MENU 0x2000

//Пункты меню

#define IDM_FILE 0x2100

#define IDM_NEW 0x2110

#define IDM_OPEN 0x2120

#define IDM_SAVE 0x2130

//Растровые изображения

#define IDB_NEW 0x3100

#define IDB_SAVE 0x3200

На рисунке ниже приводится главное окно разработанного приложения.


SetProcessDefaultLayout

Демонстрация работы функции SetProcessDefaultLayout, которая изменяет раскладку окна по умолчанию. Данный пример аналогичен примеру, с единственным исключением: перед создаем окна мы вызываем функцию SetProcessDefaultLayout.

#define _WIN32_WINNT 0x0500

#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;

}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

//Меняем раскладку

SetProcessDefaultLayout(LAYOUT_RTL);

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, 200, 200, NULL, NULL, hInstance, 0);

//Цикл обработки сообщений

while(GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}

На рисунке ниже показано получившееся окно с измененной раскладкой:


SetWindowDisplayAffinity

Демонстрация использования функции SetWindowDisplayAffinity, которая позволяет защитить содержимое окна, от копирования путём снятия скриншота с экрана. Данная программа проверялась на компьютере под управлением Windows 7.

#include <windows.h>

#define WDA_MONITOR 1

#define WDA_NONE 0

//Прототип функции SetWindowDisplayAffinity

typedef BOOL (*SETWINDOWDISPLAYAFFINITY)(HWND,DWORD);

SETWINDOWDISPLAYAFFINITY lpfSetWindowDisplayAffinity;

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

//Флаг под результат вызова SetWindowDisplayAffinity

BOOL res = TRUE;

//Флаг: обрабатываем только первое принятое сообщение WM_SHOWWINDOW

static BOOL first = TRUE;

switch(uMsg){

case WM_SHOWWINDOW:

if(!first) break;

//Вызываем функцию SetWindowDisplayAffinity

res = lpfSetWindowDisplayAffinity(hwnd,WDA_MONITOR);

//Изменяем значение флага: сообщение WM_SHOWWINDOW мы уже обработали

first = FALSE;

//Сообщаем результат вызова функции SetWindowDisplayAffinity

MessageBox(hwnd,(res)?("success"):("fail"),"",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;

}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

//Находим адрес функции SetWindowDisplayAffinity

HINSTANCE huser;

huser = GetModuleHandle("user32.dll");

lpfSetWindowDisplayAffinity = (SETWINDOWDISPLAYAFFINITY)GetProcAddress(huser,"SetWindowDisplayAffinity");

//Если функция не найдена, то выходим

if(!lpfSetWindowDisplayAffinity) return -1;

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, "MyWindow",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED,

100, 100, 200, 200, NULL, NULL, hInstance, 0);

//Цикл обработки сообщений

MSG msg;

while(GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}

К сожалению, на имеющемся у меня оборудовании данная функция возвращает значение FALSE с кодом ошибки 8 (ERROR_NOT_ENOUGH_MEMORY). Скорее всего это вызвано тем, что у меня не активирован режим построения окон посредством диспетчера рабочего стола (Desktop Window Manager - DWM).


ShellHookWindow

Здесь приведен пример работы с функциями RegisterShellHookWindow и DeregisterShellHookWindow. В данном приложении мы создаём диалоговое окно со списком (ListBox), которое выводит описатели активируемых окон.

#include <windows.h>

#include "Resource.h"

//Код уведомительного сообщения

int WM_SHELLHOOKMESSAGE;

//Прототип адреса функциии RegisterShellHookWindow

typedef BOOL (*PREGISTERSHELLHOOKWINDOW)(HWND);

PREGISTERSHELLHOOKWINDOW pRegisterShellHookWindow;

//Прототип адреса функции DeregisterShellHookWindow

typedef BOOL (*PDEREGISTERSHELLHOOKWINDOW)(HWND);

PDEREGISTERSHELLHOOKWINDOW pDeregisterShellHookWindow;

//Прототип Диалоговой процедуры

INT_PTR WINAPI Dlg_Proc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int hFunsterStil)

{

HINSTANCE huser;

huser = LoadLibrary("user32");

if(!huser) return -1;

//Получаем адрес функции RegisterShellHookWindow

pRegisterShellHookWindow = (PREGISTERSHELLHOOKWINDOW)GetProcAddress(huser,"RegisterShellHookWindow");

if(!pRegisterShellHookWindow) return -1;

//Получаем адрес функции DeregisterShellHookWindow

pDeregisterShellHookWindow = (PDEREGISTERSHELLHOOKWINDOW)GetProcAddress(huser,"DeregisterShellHookWindow");

if(!pDeregisterShellHookWindow) return -1;

//Получаем значение кода уведомительного сообщения

WM_SHELLHOOKMESSAGE = RegisterWindowMessage("SHELLHOOK");

//Создаем диалоговое окно

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)

{

if((uMsg==WM_SHELLHOOKMESSAGE)&&(wParam==HSHELL_WINDOWACTIVATED)){

//Поступило уведомительное сообщение об активации окна

char s[10];

snprintf(s, 10,"%x",lParam);

//Добавляем в список строку с дескриптором активированного окна

SendDlgItemMessage(hwnd,ID_LISTBOX,LB_ADDSTRING,0,(LPARAM)s);

}

switch(uMsg){

case WM_INITDIALOG:

//Очищаем список

SendDlgItemMessage(hwnd,ID_LISTBOX,LB_RESETCONTENT,0,0);

//Регистрируем окно-перехватчик

pRegisterShellHookWindow(hwnd);

break;

case WM_CLOSE:

//Снимаем с регистрации окно-перехватчик

pDeregisterShellHookWindow(hwnd);

//Закрываем диалоговое окно

EndDialog(hwnd,0);

}

return 0;

}

Ниже приведено содержимое файла ресурсов.

#include "Resource.h"

#include <windows.h>

ID_DIALOG DIALOG 0,0,120,100

STYLE WS_CAPTION | WS_VISIBLE | WS_SYSMENU | DS_CENTER |WS_MINIMIZEBOX

CAPTION "ShellHookWindow"

BEGIN

LISTBOX ID_LISTBOX, 05,05,110,90,WS_VISIBLE

END

И наконец содержимое файла Resource.h.

#define ID_DIALOG 0x1000

#define ID_LISTBOX 0x1020


TabbedTextOut

Демонстрация использования функции GetTabbedTextExtent и TabbedTextOut. В данном примере с помощью символов табуляции осуществляется выравнивание строк в одну колонку.

Допустим у нас есть четыре строки:

Один Один Один

Два Два Два

Три Три Три

Четыре Четыре Четыре

Мы хотим, чтобы они размещались так:

Один Один Один

Два Два Два

Три Три Три

Четыре Четыре Четыре

Для этого используем символы табуляции. Допустим, что размер строк нам неизвестен, поэтому нам нужно настроить размеры символов табуляции.

Разработанный пример работает в два этапа. На первом этапе создается обычное окно, рассчитываются размеры строк с учетом символов табуляции и подгоняется размер окна для того, чтобы вместить в себя данные строки. На втором этапе, при обработке сообщения WM_PAINT осуществляется вывод строк. Строки организованы в массив.

Рассмотрим эти этапы более подробно. Первый этап реализован в процедуре PrepareWindow. Вот как она работает.

· Вызывает функцию GetIndexMaxString, которая возвращает индекс самой длиной строки. Её реализация тривиальна.
· Вызывает функцию GetDC для получения контекста устройства созданного окна.
· Вызывает процедуру PrepareTabStops, которая рассчитывает положения остановок по табуляции.
· Вызывает функцию GetTabbedTextExtent, которая рассчитывает максимальную длину строки с учетом символов табуляции.
· Вызывает функцию ReleaseDC для освобождения контекста устройства.
· Вызывает функцию GetWindowRect для определения текущих размеров окна.
· С помощью функции MoveWindow устанавливает размер окна достаточный для того, чтобы в нем разместились строки с учетом табуляции.

Процедура PrepareTabStops работает следующим образом.

· С помощью функции GetWidthMaxElement определяет размер максимального элемента строки (то есть подстроки "Четыре").
· Заполняет массив остановок по табуляции tabstops.

Функция GetWidthMaxElement работает так.

· Путем поиска символа табуляции в самой длиной строке ("Четыре\tЧетыре\tЧетыре") определяет длину элемента строки ("Четыре") в символах.
· С помощью функции GetTextExtentPoint32 определяет размер элемента строки в логических единицах.
· Полученный размер возвращается функцией в процедуру PrepareTabStops.

На втором этапе, при получении сообщения WM_PAINT, вызывается процедура WriteStrings, которая выводит строки. Она работает следующим образом.

· Подготавливает контекст устройства с помощью функции BeginPaint.
· В цикле для каждой строки вызывает функцию TabbedTextOut, которая отображает её в окне с учетом табуляции.
· Освобождает контекст устройства с помощью функции EndPaint.

Ниже приводится полный исходный код данного примера.

#include <windows.h>

#include <stdio.h>

#include <string.h>

//Количество строк

#define COUNT_STRINGS 4

//Колисество символов табуляции в каждой строке

#define COUNT_TABS 2

//Символ табуляции

#define CHAR_TAB '\t'

//Минимальная ширина табуляции

#define WIDTH_TAB 30

//Выводимые строки

const char* strings[COUNT_STRINGS] = {

"Один\tОдин\tОдин",

"Два\tДва\tДва",

"Три\tТри\tТри",

"Четыре\tЧетыре\tЧетыре"

};

//Остановки табуляции

int tabstops[COUNT_TABS];

/*************************************************/

/******Возвращает индекс самой длиной строки******/

/*************************************************/

unsigned int GetIndexMaxString()

{

//Инициалищируем счетчики

unsigned int len;

len = strlen(strings[0]);

unsigned int max_i;

max_i = 0;

//Цикл по строкам

unsigned int i;

unsigned int templen;

for(i=1;i<COUNT_STRINGS;i++){

templen = strlen(strings[i]);

if(templen > len){

len = templen;

max_i = i;

}

}

return max_i;

}

/*************************************************/

/***Возвращает ширину самого большого элемента****/

/*************************************************/

unsigned int GetWidthMaxElement(HDC hdc, unsigned int index)

{

//Ищем символ табуляции в строке - разделитель элементов

unsigned int tabpos;

tabpos = (unsigned int)strchr(strings[index], CHAR_TAB);

if(!tabpos) return 0;

//Определяем количество символов в одном элементе

unsigned int countchar;

countchar = (unsigned int)tabpos - (unsigned int)strings[index];

//Определяем размер элемента

SIZE size = {0, 0};

GetTextExtentPoint32(hdc, strings[index], countchar, &size);

//Возвращаем ширину

return size.cx;

}

/*************************************************/

/***Подготавливает массив остановок по табуляции**/

/*************************************************/

void PrepareTabStops(HDC hdc, unsigned int index)

{

//Получаем ширину максимального элемента

unsigned int maxwidth;

maxwidth = GetWidthMaxElement(hdc, index);

if(!maxwidth) return;

//Заполняем массив остановок

tabstops[0] = maxwidth + WIDTH_TAB;

unsigned int i;

for(i=1; i<COUNT_TABS; i++)

tabstops[i] = tabstops[i-1] + maxwidth + WIDTH_TAB;

}

/*************************************************/

/**Подготавливает окно (подгоняет его по ширине)**/

/*************************************************/

void PrepareWindow(HWND hwnd)

{

//Получаем индекс самой длиной строки

unsigned int index;

index = GetIndexMaxString();

HDC hdc;

hdc = GetDC(hwnd);

//Подготавливаем массив остановок по табуляции

PrepareTabStops(hdc, index);

//Опредляем размер самой длиной строки с символами табуляции

unsigned int size;

size = GetTabbedTextExtent(hdc, strings[index], strlen(strings[index]), COUNT_TABS, tabstops);

ReleaseDC(hwnd, hdc);

//Получаем ширину самой длиной строки с символами табуляции

unsigned int width;

width = LOWORD(size);

//Получаем текущие размеры окна

RECT rc;

GetWindowRect(hwnd, &rc);

//Изменяем размеры окна

MoveWindow(hwnd, 100, 100, width + 2*20, rc.bottom - rc.top, TRUE);

}

/*************************************************/

/*****Отрисовывает строки с учетом табуляции******/

/*************************************************/

void WriteStrings(HWND hwnd)

{

//Подготавливаем контекст стуройства

HDC hdc;

PAINTSTRUCT ps;

hdc = BeginPaint(hwnd, &ps);

//Выводим строки

unsigned int i;

for(i=0; i<COUNT_STRINGS; i++)

TabbedTextOut(hdc, 20, 20*(i+1), strings[i], strlen(strings[i]), COUNT_TABS, tabstops, 20);

//Освобожэдаем контекст устройства

EndPaint(hwnd, &ps);

}

/*************************************************/

/***************Оконная процедура*****************/

/*************************************************/

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

switch(uMsg){

case WM_PAINT:

//Отрисовываем строки

WriteStrings(hwnd);

break;

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

return 0;

}

/*************************************************/

/***************Главная процедура*****************/

/*************************************************/

int 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, "TabbedTextOut",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED,

100, 100, 200, 150, NULL, NULL, hInstance, 0);

//Подготавливаем окно

PrepareWindow(hwnd);

//Цикл обработки сообщений

while(GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}

На рисунке ниже показано главное окно разработанного приложения.

На этом рисунке видно, что строки выровнены.


UpdateLayeredWindow

Здесь приведен пример вызова функции UpdateLayeredWindow для окна калькулятора. Вначале мы находим окно калькулятора, делаем его слоистым (с помощью функции SetWindowLong) и вызываем для него функцию UpdateLayeredWindow. Программа выводит на экран сообщение "success" (вызов функции прошел успешно), а главно окно калькулятора исчезает. Это происходит потому, что после обновления окна калькулятор должен самостоятельно перерисовать своё окно, но он этого не делает (поскольку он не расчитан на то, чтобы быть слоистым окном), поэтому после запуска данной программы мы его и не видим.

#define WINVER 0x0500

#include <windows.h>

typedef HDC (*CREATECOMPATIBLEDC)(HDC);

typedef HBITMAP (*CREATECOMPATIBLEBITMAP)(HDC, int, int);

typedef HGDIOBJ (*SELECTOBJECT)(HDC, HGDIOBJ);

typedef BOOL (*DELETEOBJECT)(HGDIOBJ);

typedef BOOL (*DELETEDC)(HDC);

CREATECOMPATIBLEDC pCreateCompatibleDC;

CREATECOMPATIBLEBITMAP pCreateCompatibleBitmap;

SELECTOBJECT pSelectObject;

DELETEOBJECT pDeleteObject;

DELETEDC pDeleteDC;

int main()

{

HWND hwnd;

//Находим главное окно калькулятора

hwnd = FindWindow("SciCalc",NULL);

if(!hwnd) return -1;

RECT rc;

GetWindowRect(hwnd, &rc);

SIZE sizeWnd;

sizeWnd.cx = rc.right - rc.left;

sizeWnd.cy = rc.bottom - rc.top;

//Устанавливаем стиль WS_EX_LAYERED

SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED);

//Загружаем библиотеку gdi32.dll

HINSTANCE hgdi;

hgdi = LoadLibrary("gdi32.dll");

if(!hgdi) return -1;

//Создаем контекст устройства

HDC hdcScreen;

hdcScreen = GetDC(hwnd);

//Создаем контекст устройства памяти, совместимый с устройством

HDC hDC;

pCreateCompatibleDC = (CREATECOMPATIBLEDC)GetProcAddress(hgdi, "CreateCompatibleDC");

if(pCreateCompatibleDC)

hDC = pCreateCompatibleDC(hdcScreen);

//Создаем совместимое с устройством растровое изображение

HBITMAP hBitmap;

pCreateCompatibleBitmap = (CREATECOMPATIBLEBITMAP)GetProcAddress(hgdi, "CreateCompatibleBitmap");

if(pCreateCompatibleBitmap)

hBitmap = pCreateCompatibleBitmap(hdcScreen, sizeWnd.cx, sizeWnd.cy);

//Выбираем объект в контексте устройства

pSelectObject = (SELECTOBJECT)GetProcAddress(hgdi, "SelectObject");

HGDIOBJ OldObject;

if(pSelectObject)

OldObject = pSelectObject(hDC, hBitmap);

//Инициализируем структуру BLENDFUNCTION

BLENDFUNCTION BlendFunction = {0};

BlendFunction.BlendOp = AC_SRC_OVER;

BlendFunction.SourceConstantAlpha = 255;

BlendFunction.AlphaFormat = AC_SRC_ALPHA;

POINT ptPos = {0.0};

POINT ptSrc = {0, 0};

//Вызываем функцию UpdateLayeredWindow

if(UpdateLayeredWindow(hwnd, hdcScreen, &ptPos, &sizeWnd, hDC, &ptSrc, 0, &BlendFunction, ULW_ALPHA))

printf("success\n");

else

printf("fail\n");

//Освобождаем ресурсы

if(pSelectObject)

pSelectObject(hDC, OldObject);

pDeleteObject = (DELETEOBJECT)GetProcAddress(hgdi, "DeleteObject");

if(pDeleteObject)

pDeleteObject(hBitmap);

pDeleteDC = (DELETEDC)GetProcAddress(hgdi, "DeleteDC");

if(pDeleteDC)

pDeleteDC(hDC);

ReleaseDC(NULL, hdcScreen);

getchar();

return 0;

}


UpdateLayeredWindowIndirect

Здесь приведен пример вызова функции UpdateLayeredWindowIndirect. Данная программа тестировалась в операционной системе Windows 7. Поскольку я использую заголовочные файлы составленные под более старые версии операционной системы Windows, то мы, во-впервых, явно объявляем структуру UPDATELAYEREDWINDOWINFO и, во-вторых, используем динамическую загрузку для определения адреса функции UpdateLayeredWindowIndirect. Программа искажает окно калькулятора и выдает сообщение "success", свидетельствующее о том, что функция UpdateLayeredWindowIndirect выполнилась успешно.

#define WINVER 0x0500

#include <windows.h>

typedef struct tagUPDATELAYEREDWINDOWINFO {

DWORD cbSize;

HDC hdcDst;

const POINT *pptDst;

const SIZE *psize;

HDC hdcSrc;

const POINT *pptSrc;

COLORREF crKey;

const BLENDFUNCTION *pblend;

DWORD dwFlags;

const RECT *prcDirty;

} UPDATELAYEREDWINDOWINFO, *PUPDATELAYEREDWINDOWINFO;

typedef BOOL (*UPDATELAYEREDWINDOWINDIRECT)(HWND,const UPDATELAYEREDWINDOWINFO*);

UPDATELAYEREDWINDOWINDIRECT pUpdateLayeredWindowIndirect;

int main()

{

HWND hwnd;

//Находим главное окно калькулятора

hwnd = FindWindow("CalcFrame",NULL);

if(!hwnd) return -1;

//Определяем размеры окна

RECT rc;

GetWindowRect(hwnd,&rc);

SIZE sizeWnd;

sizeWnd.cx = rc.right - rc.left;

sizeWnd.cy = rc.bottom - rc.top;

GetClientRect(hwnd,&rc);

//Устанавливаем стиль WS_EX_LAYERED

SetWindowLong(hwnd,GWL_EXSTYLE,GetWindowLong(hwnd,GWL_EXSTYLE)|WS_EX_LAYERED);

//Определяем базовый адрес загрузки библиотеки user32.dll

HINSTANCE huser;

huser = GetModuleHandle("user32.dll");

if(!huser) return -1;

//Подготавливаем структуру UPDATELAYEREDWINDOWINFO

UPDATELAYEREDWINDOWINFO ULWInfo;

ULWInfo.cbSize = sizeof(UPDATELAYEREDWINDOWINFO);

ULWInfo.hdcDst = NULL;

POINT DestPosition = {100,100};

ULWInfo.pptDst = &DestPosition;

ULWInfo.psize = &sizeWnd;

//Получаем контекст устройства

HDC hDC;

hDC = GetDC(hwnd);

ULWInfo.hdcSrc = hDC;

POINT SourcePosition = {0,0};

ULWInfo.pptSrc = &SourcePosition;

ULWInfo.crKey = 0;

//Подготавливаем структуру BLENDFUNCTION

BLENDFUNCTION BlendFunction = {0};

BlendFunction.BlendOp = AC_SRC_OVER;

BlendFunction.SourceConstantAlpha = 255;

BlendFunction.AlphaFormat = AC_SRC_ALPHA;

ULWInfo.pblend = &BlendFunction;

ULWInfo.dwFlags = ULW_ALPHA;

ULWInfo.prcDirty = &rc;

//Вызываем функцию UpdateLayeredWindowIndirect

BOOL res = FALSE;

pUpdateLayeredWindowIndirect = (UPDATELAYEREDWINDOWINDIRECT)GetProcAddress(huser,"UpdateLayeredWindowIndirect");

if(pUpdateLayeredWindowIndirect)

res = pUpdateLayeredWindowIndirect(hwnd,&ULWInfo);

//Освобождаем ресурсы

ReleaseDC(hwnd,hDC);

printf((res)?("success\n"):("fail\n"));

getchar();

return 0;

}


WM_COPYDATA

Демонстрация работы с оконным сообщением WM_COPYDATA. Данное сообщение используется для передачи окну каких-либо данных. Отправитель и получатель данных могут быть разными процессами.

В данном примере мы создадим два приложения. Первое приложение будет подготавливать данные и отправлять их второму приложению. Второе приложение будет принимать данные и выводить их на экран.

Исходный код первого приложения.

#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)

{

HWND TargetWindow=NULL;

COPYDATASTRUCT copydata;

char* s;

switch(uMsg){

case WM_COMMAND:

if(wParam != BUTTON_CLICKED) break;

//Ищем окно, которому будем отправлять данные

TargetWindow = FindWindow(NULL, "Приёмник WM_COPYDATA");

if(!TargetWindow) break;

//Заполняем структуру COPYDATASTRUCT

copydata.dwData = 0;

copydata.cbData = GetWindowTextLength(GetDlgItem(hwnd,ID_EDIT));

//Убеждаемся в том, что есть данные для отправки

if(!(copydata.cbData)) break;

copydata.cbData ++;

s = (char*)malloc(copydata.cbData);

if(!s) break;

GetDlgItemText(hwnd,ID_EDIT,s,copydata.cbData);

copydata.lpData = s;

//Отправляем сообщение с данными

SendMessage(TargetWindow,WM_COPYDATA,(WPARAM)hwnd,(LPARAM)©data);

free(s);

break;

case WM_CLOSE:

//Закрываем окно

EndDialog(hwnd,0);

}

return 0;

}

Файл ресурсов.

#include "Resource.h"

#include <windows.h>

ID_DIALOG DIALOG 0,0,140,50

STYLE WS_CAPTION | WS_VISIBLE | WS_SYSMENU | DS_CENTER |WS_MINIMIZEBOX

CAPTION "Отправитель WM_COPYDATA"

BEGIN

EDITTEXT ID_EDIT, 5, 5,130,15,WS_BORDER

PUSHBUTTON "Отправить",ID_BUTTON, 50,25,50,20

END

Заголовочный файл "Resource.h" используется для описания констант.

#include <windows.h>

#define ID_DIALOG 0x1010

#define ID_EDIT 0x1020

#define ID_BUTTON 0x1030

#define BUTTON_CLICKED ((WPARAM)((BN_CLICKED<<16) + ID_BUTTON))

Ниже приводится главное окно первого приложения.

Данное приложение при нажатии на кнопку "Отправить" посредством сообщения WM_COPYDATA отправляет строку, введенную в поле ввода, второму приложению.

Исходный код второго приложения (получателя сообщения WM_COPYDATA)

#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)

{

COPYDATASTRUCT* cds;

switch(uMsg){

case WM_COPYDATA:

cds = lParam;

//Проверяем корректность полученного указателя на структуру COPYDATASTRUCT

if(IsBadReadPtr(cds, sizeof(COPYDATASTRUCT))) break;

//Выводим полученную строку в статическое поле

SetDlgItemText(hwnd,ID_STATIC,cds->lpData);

break;

case WM_CLOSE:

//Закрываем окно

EndDialog(hwnd,0);

}

return 0;

}

Файл ресурсов.

#include "Resource.h"

#include <windows.h>

ID_DIALOG DIALOG 0,0,130,30

STYLE WS_CAPTION | WS_VISIBLE | WS_SYSMENU | DS_CENTER |WS_MINIMIZEBOX

CAPTION "Приёмник WM_COPYDATA"

BEGIN

LTEXT "",ID_STATIC, 5, 5,120,15

END

Заголовочный файл "Resource.h" используется для описания идентификаторов.

#define ID_DIALOG 0x1000

#define ID_STATIC 0x1010

Ниже приводится главное окно второго приложения.

Данное приложение просто выводит полученную строку в статическом элементе управления.


WM_GETMINMAXINFO

Демонстрация обработки оконного сообщения WM_GETMINMAXINFO. Посредством обработки этого сообщения можно установить минимальные и максимальные размеры окна, а также положение окна в развернутом состоянии.

В нашем примере мы создадим окно, размеры которого могут быть изменены пользователем (установлен стиль WS_SIZEBOX). Путём обработки сообщения WM_GETMINMAXINFO мы установим минимальный (150 на 150) и максимальный (300 на 300) размеры этого окна.

#include <windows.h>

//Минимальные размеры окна

#define MIN_X 150

#define MIN_Y 150

//Максимальные размеры окна

#define MAX_X 300

#define MAX_Y 300

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

MINMAXINFO* pmmi;

switch(uMsg){

case WM_GETMINMAXINFO:

pmmi = (MINMAXINFO*)lParam;

//Указываем минимальные размеры окна

pmmi->ptMinTrackSize.x = MIN_X;

pmmi->ptMinTrackSize.y = MIN_Y;

//Указываем максимальные размеры окна

pmmi->ptMaxTrackSize.x = MAX_X;

pmmi->ptMaxTrackSize.y = MAX_Y;

break;

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

return 0;

}

int 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|WS_SIZEBOX,

100, 100, MIN_X, MIN_Y, NULL, NULL, hInstance, 0);

//Цикл обработки сообщений

while(GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}


WM_SIZE

Демонстрация обработки оконного сообщения WM_SIZE. Данное сообщение отправляется при изменении размеров окна. Изменение размеров окна реализует сама операционная система, а вот положение и размер дочерних окон (и элеменов управления) должно корректировать приложение. Именно этим мы и займемся.

Окно с изменяемыми размерами создаётся как обычное окно, у которого установлен стиль WS_SIZEBOX.

В качестве примера возьмём окно с многострочным полем ввода и кнопкой, как показано ниже.

Дочерние окна (поле ввода и кнопка) будем ориентировать относительно границ главного окна следующим образом.

Поле ввода расположено на фиксированном расстоянии от верхней, нижней, левой и правой границ главного окна. При том размер поля ввода изменяется в соответствии с именением размера главного окна так, чтобы сохранить эти расстояния неизменными.

Кнопка будет выравниваться по центру по горизонтали и располагаться на фиксированном расстоянии от нижней границы главного окна. Размер кнопки не меняется.

Положение и размер дочерних окон будем изменять посредством функции SetWindowPos.

При расчете минимальных размеров главного окна множитель 2 используется для учета размеров заголовка окна и рамки вокруг него. Точный размер заголовка и рамки можно получить с помощью функции GetSystemMetrics. Но я не стал её использовать, чтобы не усложнять код.

Минимальный размер окна устанавливается при обработке сообщения WM_GETMINMAXINFO.

#include <windows.h>

//Размеры кнопки

#define SIZE_BUTTON_X 70

#define SIZE_BUTTON_Y 30

//Расстояние между кнопкой и нижней границей окна

#define AFTER_BUTTON_Y 5

//Расстояние между полем ввода и кнопкой

#define BETWEEN_EDIT_BUTTON 10

//Расстояние между полем ввода и левой границей окна

#define BEFORE_EDIT_X 5

//Расстояние между полем ввода и правой границей окна

#define AFTER_EDIT_X BEFORE_EDIT_X

//Расстояние между полем ввода и верхней границей окна

#define BEFORE_EDIT_Y BEFORE_EDIT_X

//Расстояние между полем ввода и нижней границей окна

#define AFTER_EDIT_Y (BETWEEN_EDIT_BUTTON+SIZE_BUTTON_Y+AFTER_BUTTON_Y)

//Минимальная ширина окна

#if (SIZE_BUTTON_X > (BEFORE_EDIT_X+AFTER_EDIT_X))

#define MIN_X 2*SIZE_BUTTON_X

#else

#define MIN_X 2*(BEFORE_EDIT_X+AFTER_EDIT_X)

#endif

//Минимальная высота окна

#define MIN_Y 2*(BEFORE_EDIT_Y + AFTER_EDIT_Y)

//Описатели поля ввода и кнопки

HWND hwndEdit;

HWND hwndButton;

//Процедура-обработчик изменения размера окна

void OnSize(HWND hwnd, LPARAM lParam){

//Получаем новые размеры окна

SIZE size;

size.cx = LOWORD(lParam);

size.cy = HIWORD(lParam);

//Вычисляем новые координаты кнопки

POINT pos;

pos.x = (size.cx - SIZE_BUTTON_X)/2;

pos.y = size.cy - SIZE_BUTTON_Y - AFTER_BUTTON_Y;

//Меняем положение кнопки

SetWindowPos(hwndButton,NULL,pos.x,pos.y,0,0,SWP_NOZORDER|SWP_NOSIZE);

//Вычисляем новые размеры поля ввода

SIZE sizeEdit;

sizeEdit.cx = size.cx - BEFORE_EDIT_X - AFTER_EDIT_X;

sizeEdit.cy = size.cy - BEFORE_EDIT_Y - AFTER_EDIT_Y;

//Меняем размер поля ввода

SetWindowPos(hwndEdit,NULL,0,0,sizeEdit.cx,sizeEdit.cy,SWP_NOZORDER|SWP_NOMOVE);

}

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

MINMAXINFO* pmmi;

switch(uMsg){

case WM_GETMINMAXINFO:

pmmi = (MINMAXINFO*)lParam;

//Указываем минимальные размеры окна

pmmi->ptMinTrackSize.x = MIN_X;

pmmi->ptMinTrackSize.y = MIN_Y;

break;

case WM_SIZE:

//Изменение размера окна

OnSize(hwnd,lParam);

break;

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

return 0;

}

int 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, "WM_SIZE",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED|WS_SIZEBOX,

100, 100, MIN_X, MIN_Y, NULL, NULL, hInstance, 0);

//Получаем размер клиентской области окна

RECT rc;

GetClientRect(hwnd,&rc);

//Вычисляем размер поля ввода

SIZE sEdit;

sEdit.cx = (rc.right - rc.left) - BEFORE_EDIT_X - AFTER_EDIT_X;

sEdit.cy = (rc.bottom - rc.top) - BEFORE_EDIT_Y - AFTER_EDIT_Y;

//Создаем многострочное поле ввода

hwndEdit = CreateWindowEx(0, "Edit","Поле ввода",

WS_VISIBLE|WS_CHILD|ES_MULTILINE,

BEFORE_EDIT_X,BEFORE_EDIT_Y,sEdit.cx, sEdit.cy,

hwnd,NULL, hInstance,0);

//Вычисляем координаты кнопки

POINT PosButton;

PosButton.x = (rc.right - rc.left - SIZE_BUTTON_X)/2;

PosButton.y = (rc.bottom - rc.top - SIZE_BUTTON_Y - AFTER_BUTTON_Y);

//Создаём кнопку

hwndButton = CreateWindowEx(0, "Button","Кнопка",

WS_VISIBLE|WS_CHILD|BS_DEFPUSHBUTTON|WS_BORDER,

PosButton.x,PosButton.y,SIZE_BUTTON_X,SIZE_BUTTON_Y,

hwnd,NULL, hInstance,0);

//Цикл обработки сообщений

while(GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}


Вывод изображения в окно

Демонстрация вывода растрового изображения (bitmap) в окно с помощью функции BitBlt.

В данном примере создается окно, на поверхность которого выводится растровое изображение. Вся основная работа выполняется при обработке сообщений WM_CREATE и WM_PAINT. При получении сообщения WM_CREATE делается следующее.

· С помощью функции LoadImage изображение загружается из ресурсов.
· Вызывается функция GetObject для получения информации о загруженном изображении. Она заносится в структуру BITMAP. Нас прежде всего будут интересовать размеры изображения, хранящиеся в полях bmWidth и bmHeight этой структуры.
· Получается контекст устройства окна. Для этого используется функция GetDC.
· С помощью функции CreateCompatibleDC создается контекст устройства, совместимый с ранее полученным контекстом устройства окна. Созданный контекст устройства используеся для "хранения" в нем выводимого растрового изображения.
· Загруженное изображение выбирается в созданном контексте устройства. Выбор осуществляется функцией SelectObject.
· С помощью функции ReleaseDC освобождается контекст устройства окна.

Вывод изображения на поверхность окна осуществляется при обработке сообщения WM_PAINT. Он состоит всего из трех шагов.

· С помощью функции BeginPaint окно подготавливается к предстоящей операции рисования.
· Вызывается функция BitBlt для отрисовки изображения. Она переносит изображения из временного контекста устройства в контекст устройства окна.
· С помощью функции EndPaint завершаются операции рисования и освобождаются ресурсы.

При обработке сообщения WM_DESTROY освобождаются ресурсы.

· С помощью DeleteDC удаляется временный контекст устройства.
· С помощью DeleteObject удаляется растровое изображение.

Ниже приводится полный исходный текст разработанного приложения.

#include <windows.h>

#include <stdio.h>

#include "Constants.h"

/***************************/

/*****Оконная процедура*****/

/***************************/

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

//Описатель растрового изображения

static HBITMAP hbitmap = NULL;

//Структура, содержащая информацию об изображении

static BITMAP BitmapInfo;

//Контекст устройства окна

HDC hdc = NULL;

//Контекст устройства совместимый с окном

static HDC hMemDC = NULL;

//Используется при рисовании

PAINTSTRUCT ps;

switch(uMsg){

case WM_CREATE:

//Загружаем изображение из ресурсов

hbitmap = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(ID_BITMAP), IMAGE_BITMAP, 0, 0, 0);

//Получаем информацию об изображении

GetObject(hbitmap, sizeof(BITMAP), &BitmapInfo);

//Получаем контекст устройства окна

hdc = GetDC(hwnd);

//Создаем контекст устройства, совместимый с окном

hMemDC = CreateCompatibleDC(hdc);

//Связываем изображение с контекстом устройства

SelectObject(hMemDC, hbitmap);

//Освобождаем контекст устройства окна

ReleaseDC(hwnd, hdc);

break;

case WM_PAINT:

//Получаем контекст устройства окна

hdc = BeginPaint(hwnd, &ps);

//Переносим изображение в контекст устройства окна

BitBlt(hdc, 0, 0, BitmapInfo.bmWidth, BitmapInfo.bmHeight, hMemDC, 0, 0, SRCCOPY);

//Освобождаем ресурсы

EndPaint(hwnd, &ps);

break;

case WM_CLOSE:

DestroyWindow(hwnd);

break;

case WM_DESTROY:

//Удаляем временный контекст устройства

DeleteDC(hMemDC);

//Удаляем изображение

DeleteObject(hbitmap);

//Закрываем приложение

PostQuitMessage(0);

break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg){

return 0;

}

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = 0;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hThisInstance;

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|WS_BORDER,

400, 300, 320, 187, NULL, 0, hThisInstance, 0);

//Цикл обработки сообщений

MSG msg;

while(GetMessage(&msg,NULL,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hThisInstance);

return 0;

}

Ниже приводится содержимое файла ресурсов. Он содержит всего один ресурс - выводимое растровое изображение.

#include "Constants.h"

ID_BITMAP BITMAP "Nature.bmp"

Ниже приводится содержимое заголовочного файла Constants.h, содержащего идентификатор ресурса.

//Идентификатор изображения

#define ID_BITMAP 0x300

Ниже приводится главное окно разработанного приложения.


Вывод изображения в окно 2

Демонстрация вывода растрового изображения (bitmap) в окно с помощью функции StretchBlt. Данный пример аналогичен примеру с той лишь разницей, что вместо функции BitBlt мы используем функцию StretchBlt. Она позволяет растягивать изображение. Исходное изображение имеет размер 32 на 32 пикселя. Перед отображением на экране оно растягивается до размеров 200 на 200 логических единиц.

Ниже приводится полный исходный код приложения.

#include <windows.h>

#include <stdio.h>

#include "Constants.h"

/***************************/

/*****Оконная процедура*****/

/***************************/

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

//Описатель растрового изображения

static HBITMAP hbitmap = NULL;

//Структура, содержащая информацию об изображении

static BITMAP BitmapInfo;

//Контекст устройства окна

HDC hdc = NULL;

//Контекст устройства совместимый с окном

static HDC hMemDC = NULL;

//Используется при рисовании

PAINTSTRUCT ps;

switch(uMsg){

case WM_CREATE:

//Загружаем изображение из ресурсов

hbitmap = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(ID_BITMAP), IMAGE_BITMAP, 0, 0, 0);

//Получаем информацию об изображении

GetObject(hbitmap, sizeof(BITMAP), &BitmapInfo);

//Получаем контекст устройства окна

hdc = GetDC(hwnd);

//Создаем контекст устройства, совместимый с окном

hMemDC = CreateCompatibleDC(hdc);

//Связываем изображение с контекстом устройства

SelectObject(hMemDC, hbitmap);

//Освобождаем контекст устройства окна

ReleaseDC(hwnd, hdc);

break;

case WM_PAINT:

//Получаем контекст устройства окна

hdc = BeginPaint(hwnd, &ps);

//Переносим изображение в контекст устройства окна

StretchBlt(hdc, 50, 0, 200, 200, hMemDC, 0, 0, BitmapInfo.bmWidth, BitmapInfo.bmHeight, SRCCOPY);

//Освобождаем ресурсы

EndPaint(hwnd, &ps);

break;

case WM_CLOSE:

DestroyWindow(hwnd);

break;

case WM_DESTROY:

//Удаляем временный контекст устройства

DeleteDC(hMemDC);

//Удаляем изображение

DeleteObject(hbitmap);

//Закрываем приложение

PostQuitMessage(0);

break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg){

return 0;

}

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = 0;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hThisInstance;

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|WS_BORDER,

400, 300, 300, 230, NULL, 0, hThisInstance, 0);

//Цикл обработки сообщений

MSG msg;

while(GetMessage(&msg,NULL,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hThisInstance);

return 0;

}

Ниже приводится содержимое файла ресурсов. Он содержит всего один ресурс - выводимое растровое изображение.

#include "Constants.h"

ID_BITMAP BITMAP "bitmap.bmp"

Ниже приводится содержимое заголовочного файла Constants.h, содержащего идентификатор ресурса.

//Идентификатор изображения

#define ID_BITMAP 0x300

Ниже приводится главное окно разработанного приложения.


Вывод изображения в окно 3

Демонстрация вывода изображения в окно с использованием функции MaskBlt.

Вся основная работа выполняется при обработке сообщений WM_CREATE и WM_PAINT. При получении первого сообщения подготавливаются два растровых изображения (исходное и маска). Исходное изображение создается программно. Маска загружается из ресурсов. При получении сообщения WM_PAINT осуществляется вывод этих изображений.

При получении сообщения WM_CREATE делается следующее.

· Вызывается функция PrepareBitmap, которая создает исходное изображение.
· С помощью функции LoadBitmap из ресурсов загружается растровое изображение маски.

Исходное изображение размером 128 на 128 пикселей представляет собой квадрат зеленого цвета. Оно создается программно в функции PrepareBitmap следующим образом.

· С помощью функции GetDC получается описатель контекста устройства окна, на котором впоследствии будет отображаться изображение.
· Создается контекст устройства совместимый с контекстом устройства окна. Для этого используется функция CreateCompatibleDC.
· С помощью функции CreateCompatibleBitmap создается растровое изображение размером 128 на 128 пикселей совместимое с контекстом устройства окна.
· Освобождается контекст устройства окна (ReleaseDC). Он нам больше не нужен.
· Изображение выбирается в созданном контексте устройства. Для выбора используется функция SelectObject,
· В цикле с помощью функции SetPixel устанавливается цвет пикселей исходного изображения. Они устанавливаются в зеленый цвет.

При получении сообщения WM_PAINT осуществляется вывод подготовленных изображений. Это делается в три шага.

· С помощью функции BeginPaint окно подготавливается к предстоящей операции рисования.
· Вызывается функция MaskBlt, которая выполняет всю основную работу по выводу изображения на поверхность окна с использованием маски.
· С помощью функции EndPaint завершается операция рисования.

Ниже приводится полный исходный текст разработанного примера.

#include <windows.h>

#include "Constants.h"

//Размеры изображений

#define SIZE_X 128

#define SIZE_Y 128

//Описатель основного изображения

HBITMAP hbitmap = NULL;

HBITMAP hMaskBitmap = NULL;

//Временный контекст устройства

HDC hMemDC = NULL;

/****************************/

/*Подготавливает изображение*/

/****************************/

void PrepareBitmap(HWND hwnd)

{

//Получаем контекст устройства окна

HDC hdc = NULL;

hdc = GetDC(hwnd);

//Создаем совместимый контекст

hMemDC = CreateCompatibleDC(hdc);

//Создаем изображение

hbitmap = CreateCompatibleBitmap(hdc, SIZE_X, SIZE_Y);

//Освобождаем контекст устройства окна

ReleaseDC(hwnd, hdc);

//Заполняем изображение зеленым цветом

SelectObject(hMemDC, hbitmap);

int i, j;

for(i = 0; i < SIZE_X; i++)

for(j = 0; j < SIZE_Y; j++)

SetPixel(hMemDC, i, j, RGB(0x00, 0xFF, 0x00));

}

/***************************/

/*****Оконная процедура*****/

/***************************/

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

//Контекст устройства окна

HDC hdc = NULL;

//Используется при рисовании

PAINTSTRUCT ps;

switch(uMsg){

case WM_CREATE:

//Подготавливаем основное изображение

PrepareBitmap(hwnd);

//Подготавливаем маску

hMaskBitmap = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(ID_BITMAP));

break;

case WM_PAINT:

//Получаем контекст устройства окна

hdc = BeginPaint(hwnd, &ps);

//Переносим изображение в контекст устройства окна с учетом маски

MaskBlt(hdc, 80, 30, SIZE_X, SIZE_Y, hMemDC, 0, 0, hMaskBitmap, 0, 0, SRCCOPY);

//Освобождаем ресурсы

EndPaint(hwnd, &ps);

break;

case WM_CLOSE:

DestroyWindow(hwnd);

break;

case WM_DESTROY:

//Удаляем временный контекст устройства

DeleteDC(hMemDC);

//Удаляем изображения

DeleteObject(hbitmap);

DeleteObject(hMaskBitmap);

//Закрываем приложение

PostQuitMessage(0);

break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg){

return 0;

}

/***************************/

/*****Главная процедура****/

/***************************/

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = 0;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hThisInstance;

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|WS_BORDER,

400, 300, 300, 230, NULL, 0, hThisInstance, 0);

//Цикл обработки сообщений

MSG msg;

while(GetMessage(&msg,NULL,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hThisInstance);

return 0;

}

Ниже приводится содержимое файла ресурсов, в котором задается растровое изображение маски.

#include "Constants.h"

ID_BITMAP BITMAP "mask.bmp"

Ниже приводится содержимое заголовочного файла Constants.h, в котором залается идентификатор ресурса.

//Идентификатор изображения

#define ID_BITMAP 0x300

На рисунке ниже показано исходное изображение (слева) и маска (справа).

На рисунке ниже показано главное окно разработанного приложения.


Вывод изображения в окно 4

Демонстрация использования функции PlgBlt. Данный пример похож на пример с той лишь разницей, что вместо функции BitBlt мы используем функцию PlgBlt. Последняя позволяет выводить изображение в параллелограмм. Опорные вершины параллелограмма хранятся в глобальном массиве points. Он заполняется в функции InitPoints, вызываемой при обработке сообщения WM_CREATE.

Координаты вычисляются на основе размеров выводимого изображения, которое загружается из ресурсов.

Ниже приводится полный исходный текст примера.

#include <windows.h>

#include <stdio.h>

#include "Constants.h"

//Массив вершин параллелограмма

POINT points[3];

/***********************************/

/*Вычисляет вершины параллелограмма*/

/***********************************/

void InitPoints(const BITMAP *pBitmapInfo)

{

//Левая верхняя

points[0].x = 50;

points[0].y = 0;

//Правая верхняя

points[1].x = points[0].x + pBitmapInfo->bmWidth;

points[1].y = 0;

//Левая нижняя

points[2].x = 0;

points[2].y = pBitmapInfo->bmHeight;

}

/***************************/

/*****Оконная процедура*****/

/***************************/

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

//Описатель растрового изображения

static HBITMAP hbitmap = NULL;

//Структура, содержащая информацию об изображении

static BITMAP BitmapInfo;

//Контекст устройства окна

HDC hdc = NULL;

//Контекст устройства совместимый с окном

static HDC hMemDC = NULL;

//Используется при рисовании

PAINTSTRUCT ps;

switch(uMsg){

case WM_CREATE:

//Загружаем изображение из ресурсов

hbitmap = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(ID_BITMAP), IMAGE_BITMAP, 0, 0, 0);

//Получаем информацию об изображении

GetObject(hbitmap, sizeof(BITMAP), &BitmapInfo);

//Получаем контекст устройства окна

hdc = GetDC(hwnd);

//Создаем контекст устройства, совместимый с окном

hMemDC = CreateCompatibleDC(hdc);

//Связываем изображение с контекстом устройства

SelectObject(hMemDC, hbitmap);

//Освобождаем контекст устройства окна

ReleaseDC(hwnd, hdc);

//Подготавливаем вершины параллелограмма

InitPoints(&BitmapInfo);

break;

case WM_PAINT:

//Получаем контекст устройства окна

hdc = BeginPaint(hwnd, &ps);

//Переносим изображение в контекст устройства окна

PlgBlt(hdc, points, hMemDC, 0, 0, BitmapInfo.bmWidth, BitmapInfo.bmHeight, NULL, 0, 0);

//Освобождаем ресурсы

EndPaint(hwnd, &ps);

break;

case WM_CLOSE:

DestroyWindow(hwnd);

break;

case WM_DESTROY:

//Удаляем временный контекст устройства

DeleteDC(hMemDC);

//Удаляем изображение

DeleteObject(hbitmap);

//Закрываем приложение

PostQuitMessage(0);

break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg){

return 0;

}

/***************************/

/*****Главная процедура*****/

/***************************/

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = 0;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hThisInstance;

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|WS_BORDER,

400, 300, 380, 190, NULL, 0, hThisInstance, 0);

//Цикл обработки сообщений

MSG msg;

while(GetMessage(&msg,NULL,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hThisInstance);

return 0;

}

Ниже приводится содержимое файла ресурсов. Он содержит всего один ресурс - выводимое растровое изображение.

#include "Constants.h"

ID_BITMAP BITMAP "Nature.bmp"

Ниже приводится содержимое заголовочного файла Constants.h, содержащего идентификатор ресурса.

//Идентификатор изображения

#define ID_BITMAP 0x300

Ниже приводится главное окно разработанного приложения.


Вывод изображения в окно 5

Демонстрация использования функции SetDIBits. В данном примере создается окно, на поверхность которого выводится растровое изображение. Функционально данный пример ничем не отличается от примера с той лишь разницей, что здесь мы используем изображение, не зависящее от устройства (Device-Independent Bitmap - DIB).

Принцип работы программы следующий. Исходное изображение из ресурсов загружается в память и ассоциируется с контекстом устройства (DC). Здесь мы работаем с изображением, зависящим от устройства (Device-Dependent Bitmap - DDB). Затем оно конвертируеся в DIB и выводится на экран.

Вся основная работа осуществляется при обработке сообщения WM_CREATE. При его получении делается следующее.

· С помощью функции CreateCompatibleDC создается два контекста устройства. Первый (hMemDCSource) используется для хранения изображения, загруженного из ресурсов (DDB). Второй (hMemDCTarget) для хранения изображения в формате DIB, которое впоследствии и будет выводиться на экран.
· Изображение загружается в память из ресурсов (LoadImage).
· Информация о загруженном изображении заносится в структуру BITMAP (GetObject).
· Загруженное изображение ассоциируется с контекстом устройства hMemDCSource (SelectObject). Изображение имеет формат DDB.
· Выделяется память под буфер pbytes, который будет содержать пиксели изображения. Размер этого буфера равен утроенному произведению ширины и высоты изображения. Коэффициент 3 используется из-за того, что в формате цвета RGB, цвет каждого пикселя описывается тремя байтами.
· Подготавливается структура BITMAPINFO. Она используется при работе с DIB,
· Вызывается функция GetDIBits, которая заносит пиксели исходного изображения в буфер pbytes.
· Удаляются исходный контекст устройства (hMemDCSource) и исходное растровое изображение. Они больше не нужны. Вся необходимая информация о изображении есть в буфере pbytes и структуре bitmapinfo.
· Создается секция DIB (CreateDIBSection). Она будет использоваться для хранения изображения в формате DIB. Данная секция ассоциируется с контекстом устройства hMemDCTarget (SelectObject).
· Вызывается функция SetDIBits для переноса изображения из буфера pbytes в секцию DIB.

После всех этих шагов у нас есть контекст устройства hMemDCTarget, в котором хранится исходное изображение в формате DIB. Осталось только вывести его на экран. Это делается в три шага при обработке сообщения WM_PAINT.

· Окно подготавливается к операции рисования (BeginPaint).
· Изображение выводится на экран (BitBlt).
· Операция рисования завершается (EndPaint).

При получении сообщения WM_DESTROY мы освобождаем все неосвобожденные ресурсы.

Я не освобождаю буфер, так как попытка его освобождения приводит к ошибке. По всей видимости он освобождается неявно в одной из вызываемых функций подсистемы gdi.

Ниже приводится полный исходный текст программы.

#include <windows.h>

#include "Constants.h"

/***************************/

/*****Оконная процедура*****/

/***************************/

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

//Описатель растрового изображения

static HBITMAP hbitmap = NULL; //DDB

static HBITMAP hSection = NULL; //DIB

//Структуры, содержащие информацию об изображении

static BITMAP bitmap; //DDB

static BITMAPINFO bitmapinfo; //DIB

//Временные контексты устройства

static HDC hMemDCTarget = NULL;

static HDC hMemDCSource = NULL;

//Буфер пикселей

static unsigned char *pbytes = NULL;

//Контекст устройства окна

HDC hdc = NULL;

//Используется при рисовании

PAINTSTRUCT ps;

//Количество строк (scanlines)

static int scan = 0;

switch(uMsg){

case WM_CREATE:

//Создаем временные контексты устройства

hMemDCSource = CreateCompatibleDC(NULL);

hdc = GetDC(hwnd);

hMemDCTarget = CreateCompatibleDC(hdc);

ReleaseDC(hwnd, hdc);

//Загружаем изображение из ресурсов

hbitmap = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(ID_BITMAP), IMAGE_BITMAP, 0, 0, 0);

//Получаем информацию об изображении

GetObject(hbitmap, sizeof(BITMAP), &bitmap);

//Связываем изображение с временным выходным контекстом устройства

SelectObject(hMemDCSource, hbitmap);

//Выделяем память под буфер с пикселями

pbytes = (unsigned char*)malloc(bitmap.bmWidth * bitmap.bmHeight * 3);

//Подготавливаем структуру BITMAPINFO

bitmapinfo.bmiHeader.biBitCount = 24;

bitmapinfo.bmiHeader.biCompression = BI_RGB;

bitmapinfo.bmiHeader.biPlanes = 1;

bitmapinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);

bitmapinfo.bmiHeader.biWidth = bitmap.bmWidth;

bitmapinfo.bmiHeader.biHeight = bitmap.bmHeight;

//Читаем пиксели изображения в формате DIB

scan = GetDIBits(hMemDCSource, hbitmap, 0, bitmap.bmHeight, pbytes, &bitmapinfo, DIB_RGB_COLORS);

//Удаляем исходный контекст устройства и изображение (они больше не нужны)

DeleteDC(hMemDCSource);

DeleteObject(hbitmap);

//Создаем секцию DIB и связываем ее с временным выходным контекстом устройства

hSection = CreateDIBSection(hMemDCTarget, &bitmapinfo, DIB_RGB_COLORS, 0, 0, 0);

SelectObject(hMemDCTarget, hSection);

//Записываем биты изображения во временный выходной контекст устройства

SetDIBits(hMemDCTarget, hSection, 0, scan, pbytes, &bitmapinfo, DIB_RGB_COLORS);

break;

case WM_PAINT:

//Получаем контекст устройства окна

hdc = BeginPaint(hwnd, &ps);

//Выводим изображение на экран

BitBlt(hdc, 0, 0, bitmapinfo.bmiHeader.biWidth, bitmapinfo.bmiHeader.biHeight, hMemDCTarget, 0, 0, SRCCOPY);

//Освобождаем контекст устройства окна

EndPaint(hwnd, &ps);

break;

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY:

//Удаляем контекст устройства и секцию DIB

DeleteDC(hMemDCTarget);

DeleteObject(hSection);

// free(pbytes);

//Закрываем приложение

PostQuitMessage(0);

break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg){

return 0;

}

/***************************/

/*****Главная процедура*****/

/***************************/

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = 0;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hThisInstance;

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|WS_BORDER,

400, 300, 320, 180, NULL, 0, hThisInstance, 0);

//Цикл обработки сообщений

MSG msg;

while(GetMessage(&msg,NULL,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hThisInstance);

return 0;

}

Ниже приводится содержимое файла ресурсов. Он содержит всего один ресурс - выводимое растровое изображение.

#include "Constants.h"

ID_BITMAP BITMAP "Nature.bmp"

Ниже приводится содержимое заголовочного файла Constants.h, содержащего идентификатор ресурса.

//Идентификатор изображения

#define ID_BITMAP 0x300

Результат работы данной программы аналогичен результату работы программы из примера.


Вывод изображения в окно 6

Демонстрация использования функции StretchDIBits. В данном примере создается окно, на поверхность которого выводится растровое изображение. Функционально данный пример ничем не отличается от примера с той лишь разницей, что здесь мы используем изображение, не зависящее от устройства (Device-Independent Bitmap - DIB).

Принцип работы программы следующий. Исходное изображение из ресурсов загружается в память и ассоциируется с контекстом устройства (DC). Здесь мы работаем с изображением, зависящим от устройства (Device-Dependent Bitmap - DDB). Затем оно конвертируется в DIB и выводится на экран, попутно растягиваясь до нужных размеров.

Исходное изображение имеет размер 32 на 32 пикселя. С помощью функции StretchBlt оно растягивается до размеров 200 на 200.

Вся основная работа осуществляется при обработке сообщения WM_CREATE. При его получении делается следующее.

· С помощью функции CreateCompatibleDC создается контекст устройства,использующийся для хранения изображения, загруженного из ресурсов (DDB).
· Изображение загружается в память из ресурсов (LoadImage).
· Информация о загруженном изображении заносится в структуру BITMAP (GetObject).
· Загруженное изображение ассоциируется с созданным ранее контекстом устройства (SelectObject). Изображение имеет формат DDB.
· Выделяется память под буфер pbytes, который будет содержать пиксели изображения. Размер этого буфера равен утроенному произведению ширины и высоты изображения. Коэффициент 3 используется из-за того, что в формате цвета RGB, цвет каждого пикселя описывается тремя байтами.
· Подготавливается структура BITMAPINFO. Она используется при работе с DIB,
· Вызывается функция GetDIBits, которая заносит пиксели исходного изображения в буфер pbytes.
· Удаляются контекст устройства и исходное растровое изображение. Они больше не нужны. Вся необходимая информация о изображении есть в буфере pbytes и структуре bitmapinfo.

После всех этих шагов у нас есть буфер (pbytes) и структура bitmapinfo, которые описывают исходное изображение в формате DIB. Осталось только вывести его на экран. Это делается в три шага при обработке сообщения WM_PAINT.

· Окно подготавливается к операции рисования (BeginPaint).
· Изображение выводится на экран (StretchDIBits).
· Операция рисования завершается (EndPaint).

При получении сообщения WM_DESTROY мы удаляем буфер pbytes.

Ниже приводится полный исходный текст программы.

#include <windows.h>

#include "Constants.h"

/***************************/

/*****Оконная процедура*****/

/***************************/

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

//Описатель растрового изображения

HBITMAP hbitmap = NULL; //DDB

//Структуры, содержащие информацию об изображении

static BITMAP bitmap; //DDB

static BITMAPINFO bitmapinfo; //DIB

//Буфер пикселей

static unsigned char *pbytes = NULL;

//Контекст устройства

HDC hdc = NULL;

//Используется при рисовании

PAINTSTRUCT ps;

//Количество строк (scanlines)

static int scan = 0;

switch(uMsg){

case WM_CREATE:

//Создаем временный контекст устройства

hdc = CreateCompatibleDC(NULL);

//Загружаем изображение из ресурсов

hbitmap = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(ID_BITMAP), IMAGE_BITMAP, 0, 0, 0);

//Получаем информацию об изображении

GetObject(hbitmap, sizeof(BITMAP), &bitmap);

//Связываем изображение с временным контекстом устройства

SelectObject(hdc, hbitmap);

//Выделяем память под буфер с пикселями

pbytes = (unsigned char*)malloc(bitmap.bmWidth * bitmap.bmHeight * 3);

//Подготавливаем структуру BITMAPINFO

bitmapinfo.bmiHeader.biBitCount = 24;

bitmapinfo.bmiHeader.biCompression = BI_RGB;

bitmapinfo.bmiHeader.biPlanes = 1;

bitmapinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);

bitmapinfo.bmiHeader.biWidth = bitmap.bmWidth;

bitmapinfo.bmiHeader.biHeight = bitmap.bmHeight;

//Читаем пиксели изображения в формате DIB

scan = GetDIBits(hdc, hbitmap, 0, bitmap.bmHeight, pbytes, &bitmapinfo, DIB_RGB_COLORS);

//Удаляем исходный контекст устройства и изображение (они больше не нужны)

DeleteDC(hdc);

DeleteObject(hbitmap);

break;

case WM_PAINT:

//Получаем контекст устройства окна

hdc = BeginPaint(hwnd, &ps);

//Выводим изображение на экран

StretchDIBits(hdc, 60, 0, 200, 200, 0, 0, bitmapinfo.bmiHeader.biWidth, bitmapinfo.bmiHeader.biHeight, pbytes, &bitmapinfo, DIB_RGB_COLORS, SRCCOPY);

//Освобождаем контекст устройства окна

EndPaint(hwnd, &ps);

break;

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY:

//Удаляем буфер с пикселями

free(pbytes);

//Закрываем приложение

PostQuitMessage(0);

break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg){

return 0;

}

/***************************/

/*****Главная процедура*****/

/***************************/

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = 0;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hThisInstance;

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|WS_BORDER,

400, 300, 320, 230, NULL, 0, hThisInstance, 0);

//Цикл обработки сообщений

MSG msg;

while(GetMessage(&msg,NULL,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hThisInstance);

return 0;

}

Ниже приводится содержимое файла ресурсов. Он содержит всего один ресурс - выводимое растровое изображение.

#include "Constants.h"

ID_BITMAP BITMAP "bitmap.bmp"

Ниже приводится содержимое заголовочного файла Constants.h, содержащего идентификатор ресурса.

//Идентификатор изображения

#define ID_BITMAP 0x300

Результат работы данной программы аналогичен результату работы программы из примера.


Вывод изображения в окно 7

Демонстрация использования функции AlphaBlend. В данном примере создается простое окно, на поверхность которого с помощью этой функции выводится изображение. Прозрачность изображения меняется по таймеру сначала от 255 (абсолютно непрозрачно) до нуля (полностью прозрачно) потом обратно и так до бесконечноти.

Вся основная работа выполняется при обработке сообщений WM_CREATE (подготовка к работе), WM_TIMER (изменение прозрачности по сигналу от таймера), WM_PAINT (вывод изображения на поверхность окна), WM_CLOSE и WM_DESTROY (освобождение ресурсов). Рассмотрим их подробнее.

При получении сообщении WM_CREATE делается следующее.

· Из ресурсов загружается исходное изображение (LoadImage).
· Определяется размер изображения (GetObject). Данная информация сохраняется в структуре BITMAP.
· Запрашивается описатель контекста устройства окна (GetDC). Он нужен для создания совместимого контекста устройства, в котором будет храниться выводимое изображение.
· Создается совместимый контекст устройства (CreateCompatibleDC).
· В созданный контекст устройства заносится изображение (SelectObject).
· Исходный контекст устройства окна освобождается (ReleaseDC). он нам больше не нужен.
· Подготавливается структура BLENDFUNCTION. Мы инициализируем все поля этой структуры. В последующем изменяться будет только одно поле (SourceConstantAlpha).
· С помощью функции LoadLibrary и GetProcAddress находится адрес функции AlphaBlend. Мы используем динамическую загрузку.
· Включается таймер (SetTimer) с интервалом 1 секунда.

При срабатывании таймера происходит следующее

· Пересчитывается коэффициент прозрачности (поле SourceConstantAlpha структуры BLENDFUNCTION).
· Вызывается функция InvalidateRect для перерисовки окна.

При обработке сообщения WM_PAINT происходит вывод самого изображения. Он осуществляется в три этапа.

· С помощью функции BeginPaint получается контекст устройства окна.
· Вызывается функция AlphaBlend для вывода изображения с заданной прозрачностью.
· С помощью функции EndPaint контекст устройства окна освобождается.

При обработке сообщений WM_CLOSE и WM_DESTROY освобождаются ранее задействованные ресурсы (таймер, изображение, совместимый контекст устройства).

Ниже приводится полный исходный текст разработанного приложения.

#include <windows.h>

#include "Constants.h"

//Прототип функции AlphaBlend

typedef BOOL (*ALPHABLEND)(HDC,int,int,int,int,HDC,int,int,int,int,BLENDFUNCTION);

ALPHABLEND lpfnAlphaBlend;

/***************************/

/*****Оконная процедура*****/

/***************************/

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

//Описатель растрового изображения

static HBITMAP hbitmap = NULL;

//Структура, содержащая информацию об изображении

static BITMAP BitmapInfo;

//Контекст устройства окна

HDC hdc = NULL;

//Контекст устройства совместимый с окном

static HDC hMemDC = NULL;

//Используется при рисовании

PAINTSTRUCT ps;

//Идентификатор таймера

static int idTimer = 1;

//Используется функцией AlphaBlend

static BLENDFUNCTION blfnc;

//Шаг, с которым меняется прозрачность

static int step = -_STEP_;

HINSTANCE himg;

switch(uMsg){

case WM_CREATE:

//Загружаем изображение из ресурсов

hbitmap = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(ID_BITMAP), IMAGE_BITMAP, 0, 0, 0);

//Получаем информацию об изображении

GetObject(hbitmap, sizeof(BITMAP), &BitmapInfo);

//Получаем контекст устройства окна

hdc = GetDC(hwnd);

//Создаем контекст устройства, совместимый с окном

hMemDC = CreateCompatibleDC(hdc);

//Связываем изображение с контекстом устройства

SelectObject(hMemDC, hbitmap);

//Освобождаем контекст устройства окна

ReleaseDC(hwnd, hdc);

//Подготавливаем структуру BLENDFUNCTION

blfnc.BlendOp = AC_SRC_OVER;

blfnc.BlendFlags = 0;

blfnc.SourceConstantAlpha = 255 - _STEP_;

blfnc.AlphaFormat = 0;

//Находим адрес функции "AlphaBlend"

himg = LoadLibrary("Msimg32.dll");

lpfnAlphaBlend = (ALPHABLEND)GetProcAddress(himg, "AlphaBlend");

//Включаем таймер

SetTimer(hwnd, idTimer, 1000, NULL);

break;

case WM_TIMER:

//Если приблизились к границам (0;255), то разворачиваемся

if((blfnc.SourceConstantAlpha < _STEP_+1) || (blfnc.SourceConstantAlpha > 255 - _STEP_))

step *= -1;

//Меняем прозрачность

blfnc.SourceConstantAlpha += step;

//Отменяем содержимое окна

InvalidateRect(hwnd, NULL, TRUE);

break;

case WM_PAINT:

//Получаем контекст устройства окна

hdc = BeginPaint(hwnd, &ps);

//Выводим изображение с учетом прозрачности

if(lpfnAlphaBlend)

lpfnAlphaBlend(hdc, 0, 0, BitmapInfo.bmWidth, BitmapInfo.bmHeight, hMemDC, 0, 0, BitmapInfo.bmWidth, BitmapInfo.bmHeight, blfnc);

//Освобождаем ресурсы

EndPaint(hwnd, &ps);

break;

case WM_CLOSE:

//Уничтожаем таймер

KillTimer(hwnd, idTimer);

//Уничтожаем окно

DestroyWindow(hwnd);

break;

case WM_DESTROY:

//Удаляем временный контекст устройства

DeleteDC(hMemDC);

//Удаляем изображение

DeleteObject(hbitmap);

//Закрываем приложение

PostQuitMessage(0);

break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg){

return 0;

}

/***************************/

/*****Главная процедура*****/

/***************************/

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = 0;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hThisInstance;

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|WS_BORDER,

400, 300, 300, 187, NULL, 0, hThisInstance, 0);

//Цикл обработки сообщений

MSG msg;

while(GetMessage(&msg,NULL,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hThisInstance);

return 0;

}

Ниже приводится содержимое файла ресурсов, в которых задается выводимое на экран изображение.

#include "Constants.h"

ID_BITMAP BITMAP "Nature.bmp"

Ниже приводится содержимое заголовочного файла "Constants.h", в котором задается идентификатор ресурса и абсолютное значение шага изменения прозрачности изображения (_STEP_).

//Абсолютное значение шага изменения прозрачности

#define _STEP_ 10

//Идентификатор изображения

#define ID_BITMAP 0x300

На рисунке ниже приводится главное окно приложения.

Можете сравнить его с главным окном приложения из примера. Там это же самое изображение выводится с использованием функции BitBlt (без учета прозрачности).


Вывод изображения в окно 8

Демонстрация использования функций CreateDIBitmap и TransparentBlt. В данном примере создается простое окно, на поверхность которого выводится монохромное изображение. Оно настраивается таким образом, чтобы белый цвет был прозрачным.

Исходное изображение хранится в ресурсах. Он проходит ряд преобразований. Вначале из него извлекаются биты в формате DIB. а затем на основе них создается новое изображение. Во всех этих манипуляциях нет никакого практического смысла. Я провожу их лишь для того, чтобы показать работу функции CreateDIBitmap.

Вся работа выполняется при обработке сообщений WM_CREATE и WM_PAINT. При получении первого делается следующее.

· С помощью функции CreateCompatibleDC и GetDC создаются два контекста устройства, совместимых с контекстом устройства окна (hMemDCSource и hMemDCTarget). Они будут использоваться при операциях над изображением и хранением промежуточных результатов.
· Изображение загружается из ресурсов (LoadImage).
· Запрашиваете информация о изображении (GetObject). Эта информация заносится в структуру BITMAP. Нас в первую очередь интересуют размеры изображения.
· Изображение ассоциируется с контекстом hMemDCSource (SelectObject).
· Выделяется память под буфер pbytes. Он будет хранить пиксели изображения в формате DIB.
· Подготавливается структура BITMAPINFO. Она используется для описания изображения в формате DIB.
· С помощью функции GetDIBits в буфер pbytes заносятся пиксели изображения в формате DIB.
· Удаляются контекст устройства hMemDCSource, в котором хранилось исходное изображение (DeleteDC), и само исходное ихображение. Изображение нам больше не нужно, так как информация о нем хранится в структуре BITMAP, а пиксели в буфере pbytes.
· Вызывается функция CreateDIBitmap для создания изображения на основе содержимого буфера pbytes и информации в структуре BITMAPINFO.
· Созданное изображение ассоциируется с контекстом устройства hMemDCTarget (SelectObject).
· Удаляется буфер pbytes. Он больше не нужен, так как у нас есть изображение, размещенное в контексте устройства hMemDCTarget.
· С помощью функций LoadLibrary и GetProcAddress находится адрес функции TransparentBlt. Он сохраняется в глобальной переменной lpfnTransparentBlt.

При получении сообщения WM_PAINT изображение, созданное функцией CreateDIBitmap выводится на поверхности окна. Это делается в три шага.

· Вызывается функция BeginPaint для подготовки окна и получения его контекста устройства.
· Вызывается функция TransparentBlt, которая и отрисовывает заданное изображение. В параметрах этой функции мы указываем, что белый цвет должен быть прозрачным. Для задания RGB значения белого цвета используется макрос RGB.
· Вызывается функция EndPaint для завершения рисования и освобождения контекста устройства окна.

Ниже приводится полный исходный текст разработанного примера.

#include <windows.h>

#include "Constants.h"

//Прототип функции TransparentBlt

typedef BOOL (*TRANSPARENTBLT)(HDC,int,int,int,int,HDC,int,int,int,int,UINT);

TRANSPARENTBLT lpfnTransparentBlt;

/***************************/

/*****Оконная процедура*****/

/***************************/

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

//Описатель растрового изображения

static HBITMAP hbitmap = NULL;

//Структуры, содержащие информацию об изображении

static BITMAP bitmap; //DDB

static BITMAPINFO bitmapinfo; //DIB

//Временные контексты устройства

static HDC hMemDCTarget = NULL;

static HDC hMemDCSource = NULL;

//Буфер пикселей изображения

static unsigned char *pbytes = NULL;

//Контекст устройства окна

HDC hdc = NULL;

//Используется при рисовании

PAINTSTRUCT ps;

//Описатель модуля "Msimg32.dll"

HINSTANCE himg32;

switch(uMsg){

case WM_CREATE:

//Создаем временные контексты устройства

hMemDCSource = CreateCompatibleDC(NULL);

hdc = GetDC(hwnd);

hMemDCTarget = CreateCompatibleDC(hdc);

ReleaseDC(hwnd, hdc);

//Загружаем изображение из ресурсов

hbitmap = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(ID_BITMAP), IMAGE_BITMAP, 0, 0, 0);

//Получаем информацию об изображении

GetObject(hbitmap, sizeof(BITMAP), &bitmap);

//Связываем изображение с временным выходным контекстом устройства

SelectObject(hMemDCSource, hbitmap);

//Выделяем память под буфер с пикселями

pbytes = (unsigned char*)malloc(bitmap.bmWidth * bitmap.bmHeight / 8);

//Подготавливаем структуру BITMAPINFO

bitmapinfo.bmiHeader.biBitCount = 1; //Монохромное изображение

bitmapinfo.bmiHeader.biCompression = BI_RGB;

bitmapinfo.bmiHeader.biPlanes = 1;

bitmapinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);

bitmapinfo.bmiHeader.biWidth = bitmap.bmWidth;

bitmapinfo.bmiHeader.biHeight = bitmap.bmHeight;

//Читаем пиксели изображения в формате DIB

GetDIBits(hMemDCSource, hbitmap, 0, bitmap.bmHeight, pbytes, &bitmapinfo, DIB_RGB_COLORS);

//Удаляем исходный контекст устройства и изображение (они больше не нужны)

DeleteDC(hMemDCSource);

DeleteObject(hbitmap);

//Создаем растровое изображение

hbitmap = CreateDIBitmap(hMemDCTarget, (BITMAPINFOHEADER*)&bitmapinfo, CBM_INIT, pbytes, &bitmapinfo, DIB_RGB_COLORS);

//Cвязываем изображение с временным выходным контекстом устройства

SelectObject(hMemDCTarget, hbitmap);

//Удаляем буфер с пикселями изображения

free(pbytes);

//Находим адрес функции "TransparentBlt"

himg32 = LoadLibrary("Msimg32.dll");

lpfnTransparentBlt = (TRANSPARENTBLT)GetProcAddress(himg32,"TransparentBlt");

break;

case WM_PAINT:

//Получаем контекст устройства окна

hdc = BeginPaint(hwnd, &ps);

//Выводим изображение на экран

if(lpfnTransparentBlt)

lpfnTransparentBlt(hdc ,70,0,bitmapinfo.bmiHeader.biWidth, bitmapinfo.bmiHeader.biHeight,

hMemDCTarget, 0,0,bitmapinfo.bmiHeader.biWidth, bitmapinfo.bmiHeader.biHeight,

RGB(0xFF,0xFF,0xFF));

//Освобождаем контекст устройства окна

EndPaint(hwnd, &ps);

break;

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY:

//Удаляем контекст устройства и изображение

DeleteDC(hMemDCTarget);

DeleteObject(hbitmap);

//Закрываем приложение

PostQuitMessage(0);

break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg){

return 0;

}

/***************************/

/*****Главная процедура*****/

/***************************/

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = 0;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hThisInstance;

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|WS_BORDER,

400, 300, 320, 190, NULL, 0, hThisInstance, 0);

//Цикл обработки сообщений

MSG msg;

while(GetMessage(&msg,NULL,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hThisInstance);

return 0;

}

Ниже приводится содержимое файла ресурсов, в котором задается исходное изображение.

#include "Constants.h"

ID_BITMAP BITMAP "Pict.bmp"

Заголовочный файл "Constants.h" содержит описание идентификатора ресурса. Его содержимое приведено ниже.

//Идентификатор изображения

#define ID_BITMAP 0x300

На рисунке ниже приводится результат работы этой программы.

Белая составляющая исходного изображения стала полностью прозрачной.


Группа переключателей

Демонстрация работы с группами переключателей. В данном примере создается диалоговое окно, предлагающее пользователю выбрать текст отображаемого сообщения и набор кнопок. Вывод сообщения осукществляется с помощью функции MessageBox.

Ниже приводится полный исходный текст примера.

#include <windows.h>

#include "Resource.h"

#define _WPARAMSHOW ((WPARAM)((BN_CLICKED << 16) + _ID_BUTTONSHOW))

#define _WPARAMCLOSE ((WPARAM)((BN_CLICKED << 16) + _ID_BUTTONCLOSE))

//Буфер под текст сообщения

char pText[SIZE_TEXT];

//Прототип Диалоговой процедуры

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;

}

//Осуществляет поиск выбранного пользователем текстового сообщения

void FindTextMessage(HWND hDlg)

{

HWND hCtrl, hCtrlHello;

//Получаем описатель первого элемента группы

hCtrl = hCtrlHello = GetDlgItem(hDlg, ID_HELLO);

int idCtrl;

//Цикл по элементам управления группы

do{

//Получаем идентификатор очередного элемента

idCtrl = GetDlgCtrlID(hCtrl);

//Проверяем, выбран ли текущий элемент

if(IsDlgButtonChecked(hDlg, idCtrl) == BST_CHECKED){

//Если он выбран, то копируем текст и прерываем цикл

GetDlgItemText(hDlg, idCtrl, pText, SIZE_TEXT);

break;

}

//Переходим к следующему элементу в группе

hCtrl = GetNextDlgGroupItem(hDlg, hCtrl, FALSE);

}while(hCtrl != hCtrlHello);

}

//Осуществляет поиск выбранного набора кнопок

int FindButtons(HWND hDlg)

{

HWND hCtrl, hCtrlOK;

//Получаем описатель первого элемента группы

hCtrl = hCtrlOK = GetDlgItem(hDlg, _ID_OK);

int idCtrl;

//Цикл по ээлементам группы

do{

//Получаем идентификатор очередного элемента управления

idCtrl = GetDlgCtrlID(hCtrl);

//Проверяем, выбран ли текущий элемент

if(IsDlgButtonChecked(hDlg, idCtrl) == BST_CHECKED)

//Если выбран, то возвращаем код набора кнопок

return (idCtrl - __ID_OK);

//Переходим к следующему элементу

hCtrl = GetNextDlgGroupItem(hDlg, hCtrl, FALSE);

}while(hCtrl != hCtrlOK);

}

//Диалоговая процедура

INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

switch(uMsg){

case WM_INITDIALOG:

//Устанавливаем "выбор" по умолчанию

SendDlgItemMessage(hwnd, ID_HELLO, BM_SETCHECK, BST_CHECKED, 0);

SendDlgItemMessage(hwnd, _ID_OK , BM_SETCHECK, BST_CHECKED, 0);

break;

case WM_COMMAND:

if(wParam == _WPARAMSHOW){

//Ищем выбранный текст сообщения

FindTextMessage(hwnd);

//Вывдим сообщение

MessageBox(hwnd, pText, "", FindButtons(hwnd));

break;

}

if(wParam != _WPARAMCLOSE)

break;

case WM_CLOSE:

//Закрываем диалоговое окно

EndDialog(hwnd,0);

}

return 0;

}

Ниже приводится содержимое файла ресурсов, в котором хранится шаблон диалогового окна.

#include <windows.h>

#include "Resource.h"

ID_DIALOG DIALOGEX 0,0,155,95

STYLE WS_CAPTION | WS_VISIBLE | WS_SYSMENU | DS_CENTER | WS_MINIMIZEBOX

CAPTION "DialogBoxParam"

BEGIN

GROUPBOX "Текст сообщения", 0x10, 5, 5, 70, 65

GROUPBOX "Набор кнопок" , 0x70, 80, 5, 73, 65

AUTORADIOBUTTON "Привет" , ID_HELLO , 7, 15, 60, 12, WS_GROUP

AUTORADIOBUTTON "Доброе утро" , ID_HELLO + 0x10, 7, 25, 60, 12

AUTORADIOBUTTON "Добрый день" , ID_HELLO + 0x20, 7, 35, 60, 12

AUTORADIOBUTTON "Добрый вечер", ID_HELLO + 0x30, 7, 45, 60, 12

AUTORADIOBUTTON "Добрая ночь" , ID_HELLO + 0x40, 7, 55, 60, 12

AUTORADIOBUTTON "ОК" ,__ID_OK + 0 /*MB_OK*/ , 82, 15, 30, 12, WS_GROUP

AUTORADIOBUTTON "ОК, Отмена" ,__ID_OK + 0x01 /*MB_OKCANCEL*/ , 82, 25, 60, 12

AUTORADIOBUTTON "Повтор, Отмена" ,__ID_OK + 0x05 /*MB_RETRYCANCEL*/, 82, 35, 70, 12

AUTORADIOBUTTON "Да, Нет" ,__ID_OK + 0x04 /*MB_YESNO*/ , 82, 45, 60, 12

AUTORADIOBUTTON "Да, Нет, Отмена",__ID_OK + 0x03 /*MB_YESNOCANCEL*/, 82, 55, 70, 12

PUSHBUTTON "Показать", _ID_BUTTONSHOW , 5 , 75, 60, 15

PUSHBUTTON "Закрыть" , _ID_BUTTONCLOSE, 82, 75, 60, 15

END

Идентификаторы переключателей выбора набора кнопок подобраны таким образом, чтобы при вычитании из них константы __ID_OK получить соответствующий выбору пользователя флаг функции MessageBox.

Каждая группа элементов управления начинается с элемента управления, у которого установлен стиль WS_GROUP. Заканчивается группа либо другим элементом управления с установленным стилем WS_GROUP (при этом начинается новая группа), либо последним элементом управления диалогового окна.

Ниже приводится содержимое заголовочного файла Resource.h, в котором задаются основные константы.

//Идентификатор ресурса

#define ID_DIALOG 0x1000

//Идентификаторы первых элементов группы

#define ID_HELLO 0x20

#define __ID_OK 0x80

#define _ID_OK __ID_OK + MB_OK

//Идентификатор кнопок

#define _ID_BUTTONSHOW 0xD0

#define _ID_BUTTONCLOSE 0xE0

//Размер буфера под строку

#define SIZE_TEXT 50

На рисунке ниже показано главное окно приложения.

Вывод сообщения осуществляется при нажатии на кнопку "Показать". При обработке нажатия на эту кнопку вызываются функции FindTextMessage и FindButtons. Первая перечисляет переключатели группы "Текст сообщения", находит выбранный пользователем переключатель и копирует его заголовок в глобальный буфер pText (с помощью функции GetDlgItemText). Вторая функция перечисляет переключатели группы "Набор кнопок", находит выбранный пользователем переключатель, вычитает из его идентификатора константу __ID_OK и возвращает полученное значение.

Перечисление переключателей в обоих функциях осуществляется функцией GetNextDlgGroupItem. Проверка выбран переключатель или нет осуществляется функцией IsDlgButtonChecked.


Два окна

Демонстарация создания приложения с двумя главными окнами. Окна являются равнозначными. Для упрощения примера окна имеют одну и ту же оконную процедуру. Основная идея состоит в том, что фукция PostQuitMessage вызывается только когда закрыты оба окна. Для проверки этого используетcя булева переменная FirstWindowClosed. По умолчанию ее значение равно false. Когда какое-либо окно закрывается значение этой переменной меяется на true. Если вновь приходит сообщение WM_DESTROY, то это значит, что закрывается последнее окно приложения, поэтому нужно завершать все приложение. Тогда и вызывается функция PostQuitMessage, прерывающая цикл обработки сообщений.

Ниже приводится полный исходный текст разработанного приложения.

#include <windows.h>

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

//Признак того, что одно из окон закрыто

static bool FirstWindowClosed = false;

switch (uMsg) {

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY:

if (!FirstWindowClosed)

{

//Закрывается первое окно. Продолжаем работать.

FirstWindowClosed = true;

break;

}

//Закрывается второе окно, поэтому завершаем все приложение

PostQuitMessage(0);

break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

return 0;

}

//Оконная процедура

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

TCHAR ClassName[] = TEXT("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 = NULL;

wc.lpszMenuName = NULL;

wc.lpszClassName = ClassName;

wc.hIconSm = NULL;

//Регистрируем оконный класс

RegisterClassEx(&wc);

//Создаем первое окно

CreateWindowEx(0, ClassName, TEXT("Первое окно"),

WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_OVERLAPPED,

100, 100, 200, 200, NULL, NULL, hInstance, 0);

//создаем второе окно

CreateWindowEx(0, ClassName, TEXT("Второе окно"),

WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_OVERLAPPED,

500, 100, 200, 200, NULL, NULL, hInstance, 0);

//Цикл обработки сообщений

while (GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}

Если вы хотите, чтобы у каждого из окон была своя оконная процедура, то переменную FirstWindowClosed нужно сделать глобальной. А обработку сообщения WM_DESTROY продублировать в обеих процедурах.


Два окна 2

Демонстрация создания приложения с двумя окнами. Данный пример похож на пример, но имеет одно важное отличие. Второе окно создается только при нажатии на кнопку, расположенную в первом окне. Если она не нажата, то второе окно не создается. При нажатии на эту кнопку, создается второе окно, а первое окно уничтожается. Для различения двух событий закрытия окна (по нажатию на кнопку и без нажатия) используется булева переменная ButtonPressed. Если при получении сообщения WM_DESTROY, значение этой переменной равно false (по умолчанию), то пользователь закрывает окно, не нажав на кнопку. В этом случае мы завершаем все приложение и вызываем функцию PostQuitMessage, которая прерывает цикл обработки сообщений. Если же значение переменной равно true, то пользователь нажал на кнопку. В этом случае мы закрываем окно, но не завершаем приложение. Значение переменной ButtonPressed вновь устанавливается в false. Благодаря этому при следующем получении сообщения WM_DESTROY мы завершим работу приложения.

Ниже приводится полный исходный код разработанного примера.

#include <windows.h>

//Наименование оконного класса

TCHAR ClassName[] = TEXT("MyWindowClass");

#define ID_BUTTON 0x00000100

#define _WPARAM ((WPARAM)((BN_CLICKED<<16)+ID_BUTTON))

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

//Признак нажатия на кнопку

static bool ButtonPressed = false;

switch (uMsg) {

case WM_COMMAND:

if (wParam == _WPARAM)

{

//Создаем второе главное окно

CreateWindowEx(0, ClassName, TEXT("Второе окно"),

WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_OVERLAPPED,

500, 100, 200, 200, NULL, NULL, GetModuleHandle(NULL), 0);

//Закрываем первое главное окно

ButtonPressed = true;

SendMessage(hwnd, WM_CLOSE, 0, 0);

}

break;

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY:

if (ButtonPressed)

{

//Закрывается первое окно. Продолжаем работать.

ButtonPressed = false;

break;

}

//Закрывается второе окно, поэтому завершаем все приложение

PostQuitMessage(0);

break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

return 0;

}

//Оконная процедура

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

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 = NULL;

wc.lpszMenuName = NULL;

wc.lpszClassName = ClassName;

wc.hIconSm = NULL;

//Регистрируем оконный класс

RegisterClassEx(&wc);

//Создаем первое главное окно

HWND hwnd;

hwnd = CreateWindowEx(0, ClassName, TEXT("Первое окно"),

WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_OVERLAPPED,

100, 100, 200, 200, NULL, NULL, hInstance, 0);

//Создаем кнопку

CreateWindowEx(0, TEXT("Button"), TEXT("Открыть второе окно"),

WS_CHILD | WS_VISIBLE |WS_BORDER | BS_PUSHBUTTON,

20, 20, 150, 50, hwnd, (HMENU)ID_BUTTON, hInstance, 0);

//Цикл обработки сообщений

while (GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}

Для простоты оба главных окна имеют один и тот же класс, и одну и ту же оконную процедуру. Но это необязательно. При реализации более сложных вариантов возможно понадобится сделать переменную ButtonPressed глобальной.


Изменение расположения нескольких окон

Данный пример демонстрирует изменение положения и размеров нескольких окон (калькулятора, mspaint и AkelPad) с помощью функций BeginDeferWindowPos, DeferWindowPos и EndDeferWindowPos.

#include <windows.h>

int main()

{

HWND hwnd;

HDWP hdwp;

//выделяем память под структуру

hdwp = BeginDeferWindowPos(3);

//Добавляем окно mspaint

hwnd = FindWindow("MSPaintApp",NULL);

hdwp = DeferWindowPos(hdwp,hwnd,NULL,0,0,200,200,SWP_NOZORDER);

//Добавляем окно калькулятора

hwnd = FindWindow("SciCalc",NULL);

hdwp = DeferWindowPos(hdwp,hwnd,NULL,100,100,0,0,SWP_NOSIZE);

//Добавляем окно AkelPad

hwnd = FindWindow("AkelPad4",NULL);

hdwp = DeferWindowPos(hdwp,hwnd,NULL,200,200,500,500,SWP_NOZORDER);

//Перемещаем окна

EndDeferWindowPos(hdwp);

//Выводим окно AkelPad на передний план

SetForegroundWindow(hwnd);

return 0;

}


Кнопка (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;

}

//Главная процедура

int 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_ICON. Сама иконка устанавливатся сообщением BM_SETIMAGE.

Иконка изначально хранится в ресурсах приложения и загружается оттуда с помощью функции LoadIcon.

При нажатии на кнопку выводится сообщение "Вы нажали на кнопку с иконкой".

Ниже приводится полный исходный текст примера.

#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;

}

int 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, 200, 130, NULL, 0, hInstance, 0);

//Создаем кнопку

HWND hwndButton;

hwndButton = CreateWindowEx(0, "Button", "",

WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_ICON,

50, 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;

}

Ниже приводится содержимое файла ресурсов, в которых задается иконка.

#include "Constants.h"

ID_ICON ICON "MyIcon.ico"

Ниже прводится содержимое заголовочного файла "Constants.h", в котором задается идентификатор ресурса иконки и идентификатор кнопки.

#define ID_ICON 0x100

//Идентификатор кнопки

#define ID_BUTTON 0x0200

#define _WPARAM ((WPARAM)((BN_CLICKED<<8)+ID_BUTTON))

Ниже приводится главное окно разработанного примера.


Кнопка с текстом и иконкой

Демонстрация создания кнопки, на поверхности которой отображается и текстовый заголовок, и иконка. Для этого у кнопки создается два дочерних окна "Static". Одно используется для отображения иконки, второе для отображения заголовка.

Иконка изначально хранится в ресурсах и загружаетя в память с помощью функции LoadIcon. Для связи иконки и статического окна последнему отправляется сообщение STM_SETICON, в параметрах которого передается описатель иконки.

Ниже приводится полный исходный текст разработанного примера.

#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;

}

int 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, 290, 130, NULL, 0, hInstance, 0);

//Создаем кнопку

HWND hwndButton;

hwndButton = CreateWindowEx(0, "Button", "",

WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,

60, 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;

}

Ниже приводится содержимое файла ресурсов, в котором задается иконка.

#include "Constants.h"

ID_ICON ICON "MyIcon.ico"

Ниже приводится содержимое заголовочного файла, в котором задаются идентификаторы иконки и кнопки.

#define ID_ICON 0x100

//Идентификатор кнопки

#define ID_BUTTON 0x0200

#define _WPARAM ((WPARAM)((BN_CLICKED<<8)+ID_BUTTON))

Ниже приводится главное окно разработанного приложения.


Кнопка с текстом и иконкой 2

Демонстрация создания кнопки, на поверхности которой отображается и текстовый заголовок и иконка. Данный пример похож на пример. Здесь решается та же задача, но решается она по-другому, без создания дочерних окон. Мы используем перегрузку оконной процедуры кнопки. Вот как это делается.

Сразу после создания кнопки мы вызываем функцию SetWindowLong, с помощью которой подменяем оконную процедуру кнопки на свою процедуру ButtonWndProc. При этом мы сохраняем адрес старой, "родной" оконной процедуры кнопки в глобальной переменной oldwndProc. Она нам пригодится, так как мы не собираемся переписывать весь функционал кнопки. Нам нужна только малая его часть.

Теперь все сообщения, адресованые окну кнопки, будут приходить в нашу процедуру ButtonWndProc и уже мы будем решать что с ними делать дальше. Из всех сообщений нас интересует только одно - WM_PAINT. На нем мы и сосредоточим все свое внимание. Детально, процедура ButtonWndProc делает следующее.

· Вызывает функцию CallWindowProc, передавая ей переменную oldwndProc. Этим самым мы вызываем старую "родную" оконную процедуру кнопки и предоставляем ей возможность обработать оконное сообщение так, как будто мы ничего не меняли.
· Если полученное сообщение не является сообщением WM_PAINT, которое нас и интересует, то выходит из процедуры.
· Получает контекст устройства окна кнопки с помощью функции GetDC.
· Вызывает функцию DrawIcon для отрисовки иконки на поверхности кнопки.
· Освобождает контекст устройства с помощью функции ReleaseDC.

По сути в данном примере мы создаем обычную кнопку с текстовым заголовком на ее поверхности, но посредством перехвата сообщения WM_PAINT дополнительно отрисовываем на ее поверхности иконку. Для того, чтобы текст и иконка не накладывались друг на друга для текста устанавливается выравнивание по правому краю. Это делается путем установки у кнопки стиля BS_RIGHT при ее создании.

Ниже приводится полный исходный текст данного примера.

#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;

}

/************************************************/

/**********Главная процедура приложения**********/

/************************************************/

int 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, 290, 130, NULL, 0, hInstance, 0);

//Создаем кнопку

hwndButton = CreateWindowEx(0, "Button", "Кнопка с иконкой ",

WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_RIGHT,

60, 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;

}

Ниже приводися содержимое файла ресурсов, котором задается иконка.

#include "Constants.h"

ID_ICON ICON "MyIcon.ico"

Ниже приводится содержимое заголовочного файла, в котором задается идентификаторы иконки и кнопки.

#define ID_ICON 0x100

//Идентияикатор кнопки

#define ID_BUTTON 0x0300

#define _WPARAM ((WPARAM)((BN_CLICKED<<8)+ID_BUTTON))

Главное окно данного приложения внешне ничем не отличается от главного окна из примера.


Контекстное меню

Данный пример иллюстрирует работу с контекстным меню и пунктами меню, имеющими галочку. В разработанном приложении создается простое окно. Контекстное меню предлагает пользователю выбор заголовка окна. При изменении текущего выбранного пункта меню меняется и заголовок окна. Рассмотрим, как работает пример.

Контекстное меню создается при обработке сообщения WM_CREATE. Создание и наполнение контекстного меню вынесено в функцию PrepareMenu, которая вызывается при обработке сообщения WM_CREATE. Функция PrepareMenu делает следующее.

· Вызывает функцию CreatePopupMenu для создания пустого контекстного меню.
· Несколько раз вызывает функцию AppendMenu для наполнения созданного меню. Мы преднамеренно создаем "неправильное" меню для того, чтобы показать работу функций редактирования меню, вызываемых далее.
· Вызывает функцию SetMenuItemInfo для изменения заголовка пункта меню.
· Вызывает функцию ModifyMenu для изменения заголовка пункта меню.
· Возвращает описатель созданного меню.

Полученный описатель меню сохраняется в локальной переменной hmenu, к которой применен квалификатор static. Уничтожается меню при обработке сообщения WM_CLOSE вызовом функции DestroyMenu.

Контекстное меню отображается на экране при нажатии на правую кнопку мыши. Для этого обрабатывается сообщение WM_RBUTTONUP. Конкретно, при его получении делается следующее.

· С помощью макросов GET_X_LPARAM и GET_Y_LPARAM из параметра lParam сообщения извлекаются клиентские координаты курсора мыши. Данные координаты заносятся в структуру POINT.
· Вызывается функция ClientToScreen для пересчета клиентских координат в экранную систему координат.
· Вызывается функция TrackPopupMenu для отображения на экране контекстного меню. Данная функция возвращает идентификатор выбранного пункта меню, или нуль, если ни один из пунктов меню не выбран пользователем.
· Проверяется значение, возвращенное функцией TrackPopupMenu. Если оно равно нулю (пользователь не выбрал никакого пункта меню), то больше ничего не делаем и завершаем обработку сообщения.
· Вызывается функция ClearMenu для сброса флажка выбора со всех пунктов меню.
· Вызывается функция CheckMenuItem для установки флажка выбранного пользователем пункта меню.
· Вызывается функция GetMenuItemInfo для получения длины заголовка выбранного пункта меню.
· Вызывается функция malloc для выделения памяти под заголовок.
· Повторно вызывается функция GetMenuItemInfo для получения заголовка выбранного пункта меню.
· Вызывается функция SetWindowText для установки заголовка окна. На его место устанавливается заголовок пункта меню.
· Освобождается память, ранее выделенная под заголовок пункта меню.

Функция ClearMenu сбрасывает флажок выбора со всех пунктов меню. В качестве единственного параметра она принимает описатель меню. Работает она следующим образом.

· Вызывает функцию IsMenu для того, чтобы убедиться в том, что полученный описатель задает меню.
· Вызывает функцию GetMenuItemCount для получения количества пунктов меню.
· В цикле по пунктам меню вызывает функцию CheckMenuItem для сброса флажка.

Ниже приводится полный иходный текст приложения.

#include <windows.h>

#include "Constants.h"

//Вспомогательные макросы

#define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp))

#define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp))

//Подготавливает контекстное меню

HMENU PrepareMenu (void){

//Создаем контекстное меню

HMENU hMenuFile;

hMenuFile = CreatePopupMenu();

//Наполняем меню

AppendMenu(hMenuFile, MF_STRING | MF_CHECKED , IDM_WINDOW , "Окно");

AppendMenu(hMenuFile, MF_STRING | MF_UNCHECKED , IDM_MENU , "Меню");

AppendMenu(hMenuFile, MF_STRING | MF_UNCHECKED , IDM_SHORTCUTMENU , "Меню");

AppendMenu(hMenuFile, MF_STRING | MF_UNCHECKED , IDM_POPUPMENU , "Меню");

//Редактируем заголовок пункта меню с помощью функции SetMenuItemInfo

MENUITEMINFO mii;

mii.cbSize = sizeof(MENUITEMINFO);

mii.fMask = MIIM_STRING ;

mii.dwTypeData = "Контекстное меню";

SetMenuItemInfo(hMenuFile, IDM_SHORTCUTMENU, FALSE, &mii);

//Изменяем заголовок пункта меню с помощью функции ModifyMenu

ModifyMenu(hMenuFile, IDM_POPUPMENU, MF_BYCOMMAND, IDM_POPUPMENU, "Раскрывающееся меню");

//Возвращаем созданное меню

return hMenuFile;

}

//Сбасывает флажок со всех пунктов меню

void ClearMenu(HMENU hmenu){

//Убеждаемся в том, что полученный описатель задает меню

if (! IsMenu(hmenu))

return;

//Получаем количество пунктов меню

int n;

n = GetMenuItemCount(hmenu);

//Отменяем выбор

int i;

for(i=0;i<n;i++)

CheckMenuItem(hmenu, i, MF_BYPOSITION|MF_UNCHECKED);

}

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

static HMENU hmenu;

POINT p;

switch(uMsg){

case WM_CREATE:

hmenu = PrepareMenu();

break;

case WM_RBUTTONUP:

//Извлекаем координаты курсора мыши

p.x = GET_X_LPARAM(lParam);

p.y = GET_Y_LPARAM(lParam);

//Пересчитывает клиентские координаты в экранные

ClientToScreen(hwnd, &p);

//Отображаем меню

int id;

id = TrackPopupMenu(hmenu, TPM_RETURNCMD, p.x, p.y, 0, hwnd, NULL);

//Убеждаемся в том, что пользователь выбрал пункт

if(id){

//Отменяем прежний выбор

ClearMenu(hmenu);

//Устанавливаем новый выбор

CheckMenuItem(hmenu, id, MF_BYCOMMAND | MF_CHECKED);

//Получаем длину заголовка выбранного пункта меню

MENUITEMINFO mii;

mii.cbSize = sizeof(MENUITEMINFO);

mii.fMask = MIIM_STRING;

mii.dwTypeData = NULL;

mii.cch = 0;

GetMenuItemInfo(hmenu, id, FALSE, &mii);

//Получаем текст заголовка выбранного пункта меню

mii.cch++;

mii.dwTypeData = (char*)malloc(mii.cch);

GetMenuItemInfo(hmenu, id, FALSE, &mii);

//Устанавливаем полученный заголовок в заголовке окна

SetWindowText(hwnd, mii.dwTypeData);

//Освобождаем память

free(mii.dwTypeData);

}//if(id){

break;

case WM_CLOSE:

//Разрушаем меню

DestroyMenu(hmenu);

//Разрушаем окно

DestroyWindow(hwnd);

break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

return 0;

}

//Главная процедура

int 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, "Окно",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED,

100, 100, 300, 200, NULL, NULL, hInstance, 0);

//Цикл обработки сообщений

while(GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}

Ниже приводится содержимое заголовочного файла Constants.h, в котором задаются идентификаторы пунктов меню.

#define IDM_WINDOW 0x0100

#define IDM_MENU 0x0110

#define IDM_SHORTCUTMENU 0x0120

#define IDM_POPUPMENU 0x0130

Ниже приводится главное окно разработанного примера.


Меню

Демонстрация ручного создания меню и обработки событий, связанных с меню.

В данном примере с помощью функции CreateMenu создается само меню, а с помощью функции AppendMenu создается его содержимое.

При получении сообщения WM_COMMAND, заголовок нажатого пункта меню с помощью функции GetMenuString копируется в локальный буфер, а потом, функцией MessageBox выводится на экран.

Ниже приводится полный исходный код примера.

#include <windows.h>

#include "Constants.h"

HMENU PrepareMenu (void){

//Создает подменю "Файл"

HMENU hMenuFile;

hMenuFile = CreateMenu();

AppendMenu(hMenuFile, MF_STRING , IDM_NEW , "Создать");

AppendMenu(hMenuFile, MF_SEPARATOR, 0 , NULL);

AppendMenu(hMenuFile, MF_STRING , IDM_OPEN, "Открыть");

//Создает основное меню и присоединяет к нему подменю "Файл"

HMENU hmenu;

hmenu = CreateMenu();

AppendMenu(hmenu, MF_STRING|MF_POPUP, (UINT_PTR)hMenuFile, "Файл");

//Создаем подменю "О программе"

HMENU hMenuHelp;

hMenuHelp = CreateMenu();

AppendMenu(hMenuHelp, MF_STRING, IDM_ABOUT, "О программе...");

//Присоединяет подменю "О программе" к основному меню

AppendMenu(hmenu, MF_STRING|MF_POPUP, (UINT_PTR)hMenuHelp, "Помощь");

//Возвращаем созданное меню

return hmenu;

}

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

char s[SIZE_BUFFER];

switch(uMsg){

case WM_COMMAND:

//Получаем текст выранного пункта меню

GetMenuString(GetMenu(hwnd), LOWORD(wParam), s, SIZE_BUFFER, MF_BYCOMMAND);

//Выводим на экран текст заголовка меню

MessageBox(hwnd, s, s, MB_OK);

break;

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

return 0;

}

//Главная процедура

int 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, "Меню",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED,

100, 100, 200, 200, NULL, PrepareMenu(), hInstance, 0);

//Цикл обработки сообщений

while(GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}

Меню создается и заполняется в функции PrepareMenu. Описатель созданного меню передается в функцию CreateWindowEx, чтобы она прикрепила его к создаваемому окну. При обработке выбора пункта меню, описатель меню получается с помощью функции GetMenu. Идентификатор выбранного пункта меню хранится в младшем слове параметра wParam сообщения WM_COMMAND.

Ниже приводится содержимое заголовочного файла Constants.h, в котором задаются идентификаторы пунктов меню размер буфера под строку с заголовком.

#define IDM_FILE 0x0100

#define IDM_NEW 0x0110

#define IDM_OPEN 0x0120

#define IDM_HELP 0x0200

#define IDM_ABOUT 0x0210

#define SIZE_BUFFER 50

Ниже приводится главное окно разработанного приложения.


Меню 2

Демонстрация загрузки меню из ресурсов и его последующего редактирования. В данном примере создается диалоговое окно. При обработке сообщения WM_INITDIALOG делается следующее:

· с помощью функции LoadMenu меню загружается из ресурсов;
· с помощью функции SetMenu меню прикрепляется к диалоговому окну;
· вызывается функция PrepareMenu, которая редактирует меню.

Изначально, загруженное из ресурсов меню похоже на меню из примера. Но функция PrepareMenu его изменяет. Она делает следующее.

· С помощью функций GetSubMenu, RemoveMenu и DestroyMenu уничтожается подменю "Помощь". Его можно было удалить и с помощью функции DeleteMenu, но её мы применим чуть позже.
· С помощью функции InsertMenu в меню вставляется пункт "Сохранить".
· С помощью функции InsertMenuItem в меню вставляется пункт "Сохранить как".
· С помощью функции DeleteMenu удаляется пункт меню "Удали меня".
· С помощью функции SetMenuDefaultItem устанавливается пункт меню по умолчанию ("Создать").

Обработка события меню аналогична обработке из примера, но с тем отличием, что вместо функции GetMenuString мы используем функцию GetMenuItemInfo.

Ниже приводится полный исходный код примера.

#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;

}

void PrepareMenu(HMENU hmenu){

//Получаем описатель подменю "Помощь"

HMENU hMenuHelp;

hMenuHelp = GetSubMenu(hmenu, 1);

//Отсоединяем подменю "Помощь" от основного меню

RemoveMenu(hmenu, 1, MF_BYPOSITION);

//Уничтожаем подменю "Помощь"

DestroyMenu(hMenuHelp);

//Получаем описатель подменю "Файл"

HMENU hMenuFile;

hMenuFile = GetSubMenu(hmenu, 0);

//Добавляем в него новый пункт "Сохранить"

InsertMenu(hMenuFile, 1, MF_BYPOSITION | MF_STRING, IDM_SAVE, "Сохранить");

//Добавляем новый пункт "Сохранить как"

MENUITEMINFO mii;

mii.cbSize = sizeof(MENUITEMINFO);

mii.fMask = MIIM_STRING | MIIM_ID;

mii.fType = MFT_STRING;

mii.wID = IDM_SAVEAS;

mii.dwTypeData = "Сохранить как";

InsertMenuItem(hMenuFile, 2, TRUE, &mii);

//Удаляем пункт меню "Удали меня"

DeleteMenu(hMenuFile, IDM_KILLME, MF_BYCOMMAND);

//Устанавливаем пункт меню по умолчанию

SetMenuDefaultItem(hMenuFile, 0, TRUE);

}

//Диалоговая процедура

INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

HMENU hmenu;

char s[SIZE_BUFFER];

MENUITEMINFO mii;

switch(uMsg){

case WM_INITDIALOG:

//Загружаем меню из ресурсов

hmenu = LoadMenu(NULL, MAKEINTRESOURCE(ID_MENU));

//Устанавливаем меню

SetMenu(hwnd, hmenu);

//Настраивам меню

PrepareMenu(hmenu);

break;

case WM_COMMAND:

//Читаем заголовок пункта меню

mii.cbSize = sizeof(MENUITEMINFO);

mii.fMask = MIIM_DATA | MIIM_TYPE;

mii.fType = MFT_STRING;

mii.dwTypeData = s;

mii.cch = SIZE_BUFFER - 1;

GetMenuItemInfo(GetMenu(hwnd), LOWORD(wParam), FALSE, &mii);

//Выводим заголовок

MessageBox(hwnd, mii.dwTypeData, "", MB_OK);

break;

case WM_CLOSE:

//Закрываем диалоговое окно

EndDialog(hwnd,0);

}

return 0;

}

Ниже приводится содержимое файла ресурсов, в котором задается изначальное меню и шаблон диалогового окна.

#include "Resource.h"

#include <windows.h>

//Меню

ID_MENU MENU{

POPUP "Файл"{

MENUITEM "Создать", IDM_NEW

MENUITEM "Открыть", IDM_OPEN

MENUITEM "Удали меня", IDM_KILLME

}

POPUP "Помощь"{

MENUITEM "О программе", IDM_ABOUT

}

}

//Шаблон диалогового окна

ID_DIALOG DIALOGEX 0,0,130,130

STYLE WS_CAPTION | WS_VISIBLE | WS_SYSMENU | DS_CENTER | WS_MINIMIZEBOX

CAPTION "Меню"

BEGIN

END

Ниже приводится содержимое заголовочного файла "Resource.h", в котором задаются идентификаторы и размер буфера под строку.

#define ID_DIALOG 0x1000

#define ID_MENU 0x2000

#define IDM_FILE 0x2100

#define IDM_NEW 0x2110

#define IDM_SAVE 0x2120

#define IDM_SAVEAS 0x2130

#define IDM_OPEN 0x2140

#define IDM_KILLME 0x2150

#define IDM_HELP 0x2200

#define IDM_ABOUT 0x2210

#define SIZE_BUFFER 50

Ниже приводится главное окно разработанного приложения.


Меню 3

Демонстрация создания меню на основе ресурса в памяти. В данном примере создается простое окно. Во время создания окна вызывается функция PrepareMenu(), которая создает меню и связывает с ним некоторую информацию. Конкретно она делает следующее.

· Выделяет память под шаблон меню.
· Заполняет структуру MENUITEMTEMPLATEHEADER и массив структур MENUITEMTEMPLATE, создавая тем самым шаблон меню. Создаваемое меню аналогично меню в примере. При этом, для формирования Unicode строк используется функция MultiByteToWideChar.
· Вызывает функцию LoadMenuIndirect для создания меню, на основе шаблона.
· Освобождает память, выделенную ранее под шаблон меню.
· Вызывает функцию SetMenuInfo для установки максимальной высоты пункта меню.
· Вызывает функцию GetSubMenu для получения описателя подменю "Файл".
· Вызывает функцию SetMenuDefaultItem для установки пункта меню умолчанию. В качестве него устанавливается пункт меню "Открыть".
· Вызывает функцию EnableMenuItem для того, чтобы сделать недоступным пункт меню "Открыть".
· Вызывает функцию SetMenuContextHelpId для установки идентификатора контекста помощи.
· Возвращает описатель меню.

Полученный описатель меню передается в функцию CreateWindowEx и связывается с главным окном прилодения.

При обработке сообщения WM_CREATE вызывается функция DrawMenuInfo, которая собирает информацию о меню (установленную функцией PrepareMenu) и выводит её в главном окне. Конкретно она делает следующее.

· Вызывает функцию GetMenu для получения описателя меню.
· Вызывает функцию GetMenuInfo для получения максимальной высоты пункта меню.
· Отображает максимальную высоту в главном окне.
· Вызывает функцию GetSubMenu для получения описателя подменю "Файл".
· Вызывает функцию GetMenuDefaultItem для получения пункта меню по умолчанию.
· Отображает порядковый номер пункта меню по умолчанию.
· Вызывает функцию GetMenuItemID для получения идентификатора пункта меню по умолчанию.
· Отображает идентификатор пункта меню по умолчанию.
· Вызывает функцию GetMenuItemRect для получения координат прямоугольника, содержащего пункт меню "Файл".
· Отображает координаты углов этого прямоугольника.
· Вызывает функцию GetMenuState для получения набора флагов состояния пункта меню "Открыть" (он недоступен).
· По полученному набору флагов определяет доступен ли этот пункт меню.
· Выводит в главном окнем вердикт: доступен или нет.
· По координата точки (200;130) находит пункт меню, которому принадлежит эта точка. Для этого вызывается функция MenuItemFromPoint.
· Отображает на экране номер найденного пункта меню (это пункт "Помощь").
· Вызывает функцию GetMenuContextHelpId для получения идентификатора контекста помощи меню.
· Отображает полученный идентификатор контекста помощи.

Отображение информации осуществляется следующим образом.

· С помощью функции snprintf формируется строка с информацией.
· Вызывается функция CreateWindow для создания дочернего окна класса "Static", в заголовке которого и отображается сформированная ранее строка.

При обработке сообщения WM_SHOWWINDOW вызывается функция HiliteMenuItem для того, чтобы подсветить пункт меню "Файл".

Ниже приводится полный исходный текст данного прмера.

#include <windows.h>

#include "Constants.h"

#include <stdio.h>

/************************************

*******Подготавливает меню***********

************************************/

HMENU PrepareMenu (void){

//Создаем буфер под шаблон меню

void *pTemplate;

pTemplate = malloc(150);

if (!pTemplate) return NULL;

//Заполняем структуру MENUITEMTEMPLATEHEADER

MENUITEMTEMPLATEHEADER *pmith;

pmith = (MENUITEMTEMPLATEHEADER*)pTemplate;

pmith->versionNumber = 0;

pmith->offset = 0;

//Заносим информацию о пункте меню "Файл"

//Заполняем структуру MENUITEMTEMPLATE

MENUITEMTEMPLATE *pmit;

pmit = (MENUITEMTEMPLATE*)(pmith+1);

pmit->mtOption = MF_POPUP;

//Поскольку мы создаем пункт меню, раскрывающий подменю, то поля mtID нет

//Сдвигаем указатель. Теперь он указывает на начало поля mtString

WORD *pw;

pw = (WORD*)pmit;

pw++;

//Записываем текст пункта "Файл"

LPWSTR lpwsz;

lpwsz = (LPWSTR)(pw);

UINT nchar;

nchar = MultiByteToWideChar(CP_ACP, 0, "Файл", -1, lpwsz, 50);

lpwsz += nchar;

//Заносим информацию о пункте меню "Создать"

pmit = (MENUITEMTEMPLATE*)(lpwsz);

pmit->mtOption = MF_STRING;

pmit->mtID = IDM_NEW;

lpwsz = (LPWSTR)(&(pmit->mtString));

nchar = MultiByteToWideChar(CP_ACP, 0, "Создать", -1, lpwsz, 50);

lpwsz += nchar;

//Заносим информацию о разделителе между пунктами "Создать" и "Открыть"

pmit = (MENUITEMTEMPLATE*)(lpwsz);

pmit->mtOption = MF_SEPARATOR;

pmit->mtID = 0;

pmit->mtString[0] = 0;

pmit++;

//Заносим информацию о пункте меню "Открыть"

pmit->mtOption = MF_STRING | MF_END;

pmit->mtID = IDM_OPEN;

lpwsz = (LPWSTR)(&(pmit->mtString));

nchar = MultiByteToWideChar(CP_ACP, 0, "Открыть", -1, lpwsz, 50);

lpwsz += nchar;

//Заносим информацию о пункте меню "Помощь"

pmit = (MENUITEMTEMPLATE*)(lpwsz);

pmit->mtOption = MF_POPUP | MF_END;

pw = (WORD*)pmit;

pw++;

lpwsz = (LPWSTR)(pw);

nchar = MultiByteToWideChar(CP_ACP, 0, "Помощь", -1, lpwsz, 50);

lpwsz += nchar;

//Заносим информацию о пункте меню "О программе..."

pmit = (MENUITEMTEMPLATE*)(lpwsz);

pmit->mtOption = MF_STRING | MF_END;

pmit->mtID = IDM_ABOUT;

lpwsz = (LPWSTR)(&(pmit->mtString));

nchar = MultiByteToWideChar(CP_ACP, 0, "О программе...", -1, lpwsz, 50);

lpwsz += nchar;

//Создаем меню

HMENU hmenu;

hmenu = LoadMenuIndirect(pTemplate);

//Освобождаем память

free(pTemplate);

//Устанавливаем максимальную высоту пункта меню

MENUINFO mi;

mi.cbSize = sizeof(MENUINFO);

mi.fMask = MIM_MAXHEIGHT;

mi.cyMax = 50;

SetMenuInfo(hmenu, &mi);

//Устанавливаем пункт меню по умолчанию

HMENU hSubMenu;

hSubMenu = GetSubMenu(hmenu, 0);

SetMenuDefaultItem(hSubMenu,0,TRUE);

//Делаем недоступным пункт меню "Открыть"

EnableMenuItem(hSubMenu, 2, MF_BYPOSITION | MF_DISABLED);

//Устанавливаем идентификатор помощи

SetMenuContextHelpId(hmenu, 0x100);

return hmenu;

}

/************************************

Собирает и отображает информацию о меню

************************************/

void DrawMenuInfo(HWND hwnd){

//Получаем описатель меню

HMENU hmenu;

hmenu = GetMenu(hwnd);

//Подучаем максимальную высоту

MENUINFO mi;

mi.cbSize = sizeof(MENUINFO);

mi.fMask = MIM_MAXHEIGHT;

GetMenuInfo(hmenu, &mi);

//Формируем строку

char s[SIZE_BUFFER];

snprintf(s,SIZE_BUFFER,"Максимальная высота %d", mi.cyMax);

//Выводим строку на экран

CreateWindow("Static",s, WS_CHILD | WS_VISIBLE, 10, 10, 170, 20, hwnd, 0, NULL, 0);

//Получаем описатель подменю "Файл"

HMENU hSubMenu;

hSubMenu = GetSubMenu(hmenu,0);

//Получаем положение пункта меню по умолчанию

UINT pos;

pos = GetMenuDefaultItem(hSubMenu,TRUE,GMDI_USEDISABLED);

snprintf(s,SIZE_BUFFER, "Положение пункта меню по умолчанию %d", pos);

CreateWindow("Static",s, WS_CHILD | WS_VISIBLE, 10, 40, 300, 20, hwnd, 0, NULL, 0);

//Получаем идентификатор пункта меню по умолчанию

UINT id;

id = GetMenuItemID(hSubMenu, pos);

snprintf(s,SIZE_BUFFER, "Идентификатор пункта меню по умолчанию 0x%X", id);

CreateWindow("Static",s, WS_CHILD | WS_VISIBLE, 10, 70, 340, 20, hwnd, 0, NULL, 0);

//Получаем прямоугольник пункта меню "Файл"

RECT rc;

GetMenuItemRect(hwnd,hmenu,0,&rc);

snprintf(s,SIZE_BUFFER, "Координаты прямоугольника пункта \"Файл\" (%d;%d)-(%d;%d)", rc.left, rc.top, rc.right, rc.bottom);

CreateWindow("Static",s, WS_CHILD | WS_VISIBLE, 10, 100, 450, 20, hwnd, 0, NULL, 0);

//Получаем состояние пункта меню "Открыть"

UINT state;

state = GetMenuState(hSubMenu, 2, MF_BYPOSITION);

//Определяем доступен ли он

UCHAR isenabled;

isenabled = !(state&(MF_DISABLED | MF_GRAYED));

//Отображаем вердикт

snprintf(s,SIZE_BUFFER,"Пункт меню \"Открыть\" %s доступен", isenabled ? "" : "не");

CreateWindow("Static",s, WS_CHILD | WS_VISIBLE, 10, 130, 450, 20, hwnd, 0, NULL, 0);

//Находим пункт меню по координатам точки

POINT p;

p.x = 200;

p.y = 130;

pos = MenuItemFromPoint(hwnd, hmenu, p);

snprintf(s,SIZE_BUFFER,"Номер пункта меню в точке (200;130) %d", pos);

CreateWindow("Static",s, WS_CHILD | WS_VISIBLE, 10, 160, 450, 20, hwnd, 0, NULL, 0);

//Получаем идентифкатор контекста помощи

DWORD HelpId;

HelpId = GetMenuContextHelpId(hmenu);

snprintf(s,SIZE_BUFFER,"Идентификатор помощи для меню 0x%X", HelpId);

CreateWindow("Static",s, WS_CHILD | WS_VISIBLE, 10, 190, 450, 20, hwnd, 0, NULL, 0);

}

/************************************

*********Оконная процедура***********

************************************/

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

switch(uMsg){

case WM_CREATE:

DrawMenuInfo(hwnd);

break;

case WM_SHOWWINDOW:

//Подсвечиваем пункт меню "Файл"

HiliteMenuItem(hwnd, GetMenu(hwnd), 0, MF_BYPOSITION | MF_HILITE);

break;

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

return 0;

}

/************************************

*********Главная процедура***********

************************************/

int 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, "Меню",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED,

150, 100, 450, 270, NULL, PrepareMenu(), hInstance, 0);

//Цикл обработки сообщений

while(GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}

Ниже приводится содержимое заголовочного файла "Constants.h", содержащего идентификаторы пунктов меню и размер буфера.

#define IDM_NEW 0x0110

#define IDM_OPEN 0x0120

#define IDM_ABOUT 0x0210

#define SIZE_BUFFER 100

Ниже приводится главное окно разработанного примера.


Обработка нажатий клавиш

Демонстрация реагирования программы на нажатие определенных клавиш клавиатуры. В данном примере создается простое оконное приложение, которое выводит на экран строковое сообщение при нажатии пользователем клавиши F5 или комбинации Ctrl+F5. При этом для каждого из этих вариантов сообщение выводится свое.

Для реализации поставленной задачи мы обрабатываем сообщение WM_KEYDOWN. В его параметре wParam передается код нажатой клавиши (нас интересует код VK_F5). Но в данном сообщении не передается информация о состоянии клавиши Control. Поэтому мы вызываем функцию GetAsyncKeyState с параметром VK_CONTROL чтобы проверить состояние этой клавиши. Признак того нажата она или нет хранится в старшем бите.

Ниже приводится полный исходный код данного примера.

#include <windows.h>

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

short ctrl_state;

switch (uMsg)

{

case WM_KEYDOWN:

if (wParam != VK_F5)

break;

//Проверяем состояние клавиши Ctrl

ctrl_state = GetAsyncKeyState(VK_CONTROL);

if (ctrl_state & 0x8000)

MessageBox(hwnd, TEXT("Вы нажали комбинацию Ctrl+F5"), TEXT(""), MB_OK);

else

MessageBox(hwnd, TEXT("Вы нажали клавишу F5"), TEXT(""), MB_OK);

break;

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

return 0;

}

//Главная функция программы

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

TCHAR ClassName[] = TEXT("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);

//Создаем окно

CreateWindowEx(0, ClassName, TEXT("Нажатия на клавиши"),

WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_OVERLAPPED | WS_BORDER,

400, 300, 250, 250, NULL, 0, hInstance, 0);

//Цикл обработки сообщений

MSG msg;

while (GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}


Оконное приложение

В данном примере демонстрируется создание простого оконного приложения.

#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;

}

int 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;

}

int 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;

}

На рисунке ниже изображено окно, создаваемое этой программой.


Оконное приложение 3

Данный пример аналогичен примеру, лишь с тем отличием, что в данном случае для организации цикла обработки сообщений используется не функция GetMessage, а функции PeekMessage и WaitMessage.

#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;

}

int 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);

//Создаем окно

HWND hwnd;

hwnd = CreateWindowEx(0, ClassName, "MyWindow",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED,

100, 100, 200, 200, NULL, NULL, hInstance, 0);

//Цикл обработки сообщений

while(WaitMessage()) {

PeekMessage(&msg, NULL, 0, 0,PM_REMOVE);

TranslateMessage(&msg);

DispatchMessage(&msg);

if(msg.message == WM_QUIT) break;

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}

Создаваемое в данном примере окно, аналогично окну, создаваемому в примере.

Поведение окна, создаваемого таким образом в целом аналогично поведению окна из примера, однако при использовании таймера окно ведет себя некорректно. Поэтому использовать данный способ нежелательно. Здесь он приведен только для демонстрации работы функций PeekMessage и WaitMessage.


Окно по центру

Демонстрация расположения окна по центру. Для решения этой задачи мы, первым делом с помощью функции SystemParametersInfo определяем размер рабочей области экрана (флаг SPI_GETWORKAREA). А потом на основе этих размеров рассчитываем новые координаты создаваемого окна.

#include <windows.h>

//Размеры окна

#define SIZE_WINDOW_X 150

#define SIZE_WINDOW_Y 150

//Оконная процедура

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;

}

int 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);

//Получаем размер рабочей области

RECT rc;

SystemParametersInfo(SPI_GETWORKAREA,0,&rc,0);

//Вычисляем координаты окна

POINT pos;

pos.x = (rc.right - rc.left - SIZE_WINDOW_X)/2;

pos.y = (rc.bottom - rc.top - SIZE_WINDOW_Y)/2;

//Создаем окно

CreateWindowEx(0, ClassName, "По центру",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED,

pos.x, pos.y, SIZE_WINDOW_X, SIZE_WINDOW_Y, NULL, NULL, hInstance, 0);

//Цикл обработки сообщений

while(GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}


Окно с перетаскиваемым элементом

Демонстрация создания окна с перетаскиваемым элементом. В данном примере создаётся окно со статическим элементом управления. Причем пользователь с помощью мыши может менять положение статического элемента управления внутри главного окна (посредством механизма Drag&Drop).

Согласно концепции Drag&Drop перетаскиваемый объект может находиться в одном из двух состояний: свободном (объект не перетаскивается пользователем) и захваченном (пользователь перетаскивает объект). Для идентификации режима мы используем глобальную переменную IsCatch.

Для решения задачи мы обрабатываем три оконных сообщения: WM_LBUTTONDOWN (пользователь нажал на левую кнопку мыши), WM_LBUTTONUP (пользователь отпустил левую кнопку мыши) и WM_MOUSEMOVE (пользователь переместил курсор мыши).

Нажатие на левую кнопку может произойти только тогда, когда перетаскиваемый объект находится в свободном состоянии. Поэтому основная задача, которая состоит при обработке сообщения WM_LBUTTONDOWN, состоит в определении того, нужно переводить перетаскивамый объект в захваченное состояние или нет. Определяется это по положению курсора в момент нажатия на левую кнопку мыши (координаты курсора передаются в параметре lParam этого сообщения).

Если в момент нажатия на левую кнопку мыши курсор находился над перетаскивывемым объектом, то этот объект переводится в захваченное состоянии. В противном случае объект остается в свободном состоянии.

При переводе перетаскиваемого объекта в захваченное состояние выполняются следующие действия: 1) с помощью функции SetCursor меняем форму курсора (для удобства пользователя); 2) изменяем значение глобальной перменной IsCatch; 3) с помощью функции ClipCursor ограничиваем область перемещения курсора (чтобы пользователь не смог "утащить" объект за пределы главного окна).

Обработка сообщения WM_MOUSEMOVE зависит от состояния перетаскиваемого объекта. Если этот объект захвачен, то в сответствии с изменением положения курсора мыши с помощью функции SetWindowPos меняется положение перетаскиваемого объекта.

Если объект не захвачен, но курсор мыши находится над перемещаемым объектом, то мы меняем форму курсора (с помощью функции SetCursor). Это сделано для удобства пользователя: так мы даём ему понять, что данный объект может быть перемещен.

Обработка сообщения WM_LBUTTONUP также зависит от состояния перетаскиваемого объекта. Если он был захвачен, то выполняются следующие действия: 1) изменяется значение глобальной переменной IsCatch; 2) с помощью функции ClipCursor "освобождается" курсор мыши: теперь он может свободно перемещаться по всему экрану.

Исходный код приложения.

#include <windows.h>

#include "Resource.h"

#define MINOTSTUP 20

//Описатель окна - перемещаемого элемента

HWND hwndStatic = HWND_DESKTOP;

//Описатель главного диалогового окна

HWND hwndMainWindow = HWND_DESKTOP;

//Описатели курсоров

HCURSOR hCurNoDrop, hCurDrop;

//Признак захвата

char IsCatch = 0;

//Высота заголовка окна

int HeightTitle = 0;

//Прототип диалоговой процедуры

INT_PTR WINAPI Dlg_Proc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int hFunsterStil)

{

//Получаем описатели курсоров

hCurDrop = LoadCursor(hThisInstance, MAKEINTRESOURCE(IDC_HANDDROP));

hCurNoDrop = LoadCursor(hThisInstance, MAKEINTRESOURCE(IDC_HANDNODROP));

//Создаём диалоговое окно

DialogBoxParam(hThisInstance, MAKEINTRESOURCE(ID_DIALOG), HWND_DESKTOP, Dlg_Proc, 0);

return 0;

}

//Извлекает координату x

inline int GetX(int Coordinates)

{

return (Coordinates&0xFFFF);

}

//Извлекает кординату y

inline int GetY(int Coordinates)

{

return (Coordinates>>0x10);

}

//Проверяет, что курсор мыши находится в пределах "перемещаемого элемента"

int IsWithinStatic(int x, int y)

{

RECT rcMainWindow, rcStatic;

GetWindowRect(hwndMainWindow, &rcMainWindow);

GetWindowRect(hwndStatic,&rcStatic);

//Осуществляем пересчет из экранных координат в клиентские

rcStatic.left -= rcMainWindow.left;

rcStatic.right -= rcMainWindow.left;

rcStatic.top -= rcMainWindow.top+HeightTitle;

rcStatic.bottom -= rcMainWindow.top+HeightTitle;

if((x>=rcStatic.left)&&(x<rcStatic.right)&&(y>=rcStatic.top)&&(y<=rcStatic.bottom))

return 1;

else

return 0;

}

//При перемещении курсора мыши

void OnMouseMove(int x, int y)

{

//Если мы в режиме захвата, то перемещаем элемент и перерисовываем курсор мыши

if(IsCatch){

//Меняем положение перетаскиваемого объекта

SetWindowPos(hwndStatic, 0, x, y, 0, 0, SWP_NOSIZE);

SetCursor(hCurDrop);

return;

}

//Если мы не в режиме захвата и курсор мыши указывает на перемещаемый элемент

//то перерисовываем курсор мыши, подсказывая пользователю о возможности захвата

if (IsWithinStatic(x, y))

SetCursor(hCurNoDrop);

return;

}

//Обработка нажатия левой кнопки мыши (захват)

void Catch(int x, int y)

{

//Если мы не в пределах "перетаскиваемого элемента" то ничего не делаем

if (!IsWithinStatic(x, y)) return;

//Перерисовываем курсор

SetCursor(hCurDrop);

//Взводим флаг захвата

IsCatch=1;

//Ограничиваем перемещение курсора мыши клиентской областью окна

RECT rcMainWindow;

GetWindowRect(hwndMainWindow, &rcMainWindow);

rcMainWindow.top += HeightTitle;

rcMainWindow.bottom -= MINOTSTUP;

rcMainWindow.right -= MINOTSTUP;

ClipCursor(&rcMainWindow);

return ;

}

//Инициализируем глобальные переменные

void OnInitDialog()

{

//Получаем описатель перетаскиваемого элемента

hwndStatic = GetDlgItem(hwndMainWindow, ID_STATIC);

//Определяем высоту заголовка окна

RECT rcWindow, rcClientWindow;

GetWindowRect(hwndMainWindow,&rcWindow);

GetClientRect(hwndMainWindow,&rcClientWindow);

HeightTitle = (rcWindow.bottom-rcWindow.top)-rcClientWindow.bottom;

}

//Диалоговая процедура

INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

switch(uMsg){

case WM_INITDIALOG:

hwndMainWindow = hwnd;

OnInitDialog();

break;

case WM_CLOSE:

EndDialog(hwnd, 0);

break;

case WM_MOUSEMOVE:

OnMouseMove(GetX(lParam), GetY(lParam));

break;

case WM_LBUTTONDOWN:

Catch(GetX(lParam), GetY(lParam));

break;

case WM_LBUTTONUP:

if(IsCatch){

//Сбрасываем флаг захвата

IsCatch = 0;

//"Освобождаем" мышь

ClipCursor(NULL);

}

break;

}

return 0;

}

Файл ресурсов.

#include <windows.h>

#include "Resource.h"

IDC_HANDNODROP CURSOR "hmove.cur"

IDC_HANDDROP CURSOR "hnwse.cur"

ID_DIALOG DIALOG 0,0,150,150

STYLE WS_CAPTION | WS_VISIBLE | WS_SYSMENU | DS_CENTER

CAPTION "Окно с перетаскиваемым элементом"

BEGIN

LTEXT "Перетаскиваемый элемент", ID_STATIC, 30, 70, 90, 10

END

Заголовочный файл "Resources.h" содержит идентификаторы ресурсов.

#define ID_DIALOG 10

#define ID_STATIC 20

#define IDC_HANDNODROP 30

#define IDC_HANDDROP 40


Перетаскивание файлов

Демонстрация создания окна, в которое можно перетаскивать файлы. В данном примере создается простое приложение с окном. При перетаскивании в него файла, на экран выводится сообщение с полным наименованием файла. Такое окно создается как и все окна, единственное его отличие от других окон это установленный стиль WS_EX_ACCEPTFILES. Данный стиль говорит системе о том, что в данное окно можно перетаскивать файлы.

Когда пользователь перетаскивает в окно файл, окну отправляется сообщение WM_DROPFILES. С этим сообщением передается идентификатор внутренней структуры, содержащей информацию о файле. Для извлечения информации о файле мы вызываем функцию DragQueryFile. Функция DragFinish используется для уведомления системы об окончании работы с внутренней структурой.

Ниже приводится полный исходный текст примера.

#include <windows.h>

/*********************************************/

/*************Оконная процедура***************/

/*********************************************/

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

TCHAR path[MAX_PATH+1];

switch (uMsg) {

case WM_DROPFILES:

//Читаем наименование принятого файла

DragQueryFile((HDROP)wParam, 0, path, MAX_PATH);

//Освобождаем ресурсы

DragFinish((HDROP)wParam);

//Выводим пользователю наименование файла

MessageBox(hwnd, path, TEXT(""), MB_OK);

break;

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

return 0;

}

/*********************************************/

/*************Главная функция*****************/

/*********************************************/

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

TCHAR ClassName[] = TEXT("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 = NULL;

wc.lpszMenuName = NULL;

wc.lpszClassName = ClassName;

//Регистрируем оконный класс

RegisterClass(&wc);

//Создаем окно

CreateWindowEx(WS_EX_ACCEPTFILES, ClassName, TEXT("Принимающее окно"),

WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_OVERLAPPED,

100, 100, 500, 500, NULL, NULL, hInstance, 0);

//Цикл обработки сообщений

while (GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}


Перечисление дочерних окон

Данный пример демонстрирует перечисление дочерних окон с помощью функции EnumChildWindows. В примере мы перечисляем дочерние окна главного окна стандартного калькулятора Windows.

#include <windows.h>

#define LENGTH 20

//Прототип функции обратного вызова

BOOL CALLBACK EnumChildProc(HWND, LPARAM);

int main()

{

HWND hwnd;

//Находим главное окно калькулятора

//его дочерние окна мы и будем перечислять

hwnd = FindWindow("SciCalc",NULL);

if(!hwnd) return -1;

//Перечисляем дочерние окна

EnumChildWindows(hwnd,EnumChildProc,0);

getchar();

return 0;

}

//Сама функция обратного вызова

//Её будет вызывать система для каждого найденного дочернего окна

BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lparam){

char text[LENGTH];

//Читаем заголовок найденного окна

GetWindowText(hwnd,text,LENGTH);

//Конвертируем символы в заголовке

CharToOem(text,text);

//Выводим информацию о найденном окне

printf("%x\t%s\n",hwnd,text);

return TRUE;

}


Перечисление имен ресурсов

Данный пример демонстрирует перечисление наименований ресурсов в заданном файле. В примере ниже мы c помощью функции EnumResourceNames перечисляем иконки стандартного калькулятора Windows.

#include <windows.h>

//Прототип процедуры обратного вызова

BOOL CALLBACK EnumResNameProc(HMODULE,LPCTSTR,LPTSTR,LONG_PTR);

int main()

{

//Получаем описатель модуля калькулятора

char path[] = "C:\\WINDOWS\\system32\\calc.exe";

HMODULE hmodule;

hmodule = LoadLibrary(path);

//Запускаем перечисление иконок

EnumResourceNames(hmodule,RT_ICON,EnumResNameProc,0);

getchar();

return 0;

}

//Сама процедура обратного вызова

BOOL CALLBACK EnumResNameProc(HMODULE hmodule, LPCTSTR sType, LPTSTR sName, LONG_PTR lParam)

{

//Выводим найденное наименование ресурса

if(IS_INTRESOURCE(sName))

printf("%X\n",sName);

else

printf("%s\n",sName);

return TRUE;

}


Перечисление имен ресурсов 2

Данный пример аналогичен примеру, с той лишь разницей, что здесь мы вместо функции EnumResourceNames используем функцию EnumResourceNamesEx.

#include <windows.h>

#define RESOURCE_ENUM_LN 0x0001

//Прототип функции EnumResourceNamesEx

typedef __stdcall BOOL (*ENUMRESOURCENAMESEX)(HMODULE,LPCTSTR,ENUMRESNAMEPROC,LONG_PTR,DWORD,LANGID);

ENUMRESOURCENAMESEX lpfERN;

//Прототип процедуры обратного вызова

BOOL CALLBACK EnumResNameProc(HMODULE,LPCTSTR,LPTSTR,LONG_PTR);

int main()

{

//Получаем описатель модуля калькулятора

char path[] = "C:\\WINDOWS\\system32\\calc.exe";

HMODULE hmodule;

hmodule = LoadLibrary(path);

//Находим адрес функции EnumResourceNamesEx

HMODULE hkernel;

hkernel = GetModuleHandle("kernel32.dll");

lpfERN = (ENUMRESOURCENAMESEX)GetProcAddress(hkernel,"EnumResourceNamesExA");

//Запускаем перечисление иконок

if(lpfERN)

lpfERN(hmodule,RT_ICON,EnumResNameProc,0,RESOURCE_ENUM_LN,MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL));

getchar();

return 0;

}

//Сама процедура обратного вызова

BOOL CALLBACK EnumResNameProc(HMODULE hmodule, LPCTSTR sType, LPTSTR sName, LONG_PTR lParam)

{

//Выводим найденное наименование ресурса

if(IS_INTRESOURCE(sName))

printf("%X\n",sName);

else

printf("%s\n",sName);

return TRUE;

}


Перечисление окон верхнего уровня

Данный пример демонстрирует перечисление окон верхнего уровня с помощью функции EnumWindows.

#include <windows.h>

//Прототип функции EnumWindowProc

BOOL CALLBACK EnumWindowsProc(HWND, LPARAM);

#define LENGTH 255

//Буфер под заголовки окон

char text[LENGTH];

int main()

{

//Перечисляем окна верхнего уровня

EnumWindows(EnumWindowsProc,0);

getchar();

return 0;

}

//Сама функция EnumWindowProc

//Вызывается системой для каждого найденного окна

BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lparam)

{

//Получаем заголовок найденного окна

GetWindowText(hwnd,text,LENGTH);

//Конвертируем его для корректного отображения кириллицы в консоли

CharToOem(text,text);

//Выводим на экран информацию о найденном окне (дескриптор и заголовок)

printf("%x\t%s\n",hwnd,text);

return TRUE;

}


Перечисление окон верхнего уровня 2

Данный примере демонстрирует перечисление окон с помощью функции SendMessageCallback. Информация о найденных окнах (дескриптор и заголовок) выводится в список ListBox. Перечисление окон запускается нажатием на кнопку "Вывести список окон". Функция SendMessageCallback рассылает всем окнам сообщение WM_NULL, а функция обратного вызова SendAsyncProc добавляет информацию о найденном окне в список.

#include <windows.h>

//Идентификатор кнопки

#define ID_BUTTON 0x100

//Идентификатор списка

#define ID_LISTBOX 0x200

#define SIZE_BUFFER 100

//Дескриптор окна списка

HWND hwnd_listbox;

//Функция обратного вызова для SendMessageCallback

void SendAsyncProc(HWND hwnd,UINT uMsg,ULONG_PTR dwData,LRESULT lResult){

//Формируем строку с информацией о найденном окне

char s[SIZE_BUFFER];

sprintf(s,"%x ",hwnd);

UINT len;

len = lstrlen(s);

//Запрашиваем заголовок найденного окна

GetWindowText(hwnd,s+len,SIZE_BUFFER-len-1);

//Добавляем строку в список

SendMessage(hwnd_listbox,LB_ADDSTRING,0,(LPARAM)s);

}

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

switch(uMsg){

case WM_COMMAND:

if((HIWORD(wParam)==BN_CLICKED)&&(LOWORD(wParam)==ID_BUTTON)){

//Обработка нажатия на кнопку

SendMessage(hwnd_listbox,LB_RESETCONTENT,0,0);

SendMessageCallback(HWND_BROADCAST,WM_NULL,0,0,(SENDASYNCPROC)SendAsyncProc,0);

}//if((HIWORD(wParam)==BN_CLICKED)&&(LOWORD(wParam)==ID_BUTTON)){

break;

case WM_CLOSE:

DestroyWindow(hwnd);

break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg){

return 0;

}

int 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, 500, 500, NULL, NULL, hInstance, 0);

//Создаем кнопку

HWND hwnd_button;

hwnd_button = CreateWindowEx(0,"button", "&Вывести список окон",

WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON|WS_BORDER,

160, 430, 150, 30, hwnd, (HMENU)ID_BUTTON, hInstance, 0);

//HWND hwnd_listbox;

hwnd_listbox = CreateWindowEx(0,"ListBox", "&З",

WS_VISIBLE|WS_CHILD|WS_BORDER|WS_VSCROLL,

5, 5, 480, 420, hwnd, (HMENU)ID_LISTBOX, hInstance, 0);

//Цикл обработки сообщений

while(GetMessage(&msg,NULL,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}


Перечисление окон потока

Данный пример демонстрирует перечисление окон заданного потока с помощью функции EnumThreadWindows. В качестве примера мы берем главное окно стандартного калькулятора, находим поток, которому он принадлежит (с помощью GetWindowThreadProcessId) и перечисляем окна найденного потока. При этом в выводе программы вы должны увидеть дескриптор ранее найденного с помощью FindWindow окна.

#include <windows.h>

#define LENGTH 20

//Прототип функции обратного вызова

BOOL CALLBACK EnumThreadWndProc(HWND, LPARAM);

int main()

{

HWND hwnd;

//Находим главное окно калькулятора

hwnd = FindWindow("SciCalc",NULL);

if(!hwnd) return -1;

//Выводим полученный дескриптор (для последующего сравнения)

printf("%x\n",hwnd);

int tid;

//Получаем идентификатор потока калькулятора

tid = GetWindowThreadProcessId(hwnd,NULL);

//Перечисляем окна потока

EnumThreadWindows(tid,EnumThreadWndProc,0);

getchar();

return 0;

}

//Сама функция обратного вызова

//Её будет вызывать система для каждого найденного окна

BOOL CALLBACK EnumThreadWndProc(HWND hwnd, LPARAM lparam){

char text[LENGTH];

//Читаем заголовок найденного окна

GetWindowText(hwnd,text,LENGTH);

//Конвертируем символы в заголовке

CharToOem(text,text);

//Выводим информацию о найденном окне

printf("%x\t%s\n",hwnd,text);

return TRUE;

}


Перечисление семейств шрифтов

Данный пример демонстрирует перечисление семейств шрифтов с помощью функции EnumFontFamilies. Для каждого найденного семейства выводится его наименование. Ниже приводится полный исходный код примера.

#include <windows.h>

#include <stdio.h>

//Прототип функции обратного вызова

int CALLBACK EnumFontFamProc(ENUMLOGFONT*, NEWTEXTMETRIC*, DWORD, LPARAM);

//Тип функции EnumFontFamilies

typedef int (*ENUMFONTFAMILIES)(HDC, LPCTSTR, FONTENUMPROC, LPARAM);

ENUMFONTFAMILIES lpfEFF;

int main()

{

//Загружаем модуль gdi32.dll

HMODULE hgdi;

hgdi = LoadLibrary("gdi32.dll");

//Получаем адрес функции EnumFontFamilies

lpfEFF = (ENUMFONTFAMILIES)GetProcAddress(hgdi, "EnumFontFamiliesA");

//Вызываем функцию EnumFontFamilies

lpfEFF(GetDC(NULL), NULL, (FONTENUMPROC)EnumFontFamProc, 0);

system("PAUSE");

return 0;

}

//Сама функция обратного вызова

int CALLBACK EnumFontFamProc(ENUMLOGFONT* lpelf, NEWTEXTMETRIC* lpntm, DWORD FontType, LPARAM lparam){

//Выводим наименование семейства шрифтов

printf("%s\n", lpelf->elfFullName);

//Продолжаем перечисление

return 1;

}


Перечисление семейств шрифтов 2

Данный пример демонстрирует перечисление семейств шрифтов. Он аналогичен примеру, но с одним отличием: вместо функции EnumFontFamilies используется функция EnumFontFamiliesEx. Ниже приводится полный исходный код примера.

#include <windows.h>

#include <stdio.h>

//Прототип функции обратного вызова

int CALLBACK EnumFontFamExProc(const LOGFONT*, const TEXTMETRIC*, DWORD, LPARAM);

//Тип функции EnumFontFamiliesEx

typedef int (*ENUMFONTFAMILIESEX)(HDC, LPLOGFONT, FONTENUMPROC, LPARAM, DWORD);

ENUMFONTFAMILIESEX lpfEFFEx;

int main()

{

//Загружаем модуль gdi32.dll

HMODULE hgdi;

hgdi = LoadLibrary("gdi32.dll");

//Получаем адрес функции EnumFontFamiliesEx

lpfEFFEx = (ENUMFONTFAMILIESEX)GetProcAddress(hgdi, "EnumFontFamiliesExA");

//Подготавливаем структуру LOGFONT

LOGFONT lf;

lf.lfCharSet = DEFAULT_CHARSET;

lf.lfFaceName[0] = 0;

lf.lfPitchAndFamily = 0;

//Вызываем функцию EnumFontFamiliesEx

lpfEFFEx(GetDC(NULL), &lf, (FONTENUMPROC)EnumFontFamExProc, 0, 0);

system("PAUSE");

return 0;

}

//Сама функция обратного вызова

int CALLBACK EnumFontFamExProc(const LOGFONT* plf, const TEXTMETRIC* ptm, DWORD dw, LPARAM lparam){

//Выводим наименование семейства шрифтов

printf("%s\n", plf->lfFaceName);

//Продолжаем перечисление

return 1;

}


Перечисление семейств шрифтов 3

Данный пример демонстрирует перечисление семейств шрифтов. Он аналогичен примеру, но с одним отличием: вместо функции EnumFontFamilies используется функция EnumFonts. Ниже приводится полный исходный код примера.

#include <windows.h>

#include <stdio.h>

//Прототип функции обратного вызова

int CALLBACK EnumFontsProc(const LOGFONT*, const TEXTMETRIC*, DWORD, LPARAM);

//Тип функции EnumFonts

typedef int (*ENUMFONTS)(HDC, LPCTSTR, FONTENUMPROC, LPARAM);

ENUMFONTS lpfEF;

int main()

{

//загружаем модуль gdi32.dll

HMODULE hgdi;

hgdi = LoadLibrary("gdi32.dll");

//Получаем алрес функции EnumFonts

lpfEF = (ENUMFONTS)GetProcAddress(hgdi, "EnumFontsA");

//Вызываем функцию EnumFonts

lpfEF(GetDC(NULL), NULL, (FONTENUMPROC)EnumFontsProc, 0);

system("PAUSE");

return 0;

}

//Сама функция обратного вызова

int CALLBACK EnumFontsProc(const LOGFONT* plf, const TEXTMETRIC* ptm, DWORD dw, LPARAM lparam){

//Выводим наименование семейства шрифтов

printf("%s\n", plf->lfFaceName);

//Продолжаем перечисление

return 1;

}


Перечисление типов ресурсов

Данный пример демонстрирует перечисление типов ресурсов в файле. В примере ниже мы будем перечислять типы ресурсов стандартного калькулятора Windows. Для перечисления типов ресурсов мы используем функцию EnumResourceTypes.

#include <windows.h>

//Прототип процедуры обратного вызова

BOOL CALLBACK EnumResTypeProc(HMODULE,LPTSTR,LONG_PTR);

int main()

{

//Подготавливаем модуль, ресурсы которого будем перечислять

char path[] = "C:\\WINDOWS\\system32\\calc.exe";

HMODULE hcalc;

hcalc = LoadLibrary(path);

//Запускаем перечисление типов ресурсов

EnumResourceTypes(hcalc,EnumResTypeProc,0);

getchar();

return 0;

}

//Сама процедура обратного вызова

BOOL CALLBACK EnumResTypeProc(HMODULE hModule, LPTSTR lpszType, LONG_PTR lParam){

if(IS_INTRESOURCE(lpszType))

printf("%X\n",lpszType);

else

printf("%s\n",lpszType);

return TRUE;

}


Перечисление типов ресурсов 2

Данный пример аналогичен примеру, но с одним отличием: вместо функции EnumResourceTypes мы используем функцию EnumResourceTypesEx.

#include <windows.h>

#define RESOURCE_ENUM_LN 0x0001

//Прототип функции EnumResourceTypesEx

typedef __stdcall BOOL (*ENUMRESOURCETYPESEX)(HMODULE,ENUMRESTYPEPROC,LONG_PTR,DWORD,LANGID);

ENUMRESOURCETYPESEX lpfERT;

//Прототип процедуры обратного вызова

BOOL CALLBACK EnumResTypeProc(HMODULE,LPTSTR,LONG_PTR);

int main()

{

//Подготавливаем модуль, ресурсы которого будем перечислять

char path[] = "C:\\WINDOWS\\system32\\calc.exe";

HMODULE hcalc;

hcalc = LoadLibrary(path);

//Находим адрес функции EnumResourceTypesEx

HMODULE hkernel;

hkernel = GetModuleHandle("kernel32.dll");

lpfERT = (ENUMRESOURCETYPESEX)GetProcAddress(hkernel,"EnumResourceTypesExA");

//Запускаем перечисление типов ресурсов

if(lpfERT)

lpfERT(hcalc,EnumResTypeProc,0,RESOURCE_ENUM_LN,MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL));

getchar();

return 0;

}

//Сама процедура обратного вызова

BOOL CALLBACK EnumResTypeProc(HMODULE hModule, LPTSTR lpszType, LONG_PTR lParam){

if(IS_INTRESOURCE(lpszType))

printf("%X\n",lpszType);

else

printf("%s\n",lpszType);

return TRUE;

}


Перечисление языков ресурсов

Демонстрирует перечисление языков ресурсов с помощью функции EnumResourceLanguages. В данном примере мы перечисляем языки ресурсов стандартного калькулятора Windows.

#include <windows.h>

//Прототип процедуры обратного вызова

BOOL CALLBACK EnumResLangProc(HMODULE,LPCTSTR,LPCTSTR,WORD,LONG_PTR);

int main()

{

//Подготавливаем модуль ресурсы которого будем перечислять

char path[] = "C:\\WINDOWS\\system32\\calc.exe";

HMODULE hcalc;

hcalc = LoadLibrary(path);

//Запускаем перечисление типов ресурсов

EnumResourceLanguages(hcalc,RT_ICON,MAKEINTRESOURCE(1),EnumResLangProc,0);

getchar();

return 0;

}

//Сама процедура обратного вызова

BOOL CALLBACK EnumResLangProc(HMODULE hModule, LPCTSTR lpszType, LPCTSTR lpszName, WORD wIDLanguage, LONG_PTR lParam){

printf("%X\n",wIDLanguage);

return TRUE;

}


Перечисление языков ресурсов 2

Данный пример аналогичен примеру, но с одним отличием: вместо функции EnumResourceLanguages мы используем функцию EnumResourceLanguagesEx.

#include <windows.h>

#define RESOURCE_ENUM_LN 0x0001

//Прототип функции EnumResourceLanguagesEx

typedef __stdcall BOOL (*ENUMRESOURCELANGUAGESEX)(HMODULE,LPCTSTR,LPCTSTR,ENUMRESLANGPROC,LONG_PTR,DWORD,LANGID);

ENUMRESOURCELANGUAGESEX lpfERL;

//Прототип процедуры обратного вызова

BOOL CALLBACK EnumResLangProc(HMODULE,LPCTSTR,LPCTSTR,WORD,LONG_PTR);

int main()

{

//Подготавливаем модуль ресурсы которого будем перечислять

char path[] = "C:\\WINDOWS\\system32\\calc.exe";

HMODULE hcalc;

hcalc = LoadLibrary(path);

//Ищем адрес функции EnumResourceLanguagesEx

HMODULE hkernel;

hkernel = GetModuleHandle("kernel32.dll");

lpfERL = (ENUMRESOURCELANGUAGESEX)GetProcAddress(hkernel,"EnumResourceLanguagesExA");

//Запускаем перечисление типов ресурсов

if(lpfERL)

lpfERL(hcalc,RT_ICON,MAKEINTRESOURCE(1),EnumResLangProc,0,RESOURCE_ENUM_LN,MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL));

getchar();

return 0;

}

//Сама процедура обратного вызова

BOOL CALLBACK EnumResLangProc(HMODULE hModule, LPCTSTR lpszType, LPCTSTR lpszName, WORD wIDLanguage, LONG_PTR lParam){

printf("%X\n",wIDLanguage);

return TRUE;

}


Перечисление языков

Демонстрирует перечисление языков пользовательского интерфейса с помощью функции EnumUILanguages.

#include <windows.h>

//Объявление типа функции обратного вызова

typedef BOOL CALLBACK (*UILANGUANGE_ENUMPROC)(LPTSTR,LONG_PTR);

//Прототип функции EnumUILanguages

typedef BOOL (*ENUMUILANGUAGES)(UILANGUANGE_ENUMPROC,DWORD,LONG_PTR);

ENUMUILANGUAGES lpfEUIL;

//Прототип процедуры обратного вызова

BOOL __stdcall CALLBACK EnumUILanguagesProc(LPTSTR,LONG_PTR);

int main()

{

//Находим адрес функции EnumUILanguages

HMODULE hkernel;

hkernel = GetModuleHandle("kernel32.dll");

lpfEUIL = (ENUMUILANGUAGES)GetProcAddress(hkernel,"EnumUILanguagesA");

//Запускаем перечисление языков

if(lpfEUIL)

lpfEUIL(EnumUILanguagesProc,0,0);

getchar();

return 0;

}

//Сама процедура обратного вызова

BOOL CALLBACK EnumUILanguagesProc(LPTSTR lpszLanguage, LONG_PTR lParam){

printf("%s\n",lpszLanguage);

return TRUE;

}

К сожалению, данный пример выводит информацию только об одном языке. Ответа на вопрос почему, я так и не нашел.


Прозрачность окна

Данный пример демонстрирует пример использования функции SetLayeredWindowAttributes. В нём создаётся диалоговое окно, прозрачность которого плавно изменяется от 255 (полностью непрозрачно) до 0 (полностью прозрачно) и обратно.

#define _WIN32_WINNT 0x0500

#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)

{

static int idTimer = 1;

static int step = 15;

static unsigned char bAlpha = 255;

switch(uMsg){

case WM_INITDIALOG:

//Устанавливаем стиль WS_EX_LAYERED

SetWindowLong(hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED);

//Устанавливаем таймер

SetTimer(hwnd,idTimer,1000,NULL);

break;

case WM_TIMER:

//При необходимости меняем знак шага изменения прозрачности окна

if((!bAlpha)||(bAlpha==255))

step *= (-1);

//Изменяем значение прозрачности

bAlpha += step;

SetLayeredWindowAttributes(hwnd,0,bAlpha,LWA_ALPHA);

break;

case WM_CLOSE:

//Уничтожаем таймер

KillTimer(hwnd,idTimer);

//Закрываем окно

EndDialog(hwnd,0);

}

return 0;

}


Редактирование ресурсов

Данный пример демонстрирует редактирование ресурсов с помощью функций BeginUpdateResource, UpdateResource и EndUpdateResource. В данном примере мы изменяем иконку стандартного калькулятора Windows. Точнее говоря, мы добавляем ему в ресурсы новую иконку.

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Подготавливаем имеющийся у нас ресурс иконки

HRSRC hres;

hres = FindResource(NULL,MAKEINTRESOURCE(1),RT_ICON);

HGLOBAL hMem;

hMem = LoadResource(NULL,hres);

BYTE *lpres;

lpres = LockResource(hMem);

//Открываем файл калькулятора для последующего редактирования ресурсов

HANDLE hUpdate;

hUpdate = BeginUpdateResource("calc.exe",FALSE);

//Изменяем ресурс (добавляем туда нашу иконку)

UpdateResource(hUpdate,RT_ICON,MAKEINTRESOURCE(8),MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL),lpres,SizeofResource(NULL,hres));

//Записываем изменения

EndUpdateResource(hUpdate,FALSE);

return 0;

}

Файл ресурсов.

0x100 ICON "MyIcon.ico"


Рисование дуг

Демонстрация рисования дуг средствами Windows API. В данном примере создается простое окно, на поверхности которого рисуется три дуги. Каждая дуга рисуется своей функцией (AngleArc, Arc и ArcTo).

Вся работа осуществляется при получении сообщений WM_CREATE и WM_PAINT. При получении первого сообщения с помощью функции CreatePen создается перо зеленого цвета шириной 2 логические единицы. Этим пером мы и будем рисовать дуги. Данное перо уничтожается функцией DeleteObject при получении сообщения WM_CLOSE.

При получении сообщения WM_PAINT делается следующее.

· С помощью функции BeginPaint получается контекст устройства окна.
· Устанавливается созданное ранее перо (SelectObject). Старое перо сохраняется в переменной oldpen.
· Сохраняется текущее направление рисования дуг (GetArcDirection). Оно сохраняется в переменной ArcDirection. В принципе вызывать функцию GetArcDirection было необязательно. Я вызываю ее лишь для демонстрации работы этой функции.
· Устанавливается направление рисование дуг по часовой стрелке (SetArcDirection).
· Рисуется первая дуга (MoveToEx и AngleArc).
· Рисуется вторая дуга (Arc).
· Рисуется третья дуга (MoveToEx и ArcTo).
· Восстанавливается исходное направление рисования дуг (SetArcDirection).
· Восстанавливается исходное перо (SelectObject).
· Освобождается описатель контекста устройства окна (EndPaint).

Вызовы функции MoveToEx нужны для установления точек, от которых рисуются отрезки в функциях AngleArc и ArcTo.

Над каждой дугой выводится надпись с названием функции, посредством которой эта дуга нарисована. Надписи выводятся через дочерние окна класса "Static". Они создаются сразу после создания главного окна приложения с помощью функции CreateWindowEx.

Ниже приводится полный исходный текст разработанной программы.

#include <windows.h>

//Радиус дуг

#define RADIUS 100

/***************************/

/*****Оконная процедура*****/

/***************************/

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

//Контекст устройства окна

HDC hdc = NULL;

//Используется при рисовании

PAINTSTRUCT ps;

//Направление и текущее положение

int ArcDirection;

POINT p;

//Перья

static HPEN hpen;

HPEN oldpen;

switch(uMsg){

case WM_CREATE:

//Создаем свое перо

hpen = CreatePen(PS_SOLID, 2, RGB(0, 0xFF, 0));

break;

case WM_PAINT:

//Получаем контекст устройства окна

hdc = BeginPaint(hwnd, &ps);

//Устанавливаем наше перо

oldpen = SelectObject(hdc, hpen);

//Меняем направление рисования дуг

ArcDirection = GetArcDirection(hdc);

SetArcDirection(hdc, AD_CLOCKWISE);

p.x = RADIUS - 40;

p.y = RADIUS + 40;

//Первая дуга

MoveToEx(hdc, p.x, p.y, NULL);

AngleArc(hdc, p.x, p.y, RADIUS, 30, 90);

//Вторая дуга

p.x += 2*RADIUS;

Arc(hdc, p.x - RADIUS , p.y - RADIUS,

p.x + RADIUS , p.y + RADIUS,

p.x - RADIUS + 10, p.y - RADIUS + 10,

p.x + RADIUS - 10, p.y - RADIUS + 10);

//Третья дуга

p.x += 2*RADIUS;

MoveToEx(hdc, p.x, p.y, NULL);

ArcTo(hdc, p.x - RADIUS , p.y - RADIUS,

p.x + RADIUS , p.y + RADIUS,

p.x - RADIUS + 10, p.y - RADIUS + 10,

p.x + RADIUS - 10, p.y - RADIUS + 10);

//Восстанавливаем направление и перо

SetArcDirection(hdc, ArcDirection);

SelectObject(hdc, oldpen);

//Освобождаем ресурсы

EndPaint(hwnd, &ps);

break;

case WM_CLOSE:

//Удаляем перо

DeleteObject(hpen);

DestroyWindow(hwnd);

break;

case WM_DESTROY:

PostQuitMessage(0);

break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg){

return 0;

}

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = 0;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hThisInstance;

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,

300, 250, 550, 200, NULL, 0, hThisInstance, 0);

//Создаем надписи над дугами

CreateWindowEx(0, "STATIC", "AngleArc", WS_VISIBLE|WS_CHILD,

40, 10, 60, 20, hwnd, 0, hThisInstance, 0);

CreateWindowEx(0, "STATIC", "Arc", WS_VISIBLE|WS_CHILD,

250, 10, 40, 20, hwnd, 0, hThisInstance, 0);

CreateWindowEx(0, "STATIC", "ArcTo", WS_VISIBLE|WS_CHILD,

460, 10, 40, 20, hwnd, 0, hThisInstance, 0);

//Цикл обработки сообщений

MSG msg;

while(GetMessage(&msg,NULL,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hThisInstance);

return 0;

}

Ниже приводится изображение главного окна приложения.


Рисование кривых Безье

Демонстрация рисования кривых Безье средствами Windows Api. В данном примере создается простое окно, на поверхности которого рисуется три кривых Безье. Они рисуются с помощью трех функций PolyBezier, PolyBezierTo и PolyDraw.

Координаты точек хранятся в глобальных массивах points1, points2 и points3. Глобальный массив types хранит типы точек для функции PolyDraw.

При получении сообщения WM_CREATE с помощью функции CreatePen создается перо, которым и будут рисоваться кривые. Оно уничтожается функцией DeleteObject при получении собщения WM_CLOSE.

Вся основная работа выполняется при получении сообщения WM_PAINT. Если конкретно, то делается следующее.

· Получается контекст устройства окна (BeginPaint).
· В этом контексте выбирается созданное ранее перо (SelectObject). Прежнее перо сохраняется в переменной oldpen.
· Рисуется первая кривая (PolyBezier).
· Рисуется вторая кривая (MoveToEx и PolyBezierTo).
· Рисуется третья кривая (PolyDraw).
· Восстанавливается исходное перо (SelectObject).
· Освобождается контекст устройства окна (EndPaint).

Функция MoveToEx используется для изменения текущего положения перед использованием функции PolyBezierTo. Она устанавливает текущее положение в точку, задаваемую первым элементом соответствующего массива точек. Последующие три элемента массива задают опорные и конечные точки кривой.

Перед функцией PolyDraw функция MoveToEx не используется, так как мы меняем текущее положение в самой функции PolyDraw первым элементом массива points3.

Ниже приводится полный исходный текст разработанного примера.

#include <windows.h>

//Точки первой кривой

const POINT points1[4] = {{10 , 50}, {50 , 20}, {70 , 100}, {110, 50}};

//Точки второй кривой

const POINT points2[4] = {{180, 50}, {220, 20}, {240, 100}, {280, 50}};

//Точки третьей кривой

const POINT points3[4] = {{350, 50}, {390, 20}, {410, 100}, {450, 50}};

//Типы точек третьей кривой

const BYTE types[4] = {PT_MOVETO, PT_BEZIERTO, PT_BEZIERTO, PT_BEZIERTO};

/***************************/

/*****Оконная процедура*****/

/***************************/

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

//Контекст устройства окна

HDC hdc = NULL;

//Используется при рисовании

PAINTSTRUCT ps;

//Перья

static HPEN hpen;

HPEN oldpen;

switch(uMsg){

case WM_CREATE:

//Создаем свое перо

hpen = CreatePen(PS_SOLID, 2, RGB(0, 0xFF, 0));

break;

case WM_PAINT:

//Получаем контекст устройства окна

hdc = BeginPaint(hwnd, &ps);

//Устанавливаем наше перо

oldpen = SelectObject(hdc, hpen);

//Рисуем первую кривую

PolyBezier(hdc, points1, 4);

//Рисуем вторую кривую

MoveToEx(hdc,points2[0].x, points2[0].y, NULL);

PolyBezierTo(hdc, &(points2[1]), 3);

//Рисуем третью кривую

PolyDraw(hdc, points3, types, 4);

//Восстанавливаем перо

SelectObject(hdc, oldpen);

//Освобождаем ресурсы

EndPaint(hwnd, &ps);

break;

case WM_CLOSE:

//Удаляем перо

DeleteObject(hpen);

DestroyWindow(hwnd);

break;

case WM_DESTROY:

PostQuitMessage(0);

break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg){

return 0;

}

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = 0;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hThisInstance;

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,

300, 250, 480, 150, NULL, 0, hThisInstance, 0);

//Создаем надписи над кривыми

CreateWindowEx(0, "STATIC", "PolyBezier", WS_VISIBLE|WS_CHILD,

10, 10, 80, 20, hwnd, 0, hThisInstance, 0);

CreateWindowEx(0, "STATIC", "PolyBezierTo", WS_VISIBLE|WS_CHILD,

180, 10, 100, 20, hwnd, 0, hThisInstance, 0);

CreateWindowEx(0, "STATIC", "PolyDraw", WS_VISIBLE|WS_CHILD,

350, 10, 100, 20, hwnd, 0, hThisInstance, 0);

//Цикл обработки сообщений

MSG msg;

while(GetMessage(&msg,NULL,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hThisInstance);

return 0;

}

Ниже приводится внешний вид главного окна разработанного примера.


Рисование линии

Данный пример демонстрирует рисование линии с помощью функций MoveToEx и LineTo. В нем мы создаем простое окно, на поверхности которого рисуется прямая линия зеленого цвета.

Вся основная работа выполняется при обработке сообщений WM_CREATE и WM_PAINT.

При получении сообщения WM_DESTROY с помощью функции CreatePen создается перо зеленого цвета шириной 5 логических единиц. Описатель этого пера сохраняется в статической переменной hpen.

При получении сообщения WM_PAINT выполняется вся основная работа. А именно, делается следующее.

· Вызывается функция BeginPaint для получения контекста устройства окна.
· С помощью функции SelectObject созданное ранее перо выбирается в контексте устройства окна. При этом прежнее перо сохраняется в переменной oldpen.
· Вызывается функция MoveToEx для установки точки, от которой будем рисовать линию.
· С помощью функции LineTo рисуется линия.
· Вызывается функция SelectObject для восстановления пера oldpen.
· С помощью функции EndPaint освобождается контекст устройства окна.

Созданное перо уничтожается функцией DeleteObject при получении сообщения WM_DESTROY.

Ниже приводится полный исходный текст разработанного примера.

#include <windows.h>

/***************************/

/*****Оконная процедура*****/

/***************************/

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

//Контекст устройства окна

HDC hdc = NULL;

//Используется при рисовании

PAINTSTRUCT ps;

//Описатели перьев

static HPEN hpen; //наше перо

HPEN oldpen; //старое перо

switch(uMsg){

case WM_CREATE:

//Создаем перо

hpen = CreatePen(PS_SOLID, 5, RGB(0x00, 0xFF, 0x00));

break;

case WM_PAINT:

//Получаем контекст устройства окна

hdc = BeginPaint(hwnd, &ps);

//Устанавливаем перо в контексте окна

oldpen = SelectObject(hdc, hpen);

//Перемещаемся

MoveToEx(hdc, 10, 40, NULL);

//Рисуем линию

LineTo(hdc, 110, 40);

//Восстанавливаем прежнее перо

SelectObject(hdc, oldpen);

EndPaint(hwnd, &ps);

break;

case WM_CLOSE:

//Удаляем перо

DeleteObject(hpen);

DestroyWindow(hwnd);

break;

case WM_DESTROY:

PostQuitMessage(0);

break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg){

return 0;

}

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = 0;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hThisInstance;

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|WS_BORDER,

400, 300, 100, 100, NULL, 0, hThisInstance, 0);

//Цикл обработки сообщений

MSG msg;

while(GetMessage(&msg,NULL,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hThisInstance);

return 0;

}

Ниже приводится главное окно разработанного приложения.


Рисование ломаных линий

Демонстрация рисования ломаных линий и закрашивания образованных ими фигур. В данном примере создается небольшое окно, на поверхности которого риуются 4 ломаных линий. Они рисуются с помощью трех функций: Polyline, PolylineTo и PolyPolyline (рисует две ломаные). Все ломаные линии образуют фигуры: три прямоугольника и один треугольник.

Первые две фигуры (два прямоугольника) закрашиваются с использованием функций FloodFill и ExtFloodFill. Для каждой из них создается своя кисть: CreateSolidBrush и GetSysColorBrush.

Последние две фигуры (прямоугольник и треугольник), рисуемые фукцией PolyPolyline не закрашиваются.

Координаты точек ломаных линий хранятся в трех глобальных массивах points1, points2 и points3. Массив polylines задает отдельные ломаные линии для функции PolyPolyline.

Вся основная работа выполняется при получении сообщений WM_CREATE и WM_PAINT. При получении первого делается следующее.

· Создается перо (CreatePen), которым будут рисоваться линии.
· Создаются две кисти (CreateSolidBrush и GetSysColorBrush). Они будут использоваться для закрашивания фигур.

Все объекты, созданные при обработке собщения WM_CREATE будут уничтожены функцией DeleteObject при получении сообщения WM_CLOSE.

При получении сообщения WM_PAINT делается следующее.

· Получается описатель контекста устройства окна (BeginPaint).
· В данном контексте выбирается наше перо (SelectObject). Прежнее перо сохраняется в переменной oldpen.
· Выбирается первая кисть (SelectObject). Исходная кисть сохраняется в переменной oldbrush.
· Рисуется первая ломаная (Polyline), образующая прямоугольник.
· Образованный прямоугольник закрашивается выбранной кистью (FloodFill).
· В контексте устройства выбирается вторая кисть (SelectObject).
· Изменяется текущее положение (MoveToEx). Вторая ломаная будет строиться от него.
· Рисуется вторая ломаная линия (PolylineTo), образующая второй прямоугольник.
· Образованный прямоугольник закрашивается выбранной (второй) кистью (ExtFloodFill).
· Восстанавливается исходная кисть (SelectObject).
· Рисуется третья и четвертая ломаные линии (PolyPolyline), образующие прямоугольник и треугольник.
· Восстанавливается исходное перо (SelectObject).
· Освобождается описатель контекста устройства окна (EndPaint).

Над всеми ломаными выводится строка с названием функции, с помощью они построены. Строки выводятся посредством дочерних окон класса "Static". Эти окна создаются с помощью функции CreateWindowEx сразу после создания главного окна приложения.

Ниже приводится полный исходный текст разработанного примера.

#include <windows.h>

//Точки первой ломаной

const POINT points1[5] = {{10 , 50}, {100, 50}, {100, 100}, {10 , 100}, {10, 50}};

//Точки второй ломаной

const POINT points2[5] = {{180, 50}, {270, 50}, {270, 100}, {180, 100}, {180, 50}};

//Точки третьей и четвертой ломаных

const POINT points3[9] = {{350, 50}, {440, 50}, {440, 100}, {350, 100}, {350, 50},

{350, 180}, {395, 130}, {440, 180}, {350, 180}};

//Ломаные для функции PolyPolyline

const DWORD polylines[2] = {5, 4};

/***************************/

/*****Оконная процедура*****/

/***************************/

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

//Контекст устройства окна

HDC hdc = NULL;

//Используется при рисовании

PAINTSTRUCT ps;

//Перья

static HPEN hpen;

HPEN oldpen;

//Кисти

static HBRUSH hbrush1;

static HBRUSH hbrush2;

HBRUSH oldbrush;

switch(uMsg){

case WM_CREATE:

//Создаем свое перо

hpen = CreatePen(PS_SOLID, 2, RGB(0, 0xFF, 0));

//Создаем свои кисти

hbrush1 = CreateSolidBrush(RGB(0xFF, 0, 0));

hbrush2 = GetSysColorBrush(COLOR_WINDOWFRAME);

break;

case WM_PAINT:

//Получаем контекст устройства окна

hdc = BeginPaint(hwnd, &ps);

//Устанавливаем наше перо

oldpen = SelectObject(hdc, hpen);

//Устанавливаем кисть для первой фигуры

oldbrush = SelectObject(hdc, hbrush1);

//Рисуем первую ломаную и заполняем образованную фигуру

Polyline(hdc, points1, 5);

FloodFill(hdc, points1[0].x+10, points1[0].y+10, RGB(0, 0xFF, 0));

//Устанавиваем кисть для второй фигуры

SelectObject(hdc, hbrush2);

//Рисуем вторую ломаную и заполняем образованную фигуру

MoveToEx(hdc, points2[0].x, points2[0].y, NULL);

PolylineTo(hdc, &(points2[1]), 4);

ExtFloodFill(hdc, points2[0].x+1, points2[0].y+1, RGB(0, 0xFF, 0), FLOODFILLBORDER);

//Восстаналиваем исходную кисть

SelectObject(hdc, oldbrush);

//Рисуем третью и четвертую ломаные

PolyPolyline(hdc, points3, polylines, 2);

//Восстанавливаем перо

SelectObject(hdc, oldpen);

//Освобождаем ресурсы

EndPaint(hwnd, &ps);

break;

case WM_CLOSE:

//Удаляем перо

DeleteObject(hpen);

//Удаляем кисти

DeleteObject(hbrush1);

DeleteObject(hbrush2);

DestroyWindow(hwnd);

break;

case WM_DESTROY:

PostQuitMessage(0);

break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg){

return 0;

}

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = 0;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hThisInstance;

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,

300, 250, 480, 230, NULL, 0, hThisInstance, 0);

//Создаем надписи над ломаными

CreateWindowEx(0, "STATIC", "Polyline", WS_VISIBLE|WS_CHILD,

10, 10, 80, 20, hwnd, 0, hThisInstance, 0);

CreateWindowEx(0, "STATIC", "PolylineTo", WS_VISIBLE|WS_CHILD,

180, 10, 100, 20, hwnd, 0, hThisInstance, 0);

CreateWindowEx(0, "STATIC", "PolyPolyline", WS_VISIBLE|WS_CHILD,

350, 10, 100, 20, hwnd, 0, hThisInstance, 0);

//Цикл обработки сообщений

MSG msg;

while(GetMessage(&msg,NULL,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hThisInstance);

return 0;

}

Ниже приводится изображение главного окна разработанного приложения.


Рисование многоугольников

Демонстрация рисования многоугольников. В данном примере создается простое окно, на поверхности которого рисуется несколько многоугольников. Для их рисования используются функции Polygon и PolyPolygon. Причем вторая из них рисует два многоугольника: прямоугольник и треугольник.

Вершины многоугольников задаются в глобальных массивах: points1 (вершины первого многоугольника, рисуемого функцией Polygon) и points2 (вершины второго и третьего многоугольников, рисуемых функцией PolyPolygon). Глобальный масив polygons задает многоугольники, рисуемые функцией PolyPolygon.

Вся основная работа выполняется при обработке сообщений WM_CREATE и WM_PAINT. При получении первого делается следующее.

· Создается перо зеленого цвета (CreatePen). Этим пером будут рисоваться границы многоугольников.
· Создается кисть красного цвета (CreateSolidBrush). Этой кистью будут закрашиваться внутренние области многоугольников.

Созданные перо и кисть будут удалены функцией DeleteObject при получении собщения WM_CLOSE.

При получении сообщения WM_PAINT делается следующее.

· Получается контекст устройства окна (BeginPaint).
· В нем выбирается наше перо (SelectObject). При этом исходное перо сохраняется в переменной oldpen.
· В контексте устройства выбирается наша кисть (SelectObject). Исходная кисть сохраняется в переменной oldbrush.
· Запрашивается текущий режим закрашивания многоугольников (GetPolyFillMode). Он сохраняется в переменной oldMode.
· Устанавливается новый режим закрашивания многоугольников (SetPolyFillMode).
· Рисуется первый многоугольник (Polygon).
· Рисуется второй и третий многоугольники (PolyPolygon).
· Восстанавливается исходная кисть (SelectObject).
· Восстанавливается исходное перо (SelectObject).
· Восстанавливается исходный режим закрашивания многоугольников (SetPolyFillMode).
· Освобождается контекст устройства окна (EndPaint).

Над каждым рисуемым многоугольником выводится строка с наименованием функции, с помощью которой он был нарисован. данные строки выводятся с помощью дочерних окон класса "Static". они создаются функцией CreateWindowEx сразу после создания главного окна приложения.

Ниже приводится полный исходный текст разработанного примера.

#include <windows.h>

//Точки первого многоугольника

const POINT points1[4] = {{10 , 50}, {100, 50}, {100, 100}, {10 , 100}};

//Точки второго и третьего многоугольников

const POINT points2[7] = {{180, 50}, {270, 50}, {270, 100}, {180, 100},

{180, 180}, {225, 130}, {270, 180}};

//Многоугольники для функции PolyPolygon

const int polygons[2] = {4, 3};

/***************************/

/*****Оконная процедура*****/

/***************************/

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

//Контекст устройства окна

HDC hdc = NULL;

//Используется при рисовании

PAINTSTRUCT ps;

//Перья

static HPEN hpen;

HPEN oldpen;

//Кисти

static HBRUSH hbrush1;

HBRUSH oldbrush;

//Режии закрашивания

int oldMode;

switch(uMsg){

case WM_CREATE:

//Создаем свое перо

hpen = CreatePen(PS_SOLID, 2, RGB(0, 0xFF, 0));

//Создаем свои кисти

hbrush1 = CreateSolidBrush(RGB(0xFF, 0, 0));

break;

case WM_PAINT:

//Получаем контекст устройства окна

hdc = BeginPaint(hwnd, &ps);

//Устанавливаем наше перо

oldpen = SelectObject(hdc, hpen);

//Устанавливаем кисть для первой фигуры

oldbrush = SelectObject(hdc, hbrush1);

//Устанавливаем режим закрашивания многоугольников

oldMode = GetPolyFillMode(hdc);

SetPolyFillMode(hdc, ALTERNATE);

//Рисуем первый многоугольник

Polygon(hdc, points1, 4);

//Рисуем второй многоугольник

PolyPolygon(hdc, points2, polygons, 2);

//Восстаналиваем исходную кисть

SelectObject(hdc, oldbrush);

//Восстанавливаем перо

SelectObject(hdc, oldpen);

//Восстанавливаем режим закрашивания

SetPolyFillMode(hdc, oldMode);

//Освобождаем ресурсы

EndPaint(hwnd, &ps);

break;

case WM_CLOSE:

//Удаляем перо

DeleteObject(hpen);

//Удаляем кисть

DeleteObject(hbrush1);

DestroyWindow(hwnd);

break;

case WM_DESTROY:

PostQuitMessage(0);

break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg){

return 0;

}

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = 0;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hThisInstance;

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,

300, 250, 300, 230, NULL, 0, hThisInstance, 0);

//Создаем надписи над дугами

CreateWindowEx(0, "STATIC", "Polygon", WS_VISIBLE|WS_CHILD,

10, 10, 80, 20, hwnd, 0, hThisInstance, 0);

CreateWindowEx(0, "STATIC", "PolyPolygon", WS_VISIBLE|WS_CHILD,

180, 10, 100, 20, hwnd, 0, hThisInstance, 0);

//Цикл обработки сообщений

MSG msg;

while(GetMessage(&msg,NULL,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hThisInstance);

return 0;

}

На рисунке ниже показано главное окно разработанного приложения.


Рисование прямоугольников

Демонстрация рисования прямоугольников средствами Windows API. В данном примере создается простое окно, на поверхности которого рисуется шесть прямоугольников. Для их рисования используются функции: FillRect, FrameRect, InvertRect, Rectangle, RoundRect и PatBlt.

Вся основная работа выполняется при обработке сообщений WM_CREATE и WM_PAINT.

При получении первого сообщения делается следующее.

· Создается перо зеленого цвета (CreatePen). Оно используется для отрисовки границ прямоугольников в функциях Rectangle и RoundRect.
· Из ресурсов загружает изображение (LoadBitmap). На основе него будет создаваться кисть.
· На основе загруженного рисунка создается кисть (CreatePatternBrush). Эта кисть будет использоваться при рисовании прямоугольника функцией FillRect.
· Загруженное изобаржение удаляется (DeleteObject). Оно нам больше не нужно.
· Создается вторая кисть (CreateSolidBrush) красного цвета. Она будет использоваться при рисовании прямоугольника функцией FrameRect.

Созданные перо и кисти будут удалены функцией DeleteObject при получении сообщения WM_CLOSE.

При получении сообщения WM_PAINT делается следующее.

· Получается контекст устройства окна (BeginPaint).
· В этом контексте выбирается наше перо (SelectObject). При этом исходное перо сохраняется в переменной oldpen.
· Рисуется первый прямоугольник (FillRect).
· Рисуется второй прямоугольник (FrameRect).
· Рисуется третий прямоугольник (InvertRect).
· Рисуется четвертый прямоугольник (Rectangle).
· Рисуется пятый прямоугольник (RoundRect).
· Рисуется шестой прямоугольник (PatBlt).
· Восстанавливается исходное перо (SelectObject).
· Освобождается контекст устройства окна (EndPaint).

Дополнительно над каждым рисуемым прямоугольником отображается строка с функцией, посредством которо данный прямоугольник был нрисован. Данные строки выводятся с помощью дочерних окон класса "Static". Эти окна создаются функцией CreateWindowEx в основной процедуре программы сразу после создания главного окна приложения.

Ниже приводится полный исходный текст разработанного приложения.

#include <windows.h>

#include "Constants.h"

/***************************/

/*****Оконная процедура*****/

/***************************/

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

//Контекст устройства окна

HDC hdc = NULL;

//Используется при рисовании

PAINTSTRUCT ps;

//Перья

static HPEN hpen;

HPEN oldpen;

//Растровое изображение

HBITMAP hbitmap;

//Кисти

static HBRUSH patternbrush;

static HBRUSH solidbrush;

//Координаты вершин прямоугольника

RECT rc;

switch(uMsg){

case WM_CREATE:

//Создаем свое перо

hpen = CreatePen(PS_SOLID, 2, RGB(0, 0xFF, 0));

//Содаем кисть на основе рисунка

hbitmap = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(ID_BITMAP));

patternbrush = CreatePatternBrush(hbitmap);

DeleteObject(hbitmap);

//Создаем простую кисть красного цвета

solidbrush = CreateSolidBrush(RGB(0xFF, 0, 0));

break;

case WM_PAINT:

//Получаем контекст устройства окна

hdc = BeginPaint(hwnd, &ps);

//Устанавливаем наше перо

oldpen = SelectObject(hdc, hpen);

//Первый прямоугольник

rc.top = 30;

rc.left = 30;

rc.bottom = 130;

rc.right = 130;

FillRect(hdc, &rc, patternbrush);

//Второй прямоугольник

rc.left += 150;

rc.right += 150;

FrameRect(hdc, &rc, solidbrush);

//Третий прямоугольник

rc.left += 150;

rc.right += 150;

InvertRect(hdc, &rc);

//Четвертый прямоугольник

rc.top = 180;

rc.left = 30;

rc.bottom = 280;

rc.right = 130;

Rectangle(hdc, rc.left, rc.top, rc.right, rc.bottom);

//Пятый прямоугольник

rc.left += 150;

rc.right += 150;

RoundRect(hdc, rc.left, rc.top, rc.right, rc.bottom, 30, 30);

//Шестой прямоугольник

rc.left += 150;

rc.right += 150;

PatBlt(hdc, rc.left, rc.top,

rc.right - rc.left, rc.bottom - rc.top,

PATINVERT);

//Восстанавливаем перо

SelectObject(hdc, oldpen);

//Освобождаем ресурсы

EndPaint(hwnd, &ps);

break;

case WM_CLOSE:

//Удаляем перо

DeleteObject(hpen);

//Удаляем кисти

DeleteObject(patternbrush);

DeleteObject(solidbrush);

DestroyWindow(hwnd);

break;

case WM_DESTROY:

PostQuitMessage(0);

break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg){

return 0;

}

/*****************************/

/*Главная процедура программы*/

/*****************************/

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = 0;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hThisInstance;

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,

300, 250, 450, 320, NULL, 0, hThisInstance, 0);

//Создаем надписи над прямоугольниками

CreateWindowEx(0, "STATIC", "FillRect", WS_VISIBLE|WS_CHILD,

50, 10, 80, 20, hwnd, 0, hThisInstance, 0);

CreateWindowEx(0, "STATIC", "FrameRect", WS_VISIBLE|WS_CHILD,

190, 10, 100, 20, hwnd, 0, hThisInstance, 0);

CreateWindowEx(0, "STATIC", "InvertRect", WS_VISIBLE|WS_CHILD,

350, 10, 100, 20, hwnd, 0, hThisInstance, 0);

CreateWindowEx(0, "STATIC", "Rectangle", WS_VISIBLE|WS_CHILD,

50, 150, 100, 20, hwnd, 0, hThisInstance, 0);

CreateWindowEx(0, "STATIC", "RoundRect", WS_VISIBLE|WS_CHILD,

190, 150, 100, 20, hwnd, 0, hThisInstance, 0);

CreateWindowEx(0, "STATIC", "PatBlt", WS_VISIBLE|WS_CHILD,

350, 150, 100, 20, hwnd, 0, hThisInstance, 0);

//Цикл обработки сообщений

MSG msg;

while(GetMessage(&msg,NULL,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hThisInstance);

return 0;

}

Ниже приводится содержимое файла ресурсов, в которых задается изображение, на основе коорого создается кисть.

#include "Constants.h"

ID_BITMAP BITMAP "Nature.bmp"

Ниже приводится содержимое заголовочного файла "Constants.h", в котором задется идентификатор ресурса.

#define ID_BITMAP 0x100

На рисунке ниже показано главное окно разработанного примера.


Рисование эллипса и его частей

Демонстрация рисования эллипса и его частей (сегмента и сектора). Данные фигуры рисуются с помощью трех функций: Chord, Ellipse и Pie. Первая фигура (сегмент) закрашивается штрихованной кистью. Вторая фигура (эллипс) - кистью, созданной на основе DIB. Третья (сектор) - стандартной кистью.

Вся основная работа выполняется при получении сообщений WM_CREATE и WM_PAINT. При получении сообщения WM_CREATE создается перо и две кисти.

Для создания пера используется функция CreatePen. При этом создается кисть зеленого цвета.

Для создания штрихованной кисти используется функция CreateHatchBrush. При этом линии штриховки имеют красный цвет.

Создание кисти на основе DIB сложнее. Вначале нужно оформить DIB в виде буфера, имеющего определенную структуру. В данном примере реализовано два способа оформления такого буфера: с использоваием функций работы с изображениями и с использованием функций работы с ресурсами. Эти способы оформлены в виде процедур GetDIB() и GetDIB2() соответствено.

Первая из них работает следующим образом.

· Создается временный контекст устройства (CreateCompatibleDC). Он будет использоваться для хранения изображения в формате DDB.
· Изображение загружается из ресурсов (LoadImage).
· Изображение ассоциируется с контекстом устройства (SelectObject).
· Получается информация об изображении (GetObject). Нас в первую очередь интересуют его размеры.
· Выделяется память под буфер, который будет содержать изображение в формате DIB. Размер буфера определяется как размер структуры BITMAPINFOHEADER плюс размер самого изображения из расчета 3 байта на пиксель.
· Подготавливается структура BITMAPINFOHEADER, лежащая в начале подготавливаемого буфера.
· В буфер загружаются пиксели изображения в формате DIB (GetDIBits).
· Удаляются исходное изображение (DeleteObject) и контекст устройства (DeleteDC).
· Функция возвращает буфер.

Вторая функция работает следующим образом.

· Находится ресурс, содержащий изображение (FindResourceEx).
· Найденный ресурс загружается в память (LoadResource).
· Получается указатель на загруженный ресурс (LockResource). Данный указатель и возвращается функцией.

Как видите второй способ значительно проще первого. Но он опирается на то, что изображения в ресурсах хранятся в нужном нам формате DIB.

Возвращенный функцией указатель на буфер передается в функцию CreateDIBPatternBrushPt, которая и создает кисть. Созданные при обработке сообщения WM_CREATE перо и две кисти уничтожаются фукцией DeleteObject при получении сообщения WM_CLOSE.

Рисование фигур осуществляется при обработке сообщения WM_PAINT. При его получении делается следующее.

· Получается контекст устройства окна (BeginPaint).
· В данном контексте устанавливается созданное ранее перо (SelectObject). Исходное перо сохраняется в переменной oldpen.
· В контексте выбирается кисть для первой фигуры (SelectObject). Это штрихованная кисть. Исходная кисть сохраняется в переменной oldbrush.
· Рисуется первая фигура (Chord). Это сегмент эллипса.
· В контексте выбирается кисть для второй фигуры (кисть на основе DIB). Выбор делается с помощью функции SelectObject.
· Сохраняются координаты точки начала кисти (GetBrushOrgEx).
· Устанавливаются новые координаты точки начала кисти (SetBrushOrgEx). Изменение положения начала кисти нужно для изменения положения рисунка внутри эллипса. В принципе функцию GetBrushOrgEx можно было и не использовать, но я вызываю ее в демонстрационных целях.
· Рисуется вторая фигура, эллипс (Ellipse).
· Восстанавливается исходное положение начала кисти (SetBrushOrgEx).
· Восстанавливается исходная кисть (SelectObject).
· Рисуется третья фигура, сектор (Pie).
· Восстанавливается исходное перо (SelectObject).
· Освобождается контекст устройства окна (EndPaint).

Над каждой рисуемой фигурой выводится строка с функцией, которая использовалась для построения этой фигуры. Данные строки выводятся посредством дочерних окон класса "Static". Они создаются в основной процедуре программы сразу после создания главного окна приложения.

Ниже приводится полный исходный текст разработанного примера.

#include <windows.h>

#include "Constants.h"

//Радиус эллипса

#define RADIUS 100

/********************************************/

/*Возвращает буфер изображения в формате DIB*/

/********************************************/

unsigned char* GetDIB(void)

{

//ВРеменный контекст устройства для хранения DIB

HDC hdc;

hdc = CreateCompatibleDC(NULL);

//Загружаем изображение из ресурсов

HBITMAP hbitmap;

hbitmap = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(ID_BITMAP), IMAGE_BITMAP, 0, 0, 0);

//Ассоциируем его с контекстом устройства

SelectObject(hdc, hbitmap);

//Получаем информацию о загруженном изображении

BITMAP bitmap;

GetObject(hbitmap, sizeof(BITMAP), &bitmap);

//Выделяем память под буфер с изображением в формате DIB

unsigned char *pbytes;

pbytes = (unsigned char*)malloc(sizeof(BITMAPINFOHEADER) + bitmap.bmWidth*bitmap.bmHeight*3);

//Подготавливаем структуру BITMAPINFOHEADER

BITMAPINFOHEADER *pinfo;

pinfo = (BITMAPINFOHEADER*)pbytes;

pinfo->biBitCount = 24;

pinfo->biCompression = BI_RGB;

pinfo->biPlanes = 1;

pinfo->biSize = sizeof(BITMAPINFOHEADER);

pinfo->biWidth = bitmap.bmWidth;

pinfo->biHeight = bitmap.bmHeight;

//ЧИтаем пиксели изображения в формате DIB

GetDIBits(hdc, hbitmap, 0, bitmap.bmHeight, (LPVOID)(pinfo+1), (BITMAPINFO*)pinfo, DIB_RGB_COLORS);

//Освобождаем ресурсы

DeleteObject(hbitmap);

DeleteDC(hdc);

return (unsigned char*)pinfo;

}

/********************************************/

/*Возвращает буфер изображения в формате DIB*/

/*************Второй способ******************/

/*******************************************/

unsigned char* GetDIB2(void)

{

//Описатель модуля, из которого загружаем ресурс

HMODULE hmodule;

hmodule = GetModuleHandle(NULL);

//Находим ресурс

HRSRC hResource;

hResource = FindResourceEx(hmodule, RT_BITMAP, MAKEINTRESOURCE(ID_BITMAP), MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL));

//Загружаем ресурс в память

HGLOBAL hMem;

hMem = LoadResource(hmodule, hResource);

//Получаем указатель на ресурс

unsigned char* lpResource;

lpResource = LockResource(hMem);

return lpResource;

}

/***************************/

/*****Оконная процедура*****/

/***************************/

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

//Контекст устройства окна

HDC hdc = NULL;

//Используется при рисовании

PAINTSTRUCT ps;

//Перья

static HPEN hpen;

HPEN oldpen;

//Кисти

static HBRUSH hhatchbrush; //штриховая

static HBRUSH hDIBbrush; //на основе DIB

HBRUSH oldbrush;

//Точки

POINT p; //Центр эллипса

POINT prev; //Начало кисти

//Буфер с изображением в формате DIB

unsigned char* pbytes;

switch(uMsg){

case WM_CREATE:

//Создаем свое перо

hpen = CreatePen(PS_SOLID, 2, RGB(0, 0xFF, 0));

//Создаем штрихованную кисть

hhatchbrush = CreateHatchBrush(HS_BDIAGONAL, RGB(0xFF, 0, 0));

//Создаем кисть на основе DIB

pbytes = GetDIB();

hDIBbrush = CreateDIBPatternBrushPt(pbytes, DIB_RGB_COLORS);

break;

case WM_PAINT:

//Получаем контекст устройства окна

hdc = BeginPaint(hwnd, &ps);

//Устанавливаем наше перо

oldpen = SelectObject(hdc, hpen);

//Устанавливаем штрихованную кисть

oldbrush = SelectObject(hdc, hhatchbrush);

//Задаем центр первого эллипса

p.x = RADIUS - 20;

p.y = RADIUS + 40;

//Рисуем сегмент эллипса

Chord(hdc, p.x - RADIUS , p.y - RADIUS,

p.x + RADIUS , p.y + RADIUS,

p.x + RADIUS - 10, p.y - RADIUS + 10,

p.x - RADIUS + 10, p.y - RADIUS + 10);

//Устанавливаем кисть на основе DIB

SelectObject(hdc, hDIBbrush);

//задаем центр второго эллипса

p.x += 2*RADIUS - 30;

//Сохраняем и устанавливаем начало кисти

GetBrushOrgEx(hdc, &prev);

SetBrushOrgEx(hdc, 30, 20, NULL);

//Рисуем эллипс

Ellipse(hdc, p.x - RADIUS , p.y - RADIUS,

p.x + RADIUS , p.y + RADIUS);

//Восстанавливаем начало кисти

SetBrushOrgEx(hdc, prev.x, prev.y, NULL);

//Восстанавливаем исходную кисть

SelectObject(hdc, oldbrush);

//Задаем центр третьего эллипса

p.x += 2*RADIUS - 30;

//Рисуем сектор эллипса

Pie(hdc, p.x - RADIUS , p.y - RADIUS,

p.x + RADIUS , p.y + RADIUS,

p.x + RADIUS - 10, p.y - RADIUS + 10,

p.x - RADIUS + 10, p.y - RADIUS + 10);

//Восстанавливаем перо

SelectObject(hdc, oldpen);

//Освобождаем ресурсы

EndPaint(hwnd, &ps);

break;

case WM_CLOSE:

//Удаляем перо

DeleteObject(hpen);

//Удаляем кисти

DeleteObject(hhatchbrush);

DeleteObject(hDIBbrush);

//Освоождаем память, занятую буфером с DIB

free(pbytes);

DestroyWindow(hwnd);

break;

case WM_DESTROY:

PostQuitMessage(0);

break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg){

return 0;

}

/*****************************/

/*Главная процедура программы*/

/*****************************/

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

char ClassName[] = "MyWindowClass";

WNDCLASSEX wc;

//Заполняем структуру WNDCLASSEX

wc.cbSize = sizeof(wc);

wc.style = 0;

wc.lpfnWndProc = WndProc;

wc.cbClsExtra = 0;

wc.cbWndExtra = 0;

wc.hInstance = hThisInstance;

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,

300, 250, 510, 280, NULL, 0, hThisInstance, 0);

//Создаем надписи над эллипсом и его частями

CreateWindowEx(0, "STATIC", "Chord", WS_VISIBLE|WS_CHILD,

60, 10, 80, 20, hwnd, 0, hThisInstance, 0);

CreateWindowEx(0, "STATIC", "Ellipse", WS_VISIBLE|WS_CHILD,

220, 10, 100, 20, hwnd, 0, hThisInstance, 0);

CreateWindowEx(0, "STATIC", "Pie", WS_VISIBLE|WS_CHILD,

400, 10, 100, 20, hwnd, 0, hThisInstance, 0);

//Цикл обработки сообщений

MSG msg;

while(GetMessage(&msg,NULL,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hThisInstance);

return 0;

}

Ниже приводится содержимое файла ресурсов, в котором задается изображение для второй кисти.

#include "Constants.h"

ID_BITMAP BITMAP "Nature.bmp"

Ниже приводится содержимое заголовочного файла Constants.h, в котором определяется идентификатор изображения.

#define ID_BITMAP 0x100

На рисунке ниже показано главное окно разработанного примера.


Снимок экрана

Демонстрация создания снимка экрана средствами Windows API. В данном примере создается небольшое приложение, которое по нажатию на кнопку создает снимок экрана и сохраняет его в файл. Файл со снимком имеет имя "MyScreenShot.bmp" и располагается в каталоге приложения.

При получении сообщения о нажатии на кнопку, программа вызывает функцию OnButtonClick, которая делает всю основную работу. Она работает следующим образом.

· С помощью функции GetSystemMetrics определяет размеры экрана и заносит их в структуру SIZE.
· Вызывает функцию GetDC для получения контекста устройства экрана.
· Создает вспомогательный контекст устройства, совместимый с контекстом устройства экрана (CreateCompatibleDC). Даный контекст будет использоваться для хранения снимка экрана.
· Создает изображение (CreateCompatibleBitmap) и связывает его с временным контекстом устройством (SelectObject). Это изображение и будет хранить снимок экрана.
· Вызывает функцию BitBlt для переноса содержимого экрана во вспомогательный контекст устройства.
· Вызывает функцию DumpToFile которая записыват содержимое вспомогательного контекста в файл.
· Освобождает ресурсы.
· С помощью функции MessageBox уведомляет пользователя о том, что операция выполнена.

Функция DumpToFile делает следующее.

· Вызывает функцию GetObject для получения информации об изображении.
· Заполняет структуру BITMAPINFOHEADER.
· Подготавливает буфер под содержимое изображения.
· Вызывает функцию GetDIBits для записи в буфер пикселей изображения в формате DIB.
· Создает файл (CreateFile).
· Заполняет структуру BITMAPFILEHEADER.
· Записывает в файл структуру BITMAPFILEHEADER, структуру BITMAPINFOHEADER, буфер с пикселями изображения.
· Удаляет буфер с пикселями и закрывает файл.

Ниже приводится полный исходный текст разработанного приложения.

#include <windows.h>

#include "Constants.h"

/************************************************************/

/***************Записывает снимок в файл*********************/

/************************************************************/

void DumpToFile(HDC hdcScreen, HBITMAP hbmScreen)

{

BITMAP bmpScreen;

//Получаем информацию об изображении

GetObject(hbmScreen, sizeof(BITMAP), &bmpScreen);

//Подготавливаем структуру BITMAPINFOHEADER

BITMAPFILEHEADER bmfHeader;

BITMAPINFOHEADER bi;

bi.biSize = sizeof(BITMAPINFOHEADER);

bi.biWidth = bmpScreen.bmWidth;

bi.biHeight = bmpScreen.bmHeight;

bi.biPlanes = 1;

bi.biBitCount = 32;

bi.biCompression = BI_RGB;

bi.biSizeImage = 0;

bi.biXPelsPerMeter = 0;

bi.biYPelsPerMeter = 0;

bi.biClrUsed = 0;

bi.biClrImportant = 0;

//Вычисляем размер изображения в байтах

DWORD dwBmpSize = ((bmpScreen.bmWidth * bi.biBitCount + 31) / 32) * 4 * bmpScreen.bmHeight;

//Выделяем память под буфер с изображением

char *lpbitmap = (char*)malloc(dwBmpSize);

//Копируем изображениев буфер в формате DIB

GetDIBits(hdcScreen, hbmScreen, 0, (UINT)bmpScreen.bmHeight, lpbitmap, (BITMAPINFO*)&bi, DIB_RGB_COLORS);

//Создаем файл под изображение

HANDLE hFile = CreateFile("MyScreenShot.bmp", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

//Вычисляем размер файла (размер изображения + размер заголовков)

DWORD dwSizeofDIB = dwBmpSize + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

//Подготавливаем структуру BITMAPFILEHEADER

//Смещение по которому находятся байты изображения

bmfHeader.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER);

bmfHeader.bfSize = dwSizeofDIB; //размер файла

bmfHeader.bfType = 0x4D42; //"BM" сигнатура

//Записываем файл

DWORD dwBytesWritten = 0;

WriteFile(hFile, (LPSTR)&bmfHeader, sizeof(BITMAPFILEHEADER), &dwBytesWritten, NULL);

WriteFile(hFile, (LPSTR)&bi , sizeof(BITMAPINFOHEADER), &dwBytesWritten, NULL);

WriteFile(hFile, (LPSTR)lpbitmap , dwBmpSize , &dwBytesWritten, NULL);

//Освобождаем ресурсы

free(lpbitmap);

CloseHandle(hFile);

}

/************************************************************/

/***************Обработчик нажатия на кнопку*****************/

/************************************************************/

void OnButtonClick(HWND hwnd)

{

HDC hdcScreen; //Контекст устройства экрана

HDC hdcMemDC = NULL; //Вспомогательный окнтекст устройства

HBITMAP hbmScreen = NULL; //Изображение со снимком экрана

//Получаем размеры экрана

SIZE size;

size.cx = GetSystemMetrics(SM_CXSCREEN);

size.cy = GetSystemMetrics(SM_CYSCREEN);

//Получаем контекст устройства экрана

hdcScreen = GetDC(NULL);

//Создаем вспоогательный DC, который будет использоваться для хранения снимка

hdcMemDC = CreateCompatibleDC(hdcScreen);

//Создаем изображение под снимок экрана

hbmScreen = CreateCompatibleBitmap(hdcScreen, size.cx, size.cy);

//Связываем его с вспомогательным контекстом

SelectObject(hdcMemDC, hbmScreen);

//Копируем содержимое экрана во временный контекст

BitBlt(hdcMemDC , 0, 0, size.cx, size.cy,

hdcScreen, 0, 0, SRCCOPY);

//Записываем снимок в файл

DumpToFile(hdcScreen, hbmScreen);

//Освобождаем ресурсы

DeleteObject(hbmScreen);

DeleteObject(hdcMemDC);

ReleaseDC(NULL,hdcScreen);

//Уведомляем пользователя о том, что работа сделана

MessageBox(hwnd,"Снимок экрана сделан","",MB_OK);

}

/************************************************************/

/***************Оконная процедура главного окна**************/

/************************************************************/

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

switch(uMsg){

case WM_COMMAND:

//Убеждаемся в том, что получено сообщение от кнопки

if(wParam == _WPARAM)

OnButtonClick(hwnd);

break;

case WM_CLOSE: DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}//switch(uMsg){

return 0;

}

/************************************************************/

/***************Главная процедура программы******************/

/************************************************************/

int 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,

10, 25, 150, 50, hwnd, (HMENU)ID_BUTTON, hInstance, 0);

//Цикл обработки сообщений

while(GetMessage(&msg,NULL,0,0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}

Ниже приводится содержимое заголовочного файла "Constants.h". В нем задается несколько констант.

//Идентификатор кнопки

#define ID_BUTTON 0x0200

#define _WPARAM ((WPARAM)((BN_CLICKED<<8)+ID_BUTTON))

Эти константы используются при распознавании события нажатия на кнопку (обработке сообщения WM_COMMAND).


Строка по кругу

Данный пример демонстрирует отображение строки по периметру круга. Вывод строк осуществляется при обработке сообщения WM_PAINT. При его получении делается следующее.

· Вызывается функция GetClientRect для получения клиентской области окна.
· Вызывается функция ValidateRect для верификации клиентской области окна. Если ее не вызвать, то глюки при отображении строки неизбежны.
· С помощью функции GetDC получаем описатель контекста устройства окна.
· Вызывается функция OnPaint, которая выполняет основную работу по отрисовке строк.
· Вызывается функция ReleaseDC для освобождения контекста устройства.

Функция OnPaint выполняет основную работу по отрисовке строк. Она принимает описатель контекста устройства и ничего не возвращает. Функция делает следующее.

· Подготавливает структуру LOGFONT, описывающую шрифт.
· С помощью функции SetBkMode устанавливает режим TRANSPARENT (не заполнять фон).
· Прогоняет цикл вывода строк.
· С помощью функции SetBkMode восстанавливает режим отрисовки фона OPAQUE (заполнять фон).

В цикле меняется угол с фиксированным шагом (45°). На каждой итерации цикла делается следующее.

· В структуре LOGFONT корректируется угол наклона текста.
· Вызывается функция CreateFontIndirect для создания шрифта.
· Вызывается функция SelectObject для выбора нового шрифта в контексте устройства. При этом предыдущий шрифт сохраняется в переменной hfntPrev.
· Угол наклона пересчитывается из десятых долей градуса в радианы.
· Вычисляются координаты точек вывод текста в соответствии с его наклоном и радиусом окружности, по которой выводятся строки.
· Вызывается функция TextOut для вывода очередной строки.
· Вызывается функция SelectObject для восстановления предыдущего шрифта.
· Вызывается функция DeleteObject для удаления созданного на данной итерации шрифта.

Радиус окружности и координаты ее центра зашиты в код программы в виде констант. Ниже приводится полный исходный код данного приложения.

#include <windows.h>

#include <math.h>

/*********************************************/

/*Обработка сообщения WM_PAINT. Рисует строки*/

/*********************************************/

void OnPaint(HDC hdc){

//Координаты центра круга

const POINT cp = {150, 150};

//Радиус круга

const unsigned int R = 100;

//Подготавливаем структуру LOGFONT

LOGFONT lf;

strcpy(lf.lfFaceName, "Arial");

lf.lfHeight = 20;

lf.lfWeight = FW_NORMAL;

lf.lfItalic = FALSE;

lf.lfUnderline = FALSE;

lf.lfStrikeOut = FALSE;

//Устанавливаем режим отображения

SetBkMode(hdc, TRANSPARENT);

//Вспомогательные переменные

unsigned int angle;

double r_angle;

HFONT hfnt, hfntPrev;

POINT point;

//Цикл вывода строк

for(angle = 0; angle < 3600; angle += 450){

//Устанавливаем угол наклона. Создаем шрифт и выбираем его.

lf.lfEscapement = angle;

hfnt = CreateFontIndirect(&lf);

hfntPrev = SelectObject(hdc, hfnt);

//Пересчитываем угол в радианы

r_angle = (double) angle*3.14159/10/180;

//Рассчитываем точку вывода

point.x = cp.x + R*sin(r_angle);

point.y = cp.y + R*cos(r_angle);

//Выводим очередную строку

TextOut(hdc, point.x, point.y, "String", 6);

//Восстанавливаем шрифт

SelectObject(hdc, hfntPrev);

//Уничтожаем шрифт

DeleteObject(hfnt);

}

//Восстанавливаем режим отображения по умолчанию

SetBkMode(hdc, OPAQUE);

}

/*************************************************************************/

/*****************************Оконная процедура***************************/

/*************************************************************************/

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

HDC hdc;

RECT rc;

switch(uMsg){

case WM_PAINT:

//Верифицируем клиентскую область

GetClientRect(hwnd, &rc);

ValidateRect(hwnd, &rc);

//Получаем контекст устройства

hdc = GetDC(hwnd);

//Выводим строки

OnPaint(hdc);

//Освобождаем контекст устройства

ReleaseDC(hwnd, hdc);

break;

case WM_CLOSE : DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0) ; break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

return 0;

}

/*****************************************************************************************/

/********************************Главная функция программы********************************/

/*****************************************************************************************/

int 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,

100, 100, 300, 300, NULL, NULL, hInstance, 0);

//Цикл обработки сообщений

while(GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}

Ниже приводится главное окно приложения.


Счетчик нажатий на кнопку

Демонстрация использования функций GetDlgItemInt и SetDlgItemInt. В данном примере, мы подсчитываем количество нажатий на кнопку. При этом текущее количество нажатий хранится в виде строки в заголовке кнопки.

Ниже приводится полный исходный текст приложения.

#include <windows.h>

#include "Resource.h"

#define _WPARAM ((WPARAM)((BN_CLICKED<<16)+ID_BUTTON))

//Прототип Диалоговой процедуры

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)

{

HWND hText;

int cText;

switch(uMsg){

case WM_INITDIALOG:

//Устанавливаем начальное значение

SetDlgItemInt(hwnd, ID_BUTTON, 0, FALSE);

break;

case WM_COMMAND:

if(wParam == _WPARAM){

//Получаем текущее количество нажатий

int cPushes = 0;

cPushes = GetDlgItemInt(hwnd, ID_BUTTON, NULL, FALSE);

//Увеличиваем его

cPushes++;

//Выводим новое значение в заголовке

SetDlgItemInt(hwnd, ID_BUTTON, cPushes, FALSE);

}

break;

case WM_CLOSE:

//Закрываем диалоговое окно

EndDialog(hwnd,0);

}

return 0;

}

Ниже приводится содержимое файла ресурсов, в котором хранится шаблон диалогового окна.

#include "Resource.h"

#include <windows.h>

ID_DIALOG DIALOGEX 0,0,130,130

STYLE WS_CAPTION | WS_VISIBLE | WS_SYSMENU | DS_CENTER | WS_MINIMIZEBOX

CAPTION "DialogBoxParam"

BEGIN

PUSHBUTTON "",ID_BUTTON, 25,60,80,12, WS_VISIBLE

END

Ниже приводится содержимое заголовочного файла Resource.h, в котором задается идентификатор шаблона диалогового окна и элемента управления.

#define ID_BUTTON 0x01

#define ID_DIALOG 0x1000


Таймер

Данный пример демонстрирует работу с таймером. Таймер используется для подсчета количества секунд, прошедших с момента запуска программы. Событие таймера обрабатывается путём обработки оконного сообщения WM_TIMER.

#include <windows.h>

HWND hwndStatic;

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

static int idTimer = 1; //Идентийикатор таймера

static unsigned int CountSec = 0; //Количество секунд

#define SIZE_BUFFER 10

char s[SIZE_BUFFER];

switch(uMsg){

case WM_CREATE:

//Создаём таймер

SetTimer(hwnd,idTimer,1000,NULL);

break;

case WM_TIMER:

//Событие таймера

CountSec++;

snprintf(s,SIZE_BUFFER,"%d",CountSec);

SetWindowText(hwndStatic,s);

break;

case WM_CLOSE:

//Уничтожаем таймер

KillTimer(hwnd, idTimer);

DestroyWindow(hwnd);

break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

return 0;

}

int 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, "Timer",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED,

100, 100, 100, 100, NULL, NULL, hInstance, 0);

hwndStatic = CreateWindowEx(0,"Static","0",

WS_VISIBLE|WS_CHILD, 55, 25, 100, 15, hwnd, NULL, hInstance, 0);

//Цикл обработки сообщений

while(GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}


Таймер 2

Данный пример аналогичен примеру, но с одним исключением: мы не обрабатываем сообщение WM_TIMER, вместо этого мы используем функцию обратного вызова TimerProc.

#include <windows.h>

HWND hwndStatic;

VOID CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT_PTR idEvent,DWORD dwTime)

{

static unsigned int CountSec = 0; //Количество секунд

#define SIZE_BUFFER 10

char s[SIZE_BUFFER];

CountSec++;

snprintf(s,SIZE_BUFFER,"%d",CountSec);

SetWindowText(hwndStatic,s);

}

//Оконная процедура

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

static int idTimer = 1; //Идентификатор таймера

switch(uMsg){

case WM_CREATE:

//Создаём таймер

SetTimer(hwnd,idTimer,1000,TimerProc);

break;

case WM_CLOSE:

//Уничтожаем таймер

KillTimer(hwnd, idTimer);

DestroyWindow(hwnd);

break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

return 0;

}

int 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, "Timer",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED,

100, 100, 100, 100, NULL, NULL, hInstance, 0);

hwndStatic = CreateWindowEx(0,"Static","0",

WS_VISIBLE|WS_CHILD, 55, 25, 100, 15, hwnd, NULL, hInstance, 0);

//Цикл обработки сообщений

while(GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}


Фильтрация клавиатурного ввода

Демострация фильтрации клавиатурного ввода с помощью перегрузки оконной процедуры. В данном примере мы создаем поле ввода, в которое разрешается вводить только цифры. Для реализации такого фильтра мы перегружаем оконную процедуру поля ввода и фильтруем сообщение WM_CHAR. Если получена цифра или спецсимвол, то сообщение передается в родную оконную процедуру поля ввода. Если же получено что-то другое, то сообщение игнорируется.

Ниже приводится полный исходный текст разработанного примера.

#include <windows.h>

//Описатель окна поля ввода

HWND hwndEdit;

//"Родная" оконная процедура поля ввода

LONG oldwndProc = 0;

/************************************************/

/********Оконная процедура главного окна*********/

/************************************************/

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;

}

/************************************************/

/*******Оконная процедура поля ввода*************/

/************************************************/

LRESULT EditWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

if (uMsg == WM_CHAR)

if(iswdigit(wParam) || iswcntrl(wParam))

//Вызываем родную оконную процедуру

return CallWindowProc((WNDPROC)oldwndProc, hwnd, uMsg, wParam, lParam);

else

//Игнорируем сообщение

return 0;

return CallWindowProc((WNDPROC)oldwndProc, hwnd, uMsg, wParam, lParam);

}

/************************************************/

/**********Главная процедура приложения**********/

/************************************************/

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

TCHAR ClassName[] = TEXT("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, TEXT("Фильтрация клавиатурного ввода"),

WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_OVERLAPPED | WS_BORDER,

400, 300, 290, 130, NULL, 0, hInstance, 0);

//Создаем поле ввода

hwndEdit = CreateWindowEx(0, TEXT("Edit"), TEXT(""),

WS_CHILD | WS_VISIBLE | WS_BORDER,

60, 20, 170, 20, hwnd, NULL, hInstance, 0);

//Переопределяем оконную процедуру поля ввода (сабклассинг)

oldwndProc = SetWindowLong(hwndEdit, GWL_WNDPROC, (LONG)EditWndProc);

//Цикл обработки сообщений

while (GetMessage(&msg, NULL, 0, 0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}


Флажок

Демонстрация работы с флажком. В данном примере создается простое диалоговое окно с флажком. При обработке сообщения WM_INITDIALOG с помощью функции CheckDlgButton флажок переводится в установленное состояние.

При нажатии на кнопку "Простая кнопка" с помощью фукции IsDlgButtonChecked проверяется состояние флажка. Если он выбран, то на экран выводится сообщение.

Ниже приводится полный исходный текст примера.

#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))


Шрифт

Демонстрация работы с шрифтом. В данном примере создается простое окно со статическим элементом управления. После создания окон с помощью функции CreateFont создается новый шрифт, который впоследствии соединяется со статическим элементом управления. Для соединения используется оконное сообщение WM_SETFONT. При закрытии приложения шрифт извлекается с помощью сообщения WM_GETFONT и уничтожается функцией DeleteObject.

Ниже приводится полный исходный текст примера.

#include <windows.h>

//Наименование оконного класса

char ClassName[] = "MyWindowClass";

//Описатель окна - статического элемента управления

HWND hStatic;

/*********************************************/

/********Обработчик закрытия окна************/

/*********************************************/

void OnClose(void)

{

//Получаем ранее установленный шрифт

HFONT hfont;

hfont = (HFONT)SendMessage(hStatic, WM_GETFONT,0,0);

//Устанавливаем системный шрифт

SendMessage(hStatic,WM_SETFONT,(WPARAM)NULL,0);

//Уничтожаем ранее созданный шрифт

DeleteObject(hfont);

}

/*********************************************/

/***********Оконная процедура*****************/

/*********************************************/

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

switch(uMsg){

case WM_CLOSE: OnClose(); DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

return 0;

}

/*********************************************/

/********Инициализирует оконный класс*********/

/*********************************************/

void InitWindowClass(HINSTANCE hInstance)

{

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);

}

/*********************************************/

/*Создает шрифт и устанавливает его в статическом элементе управления*/

/*********************************************/

void CreateSetFont(HWND hwnd)

{

//Создаем шрифт

HFONT hfont;

hfont = CreateFont(24, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, RUSSIAN_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Times New Roman");

//Устанавливаем шрифт

SendMessage(hwnd, WM_SETFONT, (WPARAM)hfont, TRUE);

}

/*********************************************/

/*********************************************/

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

//Инициализируем оконный класс

InitWindowClass(hInstance);

//Создаем главное окно

HWND hwnd;

hwnd = CreateWindowEx(0, ClassName, "Шрифты",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED,

100, 100, 200, 200, NULL, NULL, hInstance, 0);

//Создаем статический элемент управления

hStatic = CreateWindowEx(0, "Static", "Простой шрифт",

WS_VISIBLE | WS_CHILD,

10, 30, 150, 25, hwnd, NULL, hInstance, 0);

//Создаем и устанавливаем шрифт в статическом элемент управления

CreateSetFont(hStatic);

//Цикл обработки сообщений

MSG msg;

while(GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}


Шрифт 2

Данный пример демонстрирует отрисовку в окне текста разными шрифтами. В частности демонстрируется: отображене текста курсивом, полужирным шрифтом, зачеркнутым на красном фоне, красным цветом.

Программа создает простое окно. Вывод текста осуществляется при обработке оконного сообщения WM_PAINT. Получив это сообщение, программа вызывает функцию OnPaint. Данная функция делает следующее.

· Вызывает функцию BeginPaint, которая подготавливает окно к рисованию.
· Вызывает функцию WriteTexts, которая и осуществляет отрисовку текста.
· Вызывает функцию EndPaint, которая завершает рисование в окне.

Функция WriteTexts последовательно вызывает функции: WriteTextItalic (отрисовывает текст курсивом), WriteTextBold (отрисовывает текст полужирным шрифтом), WriteTextStrikeOut (отрисовывает текст зачеркнутым шрифтом на красном фоне), WriteTextRed (отрисовывает текст красным текстом). Все эти функции работают одинаковым одразом: создают шрифт, выбирают его в контексте устройства (с помощью функции SelectObject), отрисовывают текст созданным шрифтом, удаляют шрифт. При этом используются разные функции Windows API. Рассмотрим их по порядку.

Функция WriteTextItalic работает следующим образом.

· Подготавливает структуру LOGFONT. В нее заносится информация о создаваемом шрифте.
· С помощью функции CreateFontIndirect создает шрифт.
· Вызывает функцию SelectObject для выбора созданного шрифта в контексте устройства.
· С помощью функции SetRect подготавливает структуру RECT, хранящую информацию о прямоугольнике, в который выводится текст.
· Вызывает функцию DrawText для отображения текста созданным ранее шрифтом.
· С помощью функции DeleteObject удаляет шрифт.

Функция WriteTextBold работает следующим образом.

· Подготавливает структуру ENUMLOGFONTEXDV. В ней хранится информация о создаваемом шрифте. Это достаточно большая и сложная структура. Она содержит информацию о шрифте. Ручное её заполнение (как в этом примере) весьма утомительно и чревато ошибками. В примере демонстрируется более аккуратное заполнение этой структуры с помощью функции EnumFontFamiliesEx.
· С помощью функции CreateFontIndirectEx создает шрифт.
· Вызывает функцию SelectObject для выбора созданного шрифта в контексте устройства.
· С помощью функции SetRect подготавливает структуру RECT, хранящую информацию о прямоугольнике, в который выводится текст.
· Вызывает функцию DrawTextEx для отображения текста.
· С помощью функции DeleteObject удаляет шрифт.

Функция WriteTextStrikeOut работает следующим образом.

· С помощью функции CreateFont создает шрифт.
· Вызывает функцию SelectObject для выбора шрифта в контексте устройства.
· С помощью функции SetBkColor устанавливает цвет фона.
· С помощью функции TextOut отображает текст.
· Вызывает функцию DeleteObject для удаления шрифта.

Функция WriteTextRed работает следующим образом:

· Вызывает функцию CreateFont для создания шрифта.
· С помощью функции SelectObject выбирает созданный шрифт в контексте устройства.
· Вызывает функцию SetBkColor для установки цвета фона.
· Вызывает функцию SetTextColor для установки цвета текста.
· С помощью функции ExtTextOut отображает текст.
· Вызывает функцию DeleteObject для удаления шрифта,

Ниже приводится полный исходный текст примера.

#include <windows.h>

//Наименование оконного класса

char ClassName[] = "MyWindowClass";

/*********************************************/

/*******Отрисовывает текст курсивом***********/

/*********************************************/

void WriteTextItalic(HDC hdc)

{

//Подготавливаем структуру LOGFONT

LOGFONT lf;

lf.lfHeight = 30;

lf.lfWidth = 0;

lf.lfEscapement = 0;

lf.lfOrientation = 0;

lf.lfWeight = FW_NORMAL;

lf.lfItalic = TRUE;

lf.lfUnderline = FALSE;

lf.lfStrikeOut = FALSE;

lf.lfCharSet = RUSSIAN_CHARSET;

lf.lfOutPrecision = OUT_DEFAULT_PRECIS;

lf.lfQuality = DEFAULT_QUALITY;

lf.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;

strcpy(lf.lfFaceName,"Times New Roman");

//Создаем шрифт

HFONT hfont;

hfont = CreateFontIndirect(&lf);

//Устанавливаем шрифт в контексте устрйства

SelectObject(hdc, hfont);

//Выводим текст

RECT rc;

SetRect(&rc, 50, 10, 100, 0);

DrawText(hdc, "Курсив", -1, &rc, DT_NOCLIP);

DeleteObject(hfont);

}

/*********************************************/

/***Отрисовывает текст полужирным шрифтом*****/

/*********************************************/

void WriteTextBold(HDC hdc)

{

//Подготавливаем параметры шрифта

ENUMLOGFONTEXDV elfexdv;

elfexdv.elfEnumLogfontEx.elfLogFont.lfHeight = 30;

elfexdv.elfEnumLogfontEx.elfLogFont.lfWidth = 0;

elfexdv.elfEnumLogfontEx.elfLogFont.lfEscapement = 0;

elfexdv.elfEnumLogfontEx.elfLogFont.lfOrientation = 0;

elfexdv.elfEnumLogfontEx.elfLogFont.lfWeight = FW_BOLD;

elfexdv.elfEnumLogfontEx.elfLogFont.lfItalic = FALSE;

elfexdv.elfEnumLogfontEx.elfLogFont.lfUnderline = FALSE;

elfexdv.elfEnumLogfontEx.elfLogFont.lfStrikeOut = FALSE;

elfexdv.elfEnumLogfontEx.elfLogFont.lfCharSet = RUSSIAN_CHARSET;

elfexdv.elfEnumLogfontEx.elfLogFont.lfOutPrecision = OUT_DEFAULT_PRECIS;

elfexdv.elfEnumLogfontEx.elfLogFont.lfQuality = DEFAULT_QUALITY;

elfexdv.elfEnumLogfontEx.elfLogFont.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;

strcpy(elfexdv.elfEnumLogfontEx.elfLogFont.lfFaceName,"Times New Roman");

strcpy(elfexdv.elfEnumLogfontEx.elfFullName, "Times New Roman");

strcpy(elfexdv.elfEnumLogfontEx.elfStyle, "");

strcpy(elfexdv.elfEnumLogfontEx.elfScript, "");

elfexdv.elfDesignVector.dvReserved = STAMP_DESIGNVECTOR;

elfexdv.elfDesignVector.dvNumAxes = 0;

//Создаем шрифт

HFONT hfont;

hfont = CreateFontIndirectEx(&elfexdv);

//Выбираем шрифт в контексте устройство

SelectObject(hdc, hfont);

//Выводим текст

RECT rc;

SetRect(&rc, 20, 50, 100, 0);

DrawTextEx(hdc, "Полужирный", -1, &rc, DT_NOCLIP, NULL);

//Удаляем шрифт

DeleteObject(hfont);

}

/*********************************************/

/***Отрисовывает текст зачеркнутым шрифтом****/

/*********************************************/

void WriteTextStrikeOut(HDC hdc)

{

//Создаем шрифт

HFONT hfont;

hfont = CreateFont(30, 0, 0, 0, FW_NORMAL, FALSE, FALSE, TRUE, RUSSIAN_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Times New Roman");

//Устанавливаем шрифт

SelectObject(hdc, hfont);

//Устанавливаем красный цвет фона

SetBkColor(hdc, RGB(0xFF,0,0));

//Выводим текст

TextOut(hdc, 25, 90, "Зачеркнутый", 11);

//Удаляем шрифт

DeleteObject(hfont);

}

/*********************************************/

/*****Отрисовывает текст красным цветом*******/

/*********************************************/

void WriteTextRed(HDC hdc)

{

//Создаем шрифт

HFONT hfont;

hfont = CreateFont(30, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, RUSSIAN_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Times New Roman");

//Выбираем шрифт в контексте устройства

SelectObject(hdc, hfont);

//Устанавливаем цвет фона

SetBkColor(hdc, RGB(0xFF,0xFF,0xFF));

//Устанавливаем цвет текста

SetTextColor(hdc, RGB(0xFF,0,0));

//Отрисовываем текст

ExtTextOut(hdc, 50, 125, ETO_CLIPPED, NULL,"Красный",7,NULL);

//Удаляем шрифт

DeleteObject(hfont);

}

/*********************************************/

/******Отрисовывает текстовые надписи*********/

/*********************************************/

void WriteTexts(HDC hdc)

{

WriteTextItalic(hdc);

WriteTextBold(hdc);

WriteTextStrikeOut(hdc);

WriteTextRed(hdc);

}

/*********************************************/

/******Обработчик сообщения WM_PAINT**********/

/*********************************************/

void OnPaint(HWND hwnd)

{

HDC hdc;

PAINTSTRUCT ps;

hdc = BeginPaint(hwnd, &ps);

WriteTexts(hdc);

EndPaint(hwnd, &ps);

}

/*********************************************/

/***********Оконная процедура*****************/

/*********************************************/

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;

case WM_PAINT: OnPaint(hwnd); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

return 0;

}

/*********************************************/

/********Инициализирует оконный класс*********/

/*********************************************/

void InitWindowClass(HINSTANCE hInstance)

{

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_WINDOW;

wc.lpszMenuName = NULL;

wc.lpszClassName = ClassName;

wc.hIconSm = NULL;

//Регистрируем оконный класс

RegisterClassEx(&wc);

}

/*********************************************/

/*********************************************/

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

//Инициализируем оконный класс

InitWindowClass(hInstance);

//Создаем главное окно

HWND hwnd;

hwnd = CreateWindowEx(0, ClassName, "Шрифты",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED,

100, 100, 200, 200, NULL, NULL, hInstance, 0);

//Цикл обработки сообщений

MSG msg;

while(GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}

Ниже приводится главное окно разработанного примера с отображенным на нем текстом.


Шрифт 3

Демонстрация работы с функцией CreateFontIndirectEx. Пример работы с этой функцией уже приводился здесь. В примере структура ENUMLOGFONTEXDV заполнялась вручную, что очень неудобно и чревато ошибками. Поэтому в данном примере используется другой подход.

Здесь я использую функцию EnumFontFamiliesEx для получения информации об установленных в системе шрифтах. Данная функция сама подготавливает структуру ENUMLOGFONTEXDV и передает её в функцию обратного вызова. Все что нам остается это внести необходимые коррективы и создать шрифт.

После создания шрифта, он устанавливается с помощью сообщения WM_SETFONT.

#include <windows.h>

//Наименование оконного класса

char ClassName[] = "MyWindowClass";

//Описатель окна - статического элемента управления

HWND hStatic;

//Прототип функции обратного вызова

int CALLBACK EnumFontFamExProc(const LOGFONT*, const TEXTMETRIC*, DWORD, LPARAM);

//Тип функции EnumFontFamiliesEx

typedef int (*ENUMFONTFAMILIESEX)(HDC, LPLOGFONT, FONTENUMPROC, LPARAM, DWORD);

ENUMFONTFAMILIESEX lpfEFFEx;

/*********************************************/

/********Обработчик закрытия окна************/

/*********************************************/

void OnClose(void)

{

//Получаем ранее установленный шрифт

HFONT hfont;

hfont = (HFONT)SendMessage(hStatic, WM_GETFONT,0,0);

//Устанавливаем системный шрифт

SendMessage(hStatic,WM_SETFONT,(WPARAM)NULL,0);

//Уничтожаем ранее созданный шрифт

DeleteObject(hfont);

}

/*********************************************/

/***********Оконная процедура*****************/

/*********************************************/

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

switch(uMsg){

case WM_CLOSE: OnClose(); DestroyWindow(hwnd); break;

case WM_DESTROY: PostQuitMessage(0); break;

default: return DefWindowProc(hwnd, uMsg, wParam, lParam);

}

return 0;

}

/*********************************************/

/********Инициализирует оконный класс*********/

/*********************************************/

void InitWindowClass(HINSTANCE hInstance)

{

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);

}

/*********************************************/

/*Функция обратного вызова, которая вызывается для найденного семейства шрифтов*/

/*Она создает шрифт и устанавливает его в элементе управления*/

/*********************************************/

int CALLBACK EnumFontFamExProc(const LOGFONT* plf, const TEXTMETRIC* ptm, DWORD dw, LPARAM lparam){

//Семейство шрифтов найдено

//Корректируем настройки шрифта

ENUMLOGFONTEXDV elfedv;

elfedv = *((ENUMLOGFONTEXDV*)plf);

elfedv.elfEnumLogfontEx.elfLogFont.lfHeight = 30;

//Создаем шрифт

HFONT hfont;

hfont = CreateFontIndirectEx(&elfedv);

//Устанавливаем шрифт

SendMessage((HWND)lparam, WM_SETFONT, (WPARAM)hfont, TRUE);

//Прекращаем перечисление

return 0;

}

/*********************************************/

/*Запускает поиск шрифта для статического элемента управления*/

/*********************************************/

void CreateSetFont(void)

{

//Загружаем модуль gdi32.dll

HMODULE hgdi;

hgdi = LoadLibrary("gdi32.dll");

//Получаем адрес функции EnumFontFamiliesEx

lpfEFFEx = (ENUMFONTFAMILIESEX)GetProcAddress(hgdi, "EnumFontFamiliesExA");

//Указываем какой шрифт мы хотим найти

LOGFONT lf;

lf.lfCharSet = RUSSIAN_CHARSET;

strcpy(lf.lfFaceName, "Times New Roman");

lf.lfPitchAndFamily = 0;

//Ищем сешейство шрифтов (функцей EnumFontFamiliesEx)

lpfEFFEx(GetDC(hStatic), &lf, (FONTENUMPROC)EnumFontFamExProc, (LPARAM)hStatic, 0);

}

/*********************************************/

/***************Главная процедура*************/

/*********************************************/

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{

//Инициализируем оконный класс

InitWindowClass(hInstance);

//Создаем главное окно

HWND hwnd;

hwnd = CreateWindowEx(0, ClassName, "Шрифты",

WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_OVERLAPPED,

100, 100, 250, 100, NULL, NULL, hInstance, 0);

//Создаем статический элемент управления

hStatic = CreateWindowEx(0, "Static", "Простой шрифт",

WS_VISIBLE | WS_CHILD,

10, 15, 250, 30, hwnd, NULL, hInstance, 0);

//Создаем и устанавливаем шрифт в статическом элемент управления

CreateSetFont();

//Цикл обработки сообщений

MSG msg;

while(GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

//Снимаем с регистрации зарегистрированный ранее оконный класс

UnregisterClass(ClassName, hInstance);

return 0;

}


CopyRect

Копирует координаты одного прямоугольника в другой прямоугольник.

Прототип

BOOL CopyRect(

_Out_ LPRECT lprcDst,

_In_ const RECT *lprcSrc

);

Параметры

lprcDst[out]

Указатель на структуру RECT, в которую будут записаны логические координаты исходного прямоугольника.

lprcSrc[in]

Указатель на структуру RECT, координаты которой будут скопированы.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль.

Пример использования

#include <windows.h>

int main()

{

RECT rc;

//Заполняем структуру RECT

SetRect(&rc,100,100,200,200);

RECT rc2;

//Копируем прямоугольник

CopyRect(&rc2,&rc);

//Выводим копию на экран

printf("(%d;%d)-(%d;%d)\n",rc2.left,rc2.top,rc2.right,rc2.bottom);

getchar();

return 0;

}

Примечание

Так как приложения могут использовать прямоугольники для различных задач, то функции работы с прямоугольниками не используют какую-либо единицу измерения. Вместо этого координаты и размеры задаются в логических единицах со знаком. Единицы измерения определяет режим отображения (mapping mode) и функция, использующая прямоугольник.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll


EqualRect

Определяет совпадают ли два прямоугольника путём сравнения координат их левого верхнего и правого нижнего углов.

Прототип

BOOL EqualRect(

_In_ const RECT *lprc1,

_In_ const RECT *lprc2

);

Параметры

lprc1[in]

Указатель на структуру RECT, которая содержит логические координаты первого прямоугольника.

lprc2[in]

Указатель на структуру RECT, которая содержит логические координаты второго прямоугольника.

Возвращаемое значение

Если прямоугольники совпадают, то возвращается ненулевое значение.

Если прямоугольники не совпадают, то возвращаеся значение нуль.

Пример использования

#include <windows.h>

int main()

{

RECT rc1,rc2;

//Заполняем прямоугольники

SetRect(&rc1,100,100,200,200);

SetRect(&rc2,110,110,200,200);

//Сравниваем прямоугольники

if(EqualRect(&rc1,&rc2))

printf("yes\n");

else

printf("no\n");

getchar();

return 0;

}

В данном примере прямоугольники не совпадают, поэтому на экран будет выведена строка "no".

Примечание

Функция EqualRect считает пустые прямоугольники разными если их координаты отличаются.

Так как приложения могут использовать прямоугольники для различных задач, то функции работы с прямоугольниками не используют какую-либо единицу измерения. Вместо этого координаты и размеры задаются в логических единицах со знаком. Единицы измерения определяет режим отображения (mapping mode) и функция, использующая прямоугольник.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll


GetClientRect

Возвращает координаты пртивоположных углов клиентской области заданного окна. Возвращаются координаты левого верхнего и правого нижнего углов клиентской области в клиентской системе координат. Так как клиентская система координат откладывается от левого верхнего угла, то координаты левого верхнего угла клиентской области равны нулю.

Прототип

BOOL WINAPI GetClientRect(

_In_ HWND hWnd,

_Out_ LPRECT lpRect

);

Параметры

hWnd[in]

Описатель окна.

lpRect[out]

Адрес структуры RECT, в которой будут возвращены запрошенные координаты. Значения полей left и top этой структуры будут равны нулю. Значение поля right будет равно ширине клиентской области окна.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

int main(int argc, char *argv[])

{

HWND hwnd;

//Находим главное окно калькулятора

hwnd = FindWindow("SciCalc",NULL);

RECT rc;

//Получаем размеры клиентской области окна

GetClientRect(hwnd,&rc);

//Выводим полученные размеры пользователю

printf("width is %d\n", rc.right);

printf("height is %d\n", rc.bottom);

getch();

return 0;

}

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetWindowRect

Позволяет получить координаты противоположных углов прямоугольной области заданного окна в экранной системе координат.

Прототип

BOOL WINAPI GetWindowRect(

_In_ HWND hWnd,

_Out_ LPRECT lpRect

);

Параметры

hWnd[in]

Описатель окна.

lpRect[out]

Адрес структуры RECT, в которую будут записаны запрашиваемые координаты.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

int main(int argc, char *argv[])

{

HWND hwnd;

//Находим главное окно калькулятора

hwnd = FindWindow("SciCalc",NULL);

RECT rc;

//Получаем координаты углов прямоугольника окна

GetWindowRect(hwnd,&rc);

//Выводим полученные координаты пользователю

printf("(%d;%d)-(%d;%d)\n",rc.left,rc.top,rc.right,rc.bottom);

getch();

return 0;

}

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


InflateRect

Увеличивает или уменьшает ширину и высоту заданного прямоугольника. Данная функция добавляет dx единиц к левому и правому краю прямоугольника, и dy единиц к верхнему и нижнему краю. Парметры dx и dy интерпретируются как числа со знаком; положительные значения увеличивают ширину и высоту, отрицательные значения уменьшают ширину и высоту.

Прототип

BOOL InflateRect(

_Inout_ LPRECT lprc,

_In_ int dx,

_In_ int dy

);

Параметры

lprc[in,out]

Указатель на структуру RECT, которая описывает прямоугольник, размер которого будет меняться.

dx[in]

Величина, на которую изменяется ширина прямоугольника. Данный параметр должен иметь отрицательное значение для уменьшения ширины прямоугольника.

dy[in]

Величина, на которую изменяется высота прямоугольника. Данный параметр должен иметь отрицательное значение для уменьшения высоты прямоугольника.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль.

Пример использования

#include <windows.h>

int main()

{

RECT rc;

//Заполняем прямоугольник

SetRect(&rc,100,100,200,200);

//Увеличиваем прямоугольник

InflateRect(&rc,10,20);

//Выводим новые координаты прямоугольника

printf("(%d;%d)-(%d;%d)",rc.left,rc.top,rc.right,rc.bottom);

getchar();

return 0;

}

В данном примере на экран выводится строка "(90;80)-(210;220)".

Примечание

По факту ширина прямоугольника увеличивается на 2*dx единиц, а высота на 2*dy единиц.

Так как приложения могут использовать прямоугольники для различных задач, то функции работы с прямоугольниками не используют какую-либо единицу измерения. Вместо этого координаты и размеры задаются в логических единицах со знаком. Единицы измерения определяет режим отображения (mapping mode) и функция, использующая прямоугольник.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll


IntersectRect

Вычисляет пересечение двух исходных прямоугольников и помещает координаты пересечения в заданный прямоугольник. Если исходные прямоугольики не пересекаются, то в заданный прямоугольник записывается пустой прямоугольник (у него все координаты равны нулю).

Прототип

BOOL IntersectRect(

_Out_ LPRECT lprcDst,

_In_ const RECT *lprcSrc1,

_In_ const RECT *lprcSrc2

);

Параметры

lprcDst[out]

Указатель на структуру RECT, в которую будет записано пересечение прямоугольников lprcSrc1 и lprcSrc2. Значение данного параметра не может быть равно NULL.

lprcSrc1[in]

Указатель на структуру RECT, описывающую первый исходный прямоугольник.

lprcSrc2[in]

Указатель на структуру RECT, описывающую второй исходный прямоугольник.

Возвращаемое значение

Если прямоугольники пересекаются, то возвращается ненулевое значение.

Если прямоугольники не пересекаются, то возвращается значение нуль.

Пример использования

#include <windows.h>

int main()

{

RECT rc1,rc2,rc3;

//Заполняем исходные прямоугольники

SetRect(&rc1,100,100,200,200);

SetRect(&rc2,150,150,250,250);

//Находим пересечение прямоугольников

IntersectRect(&rc3,&rc1,&rc2);

//Выводим координаты пересечения

printf("(%d;%d)-(%d;%d)\n",rc3.left,rc3.top,rc3.right,rc3.bottom);

getchar();

return 0;

}

В данном примере на экран будет выведена строка "(150;150)-(200;200)".

Примечание

Так как приложения могут использовать прямоугольники для различных задач, то функции работы с прямоугольниками не используют какую-либо единицу измерения. Вместо этого координаты и размеры задаются в логических единицах со знаком. Единицы измерения определяет режим отображения (mapping mode) и функция, использующая прямоугольник.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll


InvalidateRect

Присоединяет прямоугольную область к обновляемой области окна. Обновляемая область окна - это часть клиентской области окна, которая должна быть перерисована.

Прототип

BOOL InvalidateRect(

_In_ HWND hWnd,

_In_ const RECT *lpRect,

_In_ BOOL bErase

);

Параметры

hWnd[in]

Описатель окна, обновляемая область которого изменяется. Если значение этого параметра равно NULL, то система перерисовывает все окна, не только окна текущего приложения, и рассылает сообщения WM_ERASEBKGND и WM_NCPAINT перед возвратом из функции. Установка этого параметра в значение NULL не рекомендуется.

lpRect[in]

Адрес структуры RECT, которая содержит клиентские координаты прямоугольной области добавляемой к обновляемой области. Если это параметр равен NULL, то к обновляемой области добавляется вся клиентская область окна.

bErase[in]

Определяет, что фон обновляемой области будет очищен на время ее обработки. Если значение этого параметра равно TRUE фон очищается. Если значение этого параметра равно FALSE фон остается без изменений.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль.

Пример использования

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

int main(int argc, char *argv[])

{

HWND hwnd=NULL;

//Ищем главное окно калькулятора

hwnd = FindWindow("SciCalc", NULL);

//к обновляемой области окна калькулятора

//добавляем всю его клиентскую область

InvalidateRect(hwnd, NULL, TRUE);

return 0;

}

Более сложный пример приведен здесь.

Примечание

Добавляемые области накапливаются в обновляемой области до тех пор, пока не будет обработано ближайшее сообщение WM_PAINT

Система отправляет сообщение WM_PAINT окну когда у него есть обновляемая область и очередь сообщений этого окна не содержит других сообщений.

Если значение параметра bErase равно TRUE для части обновляемой области, фон очищается во всей обновляемой области, а не только в его отдельной части.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll


IsRectEmpty

Проверяет является ли заданный прямоугольник пустым. Пустой прямоугольник - это прямоугольник, у которого нет области; то есть, координата его правого края меньше или равна координате левого края, или координата нижнего края меньше или равна координате верхнего края.

Прототип

BOOL IsRectEmpty(

_In_ const RECT *lprc

);

Параметры

lprc[in]

Указатель на структуру RECT, которая содержит логические координаты проверяемого пямоугольника.

Возвращаемое значение

Если прямоугольник пустой, то возвращается ненулевое значение.

Если прямоугольник не пустой, то возвращается значение нуль.

Пример использования

#include <windows.h>

int main()

{

RECT rc;

//Заполняем прямоугольник

SetRect(&rc,100,100,200,200);

//Проверяем является ли прямоугольник пустым

if(IsRectEmpty(&rc))

printf("Rect is empty\n");

else

printf("Rect is no empty\n");

getchar();

return 0;

}

В данном примере на экран выводится строка "Rect is no empty" (прямоугольник не пустой).

Примечание

Так как приложения могут использовать прямоугольники для различных задач, то функции работы с прямоугольниками не используют какую-либо единицу измерения. Вместо этого координаты и размеры задаются в логических единицах со знаком. Единицы измерения определяет режим отображения (mapping mode) и функция, использующая прямоугольник.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll


OffsetRect

Сдвигает заданный прямоугольник на заданное смещение.

Прототип

BOOL OffsetRect(

_Inout_ LPRECT lprc,

_In_ int dx,

_In_ int dy

);

Параметры

lprc[in,out]

Указатель на структуру RECT, которая содержит логические координаты сдвигаемого прямоугольника.

dx[in]

Величина сдвига прямоугольника вправо или влево. Для сдвига прямоугольника влево значение данного параметра должно быть меньше нуля.

dy[in]

Величина сдвига прямоугольника вверх или вниз. Для сдвига прямоугольника вверх значение этого параметра должно быть меньше нуля.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль.

Пример использования

#include <windows.h>

int main()

{

RECT rc;

//Заполняем прямоугольник

SetRect(&rc,100,100,200,200);

//Сдвигаем прямоугольник

OffsetRect(&rc,10,20);

//Выводим координаты прямоугольника

printf("(%d;%d)-(%d;%d)\n",rc.left,rc.top,rc.right,rc.bottom);

getchar();

return 0;

}

В данном примере на экран выводится строка "(110;120)-(210;220)".

Примечание

Так как приложения могут использовать прямоугольники для различных задач, то функции работы с прямоугольниками не используют какую-либо единицу измерения. Вместо этого координаты и размеры задаются в логических единицах со знаком. Единицы измерения определяет режим отображения (mapping mode) и функция, использующая прямоугольник.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll


PtInRect

Определяет лежит ли заданная точка в заданном прямоугольнике. Считается, что точка лежит внутри прямоугольника если она лежит на левой или верхней границе прямоугольника или лежит внутри его границ. Точка, лежащая на правой или нижней границе, признаётся лежащей вне прямоугольника.

Прототип

BOOL PtInRect(

_In_ const RECT *lprc,

_In_ POINT pt

);

Параметры

lprc[in]

Указатель на структуру RECT, которая описывает прямоугольник.

pt[in]

Структура POINT, которая описывает заданную точку.

Возвращаемое значение

Если заданная точка лежит внутри прямоугольника, то возвращается ненулевое значение.

Если заданная точка не лежит внутри прямоугольника, то возвращается значение нуль.

Пример использования

#include <windows.h>

int main()

{

RECT rc;

//Заполняем прямоугольник

SetRect(&rc,100,100,200,200);

//Проверяемая точка

POINT pt;

pt.x = 150;

pt.y = 150;

//Проверяем лежит ли точка внутри прямоугольника

if(PtInRect(&rc,pt))

printf("yes\n");

else

printf("no\n");

getchar();

return 0;

}

В данном примере на экран выводится строка "yes" (точка лежит внутри прямоугольника).

Примечание

Перед вызовом функции PtInRect прямоугольник должен быть нормализован. То есть, значение поля lprc.right должно быть больше чем значение поля lprc.left, а значение поля lprc.bottom больше чем lprc.top. Если прямоугольник не нормализован, то точка никогда не будет лежать внутри прямоугольника.

Так как приложения могут использовать прямоугольники для различных задач, то функции работы с прямоугольниками не используют какую-либо единицу измерения. Вместо этого координаты и размеры задаются в логических единицах со знаком. Единицы измерения определяет режим отображения (mapping mode) и функция, использующая прямоугольник.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll


SetRect

Устанавливает координаты заданного прямоугольника. Эквивалентно простому заполнению структуры RECT.

Прототип

BOOL SetRect(

_Out_ LPRECT lprc,

_In_ int xLeft,

_In_ int yTop,

_In_ int xRight,

_In_ int yBottom

);

Параметры

lprc[out]

Указатель на структуру RECT, которая и будет заполнена.

xLeft[in]

Координата по горизонтали левого верхнего угла прямоугольника.

yTop[in]

Координата по вертикали левого верхнего угла прямоугольника.

xRight[in]

Координата по горизонтали правого нижнего угла прямоугольника.

yBottom[in]

Координата по вертикали правого нижнего угла прямоугольника.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль.

Пример использования

#include <windows.h>

int main()

{

RECT rc;

//Заполняем структуру RECT

SetRect(&rc,100,100,200,200);

//Выводим её на экран

printf("(%d;%d)-(%d;%d)\n",rc.left,rc.top,rc.right,rc.bottom);

getchar();

return 0;

}

Примечание

Так как приложения могут использовать прямоугольники для различных задач, то функции работы с прямоугольниками не используют какую-либо единицу измерения. Вместо этого координаты и размеры задаются в логических единицах со знаком. Единицы измерения определяет режим отображения (mapping mode) и функция, использующая прямоугольник.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll


SetRectEmpty

Создаёт поустой прямоугольник, в котором все координаты равны нулю.

Прототип

BOOL SetRectEmpty(

_Out_ LPRECT lprc

);

Параметры

lprc[out]

Указатель на структуру RECT, которая содержит координаты прямоугольника.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль.

Пример использования

#include <windows.h>

int main()

{

RECT rc;

//Создаем пустой прямоугольник

SetRectEmpty(&rc);

//Выводим его координаты

printf("(%d;%d)-(%d;%d)\n",rc.left,rc.top,rc.right,rc.bottom);

getchar();

return 0;

}

Примечание

Так как приложения могут использовать прямоугольники для различных задач, то функции работы с прямоугольниками не используют какую-либо единицу измерения. Вместо этого координаты и размеры задаются в логических единицах со знаком. Единицы измерения определяет режим отображения (mapping mode) и функция, использующая прямоугольник.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll


SubtractRect

Определяет координаты прямоугольника, образованного путём вычитания одного прямоугольника из другого.

Прототип

BOOL SubtractRect(

_Out_ LPRECT lprcDst,

_In_ const RECT *lprcSrc1,

_In_ const RECT *lprcSrc2

);

Параметры

lprcDst[out]

Указатель на структуру RECT, в которую будут записаны координаты прямоугольника полученного путём вычитания прямоугольника lprcSrc2 из прямоугольника lprcSrc1.

lprcSrc1[in]

Указатель на структуру RECT, описывающую прямоугольник, из которого вычитается прямоугольник lprcSrc2.

lprcSrc2[in]

Указатель на структуру RECT, описывающую прямоугольник, который будет вычитаться из прямоугольника lprcSrc1.

Возвращаемое значение

Если результирующий прямоугольник является пустым прямоугольником, то возвращается значение нуль.

Если результирующий прямоугольник не является пустым прямоугольником, то возвращается ненулевое значение.

Пример использования

#include <windows.h>

int main()

{

RECT rc1,rc2,rc3;

//Заполняем прямоугольники

SetRect(&rc1,100,100,200,200);

SetRect(&rc2,150,100,250,200);

//Находим разность прямоугольников

SubtractRect(&rc3,&rc1,&rc2);

//Выводим координаты

printf("(%d;%d)-(%d;%d)\n",rc3.left,rc3.top,rc3.right,rc3.bottom);

getchar();

return 0;

}

В данном примере на экран выводится строка "(100;100)-(150;200)".

Примечание

Функция вычитает прямоугольник lprcSrc2 из прямоугольника lprcSrc1 когда прямоугольники пересекаются по горизонтали или п вертикали. Например, если lprcSrc1 имеет координаты (10,10,100,100), а прямоугольник lprcSrc2 имеет координаты (50,50,150,150) функция вернет прямоугольник (10,10,100,100). Если lprcSrc1 имеет координаты (10,10,100,100) и lprcSrc2 имеет координаты (50,10,150,150), функция вернет прямоугольник (10,10,50,100). Другими словами результирующий прямоугольник - это ограничивающий прямоугольник геометрической разницы.

Так как приложения могут использовать прямоугольники для различных задач, то функции работы с прямоугольниками не используют какую-либо единицу измерения. Вместо этого координаты и размеры задаются в логических единицах со знаком. Единицы измерения определяет режим отображения (mapping mode) и функция, использующая прямоугольник.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll


UnionRect

Создаёт объединение двух прямоугольников. Объединение - это наименьший прямоугольник, который содержит оба исходных прямоугольника.

Прототип

BOOL UnionRect(

_Out_ LPRECT lprcDst,

_In_ const RECT *lprcSrc1,

_In_ const RECT *lprcSrc2

);

Параметры

lprcDst[out]

Указатель на структуру RECT, в которую будут записаны координаты прямоугольника, содержащего в себе прямоугольники lprcSrc1 и lprcSrc2.

lprcSrc1[in]

Указатель на структуру RECT, которая описывает первый исходный прямоугольник.

lprcSrc2[in]

Указатель на структуру RECT, которая описывает второй исходный прямоугольник.

Возвращаемое значение

Если результатом объединения является непустой прямоугольник, то возвращается ненулевое значение.

Если результатом объединения является пустой прямоугольник, то возвращается значение нуль.

Пример использования

#include <windows.h>

int main()

{

RECT rc1,rc2,rc3;

//Заполняем прямоугольники

SetRect(&rc1,100,100,200,200);

SetRect(&rc2,150,100,250,200);

//Находим объединение прямоугольников

UnionRect(&rc3,&rc1,&rc2);

//Выводим координаты

printf("(%d;%d)-(%d;%d)\n",rc3.left,rc3.top,rc3.right,rc3.bottom);

getchar();

return 0;

}

В данном примере на экран выводится строка "(100;100)-(250;200)".

Примечание

Система игнорирует размеры пустого прямоугольника, то есть прямоугольника у которого значения всех координат равны нулю.

Так как приложения могут использовать прямоугольники для различных задач, то функции работы с прямоугольниками не используют какую-либо единицу измерения. Вместо этого координаты и размеры задаются в логических единицах со знаком. Единицы измерения определяет режим отображения (mapping mode) и функция, использующая прямоугольник.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll


ValidateRect

Исключает заданную прямоугольную область из обновляемой области окна. Обновляемая область окна - это часть клиентской области окна, которая должна быть перерисована.

Прототип

BOOL ValidateRect(

_In_ HWND hWnd,

_In_ const RECT *lpRect

);

Параметры

hWnd[in]

Описатель окна, обновляемая область которого изменяется. Если этот параметр равен NULL, то модифицируются обновляемые области и перерисовываются все окна, а также перед возвратом управления отправляются сообщения WM_ERASEBKGND и WM_NCPAINT.

lpRect[in]

Адрес структуры RECT, которая описывает прямоугольную область, удаляемую из обновляемой области окна. Если значение этого параметра равно NULL, то из обновляемой области удаляется вся клиентская область окна.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль.

Пример использования

Пример использования приведен здесь.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll


AlphaBlend

Отображает растровые изображения, имеющие прозрачные и полупрозрачные пиксели.

Прототип

BOOL AlphaBlend(

_In_ HDC hdcDest,

_In_ int xoriginDest,

_In_ int yoriginDest,

_In_ int wDest,

_In_ int hDest,

_In_ HDC hdcSrc,

_In_ int xoriginSrc,

_In_ int yoriginSrc,

_In_ int wSrc,

_In_ int hSrc,

_In_ BLENDFUNCTION ftn

);

Параметры

hdcDest [in]

Описатель целевого контекста устройства.

xoriginDest [in]

Горизонтальная координата левого верхнего угла целевого прямоугольника, в логических единицах.

yoriginDest [in]

Вертикальная координата левого верхнего угла целевого прямоугольника, в логических единицах.

wDest [in]

Ширина целевого прямоугольника, в логических единицах.

hDest [in]

Высота целевого прямоугольника, в логических единицах.

hdcSrc [in]

Описатель исходного контекста устройства.

xoriginSrc [in]

Горизонтальная координата левого верхнего угла исходного прямоугольника, в логических единицах.

yoriginSrc [in]

Вертикальная координата левого верхнего угла исходного прямоугольника, в логических единицах.

wSrc [in]

Ширина исходного прямоугольника, в логических единицах.

hSrc[in]

Высота исходного прямоугольника, в логических единицах.

ftn [in]

Структура BLENDFUNCTION, задающая функцию смешивания альфа каналов (alpha-blending function) исходного и целевого изображений, глобальное значение альфа канала, применяемое ко всему исходному изображению, и информацию о формате исходного изображения. Исходная и целевая функции смешивания в настоящее время ограничены константой AC_SRC_OVER.

Возвращаемое значение

Значение TRUE.

Возвращаемое значение в случае ошибки

Значение FALSE.

Пример использования

Пример использования приведен здесь.

Примечание

Если исходный и целевой прямоугольники имеют разные размеры, то исходное изображение будет растянуто до размеров целевого прямоугольника. Если использовалась функция SetStretchBltMode, то для функции режим растяжения будет автоматически изменен на COLORONCOLOR (то есть режимы BLACKONWHITE, WHITEONBLACK и HALFTONE будут заменены на COLORONCOLOR)

Целевые координаты пересчитываются с использованием преобразования, заданного для целевого контекста устройства. Исходные координаты пересчитываются с использованием преобразования, заданного для исходного контекста устройства.

Если исходный контекст устройства задает контекст расширенного метафайла, то произойдет ошибка (функция вернет значение FALSE).

Если исходное и целевое изображения имеют разные цветовые форматы, функция AlphaBlend сконвертирует исходное изображение так, чтобы его цветовой формат соответствовал цветовому формату целевого изображения.

Функция AlphaBlend не поддерживает зеркалирование. Если ширина или высота исходного или целевого изображения имеют отрицательное значение, функция завершится ошибкой.

При отображении (rendering) на принтере, первоначально вызовите функцию GetDeviceCaps с параметром SHADEBLENDCAPS для определения, поддерживает ли принтер смешивание с использованием функции AlphaBlend. Учтите, что для контекстов устройства монитора, операции смешивания поддерживаются и данные флаги означают наличие ускорения операций смешивания.

Если источник и приёмник изображения являются одной и той же поверхностью (surface), то есть они оба описывают экран или одно и то же растровое изображение в памяти (memory bitmap) и при этом их прямоугольники пересекаются, то произойдет ошибка и функция вернет значение FALSE.

Исходный прямоугольник должен полностью лежать внутри исходной поверхности, в противном случае произойдет ошибка и функция вернет значение FALSE.

Если ширина или высота исходного или целевого изображения имеют отрицательное значение, то функция завершится ошибкой.

Поле SourceConstantAlpha структуры BLENDFUNCTION задает значение альфа канала для всего исходного изображения. Значение этого поля объединяется со значениями альфа канала для каждого пикселя. Если значение поля SourceConstantAlpha равно нулю, то изображение прозрачно. Для использования только значений альфа канала каждого пикселя, установите в поле SourceConstantAlpha значение 255 (оно означает, что изображение непрозрачно).

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | Msimg32.dll


BitBlt

Выполняет побитное перемещение данных о цвете прямоугольника пикселей из одного контекста устройства в другой контекст устройства.

Прототип

BOOL BitBlt(

_In_ HDC hdcDest,

_In_ int nXDest,

_In_ int nYDest,

_In_ int nWidth,

_In_ int nHeight,

_In_ HDC hdcSrc,

_In_ int nXSrc,

_In_ int nYSrc,

_In_ DWORD dwRop

);

Параметры

hdcDest [in]

Описатель целевого контекста устройства.

nXDest [in]

Горизонтальная координата левого верхнего угла целевого прямоугольника в логических единицах.

nYDest [in]

Вертикальная координата левого верхнего угла целевого прямоугольника в логических единицах.

nWidth [in]

Ширина исходного и целевого прямоугольников в логических единицах.

nHeight [in]

Высота исходного и целевого прямоугольников в логических единицах.

hdcSrc [in]

Описатель исходного контекста устройства.

nXSrc [in]

Горизонтальная координата левого верхнего угла исходного прямоугольника в логических единицах.

nYSrc [in]

Вертикальная координата левого верхнего угла исходного прямоугольника в логических единицах.

dwRop [in]

Код растровой операции. Данный код задает как цвета исходного прямоугольника объединяются с цветами целевого прямоугольника при получении результирующего цвета.

Допустимые значения этого параметра перечислены здесь.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Функция BitBlt обрезает изображение только в целевом контексте устройства (DC).

Если в исходном контексте устройства выполняется операция вращения (rotation) или резки (shear), то функция BitBlt завершится ошибкой. Если же в исходном DC выполнена другая операция (и она не выполнена в целевом DC), то прямоугольник целевого DC растягивается, сжимается или поворачивается как это необходимо.

Если исходный и целевой DC имеют разные форматы цветов, то функция BitBlt сама сконвертирует цветовой формат как нужно.

Если исходный DC является DC расширенного метафайла и ведется запись расширенного метафайла, то происходит ошибка.

Не все устройства поддерживают функцию BitBlt. Для плучения более подробной информации смотрите описание возможности RC_BITBLT функции GetDeviceCaps, а также функции: MaskBlt, PlgBlt и StretchBlt.

Если исходный и целевой DC задают разные устройства, то функция BitBlt вернет ошибку. Для перемещения данных между DC разных устройств сконвертируйте исходное изображение в DIB с помощью функции GetDIBits. Для отображения DIB на втором устройстве используйте функцию SetDIBits или StretchDIBits.

При передаче битовых блоков управление цветом не ведется.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


CreateBitmap

Создает растровое изображение (bitmap), имеющее заданную ширину, высоту и цветовой формат (цветовые плоскости и глубину цвета).

Прототип

HBITMAP CreateBitmap(

_In_ int nWidth,

_In_ int nHeight,

_In_ UINT cPlanes,

_In_ UINT cBitsPerPel,

_In_ const VOID *lpvBits

);

Параметры

nWidth [in]

Ширина изображения в пикселях.

nHeight [in]

Высота изображения, в пикселях.

cPlanes [in]

Количество цветовых плоскостей, используемых устройством.

cBitsPerPel [in]

Количество бит, необходимых для идентификации цвета отдельного пикселя.

lpvBits [in]

Указатель на массив цветов, используемых для задания цветов в прямоугольнике пикселей. Каждая строчка (scan line) в прямоугольнике должна быть выровнена по границе слова (невыровненные строчки должны дополняться нулями). Если значение этого параметра равно NULL, то содержимое нового изображения не определено.

Возвращаемое значение

Описатель растрового изображения.

Возвращаемое значение в случае ошибки

Значение NULL.

Функция GetLastError может вернуть следующий код ошибки

ERROR_INVALID_BITMAP - вычисленный размер растрового изображения оказался меньше нуля.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Создаем растровое изобажение

HBITMAP hbitmap = NULL;

hbitmap = CreateBitmap(0, 0, 1, 1, NULL);

//Выводим на экран его описатель

char s[50];

sprintf(s, "%X", hbitmap);

MessageBox(NULL, s, "", MB_OK);

//Удаляем растровое изображение

DeleteObject(hbitmap);

return 0;

}

В данном примере мы создаем простое растровое изображение размером 1 на 1 пиксель без определенного содержания и выводим на экран его описатель.

Примечание

Функция CreateBitmap создает растровое изображения, зависящее от устройства.

После того, как растровое избражение создано, оно может быть выбрано в контексте устройства с помощью функции SelectObject. Однако, растровое изображение может быть выбрано в контексте устройства только в том случае, если растровое изображение и контекст устройства имеют одинаковый формат.

Функция CreateBitmap может использоваться для создания цветных изображений. Однако, в целях производительности приложения должны использовать эту функцию для создания двуцветных изображений, а для создания цветных изображений - функцию CreateCompatibleBitmap. Когда изображение, созданное функцией CreateBitmap, выбирается в контексте устройства, система проверяет соответствие формата изображения формату контекстного устройства, в котором оно выбирается. Так как функция CreateCompatibleBitmap принимает контекст устройства в качестве одного из своих параметров, она гарантированно возвращает растровое изображение, имеющее тот же формат, что и заданный контекст устройства. Поэтому последующий вызов функции SelectObject работает быстрее для цветных изображений, созданных функцией CreateCompatibleBitmap, чем для изображений, созданных функцией CreateBitmap.

Для двуцветных изображений, ноль обозначает цвет переднего плана (foreground color), а единица обозначает цвет фона (background color) используемого контекста устройства.

Если значения параметров nWidth и nHeight равны нулю, функция CreateBitmap вернет описатель двуцветного изображения, имеющего размер 1 на 1 пиксель.

Когда растровое изображение больше не нужно вам, вы должны уничтожить его с помощью функции DeleteObject.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


CreateBitmapIndirect

Создает растровое изображение, имеющее заданную ширину, высот и цветовой формат (количество цветовых плоскостей, глубина цвета).

Прототип

HBITMAP CreateBitmapIndirect(

_In_ const BITMAP *lpbm

);

Параметры

lpbm [in]

Указатель на структуру BITMAP, содержащую информацию о растровом изображении. Если значения полей bmWidth и bmHeight равны нулю, функция вернет описатель монохромного изображения разммером 1 на 1 пиксель.

Возвращаемое значение

Описатель растрового изображения.

Возвращаемое значение в случае ошибки

Значение NULL.

Функция GetLastError может вернуть один из кодов, приведенны ниже.

ERROR_INVALID_PARAMETER - один или несколько входных параметров имеют недопустимое значение.

ERROR_NOT_ENOUGH_MEMORY - изображение слишком велико, память не может быть выделена.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

//Биты создаваемого изображения

char bits[] = {00};

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Подготавливаем структуру BITMAP

BITMAP bitmap;

bitmap.bmType = 0;

bitmap.bmWidth = 1;

bitmap.bmHeight = 1;

bitmap.bmWidthBytes = 8;

bitmap.bmPlanes = 1;

bitmap.bmBitsPixel = 8;

bitmap.bmBits = bits;

//Создаем растровое изобажение

HBITMAP hbitmap = NULL;

hbitmap = CreateBitmapIndirect(&bitmap);

//Выводим на экран его описатель

char s[50];

sprintf(s, "%X", hbitmap);

MessageBox(NULL, s, "", MB_OK);

//Удаляем растровое изображение

DeleteObject(hbitmap);

return 0;

}

В данном примере создается простое изображение размером 1 на 1 пиксель.

Примечание

Функция CreateBitmapIndirect создает изображение, зависящее от устройства.

После того как изображение создано, оно может быть выбрано в контексте устройства с помощью функции SelectObject. Однако, оно может быть выбрано только в том случае, если и изображение и контекст устройства имеют одинаковый формат.

Хотя функция CreateBitmapIndirect может использоваться для создания цветных изображений, в целях повышения производительности приложения должны использовать эту функцию для создания монохромных ихображений, а для цветных изображений использовать функцию CreateCompatibleBitmap. Когда цветное изображение, созданное функцией CreateBitmapIndirect выбирается в контексте устройства, система должна убедиться в том, что изображение соответствует формату контекста устройства, в котором выбирается. Так как функция CreateCompatibleBitmap принимает контекст устройства в качестве входного параметра, она возвращает изображение имеющее тот же формат, что и контекст устройства. Поэтому последуюбщий вызов функции SelectObject работает быстрее, если изображение создано функцией CreateCompatibleBitmap, а не CreateBitmapIndirect.

Для двуцветных изображений, ноль обозначает цвет переднего плана (foreground color), а единица обозначает цвет фона (background color) используемого контекста устройства.

Когда изображение больше не нужно вам, уничтожьте его с помощью функции DeleteObject.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


CreateCompatibleBitmap

Создает растровое изображение (bitmap), совместимое с устройством, заданным посредством контекста устройства.

Прототип

HBITMAP CreateCompatibleBitmap(

_In_ HDC hdc,

_In_ int nWidth,

_In_ int nHeight

);

Параметры

hdc [in]

Описатель контекста устройства.

nWidth [in]

Ширина изображения в пикселях.

nHeight [in]

Высота изображения в пикселях.

Возвращаемое значение

Описатель совместимого растрового изображения.

Возвращаемое значение в случае ошибки

Значение NULL.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Создаем растровое изобажение

HBITMAP hbitmap = NULL;

hbitmap = CreateCompatibleBitmap(GetDC(NULL), 16, 16);

//Выводим на экран его описатель

char s[50];

sprintf(s, "%X", hbitmap);

MessageBox(NULL, s, "", MB_OK);

//Удаляем растровое изображение

DeleteObject(hbitmap);

return 0;

}

В данном примере создается растровое изображение размером 16 на 16 пикселей и выводится на экран его описатель.

Примечание

Цветовой формат растрового изображения, созданного функцией CreateCompatibleBitmap соотвествует цветовому формату устройства, заданного параметром hdc. Изображение может быть выбрано в любом контексте устройства, совместимом с исходным устройством.

Так как временные (memory) контексты устройства разрешают и цветные и двуцветные изображения, то формат изображения, возвращенного функцией CreateCompatibleBitmap для временного контекста устройства, отличается от оригинала. Одновременно с этим, совместимое изображение созданное для невременного контекста всега имеет тот же цветовой формат и использует ту же палитру, что и заданный контекст устройства.

Помните: при создании временного контекста устройства, он инициализируется выбранным в нем монохромным изображением размером 1 на 1 пиксель. Если этот контекст используется в функции CreateCompatibleBimap, то последняя создаст монохромное ихображение. Для создания цветного изображения, используйте контекст устройства, на основе был создан временный контекст так, как показано ниже.

HDC memDC = CreateCompatibleDC ( hDC );

HBITMAP memBM = CreateCompatibleBitmap ( hDC, nWidth, nHeight );

SelectObject ( memDC, memBM );

Если значения параметров nWidth и nHeight равны нулю, функция вернет описатель монохромного изображения размером 1 на 1 пиксель.

Если в контексте устройства hdc выбрана секция DIB, созданная функцией CreateDIBSection, то функция CreateCompatibleBitmap также создаст секцию DIB.

Когда изображение больше не нужно вам, уничтожьте его с помощью функции DeleteObject.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


CreateDIBitmap

Создает соместимое с устройством растровое изображение (DDB) из DIB и, опционально, устанавливает пиксели изображения.

Прототип

HBITMAP CreateDIBitmap(

_In_ HDC hdc,

_In_ const BITMAPINFOHEADER *lpbmih,

_In_ DWORD fdwInit,

_In_ const VOID *lpbInit,

_In_ const BITMAPINFO *lpbmi,

_In_ UINT fuUsage

);

Параметры

hdc [in]

Описатель контекста устройства.

lpbmih [in]

Указатель на структуру BITMAPINFOHEADER.

Если значение параметра fdwInit равно CBM_INIT, то функция использует информацию в этой структуре для получения желаемой ширины и высоты изображения, а также другой информации. Учтите, что положительное значение ширины и высоты задает DIB, ориентированное снизу вверх, тогда как отрицательное значение высоты задает DIB, ориентированное сверху вниз. Вызов функии CreateDIBitmap с параметром fdwInit равным CBM_INIT равносильно вызову функции CreateCompatibleBitmap для создания DDB, имеющего формат устройства, с последующим вызовом функции SetDIBits для переноса битов DIB в DDB.

fdwInit [in]

Определяет как система инициализирует биты изображения. Допсутимые значения перечислены ниже.

CBM_INIT - система использует данные в параметрах lpbInit и lpbmi для инициализации битов изображения. Если данный флаг сброшен, то параметры lpbInit и lpbmi не используются.

Если значение параметра fdwInit равно нулю, то система не инициализирует биты изображения.

lpbInit [in]

Указатель на массив байтов, содержащий начальные данные растрового изображения. Формат данных зависит от значения поля biBitCount структуры BITMAPINFO, на которую указывает параметр lpbmi.

lpbmi [in]

Указатель на структуру BITMAPINFO, которая задает размеры и формат цвета массива, на который указывает параметр lpbinit.

fuUsage [in]

Описывает формат поля bmiColors структуры BITMAPINFO, еси она используется. Существует два формата этого поля: значения цвета в формате RGB, или индексы цветов в палитре. Допустимые значения параметра fuUsage перечислены ниже.

DIB_PAL_COLORS - цветовая таблица представляет собой массив 16-разрядных индексов в логической палитре контекста устройства, в котором выбрано изображение.

DIB_RGB_COLORS - цветовая таблица содержит значения в формате RGB.

Возвращаемое значение

Описатель совместимого изображения.

Возвращаемое значение в случае ошибки

Значение NULL.

Пример использования

Пример использования приведен здесь.

Примечание

Создаваемое DDB будет иметь ту же глубину цвета, что и соответствующий ему контекст устройства. Для создания изображения, имеющего другую глубину используйте функцию CreateDIBSection.

Для обеспечения максимальной скорости отрисовки изображения на устройстве укажите в параметре fdwInit значение CBM_INIT. Затем, используйте ту же лубину цвета в DIB, что и в режиме видео (video mode). Когда видео запускается в режиме 4 или 8 бит на пиксель, используйте значение DIB_PAL_COLORS.

Значение CBM_CREATDIB в параметре fdwInit больше не поддерживается.

Когда изображение вам больше не нужно, удалите его с помощью функции DeleteObject.

ICM: управление цветом не ведется. После создания растрового изображения цвета его содержимого не корректируются.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


CreateDIBSection

Создает независящее от устройства растровое иззображение (Device Independent Bitmap - DIB), в которое приложение может писать напрямую. Функция предоставляет вам указатель на массив битов растрового изображения. Вы можете передать в функцию описатель объекта проекция файла (file-mapping object), который функция будет использовать для создания растрового изображения, или же вы можете позволить системе самой выделить память для растрового изображения.

Прототип

HBITMAP CreateDIBSection(

_In_ HDC hdc,

_In_ const BITMAPINFO *pbmi,

_In_ UINT iUsage,

_Out_ VOID **ppvBits,

_In_ HANDLE hSection,

_In_ DWORD dwOffset

);

Параметры

hdc [in]

Описатель контекста устройства. Если значение параметра iUsage равно DIB_PAL_COLORS, то функция для инициализации цветов DIB будет использовать логическую палитру данного устройства.

pbmi [in]

Указатель на структуру BITMAPINFO, содержащую различные атрибуты DIB, в том числе размеры и цвета.

iUsage [in]

Тип данных, содержащихся в массиве цветов. Указатель на этот массив хранится в поле bmiColors структуры BITMAPINFO, на которую указывает параметр pbmi. Допустимые значения параметра перечислены ниже.

DIB_PAL_COLORS - поле bmiColors указывает на массив 16-разрядных индексов в логической палитре устройства hdc.

DIB_RGB_COLORS - структура BITMAPINFO содержит массив цветов в формате RGB.

ppvBits [out]

Указатель на переменную, в которую заносится указатель на массив бит DIB.

hSection [in]

Описатель объекта проекция файла, который функция использует при создании DIB. Данный праметр может быть равен NULL.

Если значение параметра hSection отлично от NULL, то оно должно содержать описатель объекта проекция файла, созданного функцией CreateFileMapping с флагом PAGE_READWRITE или PAGE_WRITECOPY. Секции DIB доступные только для чтения не поддерживаются. Другие описатели, переданные в функцию CreateDIBSection, приведут к тому, что она завершится ошибкой.

Если значение параметра hSection отлично от NULL, функция CreateDIBSection разместит биты растрового изображения по смещению dwOffset от начала проекции файла hSection. Приложение впоследствии сможет получить описатель hSection с помощью функции GetObject. Для этого надо передать в эту функцию описатель возвращенный функцией CreateDIBSection.

Если значение параметра hSection равно NULL система сама выделить память под растровое изображение (DIB). В этом случае функция CreateDIBSection игнорирует значение параметра dwOffset. Приложение впоследствии не сможет получить описатель на этот блок памяти. Значение поля dshSection структуры DIBSECTION, заполненной функцией GetObject будет равно NULL.

dwOffset [in]

Смещение от начала проекции hSection до начала размещения бит растрового изображения. Если значение параметра hSection равно NULL, то значение параметра dwOffset игнорируется. Биты растрового изображения выравниваются по границе двойного слова. Поэтому значение параметра dwOffset должно быть кратно размеру двойного слова (DWORD).

Возвращаемое значение

Описатель созданного незаивсящего от устройства растрового изображения (DIB). При этом параметр *ppvBits указывает на биты этого изображения.

Возвращаемое значение в случае ошибки

Значение NULL. Значение параметра *ppvBits также равно NULL.

Функция GetLastError может вернуть следующий код ошибки.

ERROR_INVALID_PARAMETER - один или несколько входных параметров имеют недопустимое значение.

Пример использования

Пример использования приведен здесь.

Примечание

Как говорилось выше, если значение параметра hSection равно NULL, система сама выделит память под DIB. Система закроет описатель на эту память когда вы удалите DIB с помощью функции DeleteObject. Если же значение параметра hSection отлично от NULL, то вы сами должны освободить память после удаления растрового изображения.

Вы не можете передавать DIB из одного приложения в другое.

Функция CreateDIBSection не использует поля biXPelsPerMeter и biYPelsPerMeter структуры BITMAPINFOHEADER и не заносит в структуру BITMAPINFO информацию о разрешении (resolution).

Перед отрисовкой растрового изображения созданного функцией CreateDIBSection вы должны убедиться в том, что подсистема GDI завершила все операции рисования. Доступ к растровому изображению должен быть синхронным. Для осуществления этого используйте функцию GdiFlush. Возможно использование указателя на биты растрового изображения, в том числе передача этого указателя в такие функции, как SetDIBits.

Управление цветом не выполняется.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


GetBitmapDimensionEx

Возвращает размеры совместимого изображения. Данный размеры должны быть предварительно установлены функцией SetBitmapDimensionEx.

Прототип

BOOL GetBitmapDimensionEx(

_In_ HBITMAP hBitmap,

_Out_ LPSIZE lpDimension

);

Параметры

hBitmap [in]

Описатель совместимого изоражения.

lpDimension [out]

Указатель на структуру SIZE, в которую заносятся размеры изображения.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

#include "Constants.h"

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Загружаем растровое изображение из ресурсов

HBITMAP hbitmap = NULL;

hbitmap = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(ID_BITMAP));

//Получаем размеры изображения

SIZE size;

GetBitmapDimensionEx(hbitmap, &size);

//Выводим размеры на экран

char s[50];

sprintf(s, "(%d; %d)", size.cx, size.cy);

MessageBox(NULL, s, "", MB_OK);

//Удаляем растровое изображение

DeleteObject(hbitmap);

return 0;

}

В данном примере определяются размеры для изображения загруженного из ресурсов. Поскольку размеры ранее не устанавливались, то на экран будет выведена строка "(0; 0)".

Примечание

Размеры в структуре указываются в десятых долях миллиметра. Если размеры не были установлены ранее, то в оба поля структуры будет записано значение ноль.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


GetDIBits

Возвращает биты заданного совместимого растрового изображения (bitmap) и копирует их в буфер в формате DIB.

Прототип

int GetDIBits(

_In_ HDC hdc,

_In_ HBITMAP hbmp,

_In_ UINT uStartScan,

_In_ UINT cScanLines,

_Out_ LPVOID lpvBits,

_Inout_ LPBITMAPINFO lpbi,

_In_ UINT uUsage

);

Параметры

hdc [in]

Описатель контекста устройства.

hbmp [in]

Описатель растрового изображения. Это должно быть совместимое изображение (DDB).

uStartScan [in]

Номер первой возвращаемой строки (scan line).

cScanLines [in]

Количество возвращаемых строк (scan line).

lpvBits [out]

Указатель на буфер, в который заносятся данные растрового изображения. Если значение этого параметра равно NULL, функция запишет размеры и формат изображения в структуру BITMAPINFO, на которую указывает параметр lpbi.

lpbi [in, out]

Указатель на структуру BITMAPINFO, задающую желаемый формат данных DIB.

uUsage [in]

Формат поля bmiColors структуры BITMAPINFO. Допустимые значения этого поля перечислены ниже.

DIB_PAL_COLORS - цветовая таблица состоит из массива 16-разрядных индексов в текущей логической палитре.

DIB_RGB_COLORS - цветовая таблица должна состоять из цветов в формате RGB.

Возвращаемое значение

Если значение параметра lpvBits отлично от NULL, функция вернет количество строк, скопированных из растрового изображения.

Если же значение параметра lpvBits равно NULL, функция заполнит структуру BITMAPINFO и вернет ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Функция GetLastError может вернуть код ошибки приведенный ниже.

ERROR_INVALID_PARAMETER - один или несколько параметров имеют недопустимые значения.

Пример использования

Пример использования приведен здесь.

Примечание

Если требуемый формат DIB соответствует его внутреннему формату, то копируются значения цветов в формате RGB. Если же требуемый формат не соответствует внутренему формату, то генерируется цветовая таблица. Таблица ниже описывает цветовые таблицы, создаваемые для каждого формата.

Значение | Описание
1_BPP | Цветовая таблица состоит из белого и черного цветов.
4_BPP | Цветовая таблица состоит из смешений цветов, идентичных стандартной палитре VGA
8_BPP | Цветовая таблица состоит из смешений 256 цветов, заданных подсистемой GDI. В эти 256 цветов также входят 20 цветов, найденных в логичесой палитре по умолчанию.
24_BPP | Цветовая таблица не возвращается

Если параметр lpvBits задает корректный указатель, то первые шесть полей структуры BITMAPINFOHEADER должны задавать размер и формат DIB. Строки изображения должны быть выровнены по границе двойного слова, за исключением тех случаев, когда изображение сжато алгоритмом RLE.

Для восходящего (bottom-up) DIB высота задается положительным числом, тогда как для нисходящего (top-down) DIB она задается отрицательным числом. Цветовая таблица изображения будет присоединена к структуре BITMAPINFO.

Если значение параметра lpvBits равно NULL, функция проверяет значение первого поля первой структуры, на которую указывает параметр lpbi. Данное поле должно задавать размер структуры BITMAPCOREHEADER или BITMAPINFOHEADER, в байтах. На основе этого значения функция определяет какие поля должны быть инициализированы.

Если значение параметра lpvBits равно NULL и значение поля biBitCount структуры BITMAPINFOHEADER (часть структуры BITMAPINFO) равно нулю, функция заполнит структуру BITMAPINFOHEADER или BITMAPCOREHEADER без цветовой таблицы. Данный прием может использоваться для получения характеристик растрового изображения.

Во время вызова функции, изображение hbmp не должно быть выбрано в контексте устройства.

Началом восходящего DIB является левый нижний угол растрового изображения. Началом нисходящего DIB является левый верхний угол растрового изображения.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


GetPixel

Возвращает цвет (в формате RGB) выбранного пикселя.

Прототип

COLORREF GetPixel(

_In_ HDC hdc,

_In_ int nXPos,

_In_ int nYPos

);

Параметры

hdc [in]

Описатель контекста устройства.

nXPos [in]

Горизонтальная координата пикселя, в логических единицах.

nYPos [in]

Вертикальная координата пикселя, в логических единицах.

Возвращаемое значение

Значение цвета в формате RGB. Если запрошенный пиксель выходит за границы текущего региона отсечения (clipping region), функция возвращает значение CLR_INVALID (0xFFFFFFFF).

Возвращаемое значение в случае ошибки

Значение CLR_INVALID.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

#include "Constants.h"

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Загружаем растровое изображение из ресурсов

HBITMAP hbitmap = NULL;

hbitmap = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(ID_BITMAP));

//Создаем контекст устройства

HDC hdc;

hdc = CreateCompatibleDC(GetDC(NULL));

//Выбираем в нем изображение

SelectObject(hdc, hbitmap);

//Получаем цвет пикселя

COLORREF color;

color = GetPixel(hdc, 25, 25);

//Выводим цвет на экран

char s[50];

sprintf(s, "(%d; %d; %d)", GetRValue(color), GetGValue(color), GetBValue(color));

MessageBox(NULL, s, "", MB_OK);

//Удаляем контекст устройства

DeleteDC(hdc);

//Удаляем растровое изображение

DeleteObject(hbitmap);

return 0;

}

В данном примере на экран выводятся компоненты цвета пикселя изображения, хранящегося в ресурсах. Для извлечения компонентов цвета используются макросы GetRValue, GetGValue и GetBValue.

Примечание

Пиксель должен находиться внутри текущего региона отсечения.

Не все устройства поддерживают функцию GetPixel. Приложение должно вначале с помощью функции GetDeviceCaps убедиться в наличии соответствующей поддержки.

Изображение должно быть выбрано в контексте устройства. В противном случае функция вернет значение CLR_INVALID для всех пикселей.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


GetStretchBltMode

Возвращает текущий режим растяжения. Данный описывает как цветовые данные добавляются или удаляются из растрового изображения при его растяжении или сжатии функцией StretchBlt.

Прототип

int GetStretchBltMode(

_In_ HDC hdc

);

Параметры

hdc [in]

Описатель контекста устройства.

Возвращаемое значение

Текущий режим растяжения. Возможные значения перечислены здесь.

Возвращаемое значение в случае ошибки

Значение ноль.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Получаем режим растяжения

int StretchMode = 0;

StretchMode = GetStretchBltMode(GetDC(NULL));

//Выводим его на экран

char s[50];

sprintf(s, "%d", StretchMode);

MessageBox(NULL, s, "", MB_OK);

return 0;

}

В результате работы этой программы на экран выводится значение 1 (у вас может быть другое значение), что соответствует режиму BLACKONWHITE.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


LoadBitmap

Загружает заданное растровое изображение (bitmap) из ресурсов исполняемого файла.

Данная функция может бвть изменена или удалена в последующих версиях Windows. Используйте вместо нее функцию LoadImage или DrawFrameControl.

Прототип

HBITMAP LoadBitmap(

_In_ HINSTANCE hInstance,

_In_ LPCTSTR lpBitmapName

);

Параметры

hInstance [in]

Описатель модуля, содержащего загружаемое растровое изображение.

lpBitmapName [in]

Указатель на завершающуюся NULL символом строку, содержащую наименование загружаемого ресурса. Данный параметр также может содержать идентификатор ресурса в младшем слове и ноль в старшем слове. Для создания такого значения используйте макрос MAKEINTRESOURCE.

Возвращаемое значение

Описатель загруженного растрового изображения.

Возвращаемое значение в случае ошибки

Значение NULL.

Пример использования

Пример использования приведен здесь.

Примечание

Функция завершается ошибкой если изображение, идентифицируемое параметром lpBitmapName не существует, или для его загрузки не хватает памяти.

Функция LoadBitmap создает растровое изображение, совместимое с монитором, оно не может быть выбрано принтером. Для загрузки изображения, которое может быть выбрано принтером используйте функцию LoadImage с флагом LR_CREATEDIBSECTION для создания секции DIB. Такая секция может быть выбрана любым устройством.

Приложение может использовать функцию LoadBitmap для загрузки предопределенных изображений. Для этого параметр hInstance должен содержать значение NULL, а параметр lpBitmapName одно из значений, перечисленных ниже.

OBM_BTNCORNERS | OBM_OLD_RESTORE
OBM_BTSIZE | OBM_OLD_RGARROW
OBM_CHECK | OBM_OLD_UPARROW
OBM_CHECKBOXES | OBM_OLD_ZOOM
OBM_CLOSE | OBM_REDUCE
OBM_COMBO | OBM_REDUCED
OBM_DNARROW | OBM_RESTORE
OBM_DNARROWD | OBM_RESTORED
OBM_DNARROWI | OBM_RGARROW
OBM_LFARROW | OBM_RGARROWD
OBM_LFARROWD | OBM_RGARROWI
OBM_LFARROWI | OBM_SIZE
OBM_MNARROW | OBM_UPARROW
OBM_OLD_CLOSE | OBM_UPARROWD
OBM_OLD_DNARROW | OBM_UPARROWI
OBM_OLD_LFARROW | OBM_ZOOM
OBM_OLD_REDUCE | OBM_ZOOMD

Растровые изображения, наименования которых начинаются с "OBM_OLD", использовались в 16-разрядной версии Windows до версии 3.0.

Для использования констант OBM_, необходимо до подключения заголовочного файла Windows.h объявить константу OEMRESOURCE.

Для удаления каждого загруженного изображения приложение должно использовать функцию DeleteObject.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | LoadBitmapA и LoadBitmapW


MaskBlt

Объединяет цвета исходного и целевого растровых изображений, используя заданную маску и растровую операцию.

Прототип

BOOL MaskBlt(

_In_ HDC hdcDest,

_In_ int nXDest,

_In_ int nYDest,

_In_ int nWidth,

_In_ int nHeight,

_In_ HDC hdcSrc,

_In_ int nXSrc,

_In_ int nYSrc,

_In_ HBITMAP hbmMask,

_In_ int xMask,

_In_ int yMask,

_In_ DWORD dwRop

);

Параметры

hdcDest [in]

Описатель целевого контекста устройства.

nXDest [in]

Горизонтальная координата левого верхнего угла целевого прямоугольника в логических единицах.

nYDest [in]

Вертикальная координата левого верхнего угла целевого прямоугольника в логических единицах.

nWidth [in]

Ширина целевого прямоугольника и исходного растрового изображения, в логических единицах.

nHeight [in]

Высота целевого прямоугольника и исходного растрового изображения, в логических единицах.

hdcSrc [in]

Описатель контекста устройства, из которого копируется растровое изображение. Если параметр dwRop задает операцию, для которой исходное изображение не нужно, то параметр hdcSrc должен содержать значение NULL.

nXSrc [in]

Горизонтальная координата левого верхнего угла исходного изображения, в логических единицах.

nYSrc [in]

Вертикальная координата левого верхнего угла исходного изображения, в логических единицах.

hbmMask [in]

Описатель монохромного растрового изображения, содержащего маску. Эта маска объединяется с цветами исходного ихображения.

xMask [in]

Горизонтальное смещение внутри маски в пикселях.

yMask [in]

Вертикальное смещение внутри маски в пикселях.

dwRop [in]

Коды операций для фона и переднего плана, выполняемых при объединении исходного и целевого изображений. Код растровой операции для фона хранится в старшем байте старшего слова значения данного параметра; код растровой операции для переднего плана хранится в младшем байте старшего слова значения параметра; младшее слово игнорируется и должно равняться нулю. Создать значение соответствующего формата можно с помощью макроса MAKEROP4.

Описание значения фона и переднего плана в контексте данной функции приводится ниже в замечаниях.

Перечень растровых операций приведен здесь. Учтите что операция CAPTUREBLT обычно неприменима для контекстов печатающих устройств.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Функция MaskBlt использует растровые изображения,зависящие от устройства (Device-Dependent Bitmaps - DDB).

Значение 1 в маске указывает, что должна быть применена растровая операция, определенная для переднего плана. Значение 0 в маске указывает на то, что должна быть применена растровая операция, определенная для фона.

В растровых операциях с использованием исходного изображения маска должна охватывать исходный прямоугольник. Если это не так, то функция завершится ошибкой. Если в растровой операции исходное изображение не нужно, то маска должна охватывать целевой прямоугольник. Если это условие не выполнено, то функция завершится ошибкой.

Если в исходном контексте устройства выполняется поворот или обрезка (shear), то произойдет ошибка. Однако, допустимы другие виды преобразований.

Если исходное, целевое изображение и изобрадение шаблона иммеют разный цветовой формат, функция сконвертирует изображение шаблона и исходное изображение так, чтобы они соответствовали цветовому формату целевого изображения.

Если маска не является монохромным изображением, произойдет ошибка.

Если исходный контекст устройства задает расширенный метафайл, и он записывается, то произойдет ошибка (функция вернет значение FALSE).

Не все устройства поддерживают функцию MaskBlt. Для определения наличия поддержки приложения должны использовать функцию GetDeviceCaps с параметром RC_BITBLT.

Если маска не задана, то данная функция ведет себя так же, как и функция BitBlt с использованием кода растровой операции для переднего плана (foreground).

При переносе битов управление цветом не ведется.

При использовании на системах с несколькими мониторами, параметры hdcSrc и hdcDest должны задавать одно устройство, иначе функция завершится ошибкой. Для переноса данных между разными устройствами сконвертируйте DDB в DIB с помощью функции GetDIBits. Для вывода DIB на втором устройстве используйте функцию SetDIBits или StretchDIBits.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


PlgBlt

Выполняет побитовую передачу данных о цвете из заланного прямоугольника в исходном контексте устройства в заданный параллелограмм целевого контекста устройства. Если в функцию передана маска с корректным монохромным растровым изображением, функция будет ее использовать для маскирования цветовых битов исходного прямоугольника.

Прототип

BOOL PlgBlt(

_In_ HDC hdcDest,

_In_ const POINT *lpPoint,

_In_ HDC hdcSrc,

_In_ int nXSrc,

_In_ int nYSrc,

_In_ int nWidth,

_In_ int nHeight,

_In_ HBITMAP hbmMask,

_In_ int xMask,

_In_ int yMask

);

Параметры

hdcDest [in]

Описатель целевого контекста устройства.

lpPoint [in]

Указатель на массив из трех точек, задающих три угла целевого параллелограмма в логическом пространстве. Левый верхний угол задается первой точкой в массиве, правый верхний угол - второй точкой, левый нижний угол - третьей точкой. Правый нижний угол исходного прямоугольника косвенно отображается в четвертую точку параллелограмма. Каждая точка задается в виде структуры POINT.

hdcSrc [in]

Описатель исходного контекста устройства.

nXSrc [in]

Горизонтальная координата левого верхнего угла исходного прямоугольника в логических единицах.

nYSrc [in]

Вертикальная координата левого верхнего угла исходного прямоугольника в логических единицах.

nWidth [in]

Ширина исходного прямоугольника в логических единицах.

nHeight [in]

Высота исходного прямоугольника в логических единицах.

hbmMask [in]

Описатель дополнительного монохромного изображения, используемого для маскирования цветов в исходном прямоугольнике.

xMask [in]

Горизонтальная координата левого верхнего угла монохромного изображения в логических единицах.

yMask [in]

Вертикальная координата левого верхнего угла монохромного изображения в логических единицах.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Функция PlgBlt работает с изображениями, зависящими от устройства (Device-Dependent Bitmaps - DDB).

Четвертая вершина параллелограмма (D) вычисляется путем предлставления первых трех вершин (A, B и C) в виде векторов и вычислением выражения:

D = B + CA.

Если задана маска, значение 1 в маске говорит о том, что исходный пиксель должен быть скопирован. Значение ноль вмаске говорит о том, что пиксель в целевом контексте устройства должен остаться без изменений. Если размер маски меньше, чем исходный и целевой прямоугольники, функция воспроизводит шаблон маски.

Операции масштабирования, перемещения (translation) и отражения (reflection) допустимы в исходном контексте устройства. А вот поворот и обрезка (shear) - нет. Если маска не является монохромным изображением, произойдет ошибка. При растяжении или сжатии изображения используется текущий режим сжатия целевого контекста устройства.

Если исходный контекст устройства задает контекст устройства расширенного метафайла и в него ведется запись, то произойдет ошибка.

Целевые координаты пересчитываются в соответствии с целевым контекстом устройства; исходные координаты пересчитываются в соответствии с исходным контекстом устройства. Если в исходном контексте устройства имеет место операция поворота или обрезки, то произойдет ошибка.

Если исходный и целевой контексты устройства имеют разный цветовой формат, функция PlgBlt сконвертирует исходный прямоугольник так, чтобы его цветовой формат соответствовал формату целевого прямоугольника.

Не все устройства поддерживают функцию PlgBlt. Для более подробной информации смотрите описание возможности RC_BITBLT в функции GetDeviceCaps.

Если исходный и целевой контексты устройства описывают несовместимые друг с другом устройства, функция PlgBlt вернет ошибку.

При использовании систем с несколькими мониторами параметры hdcSrc и hdcDest должны описывать одно устройство, иначе произойдет ошибка. Для перемещения данных между разными устройствами сконвертируйте растровое изображение в DIB с помощью функции GetDIBits. Для отображения DIB используйте функцию SetDIBits или StretchDIBits.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


SetBitmapDimensionEx

Устанавливает предпочтительные размеры изображения. Эти размеры могут использоваться приложением; однако, они не используются системой.

Прототип

BOOL SetBitmapDimensionEx(

_In_ HBITMAP hBitmap,

_In_ int nWidth,

_In_ int nHeight,

_Out_ LPSIZE lpSize

);

Параметры

hBitmap [in]

Описатель изображения. Изображение не может быть секцией DIB.

nWidth [in]

Ширина изображения в десятых долях миллиметра.

nHeight [in]

Высота изображения в десятых долях миллиметра.

lpSize [out]

Указатель на структуру SIZE, в которую будут записаны предыдущие размеры изображения. Данный параметр может быть равен NULL.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение ноль.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

#include "Constants.h"

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Загружаем растровое изображение из ресурсов

HBITMAP hbitmap = NULL;

hbitmap = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(ID_BITMAP));

//Устанавливаем размеры изображения

SetBitmapDimensionEx(hbitmap, 100, 100, NULL);

//Извлекаем размеры изображения

SIZE size;

GetBitmapDimensionEx(hbitmap, &size);

//Выводим размеры на экран

char s[50];

sprintf(s, "(%d; %d)", size.cx, size.cy);

MessageBox(NULL, s, "", MB_OK);

//Удаляем растровое изображение

DeleteObject(hbitmap);

return 0;

}

В данном примере из ресурсов загружается изображение. С помощью функции SetBitmapDimensionEx для него устанавливается размер 100 на 100. Затем, с помощью функции GetBitmapDimensionEx, данный размер получется на основе изображения и выводится на экран. Если все сделано правильно, то на экран будет выведена строка "(100; 100)".

Примечание

Приложение может получить размеры, установленные для изображения, с помощью функции GetBitmapDimensionEx.

Изображение, задаваемое параметром hBitmap не может быть секцией DIB, созданной функцией CreateDIBSection. Если изображение является секцией DIB, то функция вернет ошибку.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


SetDIBits

Устанавливает пиксели совместимого изображения (DDB), используя данные о цвете, найденные в заданном DIB.

Прототип

int SetDIBits(

_In_ HDC hdc,

_In_ HBITMAP hbmp,

_In_ UINT uStartScan,

_In_ UINT cScanLines,

_In_ const VOID *lpvBits,

_In_ const BITMAPINFO *lpbmi,

_In_ UINT fuColorUse

);

Параметры

hdc [in]

Описатель контекста устройства.

hbmp [in]

Описатель совместимого растрового изображения (DDB), которое будет изменено на основе данных из DIB.

uStartScan [in]

Начальная строка (scan line) информации о цвете в массиве lpvBits.

cScanLines [in]

Количество строк в массиве, содержащем данные о DIB.

lpvBits [in]

Указатель на данные о цвете DIB, представленные в виде массива байтов. Формат элементов массива зависит от значения поля biBitCount структуры BITMAPINFO, на которую указывает параметр lpbmi.

lpbmi [in]

Указатель на структуру BITMAPINFO, содержащую информацию о DIB.

fuColorUse [in]

Задает в каком формате представлены значения поля bmiColors структуры BITMAPINFO: в формате RGB, или в виде индексов палитры. Допустимые значения этого параметра перечислены ниже.

DIB_PAL_COLORS - таблица цветов состоит из массива 16-разрядных индексов в логической палитре контекста устройства hdc.

DIB_RGB_COLORS - таблица цветов состоит из значений в формате RGB.

Возвращаемое значение

Количество скопированных строк (scan lines).

Возвращаемое значение в случае ошибки

Значение ноль. Функция GetLastError может вернуть следующий код ошибки.

ERROR_INVALID_PARAMETER - один или более параметров имеют недопустимое значение.

Пример использования

Пример использования приведен здесь.

Примечание

Наибольшая скорость работы достигается когда цвета изображения представлены в виде индексов системной палитры.

Приложения могут получить цвета системной палитры и их индексы с помощью функции GetSystemPaletteEntries. После получения цветов и индексов, приложение может создать DIB (не зависящее от устройства изображение).

Контекст устройства hdc используется только в том случае, если параметр fuColorUse имеет значение DIB_PAL_COLORS. В противном случае оно игнорируется.

Изображение hbmp не должно быть выбрано в контексте устройства во время работы этой функции.

Для всех изображений, кроме изображений, сжатых алгоритмом RLE, строки (scan lines) должны быть выровнены по границе двойного слова (DWORD).

Начало DIB, ориентированных снизу вверх, располагается в левом нижнем углу. Начало DIB, ориентированных сверху вниз, располагается в левом верхнем углу.

ICM: управление цветом ведется только если оно включено функцией SetICMMode (значение параметра iEnableICM равно ICM_ON).Если растровое изображение lpbmi имеет структуру BITMAPV4HEADER, которая задает значения гаммы (gamma) и концевых точек (endpoints), или структуру BITMAPV5HEADER, которая задает либо гамму и концевые точки, либо данные профиля (profileData) и размер профиля (profileSize), то функция интерпретирует пиксели изображения так, как будто они выражены в пространстве цветов, заданном этими структурами, а не в исходном пространстве цветов контекста устройства.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


SetDIBitsToDevice

Устанавливает пиксели заданного прямоугольника на устройстве, используя данные о цвете DIB, JPEG или PNG изображения.

Прототип

int SetDIBitsToDevice(

_In_ HDC hdc,

_In_ int XDest,

_In_ int YDest,

_In_ DWORD dwWidth,

_In_ DWORD dwHeight,

_In_ int XSrc,

_In_ int YSrc,

_In_ UINT uStartScan,

_In_ UINT cScanLines,

_In_ const VOID *lpvBits,

_In_ const BITMAPINFO *lpbmi,

_In_ UINT fuColorUse

);

Параметры

hdc [in]

Описатель контекста устройства.

XDest [in]

Горизонтальная координата левого верхнего угла целевого прямоугольника в логических единицах.

YDest [in]

Вертикальная координатиа левого верхнего угла целевого прямоугольника в логических единицах.

dwWidth [in]

Ширина изображения в логических единицах.

dwHeight [in]

Высота изображения в логических единицах.

XSrc [in]

Горизонтальная координата левого нижнего угла изображения, в логических единицах.

YSrc [in]

Вертикальная координата левого нижнего угла изображения, в логических единицах.

uStartScan [in]

Начальная строка (scan line) в изображении.

cScanLines [in]

Количество строчек DIB, входящих в состав массива lpvBits.

lpvBits [in]

Указатель на данные о цвете, представленные в виде массива байт.

lpbmi [in]

Указатель на структуру BITMAPINFO, содержащую информацию о DIB.

fuColorUse [in]

Задает формат поля bmiColors структуры BITMAPINFO: цвета в формате RGB, или индексы в палитре. Допустимые значения этого параметра перечислены ниже.

DIB_PAL_COLORS - таблица цветов является массивом 16-разрядных индексов цветов в текущей логической палитре.

DIB_RGB_COLORS - таблица цветов содержит цвета в формате RGB.

Возвращаемое значение

Количество установленных строк (scan lines).

Возвращаемое значение в случае ошибки

Значение ноль.

Если драйвер не поддерживает JPEG или PNG изображение, переданное в функцию, то функция завершится ошибкой и вернет значение GDI_ERROR. В этом случае, прложение должно самостоятельно сконвртировать изображение из формата JPEG или PNG в BMP и затем передать его в функцию SetDIBitsToDevice.

Пример использования

Пример использования приведен здесь.

Примечание

Наибольшая скорость работы достигается тогда, когда цвета пикселей изображения заданы в виде индексов в системной палитре.

Приложения могут получить цвета системной палитры и их индексы с помощью функции GetSystemPaletteEntries. После этого приложение может создать DIB.

Для всех изображений кроме изображений, сжатых по алгоритму RLE, строки должны быть выровнены по границе двойного слова (DWORD).

Начало DIB, ориентированного снизу вверх, находится в левом нижнем углу изображения. Начало DIB, ориентированного сверху вниз, находится в левом верхнем углу.

Для уменьшения объема памяти, необходимого для установки бит из большого DIB, приложение может несколько раз вызывать функцию SetDIBItsToDevice, размещая в массиве lpvBits разные части изображения. Параметры uStartScan и cScanLines позволяют задать часть изображения, содержащегося в массиве lpvBits.

Функция SetDIBitsToDevice вернет ошибку, если она вызвана процессом, работающим в фоновом режиме, в то время, как на переднем фоне во весь экран развернута сессия MS-DOS.

· Если значение поля biCompression структуры BITMAPINFOHEADER (входит в состав структуры BITMAPINFO) равно BI_JPEG или BI_PNG, то параметр lpvBits указывает на буфер, содержащий JPEG или PNG изображение. Поле biSizeImage задает размер буфер. Параметр fuColorUse должен иметь значение DIB_RGB_COLORS.
· Для гарантирования корректной обработки JPEG или PNG изображений приложения, до использования функции SetDIBitsToDevice, должны использовать CHECKJPEGFORMAT и CHECKPNGFORMAT, проверяющих, распознает ли принтер JPEG и PNG изображения, соответственно.

ICM: управление цветом ведется только если оно включено функцией SetICMMode (значение параметра iEnableICM равно ICM_ON).Если растровое изображение lpbmi имеет структуру BITMAPV4HEADER, которая задает значения гаммы (gamma) и концевых точек (endpoints), или структуру BITMAPV5HEADER, которая задает либо гамму и концевые точки, либо данные профиля (profileData) и размер профиля (profileSize), то функция интерпретирует пиксели изображения так, как будто они выражены в пространстве цветов, заданном этими структурами, а не в исходном пространстве цветов контекста устройства.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


SetPixel

Устанавливает цвет заданного пикселя.

Прототип

COLORREF SetPixel(

_In_ HDC hdc,

_In_ int X,

_In_ int Y,

_In_ COLORREF crColor

);

Параметры

hdc [in]

Описатель контекста устройства.

X [in]

Горизонтальная координата пикселя, в логических единицах.

Y [in]

Вертикальная координата пикселя, в логических единицах.

crColor [in]

Устанавливаемый цвет пикселя. Для создания значения типа COLORREF используйте макрос RGB.

Возвращаемое значение

Установленный цвет пикселя в формате RGB. Данное значение может отличаться от значения crColor. Это произойдет, если устройство не смогло найти цвет, полностью соответствующий желаемому.

Возвращаемое значение в случае ошибки

Значение -1.

Функция GetLastError может вернуть следующий код ошибки.

ERROR_INVALID_PARAMETER - один или несколько входных параметров имеют недопустимое значение.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

#include "Constants.h"

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Загружаем растровое изображение из ресурсов

HBITMAP hbitmap = NULL;

hbitmap = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(ID_BITMAP));

//Создаем контекст устройства

HDC hdc;

hdc = CreateCompatibleDC(GetDC(NULL));

//Выбираем в нем изображение

SelectObject(hdc, hbitmap);

//Устанавливаем цвет пикселя

COLORREF color = RGB(0x00, 0xFF, 0x00);

SetPixel(hdc, 25, 25, color);

//Получаем цвет пикселя

color = GetPixel(hdc, 25, 25);

//Выводим цвет на экран

char s[50];

sprintf(s, "(%d; %d; %d)", GetRValue(color), GetGValue(color), GetBValue(color));

MessageBox(NULL, s, "", MB_OK);

//Удаляем контекст устройства

DeleteDC(hdc);

//Удаляем растровое изображение

DeleteObject(hbitmap);

return 0;

}

В данном примере в изображении, загруженном из ресурсов меняется цвет пикселя с координатами (25; 25). После чего цвет этого пикселя извлекается с помощью функции GetPixel и на экран выводятся компоненты этого цвета.

Примечание

Если координаты пикселя выходят за границы текущего региона отсечения, то функция завершается ошибкой.

Не все устройства поддерживают функцию SetPixel. Для проверки наличия поддержки используйте функцию GetDeviceCaps.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


SetPixelV

Устанавливает цвет заданного пикселя. Цвет подбирается ближайшим к заданному цвету. Пиксель должен принадлежать региону отсечения и видимой части поверхности устройства.

Прототип

BOOL SetPixelV(

_In_ HDC hdc,

_In_ int X,

_In_ int Y,

_In_ COLORREF crColor

);

Параметры

hdc [in]

Описатель контекста устройства.

X [in]

Горизонтальная координата пикселя в логических единицах.

Y [in]

Вертикальная координата пикселя в логических единицах.

crColor [in]

Устанавливаемый цвет пикселя. Для создания значения типа COLORREF используйте макрос RGB.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

#include "Constants.h"

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Загружаем растровое изображение из ресурсов

HBITMAP hbitmap = NULL;

hbitmap = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(ID_BITMAP));

//Создаем контекст устройства

HDC hdc;

hdc = CreateCompatibleDC(GetDC(NULL));

//Выбираем в нем изображение

SelectObject(hdc, hbitmap);

//Устанавливаем цвет пикселя

COLORREF color = RGB(0x00, 0xFF, 0x00);

SetPixelV(hdc, 25, 25, color);

//Получаем цвет пикселя

color = GetPixel(hdc, 25, 25);

//Выводим цвет на экран

char s[50];

sprintf(s, "(%d; %d; %d)", GetRValue(color), GetGValue(color), GetBValue(color));

MessageBox(NULL, s, "", MB_OK);

//Удаляем контекст устройства

DeleteDC(hdc);

//Удаляем растровое изображение

DeleteObject(hbitmap);

return 0;

}

Данный пример аналогичен примеру, приводимому для функции SetPixel, с той лишь разницей, что вместо функции SetPixel используется функция SetPixelV.

Примечание

Не все устройства поддерживают функцию SetPixelV. Более подробно смотрите описание возможности RC_BITBLT для функции GetDeviceCaps.

Функция SetPixelV быстрее функции SetPixel, так как ей не нужно запрашивать цвет отрисовываемого пикселя.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


SetStretchBltMode

Устанавливает режим растяжения растрового изображения в заданном контексте устройстве.

Прототип

int SetStretchBltMode(

_In_ HDC hdc,

_In_ int iStretchMode

);

Параметры

hdc [in]

Описатель контекста устройства.

iStretchMode [in]

Режим растяжения. Допустимые значения этого параметра перечислены здесь.

Возвращаемое значение

Предыдущий режим растяжения.

Возвращаемое значение в случае ошибки

Значение нуль. Функция GetLastError может вернуть код ошибки, приведенный ниже.

ERROR_INVALID_PARAMETER - один или несколько параметров имеют недопустимое значение.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Получаем контекст устройства

HDC hdc = GetDC(NULL);

//Меняем режим растяжения и запоминаем прежний режим

int StretchMode_old;

StretchMode_old = SetStretchBltMode(hdc, COLORONCOLOR);

//Получаем режим растяжения

int StretchMode = 0;

StretchMode = GetStretchBltMode(hdc);

//Выводим его на экран

char s[50];

sprintf(s, "%d", StretchMode);

MessageBox(NULL, s, "", MB_OK);

//Восстанавливаем исходный режим растяжения

SetStretchBltMode(hdc, StretchMode_old);

return 0;

}

В результате работы этой программы на экран выводится число 3, которое соответствует константе COLORONCOLOR.

Примечание

Режим растяжения описывает как система объединяет строки или колонки растрового изображения с существующими пикселями устройства вывода когда приложение вызывает функцию StretchBlt.

Режимы BLACKONWHITE (STRETCH_ANDSCANS) и WHITEONBLACK (STRETCH_ORSCANS) обычно используются для сохранения пикселей переднего плана монохромных изображений. Режим COLORONCOLOR (STRETCH_DELETESCANS) обычно используется для сохранения цвета в цветных изображениях.

Режим HALFTONE медленнее и требует больше времени на обработку изображения, чем три других режима. Но он создает самое качественное изображение. Также помните, что после установки режима HALFTONE, должна быть вызвана функция SetBrushOrgEx для предотвращения отклонения кисти (brush misalignment).

В зависимости от возможностей драйвера устройства могут быть доступны и другие режимы растяжения.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


StretchBlt

Копирует растровое изображение (bitmap) из одного прямоугольника в другой, растягивая или сжимая изображение пи необходимости. Растяжение или сжатие осуществляется в соответстви с текущим режимом растяжения, установленным в целевом контексте устройства.

Прототип

BOOL StretchBlt(

_In_ HDC hdcDest,

_In_ int nXOriginDest,

_In_ int nYOriginDest,

_In_ int nWidthDest,

_In_ int nHeightDest,

_In_ HDC hdcSrc,

_In_ int nXOriginSrc,

_In_ int nYOriginSrc,

_In_ int nWidthSrc,

_In_ int nHeightSrc,

_In_ DWORD dwRop

);

Параметры

hdcDest [in]

Описатель целевого контекста устройства.

nXOriginDest [in]

Горизонтальная координата левого верхнего угла целевого прямоугольника, в логических единицах.

nYOriginDest [in]

Вертикальная координата левого верхнего угла целевого прямоугольника, в логических единицах.

nWidthDest [in]

Ширина целевого прямоугольника в логических единицах.

nHeightDest [in]

Высота целевого прямоугоьника в логических единицах.

hdcSrc [in]

Описатель исходного контекста устройства.

nXOriginSrc [in]

Горизонтальная координата левого верхнего угла исходного прямоугольника, в логических единицах.

nYOriginSrc [in]

Вертикальная координата левого верхнего угла исходного прямоугольника, в логических единицах.

nWidthSrc [in]

Ширина исходного прямоугольника, в логических единицах.

nHeightSrc [in]

Высота исходного прямоугольника, в логических единицах.

dwRop [in]

Выполняемая растровая операция. Данный параметр определяет как система должна объединять цвета в операции вывода, в которой задействуются кисть, исходное растровое изображение и целевое растровое изображение.

Допустимые значения этого параметра перечислены здесь. Учтите, что операция CAPTUREBLT обычно неприменима для контекстов печатающих устройств.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Функция StretchBlt растягивает или сжимает исходное изображение в памяти, а затем копирует результат в целевой прямоугольник. Изображение может зависеть от устройства (DDB) или же быть результатом работы функции CreateDIBSection. Данные о цвете для шаблона и целевых пикселей объединяются после растяжения или сжатия.

Если исходный контекст устройства задает устройство расширенного метафайла и одновременно ведется запись расширенного метафайла, то произойдет ошибка. Функция в этом случае вернет значение FALSE.

Если в заданной растровой операции нужна кисть, система будет использовать кисть, выбранную в целевом контексте устройства.

Целевые координаты преобразуются с помощью операции, заданной для целевого контекста устройства. Исходные координаты преобразуются с помощью операции, заданной для исходного контекста устройства.

Если исходная операция включает в себя поворот или обрезку (shear), то происходит ошибка.

Если исходное, целевое и растровое изображение кисти имеют разный цветовой формат, функция StretchBlt сконвертирует исходное растровое изображение и изображение кисти так, чтобы их цветовой формат соответствовал формату целевого растрового изображения.

Если функция StretchBlt должна сконвертировать монохромное изображение в цветное, она устанавливает белые биты (1) в цвет фона (background), а черные биты (0) в цвет переднего плана (foreground). При конвертировании цветного изображения в монохромное, она устанавливает все пиксели, имеющий цвет фона, в белый цвет (1), а все остальные пиксели в черный (0). Во время этих операций используются цвета фона и переднего плана, заданные для контекста устройства.

Если размеры исходного и целевого прямоугольников имеют разные знаки, то функция StretchBlt создает зеркальную копию изображения. Если параметры nWidthSrc и nWidthDest имеют разный знак, то функция создает зеркальную копию вдоль горизонтальной оси. Если параметры nHeightSrc и nHeightDest имеют разный знак, то функция создает зеркальную копию вдоль вертикальной оси.

Не все устройства поддерживают функцию StretchBlt. Для более подробной информации смотрите описание функции GetDeviceCaps.

При выполнении операции переноса управление цветом не осуществляется.

При использовании системы с несколькими мониторами, параметры hdcSrc и hdcDest должны задавать одно устройство, в противном случае функция завершится ошибкой. Для переноса данных между разными устройствами, сконвертируйте растровое изображение в DIB с помощью функции GetDIBits. Для отображения DIB на втором устройстве используйте функцию SetDIBits или StretchDIBits.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


StretchDIBits

Копирует данные о цвете DIB, JPEG или PNG изображения из одного прямоугольника в другой. Если целевой прямоугольник больше исходного, функция растягивает строки и столбцы данных о цвете для заполнения целевого прямоугольника. Если целевой прямоугольник меньше исходного, функция сжимает строки и столбцы посредством заданной растровой операции.

Прототип

int StretchDIBits(

_In_ HDC hdc,

_In_ int XDest,

_In_ int YDest,

_In_ int nDestWidth,

_In_ int nDestHeight,

_In_ int XSrc,

_In_ int YSrc,

_In_ int nSrcWidth,

_In_ int nSrcHeight,

_In_ const VOID *lpBits,

_In_ const BITMAPINFO *lpBitsInfo,

_In_ UINT iUsage,

_In_ DWORD dwRop

);

Параметры

hdc [in]

Описатель целевого контекста устройства.

XDest [in]

Горизонтальная координата левого верхнего угла целевого прямоугольника, в логических единицах.

YDest [in]

Вертикальная координата левого верхнего угла целевого прямоугольника, в логических единицах.

nDestWidth [in]

Ширина целевого прямоугольника в логических единицах.

nDestHeight [in]

Высота целевого прямоугольника в логических единицах.

XSrc [in]

Горизонтальная координата исходного прямоугольника в пикселях.

YSrc [in]

Вертикальная координата исходного прямоугольника в пикселях.

nSrcWidth [in]

Ширина исходного прямоугольника в пикселях.

nSrcHeight [in]

Высота исходного прямоугольника в пикселях.

lpBits [in]

Указатель на биты изображения, представленные в виде массива байт.

lpBitsInfo [in]

Указатель на структуру BITMAPINFO, содержащую информацию о DIB.

iUsage [in]

Определяет в каком формате хранятся цвета в поле bmiColors структуры BITMAPINFO: в формате RGB, или в виде индексов. Допустимые значения этого параметра перечислены ниже.

DIB_PAL_COLORS - массив содержит 16-разрядные индексы цветов в логической палитре исходного контекста устройства.

DIB_RGB_COLORS - таблица цветов содержит значения в формате RGB.

dwRop [in]

Код растровой операции, который определяет правила объединения исходных пикселей, кисти целевого контекста устройства и пикселей целевого прямоугольника при формировании нового изображения. Допустимые значения этого параметра перечислены здесь.

Возвращаемое значение

Количество скопированных строк (scan lines). Учтите, что для зеркалированного содержимого (mirrored content), возвращаемое значение может быть меньше нуля.

Возвращаемое значение в случае ошибки

Значение ноль.

Если драйвер не поддерживает JPEG или PNG изображения, переданные в функцию, то завершится ошибкой и вернет значение GDI_ERROR. Если это произошло, то приложение должно само распаковать JPEG или PNG изображение в формат BMP и затем передать его в функцию StretchDIBits.

Пример использования

Пример использования приведен здесь.

Примечание

Начало DIB, ориентированного снизу вверх, находится в левом нижнем углу. Начало DIB, ориентированного сверху вниз, находится в левом верхнем углу.

Если значения параметров nSrcWidth и nDestWidth, или nSrcHeight и nDestHeight имеют разный знак, функция создаст зеркальную копию изображения. Если параметры nSrcWidth и nDestWidth имеют разный знак, то будет создана зеркальная копия вдоль горизонтальной оси. Если параметры nSrcHeight и nDestHeight имеют разный знак, то будет создана зеркальная копия вдоль вертикальной оси.

Если значение поля biHeight структуры BITMAPINFOHEADER (входит в состав структуры BITMAPINFO) меньше нуля, то функция создаст изображение, ориентированное сверху вниз.

Функция StretchDIBits может принимать JPEG и PNG изображения. Назначение всех параметров в этом случае остается прежним, кроме случаев перечисленных ниже.

· Если поле biCompression структуры BITMAPINFOHEADER имеет значение BI_JPEG или BI_PNG, то параметр lpBits должен указывать на буфер, содержащий JPEG или PNG изображение, соответственно. Поле biSizeImage структуры BITMAPINFOHEADER задает размер буфера. Параметр iUsage должен иметь значение DIB_RGB_COLORS. Параметр dwRop должен иметь значение SRCCOPY.
· Для гарантирования корректной обработки метафайла во время печати приложения до вызова функции должны использовать CHECKJPEGFORMAT или CHECKPNGFORMAT для проверки того, что принтер распознает JPEG или PNG файлы.

ICM: управление цветом ведется только если оно включено функцией SetICMMode (значение параметра iEnableICM равно ICM_ON).Если растровое изображение lpBitsInfo имеет структуру BITMAPV4HEADER, которая задает значения гаммы (gamma) и концевых точек (endpoints), или структуру BITMAPV5HEADER, которая задает либо гамму и концевые точки, либо данные профиля (profileData) и размер профиля (profileSize), то функция интерпретирует пиксели изображения так, как будто они выражены в пространстве цветов, заданном этими структурами, а не в исходном пространстве цветов контекста устройства.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


TransparentBlt

Выполняет побитовую передачу данных о цвете заданного прямоугольника из одного контекста устройства в другой.

Прототип

BOOL TransparentBlt(

_In_ HDC hdcDest,

_In_ int xoriginDest,

_In_ int yoriginDest,

_In_ int wDest,

_In_ int hDest,

_In_ HDC hdcSrc,

_In_ int xoriginSrc,

_In_ int yoriginSrc,

_In_ int wSrc,

_In_ int hSrc,

_In_ UINT crTransparent

);

Параметры

hdcDest [in]

Описатель целевого контекста устройства.

xoriginDest [in]

Горизонтальная координата левого верхнего угла целевого прямоугольника в логических единицах.

yoriginDest [in]

Вертикальная координата левого верхнего угла целевого прямоугольника в логических единицах.

wDest [in]

Ширина целевого прямоугольника в логических единицах.

hDest [in]

Высота целевого прямоугольника в логических единицах.

hdcSrc [in]

Описатель исходного контекста устройства.

xoriginSrc [in]

Горизонтальная координата исходного прямоугольника, в логических единицах.

yoriginSrc [in]

Вертикальная координата исходного прямоугольника, в логических единицах.

wSrc [in]

Ширина исходного прямоугольника в логических единицах.

hSrc [in]

Высота исходного прямоугольника в логических единицах.

crTransparent [in]

Цвет в формате RGB в исходном изображении, который должен интерпретироватся как прозрачный.

Возвращаемое значение

Значение TRUE.

Возвращаемое значение в случае ошибки

Значение FALSE.

Пример использования

Пример использования приведен здесь.

Примечание

Функция TransparentBlt работает с совместимыми изображениями (DDB).

Функция TransparentBlt поддерживает все форматы исходных растровых изображений. Однако, для изображений с глубиной цвета 32 бита на пиксель, функция просто копирует значения альфа канала. Для определения прозрачных изображений с глубиной цвета 32 бита на пиксель используйте функцию AlphaBlend.

Если исходный и целевой прямоугольники имеют разные размеры, исходное изображение будет растянуто до размеров целевого прямоугольника. Если использовалась функция SetStretchBltMode, то для функции TransparentBlt режимы BLACKONWHITE и WHITEONBLACK будут заменены на COLORONCOLOR.

Целевой контекст устройства определяет тип преобразования для целевых координат. Исходный контекст устройства задает тип преобразования для исходных координат.

Если ширина или высота исходного или целевого прямоугольников имеют отрицательное значение, то функция TransparentBlt не зеркалирует изображение.

При работе на системе с несколькими мониторами, параметры hdcSrc и hdcDest должны описывать одно устройство, в противном случае функция завершится ошибкой. Для передачи данных между контекстами (DC) разных устройств, вначале сконвертируйте изображение в DIB с помощью функции GetDIBits. Для отображения DIB на втором устройстве используйте функцию SetDIBits или StretchDIBits.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | msimg32.dll


BeginUpdateResource

Возвращает описатель, который может быть использован функцией UpdateResource для добавления, удаления или замещения ресурсов в двоичном модуле.

Прототип

HANDLE WINAPI BeginUpdateResource(

_In_ LPCTSTR pFileName,

_In_ BOOL bDeleteExistingResources

);

Параметры

pFileName[in]

Строка с именем файла, ресурсы которого будут изменяться. Приложение должно иметь возможность получить право на запись в этот файл. Файл pFileName не должен исполняться как процесс. Если pFileName не содержит полный путь к файлу, то система будет искать файл в текущем каталоге.

bDeleteExistingResources[in]

Определяет, нужно ли удалять существующие ресурсы в файле pFileName. Если значение этого параметра равно TRUE, то существующие ресурсы удаляются, из-за этого обновленный файл будет содержать только те ресурсы, которые были добавлены ему вызовом функции UpdateResource. Если же значение этого параметра равно FALSE, то обновленный файл будет содержать ранее существовавшие ресурсы, если они не были удалены или изменены вызовом функции UpdateResource.

Возвращаемое значение

Описатель, который может быть использован функциями UpdateResource и EndUpdateResource.

Возвращаемое значение в случае ошибки

Если указанный файл не является PE файлом, он не найден, или его не удалоcь открыть для записи, то возвращается значение NULL. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Рекомендуется, чтобы редактируемый файл с ресурсами не был загружен в память перед вызовом этой функции. Тем не менее, если этот файл уже загружен в память, функция не вернет ошибку.

Существует ряд ограничений на обновление ресурсов в файлах, содержащих данные о конфигурации ресурсов (Resource Configuration data): LN файлы и ассоциированные mui файлы. Более подробно в описании функции UpdateResource.

Данная функция может обновлять ресурсы в модулях содержащих и код и ресурсы. Как говорилось выше, существуют ограничения на обновление ресурсов в LN и mui файлах, которые содержат конфигурационные данные ресурсов. Более подробно об этих ограничениях рассказано в описании функции UpdateResource.

Заголовочный файл | winbase.h (подключен в windows.h)
Экспортирующая библиотека | kernel32.dll
ANSI и Unicode наименования | BeginUpdateResourceA и BeginUpdateResourceW


CopyImage

Создаёт новое изображение (иконку, курсор или растровое изображение) и копирует атрибуты заданного изображения в новое. Если необходимо, функция растянет исходное изображение до нужного размера.

Прототип

HANDLE WINAPI CopyImage(

_In_ HANDLE hImage,

_In_ UINT uType,

_In_ int cxDesired,

_In_ int cyDesired,

_In_ UINT fuFlags

);

Параметры

hImage[in]

Описатель копируемого изображения.

uType[in]

Тип копируемого изображения. Принимает одно из значений перечисленных ниже.

IMAGE_BITMAP (0) - растровое изображение (bitmap).

IMAGE_CURSOR (2) - курсор.

IMAGE_ICON (1) - иконка.

cxDesired[in]

Желаемая ширина изображения в пикселях. Если значение этого параметра равно нулю, то возвращенное изображение будет иметь ту же ширину, что и исходное hImage.

cyDesired[in]

Желаемая высота изображения в пикселях. Если значение этого параметра равно нулю, то возвращенное изображение будет иметь ту же высоту, что и исходное hImage.

fuFlags[in]

Набор флагов. Принимает одно из значений перечисленных ниже или их комбинацию.

LR_COPYDELETEORG (0x00000008) - удаляет оригинальное изображение после создания копии.

LR_COPYFROMRESOURCE (0x00004000) - пытаеся перезагрузить ресурс иконки или курсора из оригинального ресурса модуля, а не просто скопировать имеющееся изображение. Это полезно при создании отличающейся в размерах копии, когда файл ресурсов содержит ресурсы разных размеров. Без этого флага, функция CopyImage растянет оригинальное изображение до нужного размера. Если данный флаг установлен, то функция CopyImage использует ресурс, размеры которого ближе всего к желаемому размеру. Это удастся только если изображение hImage было загружено с помощью функции LoadIcon, LoadCursor или LoadImage с флагом LR_SHARED.

LR_COPYRETURNORG (0x00000004) - возвращает оригинальное изображение hImage если оно соответствует критериям для копирования - то есть,имеет корректные размеры и глубину цвета. В этом случае флаг LR_COPYDELETEORG игнорируется. Если флаг LR_COPYRETURNORG не установлен то всегда создается новый изображение.

LR_CREATEDIBSECTION (0x00002000) - если усановлен этот флаг и создается растровое изображение, то оно создается как секция независимого от устройства растрового изображения (DIB section). Если флаг не установлен, то растровое изображение создается зависимым от устройства. Данный флаг используется только если значение параметра uType равно IMAGE_BITMAP.

LR_DEFAULTSIZE (0x00000040) - в том случае если значения параметров cxDsired или cyDesired равны нулю, функция использует ширину или высоту указанную в значениях системных метрик для курсоров или иконок. Если этот флаг не указан, а значения параметров cxDsired и cyDesired равны нулю, функция использует фактиченский размер ресурса. Если ресурс содержит несколько изображений, функция использует размер первого изображения.

LR_MONOCHROME (0x00000001) - создать новое чернобелое изображение.

Возвращаемое значение

Описатель созданного изображения.

Возвращаемое значение в случае ошибки

NULL. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

В приводимом ниже примере мы с помощью функции LoadImage загружаем из ресурсов иконку и создаём её копию.

#include <windows.h>

#include "Constants.h"

int main()

{

HICON hicon1,hicon2;

//Загружаем иконку из ресурсов

hicon1 = LoadImage(GetModuleHandle(NULL),MAKEINTRESOURCE(ID_ICON),IMAGE_ICON,0,0,0);

//Создаем копию иконки

hicon2 = CopyImage(hicon1,IMAGE_ICON,0,0,0);

//Выводим описатели

printf("%X\n",hicon1);

printf("%X\n",hicon2);

//Освобождаем ресурсы

DestroyIcon(hicon2);

DestroyIcon(hicon1);

getchar();

return 0;

}

Примечание

Когда вы завершили использование ресурса, вы должны освободить занимаемую им память путём вызова одной из функций перечисленных ниже:

растровое изображение - DeleteObject;

курсор - DestroyCursor;

иконка - DestroyIcon.

Система автоматически удаляет ресурсы, при уничтожении процесса, который их создал. Тем не менее, вызов этих функций сохранит память и увеличит размер рабочего набора процесса.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll


EndUpdateResource

Подтверждает или отменяет изменения сделанные ранее функцией UpdateResource.

Прототип

BOOL WINAPI EndUpdateResource(

_In_ HANDLE hUpdate,

_In_ BOOL fDiscard

);

Параметры

hUpdate[in]

Описатель модуля, возвращенный функцией BeginUpdateResource и используемый функцией UpdateResource для ссылки на обновляемый файл.

fDiscard[in]

Определяет нужно ли записывать изменения ресурсов в файл. Если значение этого параметра равно TRUE, то изменения не записываются. Если же значение этого параметра равно FALSE, то ресурсы в файле обновляются.

Возвращаемое значение

TRUE.

Возвращаемое значение в случае ошибки

FALSE. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Перед вызовом этой функции убедитесь в том, что все описатели файлов кроме описателя, возвращенного функцией BeginUpdateResource, закрыты.

Данная функция может обновлять ресурсы модулей, содержащих и код и ресурсы. Тем не менее, существуют ограничения на обновление ресурсов в LN и mui файлах, коорые содержат конфигурационные данные ресурсов (Resource Configuration data). Эти ограничения даны в описани функции UpdateResource.

Заголовочный файл | winbase.h (подключен в windows.h)
Экспортирующая библиотека | kernel32.dll
ANSI и Unicode наименования | EndUpdateResourceA и EndUpdateResourceW


EnumResourceLanguages

Перечисляет языковые (language-specific) ресурсы заданного типа и наименования, хранящиеся в двоичном модуле.

Прототип

BOOL WINAPI EnumResourceLanguages(

_In_ HMODULE hModule,

_In_ LPCTSTR lpType,

_In_ LPCTSTR lpName,

_In_ ENUMRESLANGPROC lpEnumFunc,

_In_ LONG_PTR lParam

);

Параметры

hModule[in]

Описатель модуля, в котором ведется поиск. Начиная с Windows Vista, если данный параметр задает нейтральный по отношению к языку исполняемый файл (Language-neutral Portable Executable) (LN файл), то в область поиска также включаются mui файлы (если они есть). Если данный параметр задает mui файл, то поиск ведется только в нем.

Если значение этого параметра равно NULL, то поиск ведется в модуле, создавшем текущий процесс.

lpType[in]

Тип ресурса, для которого перечисляются языки. Вместо указателя на строку данный параметр может содержать значение MAKEINTRESOURCE(ID), где ID - целочисленный идентификатор типа ресурса. Предопределенные типы ресурсов перечислены здесь.

lpName[in]

Наименование ресурса, для которого перечисляются языки. Вместо указателя на строку с наименованием данный параметр может содержать значение MAKEINTRESOURCE(ID), где ID - целочисленный идентификатор ресурса.

lpEnumFunc[in]

Указатель на функцию обратного вызова EnumResLangProc, которая вызывается для каждого найденного языка ресурсов.

lParam[in]

Определенное приложением значение, передаваемое в функцию обратного вызова. Данный параметр может использоваться для проверок на ошибки.

Возвращаемое значение

TRUE.

Возвращаемое значение в случае ошибки

FALSE. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Если значение IS_INTRESOURCE(lpType) равно TRUE, то параметр lpType содержит целочисленный идентификатор типа ресурса. В противном случае, параметр lpType содержит указатель на завершающуюся NULL символом строку. Если первым символом строки является символ решетки (#), то последующие символы описывают целочисленный идентификатор типа ресурса, представленный в десятичной системе счисления. Например, строка "#258" задает идентификатор 258.

Аналогично, если значение IS_INTRESOURCE(lpName) равно TRUE, то параметр lpName содержи целочисленный идентификатор ресурса. В противном случае, параметр lpName содержит указатель на завершающуюся NULL символом строку. Если первым символом строки является символ решетки (#), то последующие символы описывают целочисленный идентификатор типа ресурса, представленный в десятичной системе счисления.

Начиная с Windows Vista, двоичный модуль обычно является нейтральным по отношению к языку исполняемым файлом (language-neutral Portable Executable) (LN файлом). Перечисление также включает ресурсы из соответствующих языковых файлов ресурсов (mui файлов), которые содержат локализованные ресурсы.

Для каждого найденного ресурса функция EnumResourceLanguages вызывает определенную приложением функцию обратного вызова lpEnumFunc, передавая ей идентификатор языка, для которого найден ресурс. Вместе с идентификатором языка в эту функцию передаются некоторые другие параметры функции EnumResourceLanguages.

Приложения могут использовать функцию EnumResourceLanguagesEx, которая предоставляет возможность большего контроля над перечислением ресурсов.

Функция EnumResourceLanguages продолжает перечислять языки ресурсов до тех пор, пока либо функция обратного вызова не вернет значение FALSE, либо не будут перечислены все языки ресурсов.

В Windows Vista и более новых версиях, если параметр hModule задает LN файл, то перечисляемые ресурсы могут находиться в LN файле или в mui файле, ассоциированном с LN файлом. Если mui файла нет, то перечисляются только ресурсы, находящиеся в LN файле. В отличие от функций EnumResourceNames и EnumResourceTypes, функция EnumResourceLanguages осуществляет поиск в нескольких mui файлах. Перечисление начинается с mui файлов, находящихся в каталогах, ассоциированных с функцией EnumUILanguages. Затем поиск ведется в mui файлах, расположение которых соответствует схеме управления ресурсами (MUI Resource Management). Наконец поиск ведется в файле hModule.

Перечисление никогда не включает копии: если ресурс с одинаковым именем, типом и языком содержится и в LN файле и в mui файле, то он будет перечислен лишь единожды.

Заголовочный файл | winbase.h (подключен в windows.h)
Экспортирующая библиотека | kernel32.dll
ANSI и Unicode наименования | EnumResourceLanguagesA и EnumResourceLanguagesW


EnumResourceLanguagesEx

Появилась в Windows Vista. Перечисляет языковые ресурсы заданного типа и наименования, находящиеся в заданном двоичном модуле. Данная функция расширяет функцию EnumResourceLanguages и предоставляет больший контроль над перечислением ресурсов.

Прототип

BOOL WINAPI EnumResourceLanguagesEx(

_In_ HMODULE hModule,

_In_ LPCTSTR lpType,

_In_ LPCTSTR lpName,

_In_ ENUMRESLANGPROC lpEnumFunc,

_In_ LONG_PTR lParam,

_In_ DWORD dwFlags,

_In_ LANGID LangId

);

Параметры

hModule[in]

Описатель модуля, в котором ведется поиск. Обычно это нейтральным по отношению к языку исполняемый файл (language-neutral Portable Executable) (LN файл). Если одновременно с этим установлен флаг RESOURCE_ENUM_MUI, то в область поиска также включаются соответствующие mui файлы. Также параметр hModule может задавать mui файл. В этом случае поиск ведется только в заданном mui файле.

Если значение этого параметра равно NULL, то поиск ведется в модуле, создавшем текущий процесс.

lpType[in]

Тип ресурса, для которого перечисляются языки. Вместо указателя на строку данный параметр может содержать значение MAKEINTRESOURCE(ID), где ID - целочисленный идентификатор типа ресурса. Предопределенные типы ресурсов перечислены здесь.

lpName[in]

Наименование ресурса, для которого перечисляются языки. Вместо указтаеля на строку, данный параметр может содержать значение MAKEINTRESOURCE(ID), где ID - целочисленный идентификатор ресурса.

lpEnumFunc[in]

Указатель на функцию обратного вызова EnumResLangProc, которая будет вызвана дла каждого найденного языка ресурса.

lParam[in]

Определенное приложением значение передаваемое в функцию обратного вызова. Данный параметр может использоваться для проверки на ошибки.

dwFlags[in]

Тип файла, в котором ведется поиск. Подерживаются значения перечисленные ниже. Если значение параметра dwFlags равно нулю, то считается, что заданы флаги RESOURCE_ENUM_LN и RESOURCE_ENUM_MUI.

RESOURCE_ENUM_LN (0x0001) - поиск ведется в файле hModule, независимо от того, описывает он LN файл или mui файл.

RESOURCE_ENUM_MUI (0x0002) - поиск языковых ресурсов ведется в mui файлах, ассоциированных с LN файлом hModule. Если значение параметра LangId отлично от нуля, то поиск ведется только в mui файле, язык которого соответствует языку LangId. Обычно этот флаг используется только в том случае, если параметр hModule задает LN файл. Если параметр hModule задает mui файл, то он "покрывается" флагом RESOURCE_ENUM_LN, несмотря на его наименование.

RESOURCE_ENUM_MUI_SYSTEM (0x0004) - поиск ограничивается системными установленными MUI языками (system-installed MUI languages).

RESOURCE_ENUM_VALIDATE (0x0008) - выполняет при перечислении расширенную проверку секции ресурсов и её описания в PE заголовке, гарантируя тем самым корректное форматирование ресурсов.

LangId[id]

Язык локализации, используемый для ограничения поиска в mui файле. Этот параметр используется только если в параметре dwFlags задан флаг RESOURCE_ENUM_MUI. Если значение параметра LangId равно нулю, то в область поиска включаются все mui файлы. Если же значение параметра LangId отлично от нуля, то поиск ведется только в mui файле, язык которого соответствует языку LangId.

Возвращаемое значение

TRUE. Если ресурсы заданного типа не найдены, то возвращается значение FALSE.

Возвращаемое значение в случае ошибки

FALSE. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Если значение IS_INTRESOURCE(lpType) равно TRUE, то параметр lpType содержит целочисленный идентификатор типа ресурса. В противном случае, параметр lpType содержит указатель на завершающуюся NULL символом строку. Если первым символом строки является символ решетки (#), то последующие символы описывают целочисленный идентификатор типа ресурса, представленный в десятичной системе счисления. Например, строка "#258" задает идентификатор 258.

Аналогично, если значение IS_INTRESOURCE(lpName) равно TRUE, то параметр lpName содержит целочисленный идентификатор ресурса. В противном случае, параметр lpName содержит указатель на завершающуюся NULL символом строку. Если первым символом строки является символ решетки (#), то последующие символы описывают целочисленный идентификатор типа ресурса, представленный в десятичной системе счисления.

Начиная с Windows Vista, двоичный модуль обычно является LN файлом. Перечисление также включает в себя ресурсы из соответствующих языковых файлов ресурсов (mui файлов), которые содержат локализованные ресурсы.

Для каждого найденного ресурса функция EnumResourceLanguagesEx вызывает определенную приложением функцию обратного вызова lpEnumFunc, передавая ей идентификатор языка, для которого найден ресурс. Вместе с идентификатором языка в функцию обратного вызова передаются некоторые другие параметры функции EnumResourceLanguagesEx.

Область поиска может включать в себя и LN файл и ассоциированные с ним mui файлы, или она может быть ограничена отдельным двоичным модулем, или mui файлами, ассоциированными с отдельным LN файлом. Также, путем указания LN файла в параметре hModule и ненулевого значения параметра LangId, область поиска может быть ограничена одним mui файлом, ассоциированным с заданным LN файлом и языком.

Функция EnumResourceLanguagesEx продолжает перечислять языки ресурсов до тех пор, пока либо функция обратного вызова не вернет значение FALSE, или не будут перечислены все языки ресурсов.

Если параметр hModule задает LN файл и заданы оба флага, то перечисляются все языки, ресурсы которых находятся в LN файле, или в ассоциированных с ним mui файлах. Если mui файлов нет, то возвращаются только языки ресурсов из LN файла.

Если параметр dwFlags содержит значение RESOURCE_ENUM_MUI или равен NULL, а значение параметра LangId равно нулю, то первоначально перечисление включает в себя языки системных mui файлов, возвращенных функцией EnumUILanguages. Наконец, если установлен флаг RESOURCE_ENUM_LN то в область поиска также включается файл hModule.

Если значение параметра LangId отлично от нуля, то поиск ведется в mui файле, язык которого соответствует языку LangId. Альтернативные варианты использоваться не будут. Если mui файла для данного языка нет, то при перечислении не будет найдено ни одного ресурса (за исключением того случая, когда ресурсы соответствующего языка существуют в LN файле, и установлен флаг поиска в LN файле).

Перечисление никогда не включает копии: если ресурсы с одинаковым языком содержатся и в LN файле и в mui файле, то он будет перечислен лишь единожды.

Заголовочный файл | winbase.h (подключен в windows.h)
Экспортирующая библиотека | kernel32.dll
ANSI и Unicode наименования | EnumResourceLanguagesExA и EnumResourceLanguagesExW


EnumResourceNames

Перечисляет ресурсы заданного типа, находящиеся внутри заданного двоичного модуля. Для Windows Vista и более новых версий операционной системы, таковым, обычно, является независимый от языка исполняемый файл (language-neutral portable executable) (LN файл). Перечисление также будет включать в себя ресурсы из соответствующих языковых файлов ресурсов (mui файлов), которые содержат локализованные ресурсы. Также возможно в качестве значения параметра hModule указать произвольный .mui файл, ресурсы которого вы и хотите перечислить.

Прототип

BOOL WINAPI EnumResourceNames(

_In_opt_ HMODULE hModule,

_In_ LPCTSTR lpszType,

_In_ ENUMRESNAMEPROC lpEnumFunc,

_In_ LONG_PTR lParam

);

Параметры

hModule[in,opt]

Описатель модуля, ресурсы которого перечисляются. Начиная с Windows Vista, если указан LN файл, то в поиск включаются и соответствующие ему .mui файлы (если они есть).

Если значене этого параметра равно NULL, то поиск ведется в модуле, создавшем текущий процесс.

lpszType[in]

Тип ресурса, наименования которого необходимо перечислить. Вместо указателя на строку данный параметр может содержать значение MAKEINTRESOURCE(ID), где ID - целочисленное значение, описывающее предопределенный тип ресурса. Перечень предопределенных типов ресурсов приведен здесь.

lpEnumFunc[in]

Указатель на функцию обратного вызова (EnumResNameProc), которая будет вызвана для каждого перечисляемого наименования ресурса.

lParam[in]

Определенное приложением значение, которое будет передано в функцию обратного вызова. данный параметр может использоваться при проверке на ошибки.

Возвращаемое значение

В случае успеха возвращается значение TRUE.

Если функция не нашла ресурсов заданного типа, то возвращается значение FALSE.

Возвращаемое значение в случае ошибки

FALSE. Для получения более подробной информации об ошибке используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Если значение IS_INTRESOURCE(lpszType) равно TRUE, то параметр lpszType содержит целочисленный идентификатор типа ресурса. В противном случае, он содержит указатель на завершающуюся NULL символом строку. Если первый символ строки - символ решетки (#), то последующие символы строки представляют собой целочисленный идентификатор типа ресурса, записанный в десятичной системе счисления. Например, строка "#258" представляет идентификатор 258.

Для каждого найденного ресурса функция EnumResourceNames вызывает определенную приложением функцию обратного вызова lpEnumFunc, передавая ей в качестве параметра идентификатор каждого найденного ресурса вместе с другими параметрами функции EnumResourceNames.

Приложение может использовать функцию EnumResourceNamesEx, которая предоставляет возможность более строгого контроля за перечисляемыми ресурсами.

Если ресурс имеет идентификатор, то он передается в функцию обратного вызова; в противном случае в функцию обратного вызова передается наименование ресурса.

Функция EnumResourceNames продолжает перечислять ресурсы до тех пор, пока функция обратного вызова не вернет значение FALSE, или не будут перечислены все ресурсы.

Начиная с Windows Vista, если параметр hModule определяет LN файл, то перечисляются ресурсы, принадлежащие этому LN файлу и mui файлу, соответствующему LN файлу. Если файлы .mui не найдены, то перечисляются только ресурсы из LN файла. Порядок, в котором ищутся mui файлы является тем же порядком, в котором загрузчик ресурсов, обычно, ищет ресурсы. Если найден хотя бы один подходяший mui файл,то поиск других mui файлов не ведется. Так как все mui файлы соответствуют одному LN файлу, имеющему ресурсы нескольких типов, то будут перечислены только ресурсы, находящиеся в найденном mui файле.

Перечисление никогда не включает копии: если в LN файле и mui файле одновременно содержатся ресурсы с одинаковым наименованием, то данный ресурс будет перечислен единожды.

Заголовочный файл | winbase.h (подключен в windows.h)
Экспортирующая библиотека | kernel32.dll
ANSI и Unicode наименования | EnumResourceNamesA и EnumResourceNamesW


EnumResourceNamesEx

Появилась в Windows Vista. Перечисляет ресурсы заданного типа, хранящиеся в заданном двличном модуле. Поиск может осуществляться в LN файле и в ассоциированных с ним mui файлах. Поиск так же может быть ограничен тем или иным образом.

Прототип

BOOL WINAPI EnumResourceNamesEx(

_In_opt_ HMODULE hModule,

_In_ LPCTSTR lpszType,

_In_ ENUMRESNAMEPROC lpEnumFunc,

_In_ LONG_PTR lParam,

_In_ DWORD dwFlags,

_In_ LANGID LangId

);

Параметры

hModule[in,opt]

Описатель модуля, в котором ведется поиск. Обычно это LN файл, и, если установлен флаг RESOURCE_ENUM_MUI, то в поиск включаются соответствующие ему mui файлы. Так же данный описатель может описывать mui файл.

Если значение этого параметра равно NULL, то поиск осуществляется в модуле, создавшем текущий процесс.

lpszType[in]

Тип ресурса, наименования которого необходимо перечислить. Вместо указателя на строку с наименованием данный параметр может содержать значение MAKEINTRESOURCE(ID), где ID - целочисленное значение, задающее предопределенный тип ресурса. Перечень предопределенных типов ресурсов приведен здесь.

lpEnumFunc[in]

Указатель на функцию обратного вызова EnumResNameProc, которая будет вызвана для каждого найденного наименования ресурса.

lParam

Определенное приложением значение, передаваемое в функцию обратного вызова. Данное значение может использоваться для проверки ошибок.

dwFlags[in]

Тип файла, в котором ведется поиск. Поддерживаются значения, перечисленные ниже. Если значение этого параметра равно нулю, то используется комбинация флагов RESOURCE_ENUM_LN и RESOURCE_ENUM_MUI.

RESOURCE_ENUM_LN (0x0001) - поиск ведется в файле hModule независимо от того, является этот файл LN файлом или mui файлом.

RESOURCE_ENUM_MUI (0x0002) - поиск ведется в .mui файлах, ассоциированных с LN файлом, который задается параметром hModule, с текущими языковыми предпочтениями, согласно обычной стратегии поиска загрузчика ресурсов (Resource Loader). Если параметр LangId отличен от нуля, то поиск будет вестись только в соответствующем mui файле. Обычно, этот флаг используется только, если параметр hModule задает LN файл. Если параметр hModule определяет mui файл, тот этот файл уже "покрывается" флагом RESOURCE_ENUM_LN, несмотря на его наименование.

RESOURCE_ENUM_VALIDATE (0x0008) - выполняет при перечислении расширенную проверку корректности секции ресурсов и её описания в PE заголовке для обеспечения правильного форматирования ресурсов. Данная проверка при перечислении ограничивает максимальную длину наименования ресурса 260 символами.

LangId[in]

Язык локализации, используемый для фильтрации при поиске в MUI файле. Этот параметр исползуется только тогда, когда в параметре dwFlags установлен флаг RESOURCE_ENUM_MUI. Если значение этого параметра равно нулю, то в поиск включаются все mui файлы, которые соответствуют текущим языковым предпочтениям. Поиск при этом ведется согласно обычной стратегии поиска загрузчика ресурсов. Если значение параметра LangId отлично от нуля, то поиск ведется только в mui файле, который соответствует языку LangId.

Возвращаемое значение

В случае успеха возвращается значение TRUE.

Если функция не нашла ресурсов заданного типа, то возвращается значение FALSE.

Возвращаемое значение в случае ошибки

FALSE. Для получения более подробной информации об ошибке используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Если значение IS_INTRESOURCE(lpszType) равно TRUE, то параметр lpszType содержит целочисленный идентификатор типа ресурса. В противном случае, он содержит указатель на завершающуюся NULL символом строку. Если первый символ строки - символ решетки (#), то последующие символы строки представляют собой целочисленный идентификатор типа ресурса, записанный в десятичной системе счисления. Например, строка "#258" представляет идентификатор 258.

Область поиска может включать в себя LN файл и ассоциированные с ним mui файлы. Он может быть ограничен отдельным двоичным модулем произвольного типа. Он также может быть ограничен mui файлами, ассоциированными с отдельным LN файлом. Если параметр hModule определяет LN файл, а параметр LangId отличен от нуля, то область поиска ограничивается единственным mui файлом, ассоцированным с заданным LN файлом и языком.

Для каждого найденного ресурса функция EnumResourceNamesEx вызывает определенную приложением функцию обратного вызова lpEnumFunc, передавая ей наименование или идентификатор найденного ресурса вместе с некоторыми другими параметрами функции EnumResourceNamesEx.

Если ресурс имеет идентификатор, то в функцию обратного вызова передается идентификатор. Если же ресурс имеет наименование, то в функцию обратного вызова передается наименование.

Функция EnumResourceNamesEx продолжает перечислять наименования ресурсов до тех пор, пока либо функция обратного выхова не вернет значение FALSE, либо не будут перечислены наименования всех ресурсов заданного типа.

Если параметр hModule определяет LN файл, и определены оба флага, то перечисляемые ресурсы будут находиться или в самом LN файле, или в ассоциированных с ним mui файлах. Если mui файлы не найдены, то будут перечисляться только ресурсы из LN файла. После нахождения первого подходящего mui файла, поиск дальше него продолжаться не будет, так как все mui файлы, ассоциированные с одним LN файлом имеют одинаковые наименования ресурсов.

Если параметры dwFlags и LangId одновременно равны нулю, то поведение данной функции аналогично поведению функции EnumResourceNames.

Если значение параметра LangId отлично от нуля, то в область поиска войдет только mui файл, соответствующий заданному идентификатору языка. Альтернативные варианты использоваться не будут. Если mui файла для данного языка нет, то при перечислении не будет найдено ни одного ресурса (за исключением того случая, когда ресурсы соответствующего языка существуют в LN файле, и установлен флаг поиска в LN файле).

Перечисление никогда не включает копии: если ресурсы для заданного языка содержатся и в LN файле и в mui файле, то их наименование будет перечислено лишь единожды.

Заголовочный файл | winbase.h (подключен в windows.h)
Экспортирующая библиотека | kernel32.dll
ANSI и Unicode наименования | EnumResourceNamesExA и EnumResourceNamesExW


EnumResourceTypes

Перечисляет типы ресурсов в двоичном модуле. Начиная с Windows Vista, это обычно нейтральный по отношению к языку исполняемый файл (language-neutral Portable Executable) (LN файл). Перечисление также включает в себя ресурсы из соответствующих языковых файлов ресурсов (mui файлов) - если они есть - которые содержат локализованные ресурсы. Также допустимо, чтобы параметр hModule задавал mui файл, в этом случае типы ресурсов будут перечисляться только из этого файла.

Приложение также может использовать функцию EnumResourceTypesEx, которая предоставляет больший контроль над тем как будут перечисляться ресурсы.

Прототип

BOOL WINAPI EnumResourceTypes(

_In_opt_ HMODULE hModule,

_In_ ENUMRESTYPEPROC lpEnumFunc,

_In_ LONG_PTR lParam

);

Параметры

hModule[in,opt]

Описатель модуля, в котором ищутся ресурсы. Этот описатель может быть получен посредством функции LoadLibrary или LoadLibraryEx.

Если значение этого параметра равно NULL, то поиск ведется в модуле, создавшем текущи процесс.

lpEnumFunc[in]

Указатель на функцию обратного вызова EnumResTypeProc, которая будет вызвана для каждого найденного типа ресурсов.

lParam[in]

Определенное приложением значение передаваемое в функцию обратного вызова.

Возвращаемое значение

TRUE.

Возвращаемое значение в случае ошибки

FALSE. Для получения более подробной информации об ошибке используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Для каждого найденного типа ресурса функция EnumResourceTypes вызывает определенную приложением функцию обратного вызова lpEnumFunc, передавая ей найденный тип ресурса и некоторые другие параметры функции EnumResourceTypes.

Функция EnumResourceTypes продолжает перечислять типы ресурсов до тех пор, пока либо функция обратного вызова не вернет значение FALSE, либо не будут перечислены все типы ресурсов.

Начиная с Windows Vista, если параметр hModule задает LN файл, то перечисляются типы ресурсов, находящиеся в LN файле и в ассоциированном с ним mui файле. Если mui файла нет, то возвращаются типы ресурсов, находящиеся в LN файле. Mui файлы ищутся по тому же алгоритму, который обычно использует загрузчик ресурсов (Resource Loader). После нахождения подходящего mui файла поиск прекращается, так как все mui файлы, ассоциированные с одним LN файлом, имеют одинаковый набор типов ресурсов.

Перечисление никогда не включает копии: если какой-либо тип ресурса имеется и в LN файле и в mui файле, то он перечисляется лишь единожды.

Заголовочный файл | winbase.h (подключен в windows.h)
Экспортирующая библиотека | kernel32.dll
ANSI и Unicode наименования | EnumResourceTypesA и EnumResourceTypesW


EnumResourceTypesEx

Появилась в Windows Vista. Перечисляет типы ресурсов, хранящихся в заданном двоичном модуле. Поиск осуществляется в нейтральном по отношению к языку исполняемом файле (Language-neutral Portable Executable) (LN файле) и в ассоциированных с ним mui файлах. Поиск может быть ограничен отдельным двоичным модулем произвольного типа, или mui файлами, ассоциированными с отдельным LN файлом. Поиск также может быть ограничен отдельным mui файлом, содержащим ресурсы заданного языка.

Для каждого найденного типа ресурса функция EnumResourceTypesEx вызывает определенную приложением функцию обратного вызова, передавая ей найденный тип ресурса вместе с другими параметрами переданными в функцию EnumResourceTypesEx.

Прототип

BOOL WINAPI EnumResourceTypesEx(

_In_opt_ HMODULE hModule,

_In_ ENUMRESTYPEPROC lpEnumFunc,

_In_ LONG_PTR lParam,

_In_ DWORD dwFlags,

_In_ LANGID LangId

);

Параметры

hModule[in]

Описатель модуля, в котором ищутся типы ресурсов. Обычно это LN файл, если при этом указан флаг RESOURCE_ENUM_MUI, то в область поиска так же будут включены соответствующие ему mui файлы. также данный параметр модет задавать mui файл.

Если значение этого параметра равно NULL, то поиск ведется в модуле, создавшем текущий процесс.

lpEnumFunc[in]

Указатель на функцию обратного вызова EnumResTypeProc, которая будет вызвана для каждого найденного типа ресурса.

lParam[in]

Определенное приложением значение передаваемое в функцию обратного вызова.

dwFlags[in]

Тип файла, в котором ведется поиск ресурсов. Поддерживаются значения, перечисленные ниже. Если значение этого параметра равно нулю, то считается, что заданы флаги RESOURCE_ENUM_LN и RESOURCE_ENUM_MUI.

RESOURCE_ENUM_LN (0x0001) - поиск ведется только в файле hModule, назависимо от того является ли он LN файлом, или mui файлом.

RESOURCE_ENUM_MUI (0x0002) - поиск ведется в одном из mui файлов, ассоциированных с файлом hModule и соответствующем текущим языковым предпочтениям в соответствии с обычным алгоритмом работы загрузчика ресурсов (Resource Loader). Если значение параметра LangId отлично от нуля, то поиск ведется в mui файле, язык которого соответствует значению параметра LangId. Обычно этот флаг должен использоваться только если параметр hModule задает LN файл. Если параметр hModule задает mui файл, то этот файл "покрывается" флагом RESOURCE_ENUM_LN, несмотря на его наименование.

RESOURCE_ENUM_VALIDATE (0x0008) - осуществляет при перечислении дополнительную проверку корректности секции ресурсов и её описания в PE заголовке, для гарантирования корректного форматирования. Данная проверка ограничивает максимальную длину наименования типа ресурса 260 символами.

LangId[in]

Язык, используемый для ограничения поиска в модуле MUI. данный параметр используется только если в параметре dwFlags установлен флаг RESOURCE_ENUM_MUI. Если значение данного параметра равно нулю, то в область поиска включаются все mui файлы, соответствующие текущим языковым предпочтениям, в соответствии с обычной стратегией загрузчика ресурсов. Если же значение этого параметра отлично от нуля, то в область поиска включается только mui файл, язык которого соответствует яыку LangId.

Возвращаемое значение

TRUE. Если ресурсы не найдены, то возвращается значение FALSE.

Возвращаемое значение в случае ошибки

FALSE. Для получения более подробной информации об ошибке используйте функцию GetLastError.

Пример использования

Пример исползования приведен здесь.

Примечание

Функция EnumResourceTypesEx продолжает перечислять типы ресурсов до тех пор, пока либо функция обратного вызова не вернет значение FALSE, либо не будут перечислены все типы ресурсов.

Если параметр hModule задает LN файл, и заданы оба флага, то перечисляться будут типы ресурсов, находящихся в LN файле, или в mui файлах, ассоциированных с LN файлом. Если mui файлы не найдены, то область поиска ограничивается LN файлом. Если найден хотя бы один подходящий mui файл, то поиск других mui файлов не ведется, так как все mui файлы, ассоциированные с одним LN файлом имеют одинаковый набор типов ресурсов.

Если значения параметров dwFlags и LangId одновременно равны нулю, то поведение данной функции аналогично поведению функции EnumResourceTypes.

Если значение параметра LangId отлично от нуля, то поиск велется только в mui файле, язык которого соответствует языку LangId. Альтернативные варианты использоваться не будут. Если mui файла для данного языка нет, то при перечислении не будет найдено ни одного типа (за исключением того случая, когда ресурсы соответствующего языка существуют в LN файле, и установлен флаг поиска в LN файле).

Перечисление никогда не включает копии: если какой-либо тип ресурса для заданного языка имеется и в LN файле и в mui файле, то он перечисляется лишь единожды.

Заголовочный файл | winbase.h (подключен в windows.h)
Экспортирующая библиотека | kernel32.dll
ANSI и Unicode наименования | EnumResourceTypesExA и EnumResourceTypesExW


FindResource

Определяет местонахождение ресурса заданного типа с заданным наименованием в заданном файле.

Для указания нужного языка используйте функцию FindResourceEx.

Прототип

HRSRC WINAPI FindResource(

_In_opt_ HMODULE hModule,

_In_ LPCTSTR lpName,

_In_ LPCTSTR lpType

);

Параметры

hModule[in,opt]

Описатель модуля, иполняемый файл которого или сопровождающий его MUI файл содержит ресурс. Если значение этого параметра равно NULL, то функция ищет ресурс в модуле, создавшем текущий процесс.

lpName[in]

Наименование ресурса. Вместо указателя на строку, данный параметр может содержать значение, возвращенное макросом MAKEINTRESOURCE(ID), где ID - целочисленный идентификатор ресурса.

lpType[in]

Тип ресурса. Вместо указателя на строку, данный параметр может содержать значение, возвращенное макросом MAKEINTRESOURCE(ID), где ID - целочисленный идентификатор нужного типа ресурса. Стандартные типы ресурсов перечислены здесь.

Возвращаемое значение

Описатель информационного блока искомого ресурса. Для получения описателя ресурса, перейдате описатель информационного блока в функцию LoadResource.

Возвращаемое значение в случае ошибки

NULL. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Если макрос IS_INTRESOURCE возвращает значение TRUE для числа x равного lpName или lpType, то число x определяет целочисленный идентификатор наименования или типа заданного ресурса. Если же макрос IS_INTRESOURCE возвращает значение FALSE, то данный параметр содержит указатель на завершающуюся NULL символом строку. Если первый символ строки - символ решетки (#), то последующие символы - целочисленный идентификатор наименования или типа ресурса, записанный в десятичной системе счисления. Например, строка "#258" интерпретируется как идентификатор 258.

Для уменьшения расходуемой памяти, приложение должно обращаться к ресурсу по его идентификатору, а не по наименованию.

Приложение может использовать функцию FindResource для нахождения ресурсов произвольных типов, но данная функция должна использоваться только если приложению нужно получить доступ к двоичным данным ресурса путем последующего вызова функций LoadResource и LockResource.

Для немедленного использования ресурса, приложение должно использовать одну из функций перечисленных ниже.

FormatMessage - загружает и формирует запись таблицы сообщений.

LoadAccelerators - загружает таблицу сочетаний клавиш.

LoadBitmap - загружает растровое изображение.

LoadCursor - загружает курсор.

LoadIcon - загружает иконку.

LoadMenu - загружает меню.

LoadString - загружает запись таблицы строк.

Например, приложение может использовать функцию LoadIcon для загрузки иконки и её отображения на экране. Тем не менее приложение должно использовать функции FindResource и LoadResource для загрузки иконки и копирования её данных в другое приложение.

Строковые ресурсы хранятся в секциях по 16 строк на секцию. Строки в каждой секции хранятся как последовательность Unicode строк (не обязательно завершающихся NULL символом). Функция LoadString извлекает строку из соответствующей секции.

Заголовочный файл | winbase.h (подключен в windows.h)
Экспортирующая библиотека | kernel32.dll
ANSI и Unicode наименования | FindResourceA и FindResourceW


FindResourceEx

Определяет местонахождение ресурса, имеющего заданный тип, наименование и язык в заданном модуле.

Прототип

HRSRC WINAPI FindResourceEx(

_In_opt_ HMODULE hModule,

_In_ LPCTSTR lpType,

_In_ LPCTSTR lpName,

_In_ WORD wLanguage

);

Параметры

hModule[in,opt]

Описатель модуля, иполняемый файл которого или сопровождающий его MUI файл содержит ресурс. Если значение этого параметра равно NULL, то функция ищет ресурс в модуле, создавшем текущий процесс.

lpType[in]

Тип ресурса. Вместо указателя на строку, данный параметр может содержать значение, возвращенное макросом MAKEINTRESOURCE(ID), где ID - целочисленный идентификатор нужного типа ресурса. Стандартные типы ресурсов перечислены здесь.

lpName[in]

Наименование ресурса. Вместо указателя на строку, данный параметр может содержать значение, возвращенное макросом MAKEINTRESOURCE(ID), где ID - целочисленный идентификатор ресурса.

wLanguage[in]

Язык ресурса. Если значение этого параметра равно MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL), то используется текущий язык вызывающего потока.

Для определения языка отличного от текущего используйте макрос MAKELANGID.

Возвращаемое значение

Описатель информационного блока искомого ресурса. Для получения описателя ресурса, перейдате описатель информационного блока в функцию LoadResource.

Возвращаемое значение в случае ошибки

NULL. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Если макрос IS_INTRESOURCE возвращает значение TRUE для числа x равного lpName или lpType, то число x определяет целочисленный идентификатор наименования или типа заданного ресурса. Если же макрос IS_INTRESOURCE возвращает значение FALSE, то данный параметр содержит указатель на завершающуюся NULL символом строку. Если первый символ строки - символ решетки (#), то последующие символы - целочисленный идентификатор наименования или типа ресурса, записанный в десятичной системе счисления. Например, строка "#258" интерпретируется как идентификатор 258.

Для уменьшения расходуемой памяти, приложение должно обращаться к ресурсу по его идентификатору, а не по наименованию.

Приложение может использовать функцию FindResourceEx для нахождения ресурсов произвольных типов, но данная функция должна использоваться только если приложению нужно получить доступ к двоичным данным ресурса путем последующего вызова функций LoadResource и LockResource.

Для немедленного использования ресурса, приложение должно использовать одну из функций перечисленных ниже.

FormatMessage - загружает и формирует запись таблицы сообщений.

LoadAccelerators - загружает таблицу сочетаний клавиш.

LoadBitmap - загружает растровое изображение.

LoadCursor - загружает курсор.

LoadIcon - загружает иконку.

LoadMenu - загружает меню.

LoadString - загружает запись таблицы строк.

Например, приложение может использовать функцию LoadIcon для загрузки иконки и её отображения на экране. Тем не менее, приложение должно использовать функции FindResourceEx и LoadResource для загрузки иконки и копирования её данных в другое приложение.

Строковые ресурсы хранятся в секциях: по 16 строк на секцию. Строки в каждой секции хранятся как последовательность Unicode строк (не обязательно завершающихся NULL символом). Функция LoadString извлекает строку из соответствующей секции.

Заголовочный файл | winbase.h (подключен в windows.h)
Экспортирующая библиотека | kernel32.dll
ANSI и Unicode наименования | FindResourceExA и FindResourceExW


FreeResource

Данная функция устарела и поддерживается для обратной совместимости с 16-разрядными приложениями Windows. Для 32-разрядных приложений Windows, она не нужна для освобождения ресурсов загруженных функцией LoadResource. В 32- или 64-разрядных системах Windows данная функция вернет значение FALSE.

Уменьшает на единицу количество ссылок на загруженный ресурс. Когда количество ссылок станет равным нулю, память, занимаемая ресурсом, будет освобождена.

Прототип

BOOL WINAPI FreeResource(

_In_ HGLOBAL hglbResource

);

Параметры

hglbResource[in]

Описатель ресурса. Это значение, возвращенное функцией LoadResource.

Возвращаемое значение

Нуль.

Возвращаемое значение в случае ошибки

Ненулевое значение, которое свидетельствует о том, что ресурс не освобожден.

Пример использования

В приводимом ниже примере мы с помощью FindResource ищем ресурс иконки, загружаем его с помощью LoadResource, а затем освобождаем с помощью FreeResource.

#include <windows.h>

#include "Constants.h"

int main()

{

//Ищем ресурс

HRSRC hrsrc;

hrsrc = FindResource(NULL,MAKEINTRESOURCE(ID_ICON),RT_GROUP_ICON);

//Загружаем ресурс

HGLOBAL hglb;

hglb = LoadResource(NULL,hrsrc);

//Освобождаем ресурс

if(FreeResource(hglb))

printf("fail\n");

else

printf("success\n");

getchar();

return 0;

}

Файл ресурсов.

#include "Constants.h"

ID_ICON ICON "MyIcon.ico"

Заголовочный файл Constants.h используется для объявления идентификатора ресурса.

#define ID_ICON 0x100

Примечание

Для ресурсов загруженных посредством других функций, функция FreeResource должна быть заменена на функцию в заивисимости от типа ресурса:

комбинация клавиш - DestroyAcceleratorTable;

растровое изображение - DeleteObject;

курсор - DestroyCursor;

иконка - DestroyIcon;

меню - DestroyMenu.

Количество ссылок на ресурс увеличивается на единицу каждый раз при вызове функции LoadResource для соответствующего ресурса.

Система автоматически удаляет эти ресурсы при уничтожении создавшего их процесса. Тем не менее, вызов соответствующих функций позволяет сохранить память.

Заголовочный файл | winbase.h (подключен в windows.h)
Экспортирующая библиотека | kernel32.dll


LoadImage

Загружает иконку, курсор, анимированный курсор, или растровое изображение.

Прототип

HANDLE WINAPI LoadImage(

_In_opt_ HINSTANCE hinst,

_In_ LPCTSTR lpszName,

_In_ UINT uType,

_In_ int cxDesired,

_In_ int cyDesired,

_In_ UINT fuLoad

);

Параметры

hinst[in,opt]

Описатель модуля (библиотеки DLL или исполняемого exe файла), в котором хранится загружаемое растровое изображение. Более полную информацию смотрите в описании функции GetModuleHandle. В 32-разрядный версиях Windows описатель экземпляра (HINSTANCE), передаваемый в функцию WinMain, и описатель модуля (HMODULE) - это одно и то же.

Для загрузки OEM изображения, данный параметр должен быть равен NULL.

Для загрузки самостоятельного ресурса (файла иконки, курсора или растрового изображения) - например, C:\MyImage.bmp - данный параметр должен быть равен NULL.

lpszName[in]

Загружаемое растровое изображение. Если значение параметра hinst отлично от NULL, а значение параметра fuLoad не равно LR_LOADFROMFILE, то lpszName описывает наименование ресурса растрового изображения в модуле hinst. Если ресурс растрового изображения загружается по имени из модуля, то lpszName является указателем на завершающуюся NULL символом строку, содержащую наименование ресурса растрового изображения. Если ресурс загружается из содуля по ординалу, то используйте макрос MAKEINTRESOURCE для конвертирования ординала изображения в форму, которая может быть передана в функцию LoadImage.

Если значение параметра hinst равно NULL, а параметр fuLoad не содержит флага LR_LOADFROMFILE, то lpszName описывает загружаемое OEM изображение. Идентификаторы OEM изображений описаны в файле Winuser.h и имеют следующие префиксы:

OBM_ - растровые OEM изображения;

OIC_ - OEM иконки;

OCR_ - OEM курсоры.

Для передачи этих констант в функцию LoadImage используйте макрос MAKEINTRESOURCE. Например, для загрузки курсора OCR_NORMAL, укажите в параметре lpszName значение MAKEINTRESOURCE(OCR_NORMAL), в параметре hinst значение NULL, в параметре fuLoad установите флаг LR_SHARED.

Если в параметре fuLoad установлен флаг LR_LOADFROMFILE, то lpszName содержит наименование файла, содержащего самостоятельный ресурс (файл иконки, курсора или растрового изображения).Поэтому значение hinst должно быть равно NULL.

uType[in]

Тип загружаемого изображения. Данный параметр принимает одно из значений перечисленных ниже:

IMAGE_BITMAP (0) - загружается растровое изображение;

IMAGE_CURSOR (2) - загружается курсор;

IMAGE_ICON (1) - Загружается иконка.

cxDesired[in]

Ширина, в пикселях, иконки или курсора. Если значение этого параметра равно нулю, а параметр fuLoad содержит флаг LR_DEFAULTSIZE, то функция будет использовать системную метрику SM_CXICON или SM_CXCURSOR для установки ширины. Если значение этого параметра равно нулю, а флаг LR_DEFAULTSIZE не используется, функция будет использовать фактическую ширину ресурса.

cyDesired[in]

Высота, в пикселях, иконки или курсора. Если значение этого параметра равно нулю, а параметр fuLoad содержит флаг LR_DEFAULTSIZE, то функция будет использовать системную метрику SM_CYICON или SM_CYCURSOR для установки высоты. Если значение этого параметра равно нулю, а флаг LR_DEFAULTSIZE не используется, функция будет использовать фактическую высоту ресурса.

fuLoad[in]

Принимает одно из значений, перечисленных здесь, или их комбинацию.

Возвращаемое значение

Описатель загруженного изображения.

Возвращаемое значение в случае ошибки

NULL. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Если макрос IS_INTRESOURCE(lpszName) возвращается значение TRUE, то параметр lpszName описывает целочисленный идентификатор ресурса. В противном случае он содержит указатель на, завершающуюся NULL символом, строку. Если первым символом строки является символ решетки (#), то последующие символы в строке представляют собой десятичный номер, который определяет идентификатор ресурса. Например, строка "#258" интерпретируется как идентификатор 258.

Когда вы завершили использование растрового изображения, курсора, или иконки без использования флага LR_SHARED, вы должны освободить память, вызовом одной из функций, перечисленных ниже:

растровое изображение - DeleteObject;

курсор - DestroyCursor;

иконка - DestroyIcon.

Система автоматически удаляет эти ресурсы, при уничтожении процесса, который их создал. Тем не менее, вызов этих функций сохранит память и увеличит размер рабочего набора процесса.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | LoadImageA и LoadImageW


LoadResource

Возвращает описатель, который может быть использован для получения указателя на первый байт заданного ресурса в памяти.

Прототип

HGLOBAL WINAPI LoadResource(

_In_opt_ HMODULE hModule,

_In_ HRSRC hResInfo

);

Параметры

hModule[in,opt]

Описатель модуля, исполняемый файл которого содержит ресурс. Если значение этого параметра равно NULL, то система загружает ресурс из модуля, который использовался при создании текущего процесса.

hResInfo

Описатель загружаемого ресурса. Этот описатель возвращается функцией FindResource и FindResourceEx.

Возвращаемое значение

Описатель данных ресурса.

Возвращаемое значение в случае ошибки

NULL. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Тип возвращаемого функцией LoadResource значения имеет тип HGLOBAL только для обратной совместимости. Функция не возвращает описатель блока глобальной памяти. Не передавайте этот описатель в функцию GlobalLock или GlobalFree. Для получения указателя на первый байт данных ресурса используйте функцию LockResource. Для получения размера ресурса используйте функцию SizeofResource.

Для немедленного использования ресурса, приложение должно использовать одну из функций перечисленных ниже.

FormatMessage - загружает и формирует запись таблицы сообщений.

LoadAccelerators - загружает таблицу сочетаний клавиш.

LoadBitmap - загружает растровое изображение.

LoadCursor - загружает курсор.

LoadIcon - загружает иконку.

LoadMenu - загружает меню.

LoadString - загружает запись таблицы строк.

Например, приложение может использовать функцию LoadIcon для загрузки иконки с её последующим отображением на экране. А потом уничтожить иконку вызовом функции DestroyIcon.

Заголовочный файл | winbase.h (подключен в windows.h)
Экспортирующая библиотека | kernel32.dll


LockResource

Возвращает указатель на заданный ресурс в памяти.

Прототип

LPVOID WINAPI LockResource(

_In_ HGLOBAL hResData

);

Параметры

hResData[in]

Описатель ресурса, к которому нужно получить доступ. Данный описатель возвращает функция LoadResource. Данный параметр имеет тип HGLOBAL только в целях обратной совместимости. Не передавайте сюда никакого другого значения отличного от значения, возвращенного функцией LoadResource.

Возвращаемое значение

Указатель на первый байт ресурса.

Возвращаемое значение в случае ошибки

NULL.

Пример использования

Пример использования приведен здесь.

Примечание

Указатель, возвращенный функцией LockResource, действителен до тех пор, пока модуль, содержащий ресурс загружен в память. Нет необходимости освобождать ресурсы, так как система автоматически удалит их при уничтожении создавшего их процесса.

Не пытайтесь заблокировать (lock) реуср, используя описатель, возвращенный функцией FindResource или FindResourceEx. Возвращаемые ими описатели указывают на случайные данные.

Функция LockResource не блокирует память. Она используется для получения указателя на память, содержащую данные ресурса. Наименование функции пришло из версий Windows до Windows XP, в которых она блокировала блок глобальной памяти, выделенный функцией LoadResource.

Заголовочный файл | winbase.h (подключен в windows.h)
Экспортирующая библиотека | kernel32.dll


SizeofResource

Возвращает размер заданного ресурса в байтах.

Прототип

DWORD WINAPI SizeofResource(

_In_opt_ HMODULE hModule,

_In_ HRSRC hResInfo

);

Параметры

hModule[in]

Описатель модуля, исполняемый файл которого содержит ресурс.

hResInfo[in]

Описатель ресурса. Этот описатель должен быть создан функцией FindResource или FindResourceEx.

Возвращаемое значение

Размер ресурса в байтах.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

Пример использования приведен здесь.

Заголовочный файл | winbase.h (подключен в windows.h)
Экспортирующая библиотека | kernel32.dll


UpdateResource

Добавляет, удаляет, или замещает ресурс в исполняемом PE файле. Существует ряд ограничений на обновление ресурсов в файлах, содержащих конфигурационные данные ресурсов (Resource Configuration data): LN файлы и языковые файлы ресурсов (mui файлы).

Прототип

BOOL WINAPI UpdateResource(

_In_ HANDLE hUpdate,

_In_ LPCTSTR lpType,

_In_ LPCTSTR lpName,

_In_ WORD wLanguage,

_In_opt_ LPVOID lpData,

_In_ DWORD cbData

);

Параметры

hUpdate[in]

Описатель модуля, возвращенный функцией BeginUpdateResource, и задающий обновляемый файл.

lpType[in]

Тип обновляемого ресурса. Вместо указателя на строку с наименованием типа данный параметр может содержать значение MAKEINTRESOURCE(ID), где ID - целочисленный идентификатор, задающий предопределенный тип ресурса. Предопределенные типы ресурсов перечислены здесь. Если первым символом строки является символ решетки (#), то последующие символы определяют целочисленный идентификатор типа ресурса, представленный в десятичной системе счисления. Например, строка "#258" задает иентификатор 258.

lpName[in]

Наименование обновляемого ресурса. Вместо указателя на строку с наименованием ресурса данный параметр может содержать значение MAKEINTRESOURCE(ID), где ID - целочисленный идентификатор ресурса. При создании нового ресурса не используйте для этого параметра строки, начинающиеся с символа решетки (#).

wLanguage[in]

Идентификатор языка обновляемого ресурса. Для создания значения данного параметра используйте макрос MAKELANGID.

lpData[in,opt]

Данные ресурса, которые будут вставлены в файл, задаваемый параметром hUpdate. Если ресурс имеет один их предопределенных типов, то данные должны быть корректными и выровненными. Учтите, что это "сырые" двоичные данные, которые будут сохранены в файле hUpdate, а не данные, предоставляемые функциями LoadIcon, LoadString, или какой-либо другой функцией загрузки ресурса определенного типа. Все данные, содержащие строки или текст должны иметь кодировку Unicode. Параметр lpData не должен указывать на данные в кодировке ANSI.

Если значение параметра lpData равно NULL, а значение параметра cbData равно 0, то заданный ресурс удаляется из файла hUpdate.

cbData[in]

Размер данных ресурса lpData, в байтах.

Возвращаемое значение

TRUE.

Возвращаемое значение в случае ошибки

FALSE. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Рекомендуется чтобы файл, содержащий ресурсы, не был загружен в память до вызова этой функции. Тем не менее, если этот файл уже загружен, это не приведет к ошибке.

Приложение может несколько раз вызвать функцию UpdateResource для внесения изменений в ресурсы. Каждый вызов функции UpdateResource вноcит изменение во внутренний список добавлений, удалений, и замещений, но не записывает данные в файл hUpdate. Для записи накопленных изменений в файл приложение должно использовать функцию EndUpdateResource.

Данная функция может изменять ресурсы в модулях, содержащих и код и ресурсы.

До Windows 7: если значение параметра lpData равно NULL, а значение параметра cbData отлично от нуля, то: во-первых, соответствующий ресурс не удаляется из файла, во-вторых, генерируется исключение.

Начиная с Windows Vista: как говорилось выше, существуют ограничения на обновление ресурсов в файлах, содержащих конфигурационные данные ресурсов: LN и mui файлы. Эти ограничения приведены в таблице ниже.

Действие | LN файл | .mui файл
1. Добавление нового типа, которого раньше не было в LN или mui файле | Добавляет тип в LN файл и интерпретирует его как нейтральный по отношению к языку (нелокализованый), также добавляет новый тип или запись (item) в конфигурационные данные (RC Config data) | Добавление разрешено только для следующих типов: версия файла, конфигурационные данные, XML манифест.
2. Добавление нового ресурса существующего типа | Конфигурационные данные используются для проверки существования данного типа в mui файлах, ассоциированных с LN файлом. Если тип не существует в mui файлах, то добавляется новая запись, которая интерпретируется как нелокализованная. Если тип существует в mui файлах, то добавление не разрешено. | Могут быть добавлены только ресурсы следжующих типов: версия файла, конфигурационные данные, XML-манифест.
3. Обновление ресурса | Конфигурационные данные используются для проверки существования данного типа в mui файлах, ассоциированных с LN файлом. Если данного типа нет в mui файлах, то данный ресурс обновляется в LN файле. Если же тип есть в mui файлах, ассоциированных с LN файлом, то обновление не разрешено. | Разрешено обновление только ресурсов следующих типов: версия файла, конфигурационные данные, XML манифест.
4. Добавление типа/ресурса для нового языка | не разрешено | не разрешено
5. Удаление существующего типа/ресурса. | Работает аналогично случаю 3. Конфигурационные данные используются для проверки существования данного типа/ресурса в mui файлах, ассоциированных с LN файлом. Если данного типа/ресурса в mui файлах нет, то тип/ресурс удаляется из LN файла. Если же тип/ресурс существует в mui файлах, ассоциированных с LN файлом, то удаление не разрешено. | Удаление разрешено только для следующих типов: версия файла, конфигурационные данные, XML манифест. Также разрешено удаление ресурсов только этих типов.
6. Добавление/удаление/обновление типа, не включенного в конфигурационные данные (такого как версия, XML манифест, сами конфигурационные данные) | разрешено | разрешено
7. Другое обновление нелокализованных данных, таких как таблица TYPELIB, reginst и так далее. | Обновляет тип или ресурс в LN файле, интерпретирует его как нелокализованные, и добавляет новый тип или ресурс в конфигурационные данные. | не применимо
8. Добавление конфигурационных данных | Может быть выполнено но целостность конфигурационных данных при этом не проверяется. | Может быть выполнено но целостность конфигурационных данных при этом не проверяется.

Заголовочный файл | winbase.h (подключен в windows.h)
Экспортирующая библиотека | kernel32.dll
ANSI и Unicode наименования | UpdateResourceA и UpdateResourceW


AngleArc

Рисует отрезок и дугу. Отрезок рисуется от текущего положения до начала дуги. Дуга рисуется вдоль периметра окружности с заданным радиусом и центром. Длина дуги определяется начальным углом и углом развертки (sweep angle).

Прототип

BOOL AngleArc(

_In_ HDC hdc,

_In_ int X,

_In_ int Y,

_In_ DWORD dwRadius,

_In_ FLOAT eStartAngle,

_In_ FLOAT eSweepAngle

);

Параметры

hdc [in]

Описатель контекста устройства.

X [in]

Горизонтальная координата центра окружности в логических единицах.

Y [in]

Вертикальная координата центра окружности в логических единицах.

dwRadius [in]

Радиус окружности в логических единицах. Значение должно быть больше нуля.

eStartAngle [in]

Начальный угол, в градусах, относительно горизонтальной оси.

eSweepAngle [in]

Угол развертки, в градусах, относительно начального угла.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Функция AngleArc перемещает текущее положение в конец дуги.

Дуга, рисуемая функцией может быть эллиптической в зависимости от текущего преобразования (transformation) и режима отображения (mapping mode). Перед тем, как рисовать дугу, функция AngleArc рисует отрезок (line segment) от текущего положения до начала дуги.

Дуга рисуется создавая воображаемую окружность заданного радиуса с центром в заданной точке. Начальная точка определяется путем отсчета заданного количества градусов против часовой стрелки от горизонтальной оси. Конечная точка определяется аналогично путем отсчета против часовой стрелки от начальной точки угла, соответствующего заданному углу развертки.

Если значение угла развертки больше 360 градусов, то дуга будет прочерчена несколько раз.

Данная функция использует текущее перо. Фигура не закрашивается.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


Arc

Рисует дугу эллипса.

Прототип

BOOL Arc(

_In_ HDC hdc,

_In_ int nLeftRect,

_In_ int nTopRect,

_In_ int nRightRect,

_In_ int nBottomRect,

_In_ int nXStartArc,

_In_ int nYStartArc,

_In_ int nXEndArc,

_In_ int nYEndArc

);

Параметры

hdc [in]

Описатель контекста устройства, в котором рисуется дуга.

nLeftRect [in]

Горизонтальная координата левого верхнего угла ограничивающего прямоугольника в логических единицах.

nTopRect [in]

Вертикальная координата левого верхнего угла ограничивающего прямоугольника в логических единицах.

nRightRect [in]

Горизонтальная координата правого нижнего угла ограничивающего прямоугольника в логических единицах.

nBottomRect [in]

Вертикальная координата правого нижнего угла ограничивающего прямоугольника в логических единицах.

nXStartArc [in]

Горизонтальная координата конца радиальной линии, задающего начальную точку дуги, в логических единицах.

nYStartArc [in]

Вертикальная координата конца радиальной линии, задающего начальную точку дуги, в логических единицах.

nXEndArc [in]

Горизонтальная координата конца радиальной линии, задающего конечную точку дуги, в логических единицах.

nYEndArc [in]

Вертикальная координата конца радиальной линии, задающего конечную точку дуги, в логических единицах.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Точки (nLeftrect, nTopRect) и (nRightRect, nBottomRect) задают ограничивающий прямоугольник. Эллипс, сформированный этим прямоугольником, описывает линию дуги. Дуга строится в заданном направлении от точки пересечения эллипса с отрезком, соединяющим центр ограничивающего прямоугольника с точкой (nXStartArc, nYStartArc). Дуга заканчивается в точке пересечения эллипса с отрезком, соединяющим центр ограничивающего прямоугольника с точкой (nXEndArc, nYEndArc). Если начальная и конечная точки совпадают, то рисуется весь эллипс.

Дуга рисуется с использованием текущего пера. Фигура не заполняется.

Текущее положение функцией не используется и не изменяется.

С помощью функций GetArcDirection и SetArcDirection можно получить и изменить текущее направление рисования. Направление по умолчанию - против часовой стрелки.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


ArcTo

Рисует дугу эллипса.

Прототип

BOOL ArcTo(

_In_ HDC hdc,

_In_ int nLeftRect,

_In_ int nTopRect,

_In_ int nRightRect,

_In_ int nBottomRect,

_In_ int nXRadial1,

_In_ int nYRadial1,

_In_ int nXRadial2,

_In_ int nYRadial2

);

Параметры

hdc [in]

Описатель контекста устройства, в котором рисуется дуга.

nLeftRect [in]

Горизонтальная координата левого верхнего угла ограничивающего прямоугольника в логических единицах.

nTopRect [in]

Вертикальная координата левого верхнего угла ограничивающего прямоугольника в логических единицах.

nRightRect [in]

Горизонтальная координата правого нижнего угла ограничивающего прямоугольника в логических единицах.

nBottomRect [in]

Вертикальная координата правого нижнего угла ограничивающего прямоугольника в логических единицах.

nXRadial1 [in]

Горизонтальная координата конца радиальной линии, задающего начальную точку дуги, в логических единицах.

nYRadial1 [in]

Вертикальная координата конца радиальной линии, задающего начальную точку дуги, в логических единицах.

nXRadial2 [in]

Горизонтальная координата конца радиальной линии, задающего конечную точку дуги, в логических единицах.

nYRadial2 [in]

Вертикальная координата конца радиальной линии, задающего конечную точку дуги, в логических единицах.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Функция ArcTo похожа на функцию Arc и отличается от нее только тем, что обновляет текущее положение.

Точки (nLeftrect, nTopRect) и (nRightRect, nBottomRect) задают ограничивающий прямоугольник. Эллипс, сформированный этим прямоугольником, описывает линию дуги. Дуга строится против часовой стрелки от точки пересечения эллипса с отрезком, соединяющим центр ограничивающего прямоугольника с точкой (nXRadial1, nYRadial1). Дуга заканчивается в точке пересечения эллипса с отрезком, соединяющим центр ограничивающего прямоугольника с точкой (nXRadial2, nYRadial2). Если начальная и конечная точки совпадают, то рисуется весь эллипс.

Дополнительно к дуге функция рисует отрезок от текущего положения до начальной точки дуги. Если не произошло никаких ошибок, то текущее положение переносится в конечную точку дуги.

Дуга рисуется с использованием текущего пера. Фигура не заполняется.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


BeginPaint

Подготавливает заданное окно к рисованию и заполняет структуру PAINTSTRUCT информацией о рисовании (painting).

Прототип

HDC BeginPaint(

_In_ HWND hwnd,

_Out_ LPPAINTSTRUCT lpPaint

);

Параметры

hwnd [in]

Описатель перерисовываемого окна.

lpPaint [out]

Указатель на структуру PAINTSTRUCT, в которую заносится информация о рисовании.

Возвращаемое значение

Описатель видимого контекста устройства заданного окна.

Возвращаемое значение в случае ошибки

Значение NULL. Обычно это говорит об отсутствии доступного видимого контекста устройства.

Пример использования

Пример использования приведен здесь.

Примечание

Функция BeginPaint автоматически устанавливает регион обрезки (clipping region) для контекста устройства. Данный регион исключает (exclude) область, находящуюся вне обновляемого региона. Обновляемый регион устанавливается функцией InvalidateRect или InvalidateRgn, также его устанавливает система после изменения размеров, перемещения, создания, прокрутки или любого другого действия, влияющего на клиентскую область окна. Если обновляемый регион помечен для очистки (erasing), фунцкия BeginPaint отправит окну сообщение WM_ERASEBKGND.

Приложение не должно вызывать функцию BeginPaint кроме как при обработе сообщения WM_PAINT. Каждому вызову BeginPaint должен соответствовать вызов функции EndPaint.

Если в перерисовываемой области отображается курсор ввода, функция BeginPaint автоматически скроет его, для того, чтобы спасти его от очистки.

Если оконный класс имеет кисть фона, функция BeginPaint будет использовать эту кисть для очистки обновляемого региона перед возвращением управления.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll


Chord

Рисует сегмент эллипса (фигура образованная дугой эллипса и стягивающей ее хордой). Граница сегмента рисуется текущим пером, а его внутренняя часть закрашивается текущей кистью.

Прототип

BOOL Chord(

_In_ HDC hdc,

_In_ int nLeftRect,

_In_ int nTopRect,

_In_ int nRightRect,

_In_ int nBottomRect,

_In_ int nXRadial1,

_In_ int nYRadial1,

_In_ int nXRadial2,

_In_ int nYRadial2

);

Параметры

hdc [in]

Описатель контекста устройства, в котором рисуется сегмент.

nLeftRect [in]

Горизонтальная координата левого верхнего угла ограничивающего прямоугольника. Координата задается в логических единицах.

nTopRect [in]

Вертикальная координата левого верхнего угла ограничивающего прямоугольника. В логических единицах.

nRightRect [in]

Горизонтальная координата правого нижнего угла ограничивающего прямоугольника. В логических единицах.

nBottomRect [in]

Вертикальная координата правого нижнего угла ограничивающего прямоугольника. В логических единицах.

nXRadial1 [in]

Горизонтальная координата точки радиальной линии, задающей начало сегмента. В логических единицах.

nYRadial1 [in]

Вертикальная координата точки радиальной линии, задающей начало сегмента. В логических единицах.

nXRadial2 [in]

Горизонтальная координата точки радиальной линии, задающей конец сегмента. В логических единицах.

nYRadial2 [in]

Вертикальная координата точки радиальной линии, задающей конец сегмента. В логических единицах.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Кривая сегмента определяется эллипсом, который задается ограничивающим прямоугольником. Кривая начинается в точке пересечения эллипса с первой радиальной линией и продолжается против часовой стрелки до точки пересечения эллипса со второй радиальной линией. Сегмент ограничивается отрезком проведенным от точки пересечения эллипса с первой радиальной линией до точки пересечения эллипса со второй радиальной линией.

Если начальная и конечная точки кривой совпадают друг с другом, то рисуется весь эллипс.

Функция Chord не использет и не изменяет текущее положение.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


Ellipse

Рисует эллипс. Центр эллипса совпадает с центром ограничивающего прямоугольника. Границы эллипса рисуются текущим пером, а его внутренняя часть закрашивается текущей кистью.

Прототип

BOOL Ellipse(

_In_ HDC hdc,

_In_ int nLeftRect,

_In_ int nTopRect,

_In_ int nRightRect,

_In_ int nBottomRect

);

Параметры

hdc [in]

Описатель контекста устройства.

nLeftRect [in]

Горизонтальная координата левого верхнего угла ограничивающего прямоугольника. В логических единицах.

nTopRect [in]

Вертикальная координата левого верхнего угла ограничивающего прямоугольника. В логических единицах.

nRightRect [in]

Горизонтальная координата правого нижнего угла ограничивающего прямоугольника. В логических единицах.

nBottomRect [in]

Вертикальная координата правого нижнего угла ограничивающего прямоугольника. В логических единицах.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Функция не использует и не изменяет текущее положение.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


EndPaint

Отмечает конец рисования в заданном окне. Данная функция должна вызываться после каждого вызова функции BeginPaint по завершении рисования.

Прототип

BOOL EndPaint(

_In_ HWND hWnd,

_In_ const PAINTSTRUCT *lpPaint

);

Параметры

hWnd [in]

Описатель перерисовываемого окна.

lpPaint [in]

Указатель на структуру PAINTSTRUCT, содержащую информацию, возвращенную функцией BeginPaint.

Возвращаемое значение

Ненулевое значение.

Пример использования

Пример использования приведен здесь.

Примечание

Если курсор ввода был скрыт функцией BeginPaint, функция EndPaint восстановит его.

Функция EndPaint освобождает видимый контекст устройства, возвращенный функцией BeginPaint.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll


ExtFloodFill

Закрашивает текущей кистью область отображаемой на экране поверхности.

Прототип

BOOL ExtFloodFill(

_In_ HDC hdc,

_In_ int nXStart,

_In_ int nYStart,

_In_ COLORREF crColor,

_In_ UINT fuFillType

);

Параметры

hdc [in]

Описатель контекста устройства.

nXStart [in]

Горизонтальная координата точки, от которой начинается закрашивание. В логических единицах.

nYStart [in]

Вертикальная координата точки, от которой начинается закрашивание. В логических единицах.

crColor [in]

Цвет границы или закрашиваемой области. Интерпретация значения этого параметра зависит от значения параметра fuFillType. Для создания значения типа COLORREF используйте макрос RGB.

fuFillType [in]

Тип выполняемой операции закраски. Допустимые значения этого параметра перечислены ниже.

FLOODFILLBORDER - закрашиваемая область ограничена линиями, имеющими цвет crColor. Использование этого стиля аналогично использованию функции FloodFill.

FLOODFILLSURFACE - закрашивает область, имеющую цвет crColor. Закрашивание ведется во все направления до тех пор, пока встречается указанный цвет. Данный стиль полезен при закрашивании областей, границы которых имеют несколько цветов.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Функция может завершиться ошибкой по одной из следующих причин.

· Закрашивание не могло быть завершено.
· Заданная точка имеет цвет границы crColor (при использовании типа FLOODFILLBORDER).
· Заданная точка имеет цвет отличный от цвета crColor (при использовании типа FLOODFILLSURFACE).
· Заданная точка располагается вне границ региона отсечения, то есть она невидима на устройстве.

Если значение параметра fuFillType равно FLOODFILLBORDER, то предполагается, что область полностью ограничена линиями, имеющими цвет crColor. Функция начинает закрашивать область с точки (nXStart, nYStart) и закрашивает ее во всех направлениях до тех пор, пока не наткнется на границу.

Если значение параметра fuFillType равно FLOODFILLSURFACE, то предполагается, что область закрашена цветом crColor. Функция начинает закрашивать область с точки (nXStart, nYStart) и закрашивает ее во всех направлениях до тех пор, пока не встретит цвет отличный от crColor.

Функцию ExtFloodFill поддерживают только временные контексты устройства и устройства, поддерживающие растровые операции. Для проверки наличия поддержки этих функций используйте функцию GetDeviceCaps.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


FillRect

Закрашивает прямоугольник используя заданную кисть. Функция включает в закрашиваемую область левую и верхнюю границы, но исключает из нее правую и нижнюю границы прямоугольника.

Прототип

int FillRect(

_In_ HDC hDC,

_In_ const RECT *lprc,

_In_ HBRUSH hbr

);

Параметры

hDC [in]

Описатель контекста устройства.

lprc [in]

Указатель на структуру RECT, содержащую логические координаты закрашиваемого прямоугольника.

hbr [in]

Описатель кисти, используемой для закраски прямоугольника.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Параметр hbr может содержать описатель логической кисти или цвет. Для получения описателя кисти используйте одну из функций: CreateHatchBrush, CreatePatternBrush или CreateSolidBrush. Дополнительно, вы можете получить описатель одной из системных кистей с помощью функции GetStockObject. При задании цвета в параметре hbr вы должны использовать один из стандартных системных цветов (к выбранному цвету должно быть прибавлено число 1). Например:

FillRect(hdc, &rect, (HBRUSH) (COLOR_WINDOW+1));

Стандартные системные цвета перечислены здесь.

При закраске прямоугольника функция FilRect не включает в закрашиваемую область правую и нижнюю границы. Подсистема GDI закрашивает прямоугольник сверху вниз, не включая правую колонку и нижнюю строчку, вне зависимости от текущего режима отображения.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll


FloodFill

Закрашивает текущей кистью область отображаемой поверхности. Предполагается, что область ограничена параметром crFill.

Помните: функция FloodFill включена только для совместимости с 16-разрядными версиями Windows. Приложения вместо нее должны использовать функцию ExtFloodFill.

Прототип

BOOL FloodFill(

_In_ HDC hdc,

_In_ int nXStart,

_In_ int nYStart,

_In_ COLORREF crFill

);

Параметры

hdc [in]

Описатель контекста устройства.

nXStart [in]

Горизонтальная координата точки, от которой начинается закрашивание. В логических единицах.

nYStart [in]

Вертикальная координата точки, от которой начинается закрашивание.

crFill [in]

Цвет границы закрашиваемой области. Для создания значения типа COLORREF используйте макрос RGB.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Функция может завершиться ошибкой по одной из следующих причин.

· Закрашивание не могло быть завершено.
· Указанная точка имеет цвет границы crFill.
· Указанная точка располагается вне границ текущего региона отсечения, то есть она не видима на устройстве.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


FrameRect

Рисует границу вокруг заданного прямоугольника, используя заданную кисть. Ширина и высота границы всегда равна одной логической единице.

Прототип

int FrameRect(

_In_ HDC hDC,

_In_ const RECT *lprc,

_In_ HBRUSH hbr

);

Параметры

hDC [in]

Описатель контекста устройства, в котором рисуется граница.

lprc [in]

Указатель на структуру RECT, содержащую логические координаты левого верхнего и правого нижнего углов прямоугольника.

hbr [in]

Описатель кисти, используемой для рисования границы.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Кисть, задаваемая параметром hbr, должна быть создана одной из функций: CreateHatchBrush, CreatePatternBrush или CreateSolidBrush, или получена с помощью функции GetStockObject.

Если значение поля bottom структуры RECT меньше значения поля top, или же значение поля right меньше, чем left, то функция не нарисует границу.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll


GetArcDirection

Возвращает текущее направление рисования дуг для заданного контекста устройства. Данное направление используется функциями рисования дуг и прямоугольников.

Прототип

int GetArcDirection(

_In_ HDC hdc

);

Параметры

hdc [in]

Описатель контекста устройства.

Возвращаемое значение

Текущее направление рисования дуг. Допустимые значения перечислены ниже.

AD_COUNTERCLOCKWISE - дуги и прямоугольники рисуются против часовой стрелки.

AD_CLOCKWISE - дуги и прямоугольники рисуются по часовой стрелке.

Пример использования

Пример использования приведен здесь.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


GetBkColor

Возвращает текущий цвет фона заданного контекста устройства.

Прототип

COLORREF GetBkColor(

_In_ HDC hdc

);

Параметры

hdc [in]

Описатель контекста устройства для которого запрашивается цвет фона.

Возвращаемое значение

Текущий цвет фона в виде значения типа COLORREF.

Возвращаемое значение в случае ошибки

Значение CLR_INVALID.

Пример использования

Ниже демонстрируется пример использования этой функции.

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Получаем цвет фона

COLORREF color;

color = GetBkColor(GetDC(NULL));

//Выводим его на экран

char s[50];

snprintf(s, 50, "%X", color);

MessageBox(NULL, s, "", MB_OK);

return 0;

}

В результате работы этой программы на экран выводится значение 0xFFFFFF (у вас оно может быть другим). Это значение хоть и похоже на число CLR_INVALID (0xFFFFFFFF), но не равно ему.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


GetBkMode

Возвращает текущий режим смешивания фона для заданного контекста устройства. Режим смешивания фона контекста устройства влияет на текст, штрихованные кисти и перья, рисующие не сплошные линии.

Прототип

int GetBkMode(

_In_ HDC hdc

);

Параметры

hdc [in]

Описатель контекста устройства, для которого запрашивается режим фона.

Возвращаемое значение

Текущий режим смешивания фона, то есть значение OPAQUE или TRANSPARENT.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

char s[100];

//Получаем текущий режим

int mode;

mode = GetBkMode(GetDC(NULL));

//Конвертируем его в строку

switch (mode){

case OPAQUE : sprintf(s, "%s", "OPAQUE") ; break;

case TRANSPARENT: sprintf(s, "%s", "TRANSPARENT"); break;

default : sprintf(s, "%s", "Ошибка") ;

}

MessageBox(NULL, s, "", MB_OK);

return 0;

}

В данном примере на экран выводится строковое представление текущего режима фона для контекста устройства экрана. Обычно на экран выводится строка "OPAQUE".

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


GetPolyFillMode

Возвращает текущий режим закрашивания многоугольников.

Прототип

int GetPolyFillMode(

_In_ HDC hdc

);

Параметры

hdc [in]

Описатель контекста устройства.

Возвращаемое значение

Режим закрашивания многоугольников. Доустимые значения перечислены ниже.

ALTERNATE - выбран альтернативный режим (область закрашивается между нечетными и четными сторонами многоугольника на каждой строке).

WINDING - выбран режим изгибов (winding mode) (закрашивается любой регион с ненулевым значением изгиба (winding value)).

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


GradientFill

Заполняет прямоугольник или треугольник.

Прототип

BOOL GradientFill(

_In_ HDC hdc,

_In_ PTRIVERTEX pVertex,

_In_ ULONG nVertex,

_In_ PVOID pMesh,

_In_ ULONG nMesh,

_In_ ULONG ulMode

);

Параметры

hdc [in]

Описатель целевого контекста устройства.

pVertex [in]

Указатель на массив структур TRIVERTEX, каждая из которых описывает вершину.

nVertex [in]

Количество вершин в массиве pVertex.

pMesh [in]

Массив структур GRADIENT_TRIANGLE в режиме треугольников, или же массив структур GRADIENT_RECT в режиме прямоугольников.

nMesh [in]

Количество элементов (треугольников или прямоугольников) в массиве pMesh.

ulMode [in]

Режим работы функции. Допустимые значения этого параметра перечислены ниже.

GRADIENT_FILL_RECT_H - две точки описывают прямоугольник. Прямоугольник имеет фиксированные цвета (задаваемые структурами TRIVERTEX) для левой и правой границ. Подсистема GDI интерполирует цвет от левого к правому краю и заполняет пространство между ними.

GRADIENT_FILL_RECT_V - две точки описывают прямоугольник. Прямоугольник имеет фиксированные цвета (задаваемые структурами TRIVERTEX) для верхней и нижней границ. Подсистема GDI интерполирует цвет от верхней к нижней границе и заполняет пространство между ними.

GRADIENT_FILL_TRIANGLE - массив структур TRIVERTEX совместно с массивом индексов вершин задает отдельные треугольники. Подсистема GDI выполняет линейную интерполяцию между вершинами треугольника и заполняет пространство между ними. Рисование выполняется с глубиной цвета 24 и 32 бита на пиксель. Сглаживание (dithering) выполняется с глубиной цвета 16, 8, 4 и 1 бит на пиксель.

Возвращаемое значение

Значение TRUE.

Возвращаемое значение в случае ошибки

Значение FALSE.

Пример использования

Пример использования приведен здесь.

Примечание

Для сглаживания цветовых переходов в треугольнике вызовите функцию GradientFill с тремя вершинами треугольника. Подсистема GDI линейно интерполирует и заполнит треугольник. Ниже приводится пример работы функции в режиме треугольников.

Для сглаживания цветовых переходов в прямоугольнике, вызовите функцию GradientFill, передав ей координаты левого верхнего и правого нижнего углов прямоугольника. Существует два режима сглаживания при рисовании прямоугольников. В горизонтальном режиме прямоугольник заполняется слева направо. В вертикальном режиме он заполняется сверху вниз. Ниже приводятся примеры заполнения прямоугольников в обоих режимах.

Функция использует метод сеток (mesh method) при определении вершин рисуемых объектов. Все вершины передаются в функцию GradientFill в виде массива pVertex. Параметр pMesh определяет, как эти вершины соединяются друг с другом при формировании объекта. В режиме прямоугольников pMesh указывает на массив структур GRADIENT_RECT. Каждая структура GRADIENT_RECT задает индексы двух вершин в массиве pVertex. Эти две вершины являются левым верхним и правым нижним углами одного прямоугольника.

В случае заполнения треугольников, параметр pMesh указывает на массив структур GRADIENT_TRIANGLE. Каждая структура GRADIENT_TRIANGLE задает индексы трех точек в массиве pVertex. Эти три точки образуют один треугольник.

В целях облегчения аппаратного ускорения данной процедуре не требуется точность в один пиксель для прорисовки внутренней области треугольника.

Учтите что функция GradientFill не использует поле Alpha в структуре TRIVERTEX. Для использования функции GradientFill с эффектом прозрачности, сначала вызовите GradientFill а затем функцию AlphaBlend с необходимыми значениями альфа канала для каждой вершины.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | Msimg32.dll


InvertRect

Инвертирует прямоугольник в окне, применяя логическую операцию ОТРИЦАНИЕ к цвету каждого пикселя внутри прямоугольника.

Прототип

BOOL InvertRect(

_In_ HDC hDC,

_In_ const RECT *lprc

);

Параметры

hDC [in]

Описатель контекста устройства.

lprc [in]

Указатель на структуру RECT, содержащую логические координаты инвертируемого прямоугольника.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

На монохромных экранах, функция InvertRect черные пиксели делает белыми, а белые - черными. На цветных экранах, инверсия зависит от способа создания цветов на экране. Повторный вызов функции InvertRect приведет к восстановлению исходных цветов прямоугольника.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll


LineTo

Рисует линию от текущего положения до заданной точки, не включая последнюю.

Прототип

BOOL LineTo(

_In_ HDC hdc,

_In_ int nXEnd,

_In_ int nYEnd

);

Параметры

hdc [in]

Описатель контекста устройства.

nXEnd [in]

Горизонтальная координата конечной точки линии, в логических единицах.

nYEnd [in]

Вертикальная координата конечной точки линии, в логических единицах.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Линия рисуется с использованием текущего пера и, если перо является геометрическим, текущей кисти.

Если функция LineTo завершается успехом, то текущее положение устанавливается в заданную конечную точку линии.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


MoveToEx

Перемещает текущее положение в заданную точку и, опцмионально, возвращает предыдущее положение.

Прототип

BOOL MoveToEx(

_In_ HDC hdc,

_In_ int X,

_In_ int Y,

_Out_ LPPOINT lpPoint

);

Параметры

hdc [in]

Описатель контекста устройства.

X [in]

Горизонтальная координата нового положения, в логических единицах.

Y [in]

Вертикальная координата нового положения, в логических единицах.

lpPoint [out]

Указатель на структуру POINT, в которую заносится предыдущее текущее положение. Если значение этого параметра равно NULL, то предыдущее положение не возвращается.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Функция MoveToEx влияет на все функции рисования.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


PatBlt

Рисует прямоугольник, используя кисть, выбранную в контексте устройства. Цвета кисти и поверхности объединяются с помощью заданной растровой операции.

Прототип

BOOL PatBlt(

_In_ HDC hdc,

_In_ int nXLeft,

_In_ int nYLeft,

_In_ int nWidth,

_In_ int nHeight,

_In_ DWORD dwRop

);

Параметры

hdc [in]

Описатель контекста устройства.

nXLeft [in]

Горизонтальная координата левого верхнего угла закрашиваемого прямоугольника. В логических единицах.

nYLeft [in]

Вертикальная координата левого верхнего угла закрашиваемого прямоугольника. В логических единицах.

nWidth [in]

Ширина прямоугольника в логических единицах.

nHeight [in]

Высота прямоугольника в логических единицах.

dwRop [in]

Код растровой операции. Допустимые значения этого параметра перечислены здесь.

PATCOPY - копирует заданный шаблон в целевой прямоугольник.

PATINVERT - объединяет цвета заданного шаблона и целевого прямоугольника с помощью логической операции ИСКЛЮЧАЮЩЕЕ ИЛИ (XOR).

DSTINVERT - инвертирует целевой прямоугольник.

BLACKNESS - закрашивает целевой прямоугольник цветом, имеющим индекс 0 в физической палитре (для физической палитры по умолчанию это черный цвет).

WHITENESS - закрашивает целевой прямоугольник цветом, имеющим индекс 1 в физической палитре (для физической палитры по умолчанию это белый цвет).

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Значения параметра dwRop ограничены подмножеством всех 256 троичных кодов растровых операций. В частности, операция, выбирающая исходный прямоугольник, не может быть использована.

Не все устройства поддерживают функцию PatBlt. Для более подробной информации смотрите описание возможности RC_BITBLT в функции GetDeviceCaps.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


Pie

Рисует сектор эллипса, образованный дугой эллипса и двумя радиальными линиями.

Прототип

BOOL Pie(

_In_ HDC hdc,

_In_ int nLeftRect,

_In_ int nTopRect,

_In_ int nRightRect,

_In_ int nBottomRect,

_In_ int nXRadial1,

_In_ int nYRadial1,

_In_ int nXRadial2,

_In_ int nYRadial2

);

Параметры

hdc [in]

Описатель контекста устройства.

nLeftRect [in]

Горизонтальная координата левого верхнего угла ограничивающего прямоугольника. Координата задается в логических единицах.

nTopRect [in]

Вертикальная координата левого верхнего угла ограничивающего прямоугольника. В логических единицах.

nRightRect [in]

Горизонтальная координата правого нижнего угла ограничивающего прямоугольника. В логических единицах.

nBottomRect [in]

Вертикальная координата правого нижнего угла ограничивающего прямоугольника. В логических единицах.

nXRadial1 [in]

Горизонтальная координата точки первой радиальной линии. В логических единицах.

nYRadial1 [in]

Вертикальная координата точки первой радиальной линии. В логических единицах.

nXRadial2 [in]

Горизонтальная координата точки второй радиальной линии. В логических единицах.

nYRadial2 [in]

Вертикальная координата точки второй радиальной линии. В логических единицах.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Кривая сектора описывается эллипсом, который задается ограничивающим прямоугольником. Кривая начинается в точке пересечения эллипса с первой радиальной линией и проводится против часовой стрелки до точки пересечения эллипса со второй радиальной линией.

Функция Pie не использует и не изменяет текущее положение.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


PolyBezier

Рисует одну или несколько кривых Безье.

Прототип

BOOL PolyBezier(

_In_ HDC hdc,

_In_ const POINT *lppt,

_In_ DWORD cPoints

);

Параметры

hdc [in]

Описатель контекста устройства.

lppt [in]

Указатель на массив структур POINT, задающий конечные и контрольные точки кривых. Координаты точек задаются в логических единицах.

cPoints [in]

Количество точек в массиве lppt. Данное значение должно более чем в три раза превосходить количество рисуемых кривых, так как каждая кривая Безье требует две контрольные точки и одну конечную точку. Первая кривая дополнительно требует начальную точку.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Функция рисует кубическую кривую Безье, используя конечные и контрольные точки, заданные в массиве lppt. Первая кривая рисуется от первой к четвертой точке, используя вторую и третью точки в качестве контрольных. Каждая последующая кривая требует указания только трех точек: конечная точка предыдущей кривой используется как начальная точка новой кривой, последующие две точки являются контрольными, а третья - конечной точкой кривой.

Текущее положение функцией не используется и не изменяется. Фигура не заполняется.

Функция рисует линии с использованием текущего пера.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


PolyBezierTo

Рисует одну или несколько кривых Безье.

Прототип

BOOL PolyBezierTo(

_In_ HDC hdc,

_In_ const POINT *lppt,

_In_ DWORD cCount

);

Параметры

hdc [in]

Описатель контекста устройства.

lppt [in]

Указатель на массив структур POINT, задающий конечные и контрольные точки. Координаты точек задаются в логических единицах.

cCount [in]

Количество точек в массиве lppt. Данное должно не менее чем в три раза превосходить количество рисуемых кривых, так как каждая кривая Безье требует две контрольные и одну конечную точки.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Функция рисует кубическую кривую Безье, используя контрольные точки, заданные в массиве lppt. Первая кривая рисуется от текущего положения до третьей точки, используя первые две точки в качестве контрольных. Каждой последующей кривой требуется ровно три точки, так как конечная точка предыдущей кривой используется в качестве начальной для следующей кривой.

Функция перемещает текущее положение в конечную точку последней кривой Безье. Фигура не заполняется.

Функция рисует линии используя текущее перо.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


PolyDraw

Рисует набор отрезков и кривых Безье.

Прототип

BOOL PolyDraw(

_In_ HDC hdc,

_In_ const POINT *lppt,

_In_ const BYTE *lpbTypes,

_In_ int cCount

);

Параметры

hdc [in]

Описатель контекста устройства.

lppt[in]

Указатель на массив структур POINT, задающего конечные точки для каждого отрезка и кривой Безье, а также контрольные точки для последней. Координаты точек задаются в логчиеских единицах.

lpbTypes [in]

Указатель на массив, определяющий как должна использоваться соответствующая точка в массиве lppt. Допустимые значения элементов массива lpbTypes перечислены ниже.

PT_MOVETO - точка начинает отдельную фигуру. Она становится новым текущим положением.

PT_LINETO - линия чертится от текущего положения до данной точки, которая затем становится новым текущим положением.

PT_BEZIERTO - точка является контрольной или конечной точкой кривой Безье. Данный элемент всегда представляется в виде группы из трех последовательных элементов. Текущее положение задает начальную точку кривой. Первые две точки типа PT_BEZIERTO являются контрольными точками, третья точка этого типа - конечной. Конечная точка становится новым текущим положением. Если элементы этого типа не образуют последовательности из трех точек, происходит ошибка.

Типы PT_LINETO и PT_BEZIERTO могут, посредством битовой операции ИЛИ, объединяться со значением, приведенным ниже. Данное значение говорит о том, что соответствующая точка является последней точкой в фигуре, которая является замкнутой.

PT_CLOSEFIGURE - фигура автоматически замыкается на этой точке типа PT_LINETO или PT_BEZIERTO. Замыкающая линия провождится от этой точки до последней предшествующей точки, имеющей тип PT_MOVETO, или установленной функцией MoveToEx. Данный флаг, посредством битовй операции ИЛИ, объединяется с типом PT_LINETO для линий, или с типом PT_BEZIERTO для конечной точки кривой Безье. Текущее положение устанавливается в последнюю точку замыкающей линии.

cCount [in]

Количество элементов в массиве lppt. Такое же количество элементов будет и в массиве lpbTypes.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Функция PolyDraw может быть использована вместо последовательности вызовов MoveToEx, LineTo и PolyBezierTo для рисования несвязных фигур. Линии и кривые рисуются текущим пером, фигуры не заполняются. Если функцией BeginPath начат активный путь, то функция PolyDraw добавит элементы к этому пути.

Над точками, задаваемыми в массивах lppt и lpbTypes, выполняется одна из операций: MoveToEx, LineTo или PolyBezierTo. Также имеется возможность замкнуть фигуру.

Функция PolyDraw изменяет текущее положение.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


Polygon

Рисует многоугольник, состоящий из двух или более вершин, соединенных отрезками. Граница многоугольника рисуется текущим пером, а внутренняя его часть закрашивается текущей кистью и режимом закраски многоугольника.

Прототип

BOOL Polygon(

_In_ HDC hdc,

_In_ const POINT *lpPoints,

_In_ int nCount

);

Параметры

hdc [in]

Описатель контекста устройства.

lpPoints [in]

Указатель на массив структур POINT, задающих вершины многоугольника. Координаты задаются в логических единицах.

nCount [in]

Количество вершин в массиве. Данное значение должно быть не менее 2.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Многоугольник автоматически замыкается отрезком, проведенным от последней вершины к первой.

Функция Polygon не ипользует и не изменяет текущее положение.

Дополнительные точки игнорируются. Для отрисовки линии с большим количнство точек, разделите свои данные на группы, количество точек в каждой из которых меньше максимального значения, и вызовите функцию для каждой группы точек. Не забывая при этом соединять сементы линии.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


Polyline

Рисует набор отрезков, соединяя между собой точки в заданном массиве.

Прототип

BOOL Polyline(

_In_ HDC hdc,

_In_ const POINT *lppt,

_In_ int cPoints

);

Параметры

hdc [in]

Описатель контекста устройства.

lppt [in]

Указатель на массив структур POINT. Координаты точек в этих структурах задаются в логических единицах.

cPoints [in]

Количество точек в массиве. Значение данного параметра должно быть не менее двух.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Линии рисуются от первой точки через все последующие с использованием текущего пера. В отличие от функций LineTo и PolylineTo функция Polyline не использует и не изменяет текущее положение.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


PolylineTo

Рисует одну или несколько прямых линий.

Прототип

BOOL PolylineTo(

_In_ HDC hdc,

_In_ const POINT *lppt,

_In_ DWORD cCount

);

Параметры

hdc [in]

Описатель контекста устройства.

lppt [in]

Указатель на массив структур POINT, задающих вершины линий. Координаты точек задаются в логических единицах.

cCount [in]

Количество точек в массиве.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

В отличие от функции Polyline функция PolylineTo использует и изменяет текущее положение.

Линия рисуется от текущего положения до первой точки в массиве lppt с использованием текущего пера. Каждая последующая линия риуется от конечной точки предыдущей линии к следующей точке в массиве lppt.

Функция PolylineTo перемещает текущее положение в конечную точку последней линии.

Если отрезки, рисуемые функцией, образуют замкнутую фигуру, то она не закрашивается.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


PolyPolygon

Рисует набор замкнутых многоугольников. Граница каждого многоугольника рисуется текущим пером, а внутрення его часть закрашивается текущей кистью с учетом текущего режима закрашивания многоугольников. Многоугольники рисуемые этой функцией могут перекрываться.

Прототип

BOOL PolyPolygon(

_In_ HDC hdc,

_In_ const POINT *lpPoints,

_In_ const INT *lpPolyCounts,

_In_ int nCount

);

Параметры

hdc [in]

Описатель контекста устройства,

lpPoints [in]

Указатель на массив структур POINT, задающих вершины многоугольников. Координаты задаются в логических единицах. Многоугольники задаются последовательно друг за другом. Каждый многоугольник автоматически замыкается путем проведения линии от последней вершины к первой. Каждая вершина должна задаваться один раз.

lpPolyCunts [in]

Указатель на массив целых чисел, каждое из котороых задает количество точек в соответствующем многоугольнике. Каждое число должно быть не менее 2.

nCount [in]

Общее количество многоугольников.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Функция не использует и не изменяет текущее положение.

Все дополнительные точки игнорируются. Для рисования многоугольнико с большим числом точек разделите ваши данные на группы, количество точек в каждой из которых меньше максимального числа точек, и вызовите функцию для каждой группы точек. Учтите, что лучше всего иметь многоугольник только в одной из групп.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


PolyPolyline

Рисует несколько ломаных линий.

Прототип

BOOL PolyPolyline(

_In_ HDC hdc,

_In_ const POINT *lppt,

_In_ const DWORD *lpdwPolyPoints,

_In_ DWORD cCount

);

Параметры

hdc [in]

Описатель контекста устройства.

lppt [in]

Указатель на массив структур POINT, задающих вершины ломаных. Координаты точек указываются в логических единицах. Ломаные располагаются в массиве последовательно друг за другом.

lpdwPolyPoints [in]

Массив чисел. Каждое число задает количество точек в массиве lppt, образующих очередную ломаную. Каждое число должно быть больше или равно двум.

cCount [in]

Количество элементов в массиве lpdwPolyPoints.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Отрезки рисуются с использованием текущего пера. Фигуры, сформированные отрезками, не закрашиваются.

Функция PolyPolyline не использует и не изменяет текущее положение.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


Rectangle

Рисует прямоугольник. Его границы рисуются текущим пером, а внутренняя область закрашивается текущей кистью.

Прототип

BOOL Rectangle(

_In_ HDC hdc,

_In_ int nLeftRect,

_In_ int nTopRect,

_In_ int nRightRect,

_In_ int nBottomRect

);

Параметры

hdc [in]

Описатель контекста устройства.

nLeftRect [in]

Горизонтальная координата левого верхнего угла прямоугольника. Координата задается в логических единицах.

nTopRect [in]

Вертикальная координата левого верхнего угла прямоугольника. Координата задается в логических единицах.

nRightRect [in]

Горизонтальная координата правого нижнего угла прямоугольника. Координата задается в логических единицах.

nBottomRect [in]

Вертикальная координата правого нижнего угла прямоугольника. Координата задается в логических единицах.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Функция не использует и не изменяет текущее положение.

Прямоугольник не включает в себя нижнюю и правую границы.

Если используется перо PS_NULL, то размеры прямоугольника составляют 1 пиксель в высоту и 1 пиксель в ширину.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


RoundRect

Рисует прямоуольник с закругленными углами. Граница прямоугольника рисуется текущим пером, а внутренняя область закрашивается текущей кистью.

Прототип

BOOL RoundRect(

_In_ HDC hdc,

_In_ int nLeftRect,

_In_ int nTopRect,

_In_ int nRightRect,

_In_ int nBottomRect,

_In_ int nWidth,

_In_ int nHeight

);

Параметры

hdc [in]

Описатель контекста устройства.

nLeftRect [in]

Горизонтальная координата левого верхнего угла прямоугольника. В логических единицах.

nTopRect [in]

Вертикальная координата левого верхнего угла прямоугольника. В логических единицах.

nRightRect [in]

Горизонтальная координата правого нижнего угла прямоугольника. В логических единицах.

nBottomRect [in]

Вертикальная координата правого нижнего угла прямоугольника. В логических единицах.

nWidth [in]

Ширина эллипса, используемого для рисования закруглленных углов. В логических единицах.

nHeight [in]

Высота эллипса, используемого для рисования закруглленных углов. В логических единицах.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Функция не использует и не изменяет текущее положение.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


SetArcDirection

Устанавливает направление рисования дуг, используемое при рисовании дуг и прямоугольников.

Прототип

int SetArcDirection(

_In_ HDC hdc,

_In_ int ArcDirection

);

Параметры

hdc [in]

Описатель контекста устройства.

ArcDirection [in]

Новое направление рисования дуг. Допустимые значения этого параметра перечислены ниже.

AD_COUNTERCLOCKWISE - фигуры рисуются против часовой стрелки.

AD_CLOCKWISE - фигуры рисуются по часовой стрелке.

Возвращаемое значение

Предыдущее направление рисования дуг.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Направление по умолчаню - против часовой стрелки.

Функция SetArcDirection задает направление рисования в следующих функциях:

· Arc
· ArcTo
· Chord
· Ellipse
· Pie
· Rectangle
· RoundRect

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


SetBkColor

Устнавливает текущий цвет фона. Если устройство не может отобразить заданный цвет, то устанавливается ближайший к нему физический цвет.

Прототип

COLORREF SetBkColor(

_In_ HDC hdc,

_In_ COLORREF crColor

);

Параметры

hdc [in]

Описатель контекста устройства.

crColor [in]

Новый цвет фона. Для создания значения типа COLORREF используйте макрос RGB.

Возвращаемое значение

Предыдущий цвет фона в виде значения типа COLORREF.

Возвращаемое значение в случае ошибки

Значение CLR_INVALID.

Пример использования

Пример использования приведен здесь.

Примечание

Данная функция заполняет пропуски между линиями, отрисованными пером, который был создан функцией CreatePen. Но она не заполняет пропуски между линиями, отрисованными пером, который был создан функцией ExtCreatePen. Функция SetBkColor также устанавливает цвет фона для функций TextOut и ExtTextOut.

Если режим фона OPAQUE, то цвет фона используется для заполнения пропусков между линиями, линиями штриховки в кисти и ячейками символов. Цвет фона также используется при конвертировании битовых карт из цветного в двуцветный режим и наоборот.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


SetBkMode

Устанавливает режим смешивания фона для заданного контекста устройства. Данный режим используется при отображении текста, штрихованных кистей и перьев, которые рисуют не сплошные линии.

Прототип

int SetBkMode(

_In_ HDC hdc,

_In_ int iBkMode

);

Параметры

hdc [in]

Описатель контекста устройства.

iBkMode [in]

Режим фона. Допустимые значения перечислены ниже.

OPAQUE - фон заполняется текущим цветом фона до рисования текста, штрихованной кисти или пера.

TRANSPARENT - фон остается неизменным.

Возвращаемое значение

Предыдущий режим фона.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Функция влияет на линии, рисуемые пером, созданным функцией CreatePen. Но она не влияет на линии, рисуемые пером, созданным функцией ExtCreatePen.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


SetPolyFillMode

Устанавливает режим закрашивания многоугольников для функций их закраски.

Прототип

int SetPolyFillMode(

_In_ HDC hdc,

_In_ int iPolyFillMode

);

Параметры

hdc [in]

Описатель контекста устройства.

iPolyFillMode [in]

Новый режим закраски. Допустимые значения перечислены ниже.

ALTERNATE - выбирает альтернативный режим (область закрашивается между нечетными и четными сторонами многоугольника на каждой строке).

WINDING - выбирает режим изгибов (winding mode) (закрашивается любой регион с ненулевым значением изгиба (winding value)).

Возвращаемое значение

Предыдущий режим закрашивания.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

В целом, режимы закрашивания различаются только в тех случаях, когда закрашивается сложный, перекрывающийся многоугольник (например, пятиугольник, имеющий форму пятиконечной звезды с пятиугольником в центре). В таких случаях, режим ALTERNATE закрашивает каждый второй замкнутый регион внутри многоугольника (то есть, точки звезды), а режим WINDING закрашивает все регионы (то есть и точки, и пятиугольник).

Когда выбран режим ALTERNATE, подсистема GDI закрашивает область между нечетными и четными сторонами многоугольника на каждой строке. То есть, подсистема GDI, закрашивает область между первой и второй сторонами, между третьей и четвертой строной и т.д.

Когда выбран режим WINDING, подсистема GDI закрашивает любой регион, для которого значение изгиба (winding value) отлично от нуля. Данное значение определяет сколько раз используется перо для отрисовки многоугольника вокруг региона. Направление граней многоугольника неважно.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


BroadcastSystemMessage

Рассылает сообщение заданным получателям. В роли получателей могут выступать приложения, установленные драйверы, сетевые драйверы, драйверы устройств, или их произвольная комбинация.

Для получения дополнительной информации о запросе используйте функцию BroadcastSystemMessageEx.

Прототип

long WINAPI BroadcastSystemMessage(

_In_ DWORD dwFlags,

_Inout_opt_ LPDWORD lpdwRecipients,

_In_ UINT uiMessage,

_In_ WPARAM wParam,

_In_ LPARAM lParam

);

Параметры

dwFlags[in]

Набор флагов. Данный параметр принимает одно из значений перечисленных здесь, или их комбинацию.

lpdwRecipients[in,out,opt]

Указатель на переменную, которая содержит и в которую записывается информация о получателях сообщения.

Когда функция возвращает управление в данной переменной хранится комбинация значений, определяющих кто получил сообщение.

Если данный параметр равен NULL, то функция рассылает сообщение всем компонентам.

Переменная, на которую указывает данный параметр, должна содержать одно из значений перечисленных ниже или их комбинацию.

BSM_ALLCOMPONENTS - разослать всем системным компонентам.

BSM_ALLDESKTOPS - разослать всем рабочим столам (desktops). Требует наличия привилегии SE_TCB_NAME.

BSM_APPLICATIONS - разослать приложениям.

uiMessage[in]

Рассылаемое сообщение. Доступные оконные сообщения перечислены здесь.

wParam[in]

Дополнительный параметр сообщения. Зависит от рассылаемого сообщения.

lParam[in]

Дополнительный параметр сообщения. Зависит от рассылаемого сообщения.

Возвращаемое значение

Положительное число.

Возвращаемое значение в случае ошибки

Если функция не смогла разослать сообщение, то возвращается значение -1.

Если был задан флаг BSF_QUERY и хотя бы один получатель в ответ на рассылаемое сообщение вернул значение BROADCAST_QUERY_DENY, то функция вернет значение нуль. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Если флаг BSF_QUERY не указан, то функция рассылает заданное сообщение всем получателям, игнорируя значения, которые они возвращают в ответ на рассылаемое сообщение.

Система маршалирует (marshalling) только системные сообщения (находящиеся в диапазоне от нуля до (WM_USER-1)). Для пересылки других сообщений (с номером большим чем (WM_USER-1)) вы должны самостоятельно выполнить маршалинг.

В msdn говорится, что библиотека user32.dll экспортирует только unicode версию данной функции (то есть BroadcastSystemMessageW). Однако просмотр таблицы экспорта этой библиотеки (под Windows XP и Windows 7) обнаруживает, что она экспортирует три версии этой функции: BroadcastSystemMessage, BroadcastSystemMessageA и BroadcastSystemMessageW.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | BroadcastSystemMessageA и BroadcastSystemMessageW


BroadcastSystemMessageEx

Появилась в Windows XP. Отправляет сообщение заданным получателям. Получателями могут быть приложения, установленные драйверы, сетевые драйверы, драйверы устройств или произвольная комбинация этих системных компонент.

Данная функция похожа на функцию BroadcastSystemMesage, но позволяет получить больше информации о получателях.

Прототип

long WINAPI BroadcastSystemMessageEx(

_In_ DWORD dwFlags,

_Inout_opt_ LPDWORD lpdwRecipients,

_In_ UINT uiMessage,

_In_ WPARAM wParam,

_In_ LPARAM lParam,

_Out_opt_ PBSMINFO pBSMInfo

);

Параметры

dwFlags[in]

Набор флагов. Данный параметр принимает одно из значений перечисленных здесь, или их комбинацию.

lpdwRecipients[in,out,opt]

Указатель на переменную, которая содержит и в которую записывается информация о получателях сообщения.

Когда функция возвращает управление в данной переменной хранится комбинация значений, определяющих кто получил сообщение.

Если данный параметр равен NULL, то функция рассылает сообщение всем компонентам.

Переменная, на которую указывает данный параметр, должна содержать одно из значений перечисленных ниже или их комбинацию.

BSM_ALLCOMPONENTS - разослать всем системным компонентам.

BSM_ALLDESKTOPS - разослать всем рабочим столам (desktops). Требует наличия привилегии SE_TCB_NAME.

BSM_APPLICATIONS - разослать приложениям.

uiMessage[in]

Рассылаемое сообщение. Доступные оконные сообщения перечислены здесь.

wParam[in]

Дополнительный параметр сообщения. Зависит от рассылаемого сообщения.

lParam[in]

Дополнительный параметр сообщения. Зависит от рассылаемого сообщения.

pBSMInfo[out,opt]

Указатель на структуру BSMINFO, в которую записывается дополнительная информация при отклонении запроса (request is denied) и установленном флаге BSF_QUERY.

Возвращаемое значение

Положительное число.

Возвращаемое значение в случае ошибки

Если функция не смогла разослать сообщение, то возвращается значение -1.

Если был задан флаг BSF_QUERY и хотя бы один получатель в ответ на рассылаемое сообщение вернул значение BROADCAST_QUERY_DENY, то функция вернет значение нуль. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

Будем использовать тот же пример, который приводится здесь. С той лишь разницей что для рассылки сообщений мы будем использовать не функцию BroadcastSystemMessage, а BroadcastSystemMessageEx. Получатель сообщения остаётся без изменений. Вот исходный код отправителя.

#include <windows.h>

//Прототип структуры BSMINFO

typedef struct {

UINT cbSize;

HDESK hdesk;

HWND hwnd;

LUID luid;

} BSMINFO, *PBSMINFO;

//Прототип функии BroadcastSystemMessageEx

typedef long (*BSME)(DWORD,LPDWORD,UINT,WPARAM,LPARAM,PBSMINFO);

BSME lpfBSME;

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Регистрируем сообщение

int iMessage;

iMessage = RegisterWindowMessage("Broadcast_Message");

//Находим адрес функции BroadcastSystemMessageEx

HINSTANCE huser;

huser = GetModuleHandle("user32.dll");

lpfBSME = (BSME)GetProcAddress(huser,"BroadcastSystemMessageExA");

DWORD dw;

dw = BSM_APPLICATIONS;

//Рассылаем сообщение

if(lpfBSME)

lpfBSME(BSF_QUERY,&dw,iMessage,0,0,NULL);

return 0;

}

Попытка использования структуры BSMINFO приводит к тому, что сообщение не доходит до получателя.

Примечание

Если флаг BSF_QUERY не указан, то функция рассылает заданное сообщение всем получателям, игнорируя значения, которые они возвращают в ответ на рассылаемое сообщение.

Если вызывающий поток принадлежит рабочему столу отличному от рабочего стола, кторому принадлежит окно отклонившее запрос, вызывающий поток должен вызвать функцию SetThreadDesktop(hdesk) для получения информации об окне. Также он должен вызвать функцию CloseDesktop для возвращения полученного дескриптора рабочего стола.

Система маршалирует (marshalling) только системные сообщения (находящиеся в диапазоне от нуля до (WM_USER-1)). Для пересылки других сообщений (с номером большим чем (WM_USER-1)) вы должны самостоятельно выполнить маршалинг.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | BroadcastSystemMessageExA и BroadcastSystemMessageExW


ChangeWindowMessageFilter

Появилась в Windows Vista. [Использование функции ChangeWindowMessageFilter не рекомендуется, так как она настраивает фильтр сообщений всего процесса. Вместо неё используйте функцию ChangeWindowMessageFilterEx, которая настраивает фильтр сообщений отдельного окна. Функция ChangeWindowMessageFilter может не поддерживаться в будущих версиях Windows.]

Добавляет или удаляет сообщение из фильтра контроля привилегий пользовательского интерфейса (User Interface Privilege Isolation - UIPI).

Прототип

BOOL WINAPI ChangeWindowMessageFilter(

_In_ UINT message,

_In_ DWORD dwFlag

);

Параметры

message[in]

Сообщение добавляемое или удаляемое из фильтра. Допустимые коды сообщений перечислены здесь и здесь.

dwFlag[in]

Флаг выполняемой операции. Принимает одно из перечисленных ниже значений (в скобках указано фактическое значение константы).

MSGFLT_ADD (1) - добавляет сообщение message в фильтр. Если добавляемое сообщение уже разрешено, то фильтр никак не изменяется.

MSGFLT_REMOVE (2) - Удаляет сообщение message из фильтра. Если удаляемое сообщение уже удалено из фильтра, то фильтр никак не изменяется.

Возвращаемое значение

TRUE.

Обратите внимание: сообщение может быть успешно удалено из фильтра, но это не дает гарантию того, что сообщение будет заблокировано.

Возвращаемое значение в случае ошибки

FALSE. Получить дополнительную информацию об ошибке можно с помощью функции GetLastError.

Пример использования

Смотри здесь.

Примечание

UIPI - это механизм безопасности, который предотвращает получение окнами сообщений от приложений с более низким уровнем привилегии. Все сообщения с номером, превыщающим WM_USER заблокированы UIPI по умолчанию. Фильтр представляет собой список сообщений, которые могут передаваться от окон с более низким уровнем привилегии. таким образом, добавление сообщения в фильтр, разрешает передачу этого сообщения, а удаление сообщения из фильтра - запрещает его передачу.

Некоторые сообщения со значением меньшим WM_USER должны пройти через фильтр независимо от его настроек. Вы можете вызвать функцию ChangeWindowMessageFilter для удаления одного из этих сообщений из фильтра, и функция вернет значение TRUE. Однако сообщение все равно будет передаваться процессу.

Процессы с уровнем привилегии SECURITY_MANDATORY_LOW_RID или меньшим не могут изменять фильтр. Если такие процессы вызовут функцию ChangeWindowMessageFilter, то она вернет ошибку.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


ChangeWindowMessageFilterEx

Появилась в Windows 7. Редактирует настройки фильтра сообщений контроля привилегий пользовательского интерфейса (User Interface Privilege Isolation - UIPI) для заданного окна.

Прототип

BOOL WINAPI ChangeWindowMessageFilterEx(

_In_ HWND hWnd,

_In_ UINT message,

_In_ DWORD action,

_Inout_opt_ PCHANGEFILTERSTRUCT pChangeFilterStruct

);

Параметры

hWnd[in]

Описатель окна, настройки UIPI фильтра которого изменяются.

message[in]

Сообщение добавляемое или удаляемое из фильтра. Допустимые коды сообщений перечислены здесь и здесь.

action[in]

Выполняемое действие. Принимает одно из перечисленных ниже значений (в скобках указано фактическое значение константы).

MSGFLT_ALLOW (1) - разрешить передачу сообщения. разрешает доставку сообщения окну hWnd даже если это сообщение было послано от процессса с более низким уровнем привилегии.

MSGFLT_DISALLOW (2) - запрещает доставку сообщения message от процесса с более низким уровнем привилегии, если данное собщение разрешено для процесса (с помощью функции ChangeWindowMessageFilter) или для всей системы.

MSGFLT_RESET (0) - сбрасывает настройки фильтра для окна hWnd в значение по умолчанию. Все сообщения передаваемые от процессов с более низким уровнем привилегии, разрешенные для всей системы или фильтром процесса будут передаваться окну. Все остальные сообщения передаваемые от процессов с более низким уровнем привилегии будут блокироваться.

pChangeFilterStruct[in,out,opt]

Указатель на структуру CHANGEFILTERSTRUCT.

Возвращаемое значение

TRUE.

Возвращаемое значение в случае ошибки

FALSE. Получить дополнительную информацию об ошибке можно с помощью функции GetLastError.

Пример использования

Смотри здесь.

Примечание

UIPI - это механизм безопасности, который предотвращает получение окнами сообщений от приложений с более низким уровнем привилегии. Вы можете использовать даную функцию для того, чтобы разрешить доставку окну определенных сообщений, даже если они отправлены процессом с более низким уровнем привилегии. В отличие от функции ChangeWindowMessageFilter, которая редактирует фильтр сообщений всего процесса, функция ChangeWindowMessageFilterEx редактирует филтр сообщений отдельного окна.

Приложения могут использовать функцию ChangeWindowMessageFilter для разрешения и запрещения сообщений применительно ко всему процессу. Если сообщение разрешено фильтром сообщений процесса или фильтром сообщений окна, то оно будет доставлено окну.

Процессы с уровнем привилегии SECURITY_MANDATORY_LOW_RID или меньшим не могут изменять фильтр. Если такие процессы вызовут функцию ChangeWindowMessageFilterEx, то она вернет ошибку с кодом ERROR_ACCESS_DENIED.

Некоторые сообщения со значением меньшим WM_USER должны пройти через фильтр независимо от его настроек. Вы можете вызвать функцию ChangeWindowMessageFilterEx для удаления одного из этих сообщений из фильтра. Однако сообщение все равно будет передаваться окну.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


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


DispatchMessage

DispatchMessage(A/W)

 Top Previous Next

Пересылает оконное сообщение в соответствующую оконную процедуру.

Прототип

LRESULT WINAPI DispatchMessage(

_In_ const MSG *lpmsg

);

Параметры

lpmsg[in]

Адрес структуры MSG, описывающей пересылаемое оконное сообщение

Возвращаемое значение

Данная функция возвращает то, что вернула оконная процедура при обработке пересланного ей сообщения. Хотя это значение зависит от пересылаемого сообщения, обычно оно игнорируется.

Пример использования

Смотри в примере оконного приложения.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | DispatchMessageA и DispatchMessageW


GetInputState

Проверяет есть ли в очереди сообщений вызывающего потока сообщения связанные с кнопками мыши или клавиатурой.

Прототип

BOOL WINAPI GetInputState(void);

Возвращаемое значение

Если очередь сообщений содержит одно или более сообщений связанных с кнопками мыши или клавиатурой, то функция возвращает ненулевое значение.

Если в очереди сообщений нет новых сообщений связанных с кнопками мыши или клавиатурой, то функция возвращает значение нуль.

Пример использования

Пример использования приведен здесь.

Заголовочный файл | 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


GetMessageExtraInfo

Возвращает дополнительную информацию о сообщении для текущего потока. Дополнителная информация о сообщении является определенным приложением или драйвером параметром, ассоциированным с очередью сообщений текущего потока.

Прототип

LPARAM WINAPI GetMessageExtraInfo(void);

Возвращаемое значение

Значение, определяющее дополнительную информацию о сообщении. Интерпретация дополнительной информации зависит от устройства (is device specific).

Пример использования

Пример использования приведен здесь.

Примечание

Для изменения дополнительной информации о сообщении используйте функцию SetMessageExtraInfo.

В msdn говорится, что функцию GetMessageExtraInfo модно использовать для определения того, ка был сгенерирован щелчок кнопкой мыши: с помощью настоящей мыши, при помощи сенсорного экрана, при помощи пера (Pen) или как-нибудь еще. Подробнее об этом читайте по ссылкам: http://blogs.msdn.com/b/oldnewthing/archive/2010/11/29/10097548.aspx и http://msdn.microsoft.com/en-us/library/windows/desktop/ms703320(v=vs.85).aspx. Как бы то ни было, в моих экспериментах при обработке сообщений от мыши и клавиатуры (на Windows XP и Windows 7) данная функция всегда возвращает значение нуль (если, конечно, оно умышленно не изменено как в примере).

Как показывают эксперименты дополнительная информация о сообщении привязывается не к очереди сообщений потока, а к отдельному сообщению. Из-за этого время "жизни" информации записанной с помощью SetMessageExtraInfo соответствует времени "жизни" оконного сообщения, при обработке которого записывалась эта информация.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetMessageTime

Возвращает время, когда функция GetMessage извлекла последнее сообщение. Время редставлено в виде длинного целого (long integer), которое определяет сколько времени, в миллисекундах, прошло с момента запуска системы до создания сообщения (то есть до помещения его в очередь сообщений).

Прототип

LONG WINAPI GetMessageTime(void);

Возвращаемое значение

Время сообщения (message time).

Пример использования

Создадим небольшое приложение, которое создаёт диалоговое окно. При нажатии левой кнопкой мыши по этому окну, оно будет выводить на экран информацию о времени сообщения.

#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)

{

char s[16];

switch(uMsg){

case WM_LBUTTONDOWN:

//Выводим на экран время создания сообщения

sprintf(s,"%d",GetMessageTime());

MessageBox(hwnd,s,"",MB_OK);

break;

case WM_CLOSE:

//Закрываем окно

EndDialog(hwnd,0);

}

return 0;

}

Примечание

Возвращаемое функцией GetMessageTime значение необязательно увеличивается от сообщения к сообщению, так как из-за ограниченного числа разрядов длинного целого при большом возможно переполнение рязрядной сетки. В результате этого значение времени может вновь стать равным нулю.

Для вычисление времени, прошедшего между двумя сообщения, из времени второго сообщения нужно вычесть время первого сообщения (игнорируя переполнение) и сравнить результат с ожидаемым промежутком времени между двумя сообщениями.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


GetQueueStatus

Возвращает тип сообщений найденных в очереди сообщений вызывающего потока.

Прототип

DWORD WINAPI GetQueueStatus(

_In_ UINT flags

);

Параметры

flags[in]

Набор флагов, определяющий наличие сообщений какого типа проверяется в очереди сообщений. Данный параметр принмает одно из значений перечисленных здесь, или их комбинацию.

Возвращаемое значение

Старшее слово возвращаемого значения определяет типы сообщений, находящихся сейчас в очереди сообщений. Младшее слово возвращаемого значения определяет типы сообщений, которые были добавлены в очередь сообщений и все еще находятся там со времени последнего вызова функции GetQueueStatus, GetMessage или PeekMessage.

Пример использования

Создадим небольшое приложение, которое создаёт диалоговое окно. При нажатии левой кнопкой мыши по этому окну, оно будет выводить на экран информацию о том какие соообщения находятся в очереди сообщений.

#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)

{

char s[16];

switch(uMsg){

case WM_LBUTTONDOWN:

//Выводим на экран типы сообщений находящихся в очереди сообщений

sprintf(s,"%x",GetQueueStatus(QS_INPUT));

MessageBox(hwnd,s,"",MB_OK);

Sleep(300);

break;

case WM_CLOSE:

//Закрываем окно

EndDialog(hwnd,0);

}

return 0;

}

Задержка в 300 мс нужна для того, чтобы сообщения успевали накапливаться в очереди.

В большинстве случаев данное приложение будет выводить на экран значение нуль. Однако если щелкать по главному окну приложения достаточно быстро, то оно выведет на экран значение 0x060000, что соответствует флагу QS_MOUSE в старшем слове. Если при этом активно использовать и клавиатуру, то на экран будет выведено значение 0x070000, что соответствует значению (QS_MOUSE | QS_KEY).

Примечание

Наличие какого-ли QS_-флага в возвращаемом функции значении не гарантирует, что последующий вызов функции GetMessage или PeekMessage извлечет данное сообщение. Функции GetMessage и PeekMessage выполняют некоторую внутреннюю фильтрацию сообщений (perform some internal filtering), поэтому некоторые собщения обрабатываются внутри этих функций. Поэтому возвращаемое функцией GetQueueStatus значение следует рассматривать лишь как подсказку о том, нужно ли вызывать функцию GetMessage или PeekMessage.

Флаги QS_ALLPOSTMESSAGE и QS_POSTMESSAGE отличаются только в том, когда они сбрасываются (cleared). Флаг QS_POSTMESSAGE сбрасывается когда вы вызываете функцию GetMessage или PeekMessage, вне зависимости от того используете вы фильтрацию сообщений или нет. Флаг QS_ALLPOSTMESSAGE сбрасывается когда вы вызываете функцию GetMessage или PeekMessage без фильтрации сообщений (то есть когда параметры wMsgFilterMin и wMsgFilterMax этих функций равны нулю). Это может быть полезно когда вы вызываете функцию PeekMessage много раз для извлечения различных сообщений.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


InSendMessage

Определяет факт отправки сообщения, полученного оконной процедурой, из другого потока (того же самого процесса или другого процесса) с помощью функции SendMessage.

Для получения дополнительной информации о том, как было отправлено сообщение используйте функцию InSendMessageEx.

Прототип

BOOL WINAPI InSendMessage(void);

Возвращаемое значение

Если оконная процедура обрабатывает сообщение, которое было отправлено из другого потока с помощью функции SendMessage, то функция возвращает ненулевое значение. В противном случае она возвращает значение нуль.

Пример использования

Пример использования приведен здесь.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


InSendMessageEx

Определяет факт отправки сообщения, полученного оконной процедурой, из другого потока (того же процесса или другого процесса).

Прототип

DWORD WINAPI InSendMessageEx(

_Reserved_ LPVOID lpReserved

);

Параметры

lpReserved

Зарезервировано, должно быть равно NULL.

Возвращаемое значение

Если сообщение не было отправлено (sent), то функция возвращает значение ISMEX_NOSEND. В противном случае функция возвращает одно из значений перечисленных ниже, или их комбинацию.

ISMEX_CALLBACK - сообщение было отправлено с помощью функции SendMessageCallback. Поток, который отправил сообщение не заблокирован.

ISMEX_NOTIFY - сообщение было отправлено с помощью функции SendNotifyMessage. Поток, который отправил сообщение не заблокирован.

ISMEX_REPLIED - оконная процедура обработала сообщение. Поток, который отправил сообщение, больше не блокируется.

ISMEX_SEND - сообщение было отправлено с помощью функции SendMessage или SendMessageTimeout. Если флаг ISMEX_REPLIED не установлен, то поток, который отправил сообщение заблокирован.

Пример использования

Пример использования приведен здесь.

Примечание

Для определения того, заблокирован ли поток, отправивший сообщение используйте следующий код:

fBlocked = ( InSendMessageEx(NULL) & (ISMEX_REPLIED|ISMEX_SEND) ) == ISMEX_SEND;

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


IsDialogMessage

Определяет, предназначено ли сообщение заданному диалоговому окну и, если это так, обрабатывает сообщение.

Прототип

BOOL WINAPI IsDialogMessage(

_In_ HWND hDlg,

_In_ LPMSG lpMsg

);

Параметры

hDlg [in]

Описатель диалогового окна.

lpMsg [in]

Указатель на структуру MSG, описывающую проверяемое сообщение.

Возвращаемое значение

Если сообщение обработано, то возвращается ненулевое значение.

Если сообщение не обработано, то возвращается значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Хотя функция IsDialogMessage предназначена для немодальных диалоговых окон, вы можете использовать её для окна, содержащего элементы управления, позволяя тем самым предоставлять пользователю такую же возможность клавиатурного выбора элементов управления, какая у него есть при работе с диалоговыми окнами.

Когда функция IsDialogMessage обрабатывает сообщение, она проверяет сообщения клавиатуры и конвертирует их в выбор элемента управления. Например, при нажатии клавишы TAB выбирается следующий элемент управления или их группа; при нажатии клавишы "стрелка вниз" выбирается следующий элемент управления в группе.

Так как функция IsDialogMessage выполняет всю необходимую трансляцию и диспетчеризацию сообщений, то сообщения, обработанные ею, не должны передаваться в функцию TranslateMessage или DispatchMessage.

Функция IsDialogMessage отправляет диалоговой процедуре сообщение WM_GETDLGCODE для определения клавиш, которые должны быть обработаны.

Функция IsDialogMessage может отправить окну сообщения DM_GETDEFID и DM_SETDEFID. Эти константы объявлены в заголовочном файле Winuser.h как WM_USER и WM_USER+1, поэтому возможны конфликты с определенными приложением сообщениями, имеющими такой же код.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | IsDialogMessageA и IsDialogMessageW


MsgWaitForMultipleObjects

Появилась в Windows XP. Ждёт пока один или несколько объектов находятся в сигнальном состоянии или пока не истечет время ожидания. Объектами могут быть объекты событий ввода (input event objects), которые вы определили с помощью параметра dwWakeMask.

Для перехода в "тревожное" (alertable) ожидание используйте функцию MsgWaitForMultipleObjectsEx.

Прототип

DWORD WINAPI MsgWaitForMultipleObjects(

_In_ DWORD nCount,

_In_ const HANDLE *pHandles,

_In_ BOOL bWaitAll,

_In_ DWORD dwMilliseconds,

_In_ DWORD dwWakeMask

);

Параметры

nCount[in]

Количество описателей объектов в массиве, на который указывает параметр pHandles. Максимально допустимое количество описателей равно MAXIMUM_WAIT_OBJECTS минус один.

pHandles[in]

Массив описателей объектов. Список типов объектов, описатели которых могут задаваться в этом массиве приведен в примечании. Массив может содержать описатели объектов разных типов. Массив не должен содержать копии одного и того же описателя.

Если один из описателей в этом массиве закрывается (is closed) во время ожидания, то поведение функции неопределено.

Описатели должны иметь тип доступа SYNCHRONIZE.

bWaitAll[in]

Если значение этого параметра равно TRUE, то функция вернет управление когда все объекты, указанные в массиве pHandles, перейдут в сигнальное состояние (set to signaled) и будет получен ввод. Если значение этого параметра равно FALSE, то функция управление когда один из объектов, указанных в массиве pHandles, перейдет в сигнальное состояние или будет получен ввод. В этом случае функция возвращает значение, определяющее объект, изменение состояния которого привело к выходу из функции.

dwMilliseconds[in]

Время ожидания, в миллисекундах. Еслизадано ненулевое значение, то функция ждет пока заланные объекты не перейдут в сигнальное состояние или не истечет заданный интервал времени. Если значение параметра dwMilliseconds равно нулю, то функция не ждет когда объекты перейдут в сигнальное состояние, она немедленно возвращает управление. Если значение параметра dwMilliseconds равно INFINITE, то функция вернет управление только когда заданные объекты перейдут в сигнальное состояние.

dwWakeMask[in]

Типы ввода, описатель объекта события ввода (input event object handle) которых будет добавлен в массив описателей объектов. Значение данного параметра может быть произвольной комбинацией флагов, перечисленных здесь.

Возвращаемое значение

Если функция завершается с успаехом, то возвращенное значение определяет событие, которое привело к выходу из функции. Оно может быть одним из перечисленных ниже значений (константа WAIT_OBJECT_0 определена как нуль, WAIT_ABANDONED_0 определена как 0x00000080L).

Значение от WAIT_OBJECT_0 до (WAIT_OBJECT_0+(nCount-1)). Если значение параметра bWaitAll равно TRUE, то возвращенное значение определяет, что все заданные объекты перешли в сигнальное состояние. Если значение параметра bWaitAll равно FALSE, то возвращенное функцией значение минус WAIT_OBJECT_0 определяет индекс объекта в массиве pHandles, который прервал ожидание.

Значение WAIT_OBJECT_0+nCount. В очереди сообщений потока доступно новое сообщение ввода, удовлетворяющее значению параметра dwWakeMask. Такие функции, как PeekMessage, GetMessage и WaitMessage помечают сообщенния в очереди как старые сообщения. Поэтому, после того как вы вызвали одну из этих функций, последующий вызов функции MsgWaitForMultipleObjects не вернет управление до тех пор, пока не будет получен новый ввод заданного типа.

Данное значение также возвращается в результате системного события, которое требует активности потока (thread's action), такого как активация на переднем плане (foreground activation). Поэтому функция MsgWaitForMultipleObjects может вернуть управление даже тогда, когда нет доступного ввода, и если значение параметра dwWakeMask равно нулю. В этих случаях, вызовите функцию GetMessage или PeekMessage для обработки системного события перед повторным вызовом функции MsgWaitForMultipleObjects.

Значение от WAIT_ABANDONED_0 до (WAIT_ABANDONED+nCount-1). Если значение параметра bWaitAll равно TRUE, то возвращенное значение определяет, что все заданные объекты перешли в сигнальное состояние и что хотя бы один из этих объектов является "забытым" мьютексом (abandoned mutex). Если значение параметра bWaitAll равно FALSE, то возвращенное функцией значение минус WAIT_ABANDONED_0 является индексом объекта "забытый" мьютекс в массиве pHandles, который прервал ожидание. Право собственности на этот мьютекс переходит к вызывающему потоку, и мьютекс установлен в несигнальное состояние (set to nonsignaled).

Если мьютекс сохранил прежнее состояние, вы должны проверить его на корректность.

WAIT_TIMEOUT. Истекло время ожидания, и условия заданные в параметрах bWaitAll и dwWakeMask не выполнены.

Возвращаемое значение в случае ошибки

WAIT_FAILED. Для получения дополнительной информации используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Функция MsgWaitForMultipleObjects определяет были ли выполнены требования ожидания (wait criteria). Если они не были выполнены, то вызывающий поток входит в состояние ожидания до тех пор пока либо не будут выполнены условия ожидания, либо не истечет интервал ожидания.

Когда значение параметра bWaitAll равно TRUE, функция не изменяет состояния заданных объектов до тех пор, пока все объекты не перейдут в сигнальное состояние. Например, мьютекс может находиться в сигнальном состоянии, но поток не получит возможность управлять им до тех пор, пока остальные объекты также не перейдут в сигнальное состояние. В это время другой поток может получить возможность управлять этим мьютексом, тем самым переведя его в несигнальное состояние.

Когда значение параметра bWaitAll равно TRUE, функция ждёт, когда все объекты перейдут в сигнальное состояние и будет получено сообщение ввода. Тем самым, установка значения параметра bWaitAll равным TRUE предотвращает обработку ввода до тех пор пока все объекты в массиве pHandles не перейдут в сигнальное состояние. Поэтому, если вы установили значение параметра bWaitAll равным TRUE, вы должны использовать короткий период ожидания в dwMilliseconds. Если у вас есть поток, который создёт окна, ожидая вех объектов из массива pHandles, включая события ввода заданные в dwWakeMask, без времени ожидания, то это приведет к "зависанию" системы. Это произойдет из-за того, что потоки, создающие окна должны обрабатывать сообщения. DDE рассылает сообщения всем окнам в системе. Поэтому, если поток создаёт окна, не устанавливайте значение параметра bWaitAll равным TRUE при вызове функции MsgWaitForMultipleObjects из этого потока.

Когда значение параметра bWaitAll равно FALSE, функция проверяет описатели в массиве начиная с первого элемента, пока один из объектов не перейдет в сигнальное состояние. Ели в сигнальное состояние переходит несколько объектов, функция возвращает индекс первого оисателя в массиве, чей объект перешел в сигнальное состояние.

Функция MsgWaitForMultipleObjects не возвращает управление если в очереди сообщений существует непрочитанный ввод заданного типа после вызова потоком какой-либо функции проверки очереди. Это происходит потому, что такие функции как PeekMessage, GetMessage, GetQueueStatus и WaitMessage проверяют очередь и изменяют информацию о её состоянии таким образом, что ввод больше не считается новым. Последующий вызов функции MsgWaitForMultipleObjects не вернет управление до тех пор, пока не поступит новый ввод заданного типа. Существующий непрочитанный ввод (полученный до последней проверки очереди сообщений потока) игнорируется.

Функция изменяет состояние синхронизирующих объектов некоторых типов. Изменение состояние объекта или объектов происходит только тогда, когда их сигнальное состояние вызывает выход из функции. Например, счетчик объекта семафор уменьшается на единицу. Для более подробной информации см. документацию на отдельные объекты синхронизации.

В массиве pHandles можно задавать описатели следующих типов объектов: уведомление об изменении (change notification); консольный ввод; событие (event); уведомление ресурсов памяти (memory resource notification); мьютекс; процесс; поток; ожидаемый таймер (waitable timer).

Флаги QS_ALLPOSTMESSAGE и QS_POSTMESSAGE отличаются в том, когда они сбрасываются. Флаг QS_POSTMESSAGE очищается, когда вы вызываете функцию GetMessage или PeekMessage с фильтрацией сообщений или без фильтрации. Флаг QS_ALLPOSTMESSAGE очищается, когда вы вызываете функцию GetMessage или PeekMessage без фильтрации сообщений (значения параметров wMsgFilterMin и wMsgFilterMax этих функций равны нулю). Это может быть полезным когда вы много раз вызываете функцию PeekMessage для извлечения различных сообщений.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


MsgWaitForMultipleObjectsEx

Появилась в Windows XP. Ожидает пока один или все заданные объекты не перейдут в сигнальное состояние, процедура завершения ввода/вывода (I/O completion routine) или асинхронный вызов поцедуры (APC) не будет поставлен в очередь потока, или не истечет интервал ожидания. Массив объектов может включать в себя объекты событий ввода (input event objects), которые указываются с помощью параметра dwWakeMask.

Прототип

DWORD WINAPI MsgWaitForMultipleObjectsEx(

_In_ DWORD nCount,

_In_ const HANDLE *pHandles,

_In_ DWORD dwMilliseconds,

_In_ DWORD dwWakeMask,

_In_ DWORD dwFlags

);

Параметры

nCount[in]

Количество описателей объектов в массиве pHandles.Максимально допустимое количество описателей объектов равно MAXIMUM_WAIT_OBJECTS минус один.

pHandles[in]

Указатель на массив описателей объектов. Типы объектов, описатели которых могут быть указаны в этом массиве перечислены в примечании. Массив может содержать описатели объектов разных типов. Он не должен содержать копий одного и того же описателя.

Если один из описателей закрывается во время ожидания, то поведение функции становится неопределенным.

Описатели должны иметь право доступа (access right) SYNCHRONIZE.

dwMilliseconds[in]

Время ожидания, в миллисекундах. Если значение этого параметра отлично от нуля, то функция ждёт пока заданные объекты не перейдут в сигнальное состояние, в очередь потока не будет поставлена процедура завершения ввода/вывода или APC, или не истечет заданный период ожидания. Если значение параметра dwMilliseconds равно нулю, функция не переходит в состояние ожидания и немедленно возвращает управление. Если значение параметра dwMilliseconds равно INFINITE, функция вернет управление только тогда когда заданные объекты перейдут в сигнальное состояние или в очередь потока будет поставлена процедура завершения ввода/вывода или APC.

dwWakeMask[in]

Типы ввода для описатели объектов событий которых будут добавлены в массив описателей объектов. Данный параметр принимает одно из значений перечисленных здесь или их комбинацию.

dwFlags[in]

Тип ожидания. Данный параметр принимает одно из значений перечисленных ниже или их комбинацию.

Нуль - функция вернет управление когда один из объектов перейдет в сигнальное состояние. Возвращаемое функцией значение определяет - изменение состояния какого объекта привело к выходу из функции.

MWMO_ALERTABLE - функция также вернет управление если в очередь ожидающего потока с помощью функции QueueUserAPC поставлен APC.

MWMO_INPUTAVAILABLE - функция вернет управление если для очереди существует ввод, даже если этот ввод был просмотрен (но не удален) с помощью другой функции, такой как PeekMessage.

MWMO_WAITALL - функция вернет управление когда в одно и тоже время все объекты указанные в массиве pHandles будут в сигнальном состоянии и будет получено событие ввода.

Возвращаемое значение

Возвращаемое значение определяет какое событие привело к выходу из функции. Допустимые значения перечислены ниже. (константа WAIT_OBJECT_0 определена как нуль, константа WAIT_ABANDONED_0 определена как 0x00000080L)

От WAIT_OBJECT_0 до (WAIT_OBJECT_0 + nCount - 1). Если используется флаг MWMO_WAITALL, то возвращаемое значение говорит о том, что все объекты перешли в сигнальное состояние. Если этот флаг не используется, то возвращенное значение минус WAIT_OBJECT_0 является индексом объекта в массиве pHandles, который привел к выходу из функции.

WAIT_OBJECT_0 + nCount. В очереди ввода потока доступен новый ввод заданного в параметре dwWakeMask типа. Такие функции как PeekMessage, GetMessage, GetQueueStatus и WaitMessage помечают сообщения в очереди как старые сообщения. Вследствие этого, после вызова одной из этих функций, последующий вызов функции MsgWaitForMultipleObjects не вернет управления до тех пор, пока не будет получен новый ввод заданного типа.

Данное значение возвращается также когда происходит системное событие, требующее активации потока, такое как активация на переднем плане (foreground activation). Поэтому функция MsgWaitForMultipleObjectsEx может вернуть управление несмотря на то, что доступного ввода нет и даже если значение параметра dwWakeMask равно нулю. В этих случаях вызов функции GetMessage или PeekMessage обработает системное событие перед повторной попыткой использования функции MsgWaitForMultipleObjectsEx.

От WAIT_ABANDONED_0 до (WAIT_ABANDONED_0+nCount-1). Если используется флаг MWMO_WAITALL, то возвращенное значение говорит о том, что все заданные оюъекты перешли в сигнальное состояние и, по крайней мере, один из объектов является "забытым" мьютексом (abandoned mutex). Если флаг не используется, то возвращенное значение минус WAIT_ABANDONED_0 является индексом "потерянного" мьютекса в массиве pHandles, который привел к выходу из функции. Владельцем мьютекса становится вызывающий поток, мютекс устанавливается в несигнальное состояние.

Если мьютекс сохранил прежнее состояние, вы должны проверить его на корректность.

WAIT_IO_COMPLETION. Ожидание было прервано из-за того, что в очередь потока была поставлена одна или несколько APC пользовательского уровня.

WAIT_TIMEOUT. Истек интервал ожидания, и условия определенные параметрами dwFlags и dwWakeMask так и не наступили.

Возвращаемое значение в случае ошибки

WAIT_FAILED. Для получения дополнительной информации используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Функция MsgWaitForMultipleObjectsEx определяет собьлюдение условий заданных в параметрах dwWakeMask и dwFlags. Если эти условия не выполняются, то вызывающий поток входит в состояние ожидания до тех пор пока либо не будут выполняться ожидаемые условия, либо не истечет время ожидания.

Когда значение параметра dwFlags равно нулю, функция последовательно проверяет описатели в массиве, начиная с нулевого индекса, до тех пор пока один из объектов не перейдет в сигнальное состояние. Если в сигнальное состояние перешло несколько объектов, то функция возвращает индекс первого описателя в массиве, объект которого перешел в сигнальное состояние.

Функция MsgWaitForMultipleObjectsEx не возвращает управление есои в очереди сообщений есть непрочитанный ввод заданного типа после того как поток вызвал функцию проверки очереди. Это происходит из-за того, что такие функции как PeekMessage, GetMessage, GetQueueStatus и WaitMessage проверяют очередь и затем изменяют информацию о её состоянии таким образом, что ввод более не считается новым. Последующий вызов функции MsgWaitForMultipleObjectsEx не вернет управление до тех пор пока не будет получен новый ввод указанного типа. Для изменения такого поведения используйте флаг MWMO_INPUTAVAILABLE. Если этот флаг не указан, то существующий непочитанный ввод (полученный до последнего вызова функции проверки очереди) игнорируется.

Функция изменяет состояние некоторых объектов синхронизации. Изменение состояния происходит только для объекта или объектов, сигнальное состояние которых привело к выходу из функции. Например, система уменьшает на единицу значение счетчика семафора. Более подробную информацию смотрите в описании отдельных объектов синхронизации.

В массиве pHandles допустимо указание описателей объектов следующих типов: уведомление об изменении (change notification); консольный ввод; событие; уведомление расходования памяти (memory resource notification); мьютекс; процесс; семафор; поток; ожидаемый таймер (waitable timer).

Флаги QS_ALLPOSTMESSAGE и QS_POSTMESSAGE отличаются в том, когда они сбрасываются. Флаг QS_POSTMESSAGE очищается, когда вы вызываете функцию GetMessage или PeekMessage с фильтрацией сообщений или без фильтрации. Флаг QS_ALLPOSTMESSAGE очищается, когда вы вызываете функцию GetMessage или PeekMessage без фильтрации сообщений (значения параметров wMsgFilterMin и wMsgFilterMax этих функций равны нулю). Это может быть полезным когда вы много раз вызываете функцию PeekMessage для извлечения различных сообщений.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


PeekMessage

Распределяет входящие (incoming sent) сообщения, проверяет очередь потока на наличие помещенных (posted) в неё сообщений, и врзвращает сообщение (если оно есть).

Прототип

BOOL WINAPI PeekMessage(

_Out_ LPMSG lpMsg,

_In_opt_ HWND hWnd,

_In_ UINT wMsgFilterMin,

_In_ UINT wMsgFilterMax,

_In_ UINT wRemoveMsg

);

Параметры

lpMsg[out]

Указатель на структуру MSG, в которую будет записана информация о сообщении.

hWnd[in,opt]

Описатель окна, сообщения для которого будут извлекаться. Окно должно принадлежать текущему потоку.

Если значение этого параметра равно NULL, то функция PeekMessage извлекает сообщения для всех окон, принадлежащих текущему потоку, и все сообщения из очереди собщений потока, для которых значение поля hwnd равно NULL (см. описание структуры MSG). Таким образом при hWnd равном NULL обрабатываются и оконные сообщения и сообщения потока.

Если значение параметра hWnd равно -1, то функция PeekMessage извлекает только сообщения из очереди сообщения потока, для которых значение поля hwnd равно NULL, то есть, сообщения потока отправленные с помощью функции PostMessage (при параметре hWnd равном NULL) или PostThreadMessage.

wMsgFilterMin[in]

Значение кода первого сообщения в диапазоне проверяемых сообщений. Используйте значение WM_KEYFIRST (0x0100) для определения первого сообщения от клавиатуры, или WM_MOUSEFIRST (0x0200) для определения первого сообщения от мыши.

Если значения параметров wMsgFilterMin и wMsgFilterMax одновременно равны нулю, то функция PeekMessage извлекает все доступные сообщения (то есть фильтрация не выполняется).

wMsgFilterMax[in]

Значение кода последнего сообщения в диапазоне проверяемых сообщений. Используйте значение WM_KEYLAST для определения последнего сообщения от клавиатуры, или WM_MOUSELAST для определения последнего сообщения от мыши.

Если значения параметров wMsgFilterMin и wMsgFilterMax одновременно равны нулю, то функция PeekMessage извлекает все доступные сообщения (то есть фильтрация не выполняется).

wRemoveMsg[in]

Набор флагов, которые определяют как будет обрабатываться сообщение. Данный параметр принимает одно из значений перечисленных ниже, или их комбинацию.

PM_NOREMOVE - сообщения не удаляются из очереди после обработки функцией PeekMessage.

PM_REMOVE - сообщения удаляются из очереди после обработки функцией PeekMessage.

PM_NOYIELD - запрещает системе освобождать (releasing) какой-либо поток, то есть переводить поток в состояние простоя (idle) на время ожидания вызова (см. описание функции WaitForInputIdle). Комбинируйте данный флаг с флагом PM_NOREMOVE или PM_REMOVE.

По умолчанию обрабатываются сообщения всех типов. Для указания того, что должны обрабатываться отдельные сообщения используйте одно из значений, перечимсленных ниже, или их комбинацию.

PM_QS_INPUT - обрабатывать сообщения от мыши и клавиатуры.

PM_QS_PAINT - обрабатывать сообщения рисования (paint messages).

PM_QS_POSTMESSAGE - обрабатывать все сообщения, поставленные в очередь (posted messages), включая сообщения таймеров и горячих клавиш (hotkeys).

PM_QS_SENDMESSAGE - обрабатывать все отправленные (sent) сообщения.

Возвращаемое значение

Если есть доступное сообщение, то возвращается ненулевое значение.

Если доступных сообщений нет, то возвращается значение нуль.

Пример использования

Пример использован приведен здесь.

Примечание

Функция PeekMessage возвращает сообщения направленные окну hWnd или любому его дочернему окну, и находящиеся в интервале от wMsgFilterMin до wMsgFilterMax. Помните, что приложение может использовать только младшие слова этих параметров, старшие слова зарезервированы для системы.

Функция PeekMessage всегда извлекает сообщение WM_QUIT вне зависимости от значения параметров wMsgFilterMin и wMsgFilterMax.

Во время этого вызова, система предоставляет ожидающие обработки, внеочередные (nonqueued) сообщения, то есть сообщения отправленные окнам, принадлежащим вызывающему потоку с помощью функции SendMessage, SendMessageCallback, SendMessageTimeout или SendNotifyMessage. Затем из очереди извлекается первое сообщение, которое соответствует заданному фильтру. Система также может обрабатывать внутренние события (internal events). Если фильтр не задан, то сообщения обрабатываются в следующем порядке:

· отправленные (sent) сообщения,
· сообщенные поставленные в очередь (posted),
· сообщения ввода (от аппаратуры) и системные внутренние события,
· отправленные (sent) сообщения (снова),
· сообщения WM_PAINT,
· cooбщения WM_TIMER.

Для извлечения сообщений ввода перед сообщениями поставленными в очередь (posted), используйте параметры wMsgFilterMin и wMsgFilterMax.

Функция PeekMessage обычно не удаляет из очерели сообщение WM_PAINT. Сообщения WM_PAINT остаются в очереди до тех пор пока не будут обработаны. Однако, если сообщение WM_PAINT имеет пустой обновляемый регион, функция PeekMessage удаляет его из очереди.

Если окно верхнего уровня не отвечает на сообщения в течения нескольких секунд, система решает, что приложение зависло и замещает окно окном-призраком (ghost window), которое имеет такое же место в z-последовательности, положение, размер и атрибуты отображения. Это позволяет пользователю перемещать окно, изменять его размеры, или даже закрыть приложение. Однако доступны только эти действия, так как приложение фактически не отвечает. Когда приложение находится в режиме отладки, система не создаёт окно-призрак.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | PeekMessageA и PeekMessageW


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


PostThreadMessage

Помещает сообщение в очередь сообщений заданного потока. Функция возвращает управление без ожидания обработки сообщения потоком.

Прототип

BOOL WINAPI PostThreadMessage(

_In_ DWORD idThread,

_In_ UINT Msg,

_In_ WPARAM wParam,

_In_ LPARAM lParam

);

Параметры

idThread[in]

Идентификатор потока, которому отправляется сообщение.

Если данный поток не имеет очереди сообщений, то функция завершается ошибкой. Система создаёт очередь сообщений потока когда этот поток делает первый вызов какой-либо USER или GDI функции.

Отправляемые сообщения проверяются фильтром контроля привилегий пользовательского интерфейса (User Interface Privilege Isolation - UIPI) (UIPI появился в Windows Vista). Поток может отправлять сообщения только потокам, процессы которых находятся на том же или более низком уровне привилегий, что и процесс потока-отправителя.

Поток должен иметь привилегию SE_TCB_NAME для отправки сообщений потоку, принадлежащему процессу с таким же локально уникальным идентификатором (LUID), но работающему на другом рабочем столе. В противном случае функция завершится ошибкой ERROR_INVALID_THREAD_ID.

Поток должен принадлежать тому же рабочему столу, что и вызывающий поток, или процессу с таким же значением LUID.В противном случае функция завершится ошибкой ERROR_INVALID_THREAD_ID.

Msg[in]

Код отправляемого сообщения. Системные коды сообщений перечислены здесь.

wParam[in]

Дополнительный параметр сообщения.

lParam[in]

Дополнительный параметр сообщения.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError. Функция GetLastError возвращает значение ERROR_INVALID_THREAD_ID если параметр idThread является недействительным идентификатором потока, или если у потока idThread нет очереди сообщений. Функция GetLastError возвращает значение ERROR_NOT_ENOUGH_QUOTA, если превышено максимально допустимое количество сообщений в очереди.

Пример использования

Пример использования приведен здесь.

Примечание

Если сообщение заблокировано UIPI, то функция GetLastError вернет значение 5 (ошибка доступа).

Поток, которому отправляется сообщение должно создать очередь сообщений, иначе функция PostThreadMessage закончится ошибкой. Для обработки этой ситуации используйте следующий метод.

· Создайте объект событие (event object), затем создайте поток.
· Перед вызовом функции PostThreadMessage используйте функцию WaitForSingleObject для ожидания перехода объекта события в сигнальное состояние.
· В потоке, который должен будет принять сообщение вызовите функцию PeekMessage как показано ниже для того чтобы система создала очередь сообщений.

PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE)

· Установите оюъект событие (set the event), указывая тем самым, что поток готов принимать сообщения.

Поток, которму отправляется сообщение, получает это сообщение с помощью функции GetMessage или PeekMessage. Значение поля hwnd возвращенной структуры MSG при этом равно NULL.

Сообщения, отправляемы функцией PostThreadMessage не ассоциируются с окном. Поэтому они не могут быть обработаны функцией DispatchMessage. Вследствие этого, если поток-получатель находится в модальном цикле (in a modal loop) (например, при использовании функции MessageBox или DialogBox), сообщения будут потеряны. Для перехвата сообщений потока, находящегося в модальном цикле, используйте определенный для потока перехватчик (thread-specific hook).

Система маршалирует только системные сообщения (коды которых находятся в интервале между нулем и (WM_USER-1)). При отправке других сообщений (код которых больше или равен WM_USER) другому процессу вы должны самостоятельно их маршалировать.

Существует ограничение в 10000 сообщений в очереди сообщений. Данное ограничение должно быть достаточно большим. Если ваше приложение превышает это ограничение, то оно должно быть переработано, чтоба избежать потребления такого большого объема системных ресурсов. Для изменения этого ограничения, измените значение, хранящееся в ключе "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\USERPostMessageLimit" реестра. Минимально допустимое значение 4000.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | PostThreadMessageA и PostThreadMessageW


RegisterWindowMessage

Определяет новое оконное сообщение, которое гарантированно будет уникальным для всей системы. Возвращенное функцией значение в дальнейшем может быть использовано для отправки сообщений.

Прототип

UINT WINAPI RegisterWindowMessage(

_In_ LPCTSTR lpString

);

Параметры

lpString[in]

Строка с наименованием регистрируемого сообщения.

Возвращаемое значение

Числовой код зарегистрированного сообщения в диапазоне от 0xC000 до 0xFFFF.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

#include <windows.h>

int main()

{

int iMessage;

iMessage = RegisterWindowMessage("Message");

printf("%x\n",iMessage);

getchar();

}

Примечание

Функция RegisterWindowMessage обычно используется для регистрации сообщения, используемого для взаимодействия двух приложений.

Если два приложения регистрируют сообщение с олинаковым наименованием, то функция вернет два одинаковых кода сообщения. Данные коды остаются неизменными до окончания сеанса.

Используйте RegisterWindowMessage только тогда, когда несколько приложений должны обрабатывать сообщение с одинаковым кодом. Для отправки закрытых (private) сообщений внутри оконного класса приложение может использовать произвольное числовое значение в диапазоне от WM_USER до 0x7FFF. (Сообщения в этом диапазоне являются закрытыми для оконного класса, но не для приложения. Например, предопределенные классы элементов управления, такие, как: BUTTON, EDIT, LISTBOX и COMBOBOX могут использовать значения из этого диапазона).

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | RegisterWindowMessageA и RegisterWindowMessageW


ReplyMessage

Отвечает на сообщение, отправленное функцией SendMessage без передачи управления функции, которая вызвала SendMessage.

Прототип

BOOL WINAPI ReplyMessage(

_In_ LRESULT lResult

);

Параметры

lResult[in]

Результат обработки сообщения. Возможные значения зависят от отправленного сообщения.

Возвращаемое значение

Если вызывающий поток обработал сообщение, отправленное из другого потока или процесса, то функция возвращает ненулевое значение.

Если вызывающий поток обработал сообщение, отправленное из того же потока, то возвращается значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Вызывая эту функцию, оконная процедура, которая обрабатывает сообщение, позволяет потоку, вызвавшему SendMessage, продолжить свою работу, как если бы поток, получивший сообщение, обработал его и вернул управление. Поток, который вызвал ReplyMessage продолжает свою работу.

Если сообщение не было отправлено функцией SendMessage, или если сообщение было отправлено тем же потоком, то функция ReplyMessage ничего не делает.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


SendDlgItemMessage

Отправляет сообщение заданному элементу управления диалогового окна.

Прототип

LRESULT WINAPI SendDlgItemMessage(

_In_ HWND hDlg,

_In_ int nIDDlgItem,

_In_ UINT Msg,

_In_ WPARAM wParam,

_In_ LPARAM lParam

);

Параметры

hDlg [in]

Описатель диалогового окна, содержащего элемент управления.

nIDDlgItem [in]

Идентификатор элемента управления, которому отправляется сообщение.

Msg [in]

Отправляемое сообщение. Допустимые коды сообщений перечислены здесь.

wParam [in]

Дополнительный параметр сообщения.

lParam [in]

Дополнительный параметр сообщения.

Возвращаемое значение

Результат обработки сообщения. Зависит от отправляемого сообщения.

Пример использования

В приводимом ниже примере функция SendDlgItemMessage используется для изменения текста заголовка элемента управления. При этом ему отправляется сообщение WM_SETTEXT. Ниже приводится поный исходный текст примера.

#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)

{

switch(uMsg){

case WM_INITDIALOG:

//Изменяем текст в элементе управления

SendDlgItemMessage(hwnd, ID_TEXT, WM_SETTEXT, (WPARAM)0, (LPARAM)"Hello, World!");

break;

case WM_CLOSE:

//Закрываем диалоговое окно

EndDialog(hwnd,0);

}

return 0;

}

Ниже приводится содержимое файла ресурсов, в котором задается шаблон диалогового окна.

#include "Resource.h"

#include <windows.h>

ID_DIALOG DIALOGEX 0,0,130,130

STYLE WS_CAPTION | WS_VISIBLE | WS_SYSMENU | DS_CENTER | WS_MINIMIZEBOX

CAPTION "DialogBoxParam"

BEGIN

CTEXT "",ID_TEXT, 25,60,80,12, WS_VISIBLE

END

Ниже приводится содержимое заголовочного файла Resource.h, в котором задаются идентификаторы шаблона и элемента управления.

#define ID_DIALOG 0x1000

#define ID_TEXT 0x01

Примечание

Функция SendDlgItemMessage не возвращает управления до тех пор, пока сообщение не будет обработано.

Использование функции SendDlgItemMessage аналогично получению описателя элемента управления и отправке ему сообщения с помощью функции SendMessage.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | SendDlgItemMessageA и SendDlgItemMessageW


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


SendMessageCallback

Отправляет (sends) заданное сообщение окну или окнам. Данная функция вызывает оконную процедуру заданного окна и немедленно возвращает управление если окно принадлежит другому потоку. После того как оконная процедура обработает сообщение, система вызывет заданную функцию обратного вызова (callback function), передавая ей в качестве параметра результат обработки сообщения и дополнительный параметр заданный приложением.

Прототип

BOOL WINAPI SendMessageCallback(

_In_ HWND hWnd,

_In_ UINT Msg,

_In_ WPARAM wParam,

_In_ LPARAM lParam,

_In_ SENDASYNCPROC lpCallBack,

_In_ ULONG_PTR dwData

);

Параметры

hWnd[in]

Описатель окна, оконная процедура которого получит заданное сообщение. Если значение этого параметра равно HWND_BROADCAST((HWND)0xFFFF), то сообщение будет разослано всем окнам верхнего уровня в системе, включая недоступные и невидимые окна без владельца (unowned), перекрытые (overlapped) окна, и всплывающие (pop-up) окна; но данное сообщение не отправляется дочерним окнам.

Msg[in]

Код отправляемого сообщения. Системные сообщения перечислены здесь.

wParam[in]

Дополнительный параметр сообщения.

lParam[in]

Дополнительный параметр сообщения.

lpCallBack[in]

Указатель на функцию обратного вызова SendAsyncProc, которую система вызовет после того, как оконная процедура обработает сообщение.

Если значение параметра hWnd равно HWND_BROADCAST, то система будет вызывать функцию SendAsyncProc для всех окон верхнего уровня.

dwData[in]

Определенное приложением значение, которое будет передано в функцию, на которую указывает параметр lpCallBack.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Если целевое окно принадлежит потоку, который вызывает функцию SendMessageCallback, то оконное процедура вызывается синхронно, функция обратного вызова вызывается сразу же после того как оконная процедура вернет управление. Если же целевое окно принадлежит другому потоку, то функция обратного вызова будет вызвана только тогда, когда поток, вызвавший функцию SendMessageCallback вызовет GetMessage, PeekMessage или WaitMessage.

При рассылке сообщений с кодом меньшим чем WM_USER с помощью асинхронной функции (PostMessage, SendNotifyMessage и SendMessageCallback), параметры данного сообщения не должны содержать указатели. В противном случае произойдет ошибка. Функция вернет управление до того, как принимающий поток получит возможность обработать сообщение, в результате этого отправитель освободит память до того как она будет использована.

Приложения, которым необходимо взаимодействовать друг с другом посредством HWND_BROADCAST должны использовать функцию RegisterWindowMessage для получения уникального кода сообщения.

Система маршалирует только системные сообщения (коды которых находятся в интервале от нуля до (WM_USER-1)). При отправке других сообщений (коды которых больше или равны WM_USER) процессам, вы должны самостоятельно осуществлять их маршаллинг.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | SendMessageCallbackA и SendMessageCallbackW


SendMessageTimeout

Отправляет заданное сообщение одному или нескольким окнам.

Прототип

LRESULT WINAPI SendMessageTimeout(

_In_ HWND hWnd,

_In_ UINT Msg,

_In_ WPARAM wParam,

_In_ LPARAM lParam,

_In_ UINT fuFlags,

_In_ UINT uTimeout,

_Out_opt_ PDWORD_PTR lpdwResult

);

Параметры

hWnd[in]

Описатель окна, оконная процедура которого примет рассылаемое сообщение.

Если значение этого параметра равно HWND_BROADCAST ((HWND)0xFFFF), то сообщение будет отправлено всем окнам верхнего уровня, включая недоступные или невидимые окна без владельца. Функция не вернет управление до тех пор пока по каждому окну не истечет период ожидания. Поэтому, общее время ожидания возврата функции составляет значение параметра uTimeout помноженное на количество окон верхнего уровня.

Msg[in]

Код рассылаемого сообщения.

Перечень системных сообщений приведен здесь.

wParam[in]

Дополнительный параметр сообщения.

lParam[in]

Дополнительный параметр сообщения.

fuFlags[in]

Набор флагов определяющий поведение функции. Данный параметр принимает одно из значений перечисленных ниже или их комбинацию.

SMTO_ABORTIFHUNG - функция возвращает управление без ожидания если поток-получатель сообщения не отвечает или "завис".

SMTO_BLOCK - вызывающий поток не обрабатывает никаких других запросов до тех пор пока функция не вернет управление.

SMTO_NORMAL - вызывающий поток может обрабатывать другие запросы во время ожидания возврата из функции.

SMTO_NOTIMEOUTIFNOTHUNG - функция не учитывает время ожидания когда поток-получатель обрабатывает сообщение.

SMTO_ERRORONEXIT - функция должна вернуть значение нуль, если целевое окно разрушено или владеющий им поток был уничтожен во время обработки сообщения.

uTimeout[in]

Длительность интервала времени, в миллисекундах. Если сообщение рассылается нескольким окнам, то каждое окно может использовать всё время ожидания. Например, если вы задали интервал равным пяти секундам и существует три окна верхнего уровня, которые не в состоянии обработать сообщение, функция может вернутть управление только через 15 секунд.

lpdwResult[out,opt]

Указатель на переменную типа DWORD, в которую будет записан результат обработки сообщения. Значение результата зависит от отправляемого сообщения.

Возвращаемое значение

Ненулевое значение. Функция SendMessageTimeout не предоставляет информацию об отдельных окнах если использовалось значение HWND_BROADCAST.

Возвращаемое значение в случае ошибки

Нуль. Чтобы получить дополнительную информацию об ошибке вызовите GetLastError. Если функция GetLastError вернет значение ERROR_TIMEOUT, то истек период ожидания функци.

Windows 2000: Если функция GetLastError вернет значение нуль, то истек период ожидания.

Пример использования

В данном примере мы находим главное окно калькулятора и отправляем ему сообщение WM_CLOSE (закрываем его).

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

HWND hwnd;

//Находим окно калькулятора

hwnd = FindWindow("SciCalc",NULL);

//Отправляем ему сообщение

SendMessageTimeout(hwnd, WM_CLOSE,0,0,SMTO_NORMAL,500,NULL);

return 0;

}

Примечание

Функция вызывает оконную процедуру заданного окна и, если окно принадлежит другому потоку, не возвращает управление до тех пор пока оконная поцедура не обработает сообщение или не истечет заданное время ожидания. Если окно, которому отправляется сообщение, принадлежит вызывающему функцию потоку, то оконная процедура вызывается напрямую - время ожидания игнорируется.

Функция считает, что поток не отвечает если он не вызывает функцию GetMessage или аналогичную ей в течение пяти секунд.

Система маршалирует только системные сообщения (коды которых находятся в интервале от нуля до (WM_USER-1)). При отправке других сообщений (коды которых больше или равны WM_USER) другому процессу вы должны самостотельно их маршалировать.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | SendMessageTimeoutA и SendMessageTimeoutW


SendNotifyMessage

Отправляет заданное сообщение окну или окнам. Если окно было создано вызывающим потоком, то функция SendNotifyMessage вызывает оконную процедуру окна и не возвращает управления до тех пор пока она не обработает сообщение. Если окно было создано другим потоком, функция SendNotifyMessage передает сообщение в оконную процедуру и немедленно возвращает управление; она не дожидается когда оконная процедура завершит обработку сообщения.

Прототип

BOOL WINAPI SendNotifyMessage(

_In_ HWND hWnd,

_In_ UINT Msg,

_In_ WPARAM wParam,

_In_ LPARAM lParam

);

Параметры

hWnd[in]

Описатель окна, оконная процедура которого примет сообщение. Если значение этого параметра равно HWND_BROADCAST ((HWND)0xFFFF), то сообщение рассылается всем окнам верхнего уровня, включая недоступные и невидимые окна без владельца, перекрытые (overlapped) окна и всплывающие (pop-up) окна. Но сообщение не отправляется дочерним окнам.

Msg[in]

Код отправляемого сообщения. Системные сообщения перечислены здесь.

wParam[in]

Дополнительный параметр сообщения.

lParam[in]

Дополнительный параметр сообщения.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

В данном примере мы находим главное окно калькулятора и отправляем ему сообщение WM_CLOSE (закрываем его).

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

HWND hwnd;

//Находим окно калькулятора

hwnd = FindWindow("SciCalc",NULL);

//Отправляем ему сообщение

SendNotifyMessage(hwnd, WM_CLOSE,0,0);

return 0;

}

Примечание

Если вы отправляете сообщение с кодом меньшим чем WM_USER с помощью асинхронной функции отправки сообщения (PostMessage, SendNotifyMessage и SendMessageCallback), то параметры рассылаемого сообщения не должны содержать указателей. В противном случае произойдет ошибка. Функция вернет управление до того как принимающий поток сможет обработать сообщение, отправитель освободит память до того как она будет использована.

Приложения, которым необходимо взаимодействовать друг с другом посредством HWND_BROADCAST должны использовать функцию RegisterWindowMessage для получения уникального кода сообщения.

Система маршалирует только системные сообщения (коды которых находятся в интервале от нуля до (WM_USER-1)). При отправке других сообщений (коды которых больше или равны WM_USER) другому процессу вы должны самостотельно их маршалировать.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | SendNotifyMessageA и SendNotifyMessageW


SetMessageExtraInfo

Устанавливает дополнительную информацию о сообщении для текущего потока. Дополнителная информация о сообщении является определенным приложением или драйвером параметром, ассоциированным с очередью сообщений текущего потока. Приложение может использовать функцию GetMessageExtraInfo для получения дополнительной информации о сообщении потока.

Прототип

LPARAM WINAPI SetMessageExtraInfo(

_In_ LPARAM lParam

);

Параметры

lParam[in]

Новое значение, которое будет ассоциировано с текущим потоком.

Возвращаемое значение

Предыдущее значение, ассоцированное с текущим потоком.

Пример использования

Пример использования приведен здесь.

Примечание

Как показывают эксперименты дополнительная информация о сообщении привязывается не к очереди сообщений потока, а к отдельному сообщению. Из-за этого время "жизни" информации записанной с помощью SetMessageExtraInfo соответствует времени "жизни" оконного сообщения, при обработке которого записывалась эта информация.

Заголовочный файл | 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


WaitMessage

Уступает процессорное время другому потоку, когда в очереди сообщений нет новых сообщений. Функция WaitMessage блокирует поток и не возвращает управление до тех пор пока в очередь сообщений потока не будет помещено (placed) новое сообщение.

Прототип

BOOL WINAPI WaitMessage(void);

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Учтите, что функция WaitMessage не вернет управление если после вызова какой-либо функции проверки очереди сообщений, в этой очереди остался непрочитанный ввод (unread input). Это происходит из-за того, что такие функции как PeekMessage, GetMessage, GetQueueStatus, WaitMessage, MsgWaitForMultipleObjects и MsgWaitForMultipleObjectsEx проверяют очередь и, затем изменяют информацию о состоянии очереди таким образом, что ввод больше не считается новым. Последующий вызов функции WaitMessage не вернет управления до тех пор, пока не будет осуществлен новый ввод заданного типа. Существующий непрочитанный ввод (полученный до последней проверки очереди) игнорируется.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


CharLower

Приводит все символы строки, ии отдельный символ к нижнему регистру. Если операндом является строка, то функция конвертирует символы на месте.

Прототип

LPTSTR WINAPI CharLower(

_Inout_ LPTSTR lpsz

);

Параметры

lpsz [in, out]

Завершающаяся NULL символом строка, или отдельный символ. Если значение старшего слова этого параметра равно нулю, то младшее слово должно содержать отдельный символ, который и будет сконвертирован.

Возвращаемое значение

Если операндом является строка символов, то функция вернет указатель на сконвертированную строку. Так как строка конвертируется "на месте", то возвращаемое значение равно lpsz.

Если же операндом является отдельный символ, то функция вернет 32-разрядное целое, старшее слово которого равно нулю, а младшее слово содержит сконвертированный символ.

Возвращаемое значение в случае ошибки

Нет ни одного способа проверки на возникновение ошибки во время работы функции. Ошибка маловероятна. Дополнительная информация об ошибке не предоставляется. Не вызывайте функцию GetLastError.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Исходная строка

char s[] = "ПРИВЕТ\0";

//Приводим символы к нижнему регистру

char* str;

str = CharLower(s);

//Выводим строку на экран

MessageBox(NULL, str, "", MB_OK);

return 0;

}

В результате работы этой программы на экран будет выведена строка "привет".

Ниже приводится аналогичный пример использования функции CharLower, но без дополнительной переменной.

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Исходная строка

char s[] = "ПРИВЕТ\0";

//Приводим символы к нижнему регистру

CharLower(s);

//Выводим строку на экран

MessageBox(NULL, s, "", MB_OK);

return 0;

}

Результат работы этой программы аналогичен результату программы из предыдущего примера.

Примечание

Учтите, что функция CharLower всегда конвертирует большую "I" в маленькую "i" даже если текущий язык турецкий или азербайджанский. Если вам нужна фукция, учитывающая такие лингвистические особенности, используйте LCMapString,

Конвертирование в Unicode в ANSI версии функции всегда выполняется с использованием системной локали по умолчанию.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | CharLowerA и CharLowerW


CharLowerBuff

Конвертирует символы, находящиеся в буфере из верхнего в нижний регистр. Функция конвертирует символы на месте.

Прототип

DWORD WINAPI CharLowerBuff(

_Inout_ LPTSTR lpsz,

_In_ DWORD cchLength

);

Параметры

lpsz [in, out]

Указатель на буфер, содержащий один или несколько обрабатываемых символов.

ссhLength [in]

Размер буфера lpsz в символах. Функция проверяет каждый символ иконвертирует его из верхнего регистра в нижний. Фукция проверяет ссhLength символов, даже если один или несколько из них являются NULL символами.

Возвращаемое значение

Количество обработанных символов. Например, вызов CharLowerBuff("Acme of Operating Systems", 10) вернет значение 10.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#define SIZE_BUFFER 6

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Исходная строка

char s[SIZE_BUFFER+1] = "ПРИВЕТ\0";

//Приводим символы к нижнему регистру

CharLowerBuff(s, SIZE_BUFFER);

//Выводим строку на экран

MessageBox(NULL, s, "", MB_OK);

return 0;

}

В результате работы этой программы на экран будет выведена строка "привет".

Примечание

Учтите, что функция CharLowerBuff всегда конвертирует большую "I" в маленькую "i" даже если текущий язык турецкий или азербайджанский. Если вам нужна фукция, учитывающая такие лингвистические особенности, используйте LCMapString.

Конвертирование в Unicode в ANSI версии функции всегда выполняется с использованием системной локали по умолчанию.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | CharLowerBuffA и CharLowerBuffW


CharNext

Возвращает указатель на следующий символ строки. Данная функция может обрабатывать строки, состоящие из однобайтовых и многобайтовых символов.

Прототип

LPTSTR WINAPI CharNext(

_In_ LPCTSTR lpsz

);

Параметры

lpsz [in]

Указатель на символ в завершающейся NULL символом строке.

Возвращаемое значение

Указатель на следующий символ в строке, или на завершающий NULL символ, в случае конца строки.

Если параметр lpsz указывает на завершающий NULL символ, то функция вернет этот же указатель.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Исходная строка

char s[] = "Привет, мир";

//Переходим к следующему символу

char* str;

str = CharNext(s);

//Выводим строку на экран

MessageBox(NULL, str, "", MB_OK);

return 0;

}

В результате работы этой программы на экран будет выведена строка "ривет, мир" (без первого символа).

Примечание

ANSI версия функции использует системную кодовую страницу. Функция CharNextExA позволяет явно задать используемую кодовую страницу.

Функция CharNext при работе с диакритическими знаками реализует пользовательские ожидания по умолчанию. Например, строка, содержащая символы U+0061 U+030a (маленькая латинская a + кольцо объединения над ней (COMBINING RING ABOVE)), которые отображаются как "a", будет представлена в виде двух символов, не одного. Строка состоящая из символов U+0061 U+0301 U+03002 U+0303 U+0304, выглядящая как "a´^~¯", будет состоять из пяти символов и т.д.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | CharNextA и CharNextW


CharNextExA

Возвращает указатель на следующий символ в строке. Данная функция может обрабатывать строки, состоящие из одно- и двухбайтовых символов.

Прототип

LPSTR WINAPI CharNextExA(

_In_ WORD CodePage,

_In_ LPCSTR lpCurrentChar,

_In_ DWORD dwFlags

);

Параметры

codePage [in]

Идентификатор кодовой страницы, используемой при проверке диапазонов лидирующих байт (check lead-byte ranges). Для данного параметра предусмотрены константы перечисленные ниже.

CP_ACP (0) - системная кодовая страница по умолчанию

CP_MACCP (2) - кодовая страница по умолчанию в Macintosh

CP_OEMCP (1) - системная кодовая страница OEM по умолчанию.

lpCurrentChar [in]

Указатель на текущий символ в завершающейся NULL символом строке.

dwFlags [in]

Зарезервировано. Должно быть равно нулю.

Возвращаемое значение

Указатель на следующий символ в строке. Если достигнут конец строки, то функция вернет указатель на завершающий NULL символ.

Если параметр lpCurrentChar указывает на завершающий NULL символ, то возвращаемое значение равно lpCurrentChar.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Исходная строка

char s[] = "Привет, мир";

//Переходим к следующему символу

char* str;

str = CharNextExA(CP_ACP, s, 0);

//Выводим строку на экран

MessageBox(NULL, str, "", MB_OK);

return 0;

}

В результате работы этой программы на экран будет выведена строка "ривет, мир" (без первого символа).

Примечание

Функция CharNextExA позволяет явно задать кодовую страницу. В отличие от нее функция CharNext (ANSI версия) использует системную кодовую страницу по умолчанию.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll


CharPrev

Возвращает указатель на предыдущий символ в строке. Данная функция может обрабатывать строки, состоящие из одно- и двух-байтовых символов.

Прототип

LPTSTR WINAPI CharPrev(

_In_ LPCTSTR lpszStart,

_In_ LPCTSTR lpszCurrent

);

Параметры

lpszStart [in]

Начало строки.

lpszCurrent [in]

Указатель на символ в завершающейся NULL символом строке.

Возвращаемое значение

Указатель на предыдущий символ в строке, или, если значение параметра lpszCurrent равно lpszStart, указатель на первый символ строки.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Исходная строка

char s[] = "Привет, мир\0";

//Сдвигаем указатель на "т, мир"

char* ps;

ps = s + 5;

//Получаем предыдущий символ

ps = CharPrev(s, ps);

//Выводим строку на экран

MessageBox(NULL, ps, "", MB_OK);

return 0;

}

В данном примере, указатель ps изначально устанавливается на символ "т". Затем функция CharPrev перемещает его на символ "е". В результате таких манипуляций на экран выводится строка "ет, мир".

Примечание

ANSI версия функции использует системную кодовую страницу. Функция CharPrevExA позволяет явно задать используемую кодовую страницу.

Функция CharPrev при работе с диакритическими знаками реализует пользовательские ожидания по умолчанию. Например, строка, содержащая символы U+0061 U+030a (маленькая латинская a + кольцо объединения над ней (COMBINING RING ABOVE)), которые отображаются как "a", будет представлена в виде двух символов, не одного. Строка состоящая из символов U+0061 U+0301 U+03002 U+0303 U+0304, выглядящая как "a´^~¯", будет состоять из пяти символов и т.д.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | CharPrevA и CharPrevW


CharPrevExA

Возвращает указатель на предыдущий символ в строке. Данная функция может обрабатывать строки, состоящие из одно- и двухбайтовых символов.

Прототип

LPSTR WINAPI CharPrevExA(

_In_ WORD CodePage,

_In_ LPCSTR lpStart,

_In_ LPCSTR lpCurrentChar,

_In_ DWORD dwFlags

);

Параметры

CodePage [in]

Идентификатор кодовой страницы, используемой для проверки диапазонов лидирующих байт (check lead-byte ranges). Для данного параметра предусмотрены константы перечисленные ниже.

CP_ACP (0) - системная кодовая страница по умолчанию

CP_MACCP (2) - кодовая страница по умолчанию в Macintosh

CP_OEMCP (1) - системная кодовая страница OEM по умолчанию.

lpStart [in]

Указатель на начало строки.

lpCurrentChar [in]

Указатель на символ в завершающейся NULL символом строке.

dwFlags [in]

Зарезервировано. Должно быть равно нулю.

Возвращаемое значение

Указатель на предыдущий символ в строке. Если значение параметра lpCurrentChar равно lpStart, то функция вернет указатель на первый символ.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Исходная строка

char s[] = "Привет, мир\0";

//Сдвигаем указатель на "т, мир"

char* ps;

ps = s + 5;

//Получаем предыдущий символ

ps = CharPrevExA(CP_ACP, s, ps, 0);

//Выводим строку на экран

MessageBox(NULL, ps, "", MB_OK);

return 0;

}

В данном примере, указатель ps изначально устанавливается на символ "т". Затем функция CharPrevExA перемещает его на символ "е". В результате таких манипуляций на экран выводится строка "ет, мир".

Примечание

Функция CharPrevExA позволяет явно задать используемую кодовую страницу. В отличие от нее функция CharPrev (ANSI версия) использует системную кодовую страницу по умолчанию.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll


CharToOem

Переводит строку в набор символов OEM.

Прототип

BOOL WINAPI CharToOem(

_In_ LPCTSTR lpszSrc,

_Out_ LPSTR lpszDst

);

Параметры

lpszSrc[in]

Строка, которую нужно перевести.

lpszDst[out]

Адрес буфера, в котором следует разместить переведенную строку. Если функция CharToOem используется для перевода ANSI строки, то значения параметров lpszSrc и lpszDst могут совпадать. Для двухбайтовых строк это недопустимо.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

В случае когда для двухбайтовых строк совпадают значения параметров lpszSrc и lpszDst возвращается значение нуль. В этом случае функция GetLastError возвращает значение ERROR_INVALID_ADDRESS.

Пример использования

#include <windows.h>

int main()

{

char s[] = "Привет, мир!";

char* p;

p = (char*)malloc(lstrlen(s)+1);

CharToOem(s, p);

printf("%s\n",p);

free(p);

getchar();

return 0;

}

В данном примере на консоль выводится текстовое собщение "Привет, мир!". Если выводить это сообщение без использования функции CharToOem, то оно будет отображено неправильно, из-за использования консолью набора символов OEM.

Примечание

Неправильное использование этой функции может cкомпрометировать безопасность вашего приложения.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | CharToOemA и CharToOemW


CharToOemBuff

Транслирует заданное количество символов сроки в набор символов OEM.

Прототип

BOOL WINAPI CharToOemBuff(

_In_ LPCTSTR lpszSrc,

_Out_ LPSTR lpszDst,

_In_ DWORD cchDstLength

);

Параметры

lpszSrc [in]

Транслируемая, завершающаяся NULL символом строка.

lpszDst [out]

Указатель на бучер, в который помещается результирующая строка. Если используется ANSI версия функции, то результирующая строка может записываться поверх исходной строки. То есть значения параметров lpszSrc и lpszDst могут совпадать. Если же используется Unicode версия функции, то значения этих параметров должны различаться.

cchDstLength [in]

Количество символов транслируемых в строке lpszSrc.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Если значения параметров lpszSrc и lpszDst равны друг другу для Unicode версии функции, то она вернет значение нуль. При этом функция GetLastError вернет значение ERROR_INVALID_ADDRESS.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

#define SIZE_BUFFER 6

int main()

{

//Исходная строка

char s[SIZE_BUFFER+1] = "Привет\0";

char str[SIZE_BUFFER+1];

//Конвертируем её в OEM

CharToOemBuff(s, str, SIZE_BUFFER);

str[SIZE_BUFFER] = 00;

//Выводим на консоль

printf("%s\n",str);

system("PAUSE");

return 0;

}

В данном примере в консоль выводится строка "Привет". Если бы мы попытались вывести эту строку напрямую (без использования функции CharToOemBuff), то мы бы увидили кракозябры вместо символов кириллицы.

Примечание

В отличие от функции CharToOem, функция CharToOemBuff не останавливает конвертирование символов, когда в буфере lpszSrc встречает NULL-символ. Функция CharToOemBuff конвертирует все cchDstLength символов.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | CharToOemBuffA и CharToOemBuffW


CharUpper

Приводит строку символов или отдельный символ к верхнему регистру. Если в функцию передана строка символов, функция конвертирует символы "на месте".

Прототип

LPTSTR WINAPI CharUpper(

_Inout_ LPTSTR lpsz

);

Параметры

lpsz [in, out]

Завершающаяся NULL символом строка, или отдельный символ. Если старшее слово значения параметра равно нулю, то младшее слово должно содержать отдельный конвертируемый символ.

Возвращаемое значение

Если в функцию передана строка, то функция вернет указатель на сконвертированную строку. Так как строка конвертируется "на местие", то возвращаемое значение совпадает со значением параметра lpsz.

Если же в функцию передан отдельный символ, то функция вернет 32-разрядное значение, старшее слово которого равно нулю, а младшее слово содержит сконвертированный символ.

Возвращаемое значение в случае ошибки

Функция не позволяет идентифицировать факт ошибки. Ошибка маловероятна. Дополнительная информация об ошибке не предоставляется. Не вызывайте функцию GetLastError.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Исходная строка

char s[] = "Привет\0";

//Приводим символы строки к верхнему регистру

char* str;

str = CharUpper(s);

//Выводим строку на экран

MessageBox(NULL, str, "", MB_OK);

return 0;

}

В результате работы этой программы на экран будет выведена строка "ПРИВЕТ".

Ниже приводится аналогичный пример использования функции CharUpper, но без использования дополнительной переменной.

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Исходная строка

char s[] = "Привет\0";

//Приводим символы строки к верхнему регистру

CharUpper(s);

//Выводим строку на экран

MessageBox(NULL, s, "", MB_OK);

return 0;

}

Результат работы этой программы аналогичен результату работы программы из предыдущего примера.

Примечание

Учтите, что функция CharUpper всегда отображает маленькую "i" в большую "I", даже если текущий язык - турецкий или азербайджанский. Если вам нужна функция, учитывающая такие лингвистические особенности, используйте функцию LCMapString.

Конвертирование в Unicode для ANSI версии функции всегда выполняется для текущей системной локали.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | CharUpperA и CharUpperW


CharUpperBuff

Приводит символы строки к верхнему регистру. Функция конвертирует символы "на месте".

Прототип

DWORD WINAPI CharUpperBuff(

_Inout_ LPTSTR lpsz,

_In_ DWORD cchLength

);

Параметры

lpsz [in, out]

Указатель на буфер, содержащий один или несколько обрабатываемых символов.

cchLength [in]

Размер, в символах, буфера lpsz.

Функция проверяет каждый символ и переводит его из нижнего регистра в верхний. Функция проверяет cchLength символов, даже если один или несколько обрабатываемых символов являются NULL символами.

Возвращаемое значение

Количество обработанных символов.

Например, функция CharUpperBuff("Zenith of API Sets", 10) вернет значение 10.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Исходная строка

char s[] = "Привет\0";

//Приводим символы строки к верхнему регистру

CharUpperBuff(s, strlen(s));

//Выводим строку на экран

MessageBox(NULL, s, "", MB_OK);

return 0;

}

В результате работы этой программы на экран будет выведена строка "ПРИВЕТ".

Примечание

Учтите, что функция CharUpperBuff всегла приводит маленькую "i" к большой "I", даже если текущий язык турецкий или азербайджанский. Если вам нужна функция, учитывающая такие лиингвистические особенности, используйте функцию LCMapString.

Конвертирование в Unicode для ANSI версии функции всегда выполняется для текущей системной локали.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | CharUpperBuffA и CharUpperBuffW


CompareString

Сравнивает две строки символов, для локали, заданной по ее идентификатору.

Некорректное использование функции CompareString может нарушить безопасность вашего приложения. Например, функция может приводить к проблемам безопасности когда используется для нелингвистического сравнения, так как две строки, различающиеся в двоичном представлении могут быть лингвистически эквивалентными. Приложение должно проверять корректность строк перед использованием функции и предоставлять обработчики ошибок.

Для совместимости с Unicode, ваши приложения должны использовать функцию CompareStringEx или Unicode версию функции CompareString. Другой причиной использовать функцию CompareStringEx является то, что компания Microsoft для новых локалей использует наименования, а не идентификаторы. Это делается в целях совместимости с другими платформами (interoperability). Приложения, которые будут работать только на Windows Vista или более новых версиях операционной системы должны использовать функцию CompareStringEx.

Прототип

int CompareString(

_In_ LCID Locale,

_In_ DWORD dwCmpFlags,

_In_ LPCTSTR lpString1,

_In_ int cchCount1,

_In_ LPCTSTR lpString2,

_In_ int cchCount2

);

Параметры

Locale [in]

Идентификатор локали, используемой для сравнения. Для его создания вы можете использовать макрос MAKELCID, или же использовать одну из констант, перечисленных здесь.

dwCmpFlags [in]

Набор флагов, задающих правила сравнения строк. Данные флаги перечислены здесь. Они совпадают с флагами функции CompareStringEx.

lpString1 [in]

Указатель на первую сравниваемую строку.

cchCount1 [in]

Длина строки lpString1, за исключением завершающего NULL символа. Данное значение равно количеству байт для ANSI версии функции или количеству символов для Unicode версии функции. Если строка завершается NULL символом, то приложение может указать отрицательное значение. В этом случае, функция сама определит длину строки.

lpString2 [in]

Указатель на вторую сравниваемую строку.

cchCount2 [in]

Длина строки lpString2, за исключением завершающего NULL символа. Данное значение равно количеству байт для ANSI версии функции или количеству символов для Unicode версии функции. Если строка завершается NULL символом, то приложение может указать отрицательное значение. В этом случае, функция сама определит длину строки.

Возвращаемое значение

Аналогично функции CompareStringEx.

Возвращаемое значение в случае ошибки

Аналогично функции CompareStringEx.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Сравниваемые строки

char s1[] = "Привет\0";

char s2[] = "привет\0";

//Сравниваем строки

int res = 0;

res = CompareString(LOCALE_CUSTOM_DEFAULT, LINGUISTIC_IGNORECASE, s1, -1, s2, -1);

//Выводим результат сравнения

if(res == CSTR_EQUAL)

MessageBox(NULL, "Строки совпадают", "", MB_OK);

else

MessageBox(NULL, "Строки отличаются", "", MB_OK);

return 0;

}

В данном примере сравниваются две строки "Привет" и "привет". Данные строки различаются первым символом. Поскольку они различаются регистром, а в функцию передан флаг LINGUISTIC_IGNORECASE, то функция возвращает значение CSTR_EQUAL (строки равны). Поэтому на экран выводится сообщение "Строки совпадают".

Примечание

Смотрите примечания к функции CompareStringEx.

Если ваше приложение вызывает ANSI версию функции, то она сама сконвертирует параметры в Unicode на основе кодовой страницы по умолчанию для переданной функции локали. Поэтому приложение не может использовать функцию CompareString для обработки текста в кодировке UTF-8.

Обычно, для сравнения без учета регистра, функция CompareString отображает маленькую "i" в большую "I", даже если задана турецкая или азербайджанская локаль. Флаг NORM_LINGUISTIC_CASING оменяет это поведение для турецкой и азербайджанской локалей. Если этот флаг задан совместно с турецкой или азербайджанской локалью, то символ маленькой "i" без точки (U+131) является строчным вариантом большой буквы "I" (U+0049), а маленькая "i" (U+0069) является строчным вариантом большой буквы "I" с точкой (U+0130).

Начиная с Windows 8. ANSI версия функции объявлена в заголовочном файле Winnls.h, а Unicode версия функции в заголовочном файле Stringapiset.h. До Windows 8, обе версии объявлялись в заголовочном файле Winnls.h.

Заголовочный файл | winnls.h (подключен в windows.h); Stringapiset.h (подключен в windows.h)
Экспортирующая библиотека | kernel32.dll
ANSI и Unicode наименования | CompareStringA и CompareStringW


CompareStringEx

Появилась в Windows Vista. Сравнивает две строки Unicode для локали, заданной по её наименованию.

Некорректное использование функции CompareStringEx может нарушить безопасность вашего приложения. Строки, которые сравниваются некорректно могут приводить к некорректному вводу. Перед использованием функции убедитесь в корректности строк и приготовьтесь к обработке ошибок.

Если приложение спректировано для работы в Windows Vista или более новой версии операционной системы, то оно должно вызывать функцию CompareStringEx вместо CompareString.

Прототип

int CompareStringEx(

_In_opt_ LPCWSTR lpLocaleName,

_In_ DWORD dwCmpFlags,

_In_ LPCWSTR lpString1,

_In_ int cchCount1,

_In_ LPCWSTR lpString2,

_In_ int cchCount2,

_In_opt_ LPNLSVERSIONINFO lpVersionInformation,

_In_opt_ LPVOID lpReserved,

_In_opt_ LPARAM lParam

);

Параметры

lpLocaleName [in, opt]

Указатель на наименовани локали, или одно из предопределенных значений, перечисленных ниже.

· LOCALE_NAME_INVARIANT
· LOCALE_NAME_SYSTEM_DEFAULT
· LOCALE_NAME_USER_DEFAULT

dwCmpFlags [in]

Набор флагов, задающих как функция сравнивает строки. По умолчанию, ни один из флагов не установлен. Данный параметр может содержать комбинацию флагов, перечислены здесь, или значение нуль, для реализации поведения по умолчанию.

lpString1 [in]

Указатель на первую сравниваемую строку.

cchCount1 [in]

Длина строки lpString1, не включая завершающий NULL символ. Приложение может установить в этом параметре отрицательное значение, если строка завершается NULL символом. В этом случае функция сама определит длину строки.

lpString2 [in]

Указатель на вторую сравниваемую строку.

cchCount2 [in]

Длина строки lpString2, не включая завершающий NULL символ. Приложение может установить в этом параметре отрицательное значение, если строка завершается NULL символом. В этом случае функция сама определит длину строки.

lpVersionInformation [in, opt]

Зарезервировано. Должно быть равно NULL.

lpReserved [in, opt]

Зарезервировано. Должно быть равно NULL.

lParam [in, opt]

Зарезервировано. Должно быть равно нулю.

Возвращаемое значение

Одно из значений, перечисленных ниже. Для приведения возвращаемого значения к результату сравнения строк в стиле языка C, нужно вычесть из него число 2. После этого получаемые значения <0, ==0 и >0 соответствуют результатам сравнения в стиле языка C.

CSTR_LESS_THAN (1) - строка lpString1 меньше (в лексическом смысле) строки lpString2.

CSTR_EQUAL (2) - строка lpString1 равна (в лексическом смысле) строке lpString2. Строки равны с точки зрения их упорядочивания, но при этом они могут различаться.

CSTR_GREATER_THAN (3) - строка lpString1 больше (в лексическом смысле) строки lpString2.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации об ошибке, приложение может вызвать функцию GetLastError, которая вернет один из кодов, перечисленных ниже.

ERROR_INVALID_FLAGS - недопустмые значения флагов.

ERROR_INVALID_PARAMETER - недопустимое значение какого-либо параметра функции.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

//Вводим константу LOCALE_NAME_INVARIANT

#if defined(__GNUC__)

#define LOCALE_NAME_INVARIANT (const WCHAR []){ 0 }

#elif defined(_MSC_VER)

# define LOCALE_NAME_INVARIANT L""

#else

static const WCHAR LOCALE_NAME_INVARIANT[] = { 0 };

#endif

//Вводим тип функции CompareStringEx

typedef int (*LPCOMPARESTRINGEX)(LPCWSTR, DWORD, LPCWSTR, int, LPCWSTR, int, LPNLSVERSIONINFO, LPVOID, LPARAM);

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Сравниваемые строки

wchar_t s1[] = L"Hello\0";

wchar_t s2[] = L"hello\0";

//Находим адрес функции CompareStringEX

HMODULE hkernel32;

hkernel32 = GetModuleHandle("kernel32.dll");

LPCOMPARESTRINGEX lpfcse;

lpfcse = (LPCOMPARESTRINGEX)GetProcAddress(hkernel32, "CompareStringEx");

//Сравниваем строки

int res = 0;

if(lpfcse)

res = lpfcse(LOCALE_NAME_INVARIANT, LINGUISTIC_IGNORECASE, s1, -1, s2, -1, NULL, NULL, 0);

//Выводим результат сравнения

if(res == CSTR_EQUAL)

MessageBox(NULL, "Строки совпадают", "", MB_OK);

else

MessageBox(NULL, "Строки отличаются", "", MB_OK);

return 0;

}

В данном примере сравниваются две строки "Hello" и "hello". Данные строки различаются первым символом. Поскольку они различаются регистром, а в функцию передан флаг LINGUISTIC_IGNORECASE, то функция возвращает значение CSTR_EQUAL (строки равны). Поэтому на экран выводится сообщение "Строки совпадают".

Примечание

Функции CompareString и CompareStringEx оптимизированы таким образом, что наибольшая скорость их работы достигается при следующих условиях: значение параметра dwCmpFlags равно нулю или NORM_IGNORECASE; значения параметров cchCount1 и cchCount2 равны -1; локаль не поддерживает какие-либо лингвистические сжатия. Например, в испанской локали символы "ch" интерпретируются как один символ.

Функции CompareString и CompareStringEx во время сравнения игнорируют арабские кашиды. Это значит, что если две строки идентичны, за исключением присутствующих в них кашид, функция вернет значение CSTR_EQUAL.

Если прложение использует флаги NORM_IGNORENONSPACE и NORM_IGNORECASE, то данные флаги могут иногда мешать (interfere) корректному сравнению строк. Это может произойти для локалей, которые не поддерживают беспробельные (non-spacing) символы, или например, использует одинаковые уровни насыщенности (weight levels) для обработки разных важных операций. В этих случаях, ваше приложение должно использовать флаги LINGUISTIC_IGNOREDIACRITIC и LINGUISTIC_IGNORECASE. Эти флаги обеспечивают лингвистически правильное сравнение кодовых точек, использующих регистр и диакритические знаки, и не окажет влияние на другие кодовые точки.

Начиная с Windows Vista функции CompareString и CompareStringEx могут возвращать данные из пользовательских (custom)локалей. Идентичность этих данных при переходе с одного компьютера на другой, или при разных запусках приложения не гарантируется.

Начиная с Windows 8: если ваше приложение передает в функцию тэги языков, полученные из пространства имен Windows.Globalization, оно должно предварительно сконвертировать эти тэги с помощью функции ResolveLocaleName.

Начиная с Windows 8 функция CompareStringEx объявлена в заголовочном файле Stringapiset.h. До Windows 8, она объявлялась в заголовочном файле Winnls.h.

Учтите, что поведение функции может различаться между релизами операционной системы Windows. Например, могут быть созданы новые кодовые точки Unicode. Для определения версии сортировщика используйте функцию GetNlsVersionEx.

Заголовочный файл | Stringapiset.h (подключен в windows.h)
Экспортирующая библиотека | kernel32.dll


FoldString

Отображает одну строку Unicode в другую, выполняя заданное преобразование.

Учтите: неправильное использование функции FoldString может нарушить безопасность вашего приложения. Строки, которые не могут быть корректно отображены порождают некорректный ввод. Перед использованием функции убедитесь в корректности строк и предоставьте обработчики ошибок.

Прототип

int FoldString(

_In_ DWORD dwMapFlags,

_In_ LPCTSTR lpSrcStr,

_In_ int cchSrc,

_Out_opt_ LPTSTR lpDestStr,

_In_ int cchDest

);

Параметры

dwMapFlags [in]

Набор флагов, задающих тип преобразования, выполняемого при отображении строки. Данный параметр содержит комбинацию флагов, перечисленных здесь.

lpSrcStr [in]

Указатель на исходную строку, которую функция должна отобразить.

cchSrc [in]

Размер, в символах, исходной строки lpSrcStr, за исключением завершающего NULL символа. Если строка завершается NULL символом, то приложение может передать в этом параметре отрицательное значение. В этом случае функция сама определит длину строки и вставит завершающий NULL символ в конец результирующей строки lpDestStr.

lpDestStr [out, opt]

Указатель на буфер, в котором функция разместит отображенную строку.

cchDest [in]

Размер, в символах, результирующей строки lpDestStr. Если размер в cchSrc указан с учетом завершающего NULL символа, то и в cchDest он также должен указываться с учетом завершающего NULL символа.

Приложение может установить в этом параметре значение нуль. В этом случае функция не будет использовать параметр lpDestStr и вернет необходимый размер буфера для отображаемой строки. Если задан флаг MAP_FOLDDIGITS, функция возвращает максимальный необходимый размер, даже если фактическое количество символов меньше максимального размера. Если максимальный размер не указан, функция завершится с ошибкой ERROR_INSUFFICIENT_BUFFER.

Возвращаемое значение

Количество символов в транслируемой строке, включая завершающий NULL символ. Если значение параметра cchDest равно нулю, то функция вернет размер буфера необходимый для размещения в нем обработанной строки, включая завершающий NULL символ.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации об ошибке, используйте функцию GetLastError. Она вернет код ошибки. Возможные коды ошибок перечислены ниже.

ERROR_INSUFFICIENT_BUFFER - недостаточный размер буфера, или же он неправильно задан в значение NULL.

ERROR_INVALID_DATA - некорректные данные.

ERROR_INVALID_FLAGS - недопустимый набор флагов.

ERROR_INVALID_PARAMETER - недопустимое значение какого-либо параметра.

ERROR_MOD_NOT_FOUND - модуль не найден.

ERROR_OUTOFMEMORY - для завершения операции не хватает памяти.

ERROR_PROC_NOT_FOUND - требуемая процедура не найдена.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Исходная строка

char in_str[] = "Привет\0";

//Определяем необходимый размер буфера

size_t size = 0;

size = FoldString(MAP_COMPOSITE, in_str, -1, NULL, 0);

//Подготавливаем буфер

char* out_str;

out_str = (char*)malloc(size * sizeof(char));

//Конвертируем строку

FoldString(MAP_COMPOSITE, in_str, -1, out_str, size);

//Выводим результат конвертирования

MessageBox(NULL, out_str, "", MB_OK);

//Освобождаем память

free(out_str);

return 0;

}

Примечание

Значения параметров lpSrcStr и lpDestStr не должны совпадать. Если же они равны друг другу, функция завершится с ошибкой ERROR_INVALID_PARAMETER.

Зона совместимости Unicode состоит из символов в интервале от 0xF900 до 0xFFEF, то есть описывает символы из других стандартов кодирования. На самом деле данные символы являются вариантами символов, уже имеющихся в Unicode. Зона совместимости используется для поддержки двойного отображения "туда-обратно" (round-trip mapping) в этих стандартах. Приложения могут использовать флаг MAP_FOLDCZONE для запрета поддержки дублирования символов в зоне совместимости.

Начиная с Windows Vista данная функция поддерживает нормализацию Unicode. Отображаются все символы совместимые с Unicode.

Начиная с Windows Vista. Преобразования, заданные флагами MAP_FOLDCZONE, MAP_PRECOMPOSED и MAP_COMPOSITE, при отображении строки используют формы нормалзации KC, C, и D (посредством функции NormalizeString).

Начиная с Windows 8 ANSI версия функции объявлена в заголовочном файле Winnls.h, а Unicode версия в файле Stringapiset.h. До Windows 8 обе версии объявлялись в заголовочном файле Winnls.h.

Заголовочный файл | winnls.h (подключен в windows.h); Stringapiset.h (подключен в windows.h)
Экспортирующая библиотека | kernel32.dll
ANSI и Unicode наименования | FoldStringA и FoldStringW


GetStringTypeA

Устарела. Возвращает информацию о типах символов, входящих в состав заданной строки. Для каждого символа строки функция устанавливает один или несколько бит в соответствующем ему элементе массиве с выходными данными. Каждый бит идентифицирует тип символа, например, буква, цифра или ни первое ни второе.

Внимание: неправильное использование этой функции может нарушить безопасность вашего приложения. Для предотвращения переполнения буфера приложение должно правильно задатть размер буфера с выходными данными.

Прототип

BOOL GetStringTypeA(

_In_ LCID Locale,

_In_ DWORD dwInfoType,

_In_ LPCSTR lpSrcStr,

_In_ int cchSrc,

_Out_ LPWORD lpCharType

);

Параметры

Locale [in]

Идентификатор локали, задающий локаль. Для создания идентификатора вы можете использовать макрос MAKELCID или использовать одно из значений, перечисленных ниже.

LOCALE_SYSTEM_DEFAULT - локаль по умолчанию для операционной системы (0x0800).

LOCALE_USER_DEFAULT - локаль по умолчанию для пользователя или процесса (0x0400).

Windows Vista и новее: также поддерживаются идентификаторы, перечисленные ниже

LOCALE_CUSTOM_DEFAULT - пользовательская (custom) локаль по умолчанию (0x0C00).

LOCALE_CUSTOM_UI_DEFAULT - пользовательская (custom) локаль по умолчанию для многоязыкового интерфейса (MUI) (0x1400).

LOCALE_CUSTOM_UNSPECIFIED - неопределеная пользовательская локаль, используемая для идентифицирования всех дополнительных локалей, за исключением локали текущего пользователя (0x1000).

dwInfoType [in]

Набор флагов, задающих запрашиваемую информацию о типах символов. данный параметр аналогичен параметру dwInfoType функции GetStringTypeW. Подробная информация о типах символов приведена здесь.

lpSrcStr [in]

Указатель на ANSI строку, для символов которой запрашивается информация об их типах. Если указанная локаль использует двухбайтовый набор символов (DBCS), то данная строка также может состоять из символов двухбайтового набора символов. Если значение параметра cchSrc меньше нуля, то данная строка должна завершаться NULL символом.

cchSrc [in]

Размер строки lpSrcStr в символах, Если указанный размер включает в себя завершающий NULL символ, то функция вернет информацию и для этого символа. Если значение параметра cchSrc меньше нуля, то считается, что строка завершается NULL символом. В этом случае функция сама вычислит размер строки и вернет информацию обо всех символах строки, включая завершающий NULL символ.

lpCharType [in]

Указатель на массив 16-разрядных значений. Размер этого массива должен быть достаточен для того, чтобы вместить в себя по одному 16-разрядному значению для каждого символа исходной строки. Если значение параметра cchSrc больше нуля, то параметр lpCharType должен указывать на массив слов состоящий из cchSrc элементов. Если же значение параметра cchSrc меньше нуля, то параметр lpCharType должен указывать на массив слов, состоящий из lpSrcStr+1 элемента. Когда функция вернет управление, данный массив будет содержать по одному слову для каждого символа исходной строки.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации об ошибке используйте функцию GetLastError. Она вернет одно из значений, перечисленных ниже.

ERROR_INVALID_FLAGS - недопустимый набор флагов.

ERROR_INVALID_PARAMETER - недопустимое значение какого-либо параметра.

Пример использования

Ниже приводится пример использования этой функции.

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

char s[] = "a2;";

WORD ww[4];

char str[20];

if(GetStringTypeA(LOCALE_SYSTEM_DEFAULT, CT_CTYPE1, s, -1, ww))

sprintf(str, "%X; %X; %X; %X", ww[0], ww[1], ww[2], ww[3]);

else

sprintf(str, "%s", "Ошибка");

MessageBox(NULL, str, "", 0);

return 0;

}

В данном примере мы получаем информацию о 4 символах: 'a' , '2', ';' и NULL символ в классификации Ctype1. Согласно ей получена следующая информация:

'a': 0x382 = C1_DEFINED | C1_ALPHA | C1_XDIGIT | C1_LOWER;

'2': 0x284 = C1_DEFINED | C1_XDIGIT | C1_DIGIT;

';' : 0x210 = C1_DEFINED | C1_PUNCT;

NULL символ: 0x220 = С1_DEFINED | C1_CNTRL.

Примечание

Данная функция конвертирует исходную строку в Unicode и вызывает функцию GetStringTypeW. Из-за этого слова в выходном массиве соответствуют не символам оригинальной ANSI строки, а символам эквивалентной ей строки Unicode. Конвертирование ANSI в Unicode может привести к изменению длины строки, например, пара символов ANSI может отображаться в один символ Unicode. Поэтому, соотношение символа ANSI строки и слова в массиве не всегда выполняется для многобайтовых строк. Таким образом, функция GetStringTypeA ограничивает использование многобайтовых строк. Вместо неё рекомендуется использовать функции GetStringTypeW и GetStringTypeEx.

Когда в функцию передается идентификатор локали, использующей только Unicode, функция завершается успехом. Это происходит потому, что операционная система использует системную кодовую страницу. Тем не менее, символы, не описанные в системной кодовой странице, отображаются в строке в виде вопросительных знаков (?).

Значения параметров lpSrcStr и lpCharType не должны совпадать. Еслиони совпадают, функция завершится с ошибкой ERROR_INVALID_PARAMETER.

Параметр Locale используется только при конвертировании строки в Unicode. Он никак не влияет на значения CTYPE*, переданные приложением. Типы символов определены исключительно на основе кодов Unicode и не зависят от локали. Например, буквы греческого алфавита определены как C1_ALPHA для всех возможных значений параметра Locale.

Параметр Locale не используется в функции GetStringTypeW. Это приводит к тому, что набор параметров в этих функциях различен. Из-за этого приложения не могут автоматически переключаться между ANSI и Unicode версиями функциями GetStringType* посредством директивы #define UNICODE. Приложения могут обойти это ограничение с помощью функции GetStringTypeEx, которая рекомендуется к использованию.

Заголовочный файл | winnls.h (подключен в windows.h)
Экспортирующая библиотека | kernel32.dll


GetStringTypeEx

Возвращает информацию о типах символов, входящих в состав исходной строки. Для каждого символа, функция устанвливает один или несколько бит в соответствующем этому символу 16-разрядном элементе массива с выходной информацией. Каждый бит задает тип символа: буква, цифра или что-то другое.

Внимание: неправильное использование этой функции может нарушить безопасность вашего приложения. Для предотвращения переполнения буфера приложение должно корректно задать размер буфера с выходной информацией.

В отличие от функций GetStringTypeA и GetStringTypeW функция GetStringTypeEx реализует обработку ANSI и Unicode строк в соответствии с директивой #define UNICODE. Данная функция рекомендуется для получения информации о типах символов.

Прототип

BOOL GetStringTypeEx(

_In_ LCID Locale,

_In_ DWORD dwInfoType,

_In_ LPCTSTR lpSrcStr,

_In_ int cchSrc,

_Out_ LPWORD lpCharType

);

Параметры

Locale [in]

Идентификатор локали, задающий локаль. Данный параметр уникальным образом задает кодовую страницу ANSI. Для создания идентификатора вы можете использовать макрос MAKELCID или использовать одно из значений, перечисленных ниже.

LOCALE_SYSTEM_DEFAULT - локаль по умолчанию для операционной системы (0x0800).

LOCALE_USER_DEFAULT - локаль по умолчанию для пользователя или процесса (0x0400).

Windows Vista и новее: также поддерживаются идентификаторы, перечисленные ниже

LOCALE_CUSTOM_DEFAULT - пользовательская (custom) локаль по умолчанию (0x0C00).

LOCALE_CUSTOM_UI_DEFAULT - пользовательская (custom) локаль по умолчанию для многоязыкового интерфейса (MUI) (0x1400).

LOCALE_CUSTOM_UNSPECIFIED - неопределеная пользовательская локаль, используемая для идентифицирования всех дополнительных локалей, за исключением локали текущего пользователя (0x1000).

dwInfoType [in]

Набор флагов, задающих запрашиваемую информацию о символах. Данный параметр аналогичен параметру dwInfoType функции GetStringTypeW. Поддерживаемые классификации символов описаны здесь.

lpSrcStr [in]

Указатель на строку, состоящую из символов, для которых запрашивается информация. Если значение параметра cchSrc меньше нуля, то строка должна завершаться NULL символом.

cchSrc [in]

Размер строки lpSrcStr, в символах. Размер равен количеству байт для ANSI версии или широких символов для Unicode версии функции. Если указанный размер включает в себя завершающий NULL символ, то функция вернет информацию и для этого символа.

Если в качестве размера строки указано отрицательное число, то считается, что исходная строка завершается NULL символом. В этом случае функция сама вычислит размер строки, включая завершающий NULL символ.

lpCharType [out]

Указатель на массив 16-разрядных значений. Размер этого массива должен быть достаточен для того чтобы вместить в себя 16-разрядное значение для каждого символа исходной строки. Если значение параметра cchSrc положительно, то параметр lpCharType должен указывать на массив слов, состоящий из cchSrc элементов. Если же значение параметра cchStr меньше нуля, то параметр lpCharType должен указывать на массив слов, состоящий из lpSrcStr+1 элементов. Когда функция вернет управление, данный массив будет содержать по слову для каждого символа исходной строки.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации об ошибке используйте функцию GetLastError. Она вернет одно из значений, перечисленных ниже.

ERROR_INVALID_FLAGS - недопустимый набор флагов.

ERROR_INVALID_PARAMETER - недопустимое значение какого-либо параметра.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

char s[] = "a2;";

WORD ww[4];

char str[20];

if(GetStringTypeEx(LOCALE_SYSTEM_DEFAULT, CT_CTYPE1, s, -1, ww))

sprintf(str, "%X; %X; %X; %X", ww[0], ww[1], ww[2], ww[3]);

else

sprintf(str, "%s", "Ошибка");

MessageBox(NULL, str, "", 0);

return 0;

}

Данный пример аналогичен примеру, приводимому для функции GetStringTypeA.

В этом примере мы получаем информацию о 4 символах: 'a' , '2', ';' и NULL символ в классификации Ctype1. Согласно ей получена следующая информация:

'a': 0x382 = C1_DEFINED | C1_ALPHA | C1_XDIGIT | C1_LOWER;

'2': 0x284 = C1_DEFINED | C1_XDIGIT | C1_DIGIT;

';' : 0x210 = C1_DEFINED | C1_PUNCT;

NULL символ: 0x220 = С1_DEFINED | C1_CNTRL.

Примечание

При использовании кодовой страницы ANSI функция конвертирует исходную строку в Unicode и затем анализирует каждый символ Unicode.

Данная функция конвертирует исходную строку в Unicode и вызывает функцию GetStringTypeW. Из-за этого слова в выходном массиве соответствуют не символам оригинальной ANSI строки, а символам эквивалентной ей строки Unicode. Конвертирование ANSI в Unicode может привести к изменению длины строки, например, пара символов ANSI может отображаться в один символ Unicode. Поэтому, соотношение символа ANSI строки и слова в массиве не всегда выполняется для многобайтовых строк. Таким образом, ANSI версия функции ограничивает использование многобуквенных (multicharacter) строк. Рекомендуется использовать Unicode версию функции.

Функция GetStringTypeEx обходит ограничение, вызванное различным набором параметров в функциях GetStringTypeA и GetStringTypeW. Из-за этого различия приложения не могли автоматически переключаться между этими функциями посредством директивы #define UNICODE. С другой стороны функция GetStringTypeEx поддерживает возможность такого переключения. Поэтому она рекомендуется к использованию.

Когда ANSI версия функции GetStringTypeEx используется совместно с идентификатором локали, поддерживающей только Unicode, функция корректно выполняет поставленную перед ней задачу, так как операционная система использует системную кодовую страницу. Тем не менее, символы, не заданные в системной кодовой странице отображаются в строку в виде знаков вопроса (?).

Значения параметров lpSrcStr и lpCharType не должны совпадать. Если же они равны друг другу, то функция завершится с ошибкой ERROR_INVALID_PARAMETER.

Параметр Locale используется только при конвертировании строки в Unicode. Он никак не влияет на значения CTYPE*, переданные приложением. Типы символов определены исключительно на основе кодов Unicode (Unicode points) и не зависят от локали. Например, буквы греческого алфавита определены как C1_ALPHA для всех возможных значений параметра Locale.

Заголовочный файл | winnls.h (подключен в windows.h)
Экспортирующая библиотека | kernel32.dll
ANSI и Unicode наименования | GetStringTypeExA и GetStringTypeExW


GetStringTypeW

Возвращает информацию о типах символов, входящих в состав Unicode строки. Для каждого символа функция устанавливает один или несколько бит в соответствующем символу 16-разрядном элементе массива. Каждый бит идентифицирует тип символа, например, буква, цифра, или что-то другое.

Внимание: неправильное использование данной функции может привести к нарушению безопасности вашего приложения. Для предотвращения переполнения буфера приложение должно корректно задать размер буфера с выходной информацией.

Прототип

BOOL GetStringTypeW(

_In_ DWORD dwInfoType,

_In_ LPCWSTR lpSrcStr,

_In_ int cchSrc,

_Out_ LPWORD lpCharType

);

Параметры

dwInfoType [in]

Набор флагов, задающих запрашиваемую информацию о типе символов. Данный параметр принимает одно из значений, перечисленных ниже. Все типы символов разделяются на несколько уровней, они описаны здесь.

CT_CTYPE1 - запрашивается информация о типе символа (Ctype1).

CT_CTYPE2 - запрашивается информация о направлении текста (Ctype2).

CT_CTYPE3 - запрашивается информация об обработке текста (Ctype3).

lpSrcStr [in]

Указатель на строку Unicode, для символов которой запрашивается информация. Если значение параметра cchSrc меньше нуля, то строка должна завершаться NULL символом.

cchSrc [in]

Размер строки lpSrcStr, в символах. Если размер строки включает в себя NULL символ, то функция вернет информацию и об этом символе. Если значение параметра cchSrc меньше нуля, то считается, что строка завершается NULL символом. В этом случае функция сама вычислит размер строки, включая завершающий NULL символ.

lpCharType [out]

Указатель на массив 16-разрядных значений. Размер этого массива должен быть достаточен для того, чтобы вместить 16-разрядное значение для каждого символа исходной стироки. Если значение параметра cchSrc не меньше нуля, то параметр lpCharType должен указывать на массив слов, состоящий из cchSrc элементов. Если же значение параметра cchSrc меньше нуля, то параметр lpCharType указывает на массив слов, состоящий из cchSrc+1 элементов. Когда функция вернет управление, данный массив будет содержать слова, каждое из которых соответствует символу в исходной строке.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации об ошибке используйте функцию GetLastError. Она вернет одно из значений, перечисленных ниже.

ERROR_INVALID_FLAGS - недопустимый набор флагов.

ERROR_INVALID_PARAMETER - недопустимое значение какого-либо параметра.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

wchar_t s[] = L"a2;";

WORD ww[4];

char str[20];

if(GetStringTypeW(CT_CTYPE1, s, -1, ww))

sprintf(str, "%X; %X; %X; %X", ww[0], ww[1], ww[2], ww[3]);

else

sprintf(str, "%s", "Ошибка");

MessageBox(NULL, str, "", 0);

return 0;

}

Данный пример аналогичен примеру, приводимому для функции GetStringTypeA.

В этом примере мы получаем информацию о 4 символах: 'a' , '2', ';' и NULL символ в классификации Ctype1. Согласно ей получена следующая информация:

'a': 0x382 = C1_DEFINED | C1_ALPHA | C1_XDIGIT | C1_LOWER;

'2': 0x284 = C1_DEFINED | C1_XDIGIT | C1_DIGIT;

';' : 0x210 = C1_DEFINED | C1_PUNCT;

NULL символ: 0x220 = С1_DEFINED | C1_CNTRL.

Примечание

Значения параметров lpSrcStr и lpCharType не должны совпадать. Если они равны друг другу, то функция завершится с ошибкой ERROR_INVALID_PARAMETER.

Параметр Locale используется в функции GetStringTypeA и не используется в функции GetStringTypeW. Это приводит к тому, что набор параметров в этих функциях различен. Из-за этого приложения не могут автоматически переключаться между ANSI и Unicode версиями функциями GetStringType* посредством директивы #define UNICODE. Приложения могут обойти это ограничение с помощью функции GetStringTypeEx, которая рекомендуется к использованию.

Поддерживаемые типы символов перечислены здесь.

Начиная с Windows 8: функция GetStringTypeW описана в заголовочном файле Stringapiset.h. До Windows 8, она описывалась в заголовочном файле Winnls.h.

Заголовочный файл | Stringapiset.h (подключен в windows.h)
Экспортирующая библиотека | kernel32.dll


IsCharAlpha

Проверяет является ли заданный символ алфавитным. Эта проверка основывается на языковых настройках, установленных пользователем в Панели Управления.

Прототип

BOOL WINAPI IsCharAlpha(

_In_ TCHAR ch

);

Параметры

ch [in]

Проверяемый символ.

Возвращаемое значение

Если символ является алфавитным, то функция возвращает ненулевое значение.

Если же символ не является алфавитным, функция вернет значение нуль.

Возвращаемое значение в случае ошибки

Единственный способ определить факт ошибки - использовать функцию GetLastError.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Тестируемый символ

char ch = 'К';

//Тестируем символ

if(IsCharAlpha(ch))

MessageBox(NULL, "Алфавитный", "", MB_OK);

else

MessageBox(NULL, "Не алфавитный", "", MB_OK);

return 0;

}

В результате работы этой программы на экран выводится сообщение "Алфавитный".

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | IsCharAlphaA и IsCharAlphaW


IsCharAlphaNumeric

Определяет является ли заданный символ алфавитно-цифровым. Данная проверка основывается на языковых настройках, указанных пользователем во время установки операционной системы или настроенных им в Панели Управления.

Прототип

BOOL WINAPI IsCharAlphaNumeric(

_In_ TCHAR ch

);

Параметры

ch [in]

Проверяемый символ.

Возвращаемое значение

Если символ является алфавитно-цифровым, то функция возвращает ненулевое значение.

Если символ не является алфавитно-цифровым, то функция возвращает значение нуль.

Возвращаемое значение в случае ошибки

Единственный способ определить факт ошибки - использовать функцию GetLastError.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Тестируемый символ

char ch = 'Щ';

//Тестируем символ

if(IsCharAlphaNumeric(ch))

MessageBox(NULL, "Алфавитно-цифровой", "", MB_OK);

else

MessageBox(NULL, "Не алфавитно-цифровой", "", MB_OK);

return 0;

}

В результате работы этой программы на экран выводится сообщение "Алфавитно-цифровой".

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | IsCharAlphaNumericA и IsCharAlphaNumericW


IsCharLower

Определяет является ли символ символом в нижнем регистре. Эта проверка основывается на языковых настройках, установленных пользователем во время установки операционной системы. Изменить их можно в Панели Управления.

Прототип

BOOL WINAPI IsCharLower(

_In_ TCHAR ch

);

Параметры

ch [in]

Проверяемый символ.

Возвращаемое значение

Если символ является символом в нижнем регистре, функция возвращает ненулевое значение. В противном случае она возвращает значение нуль.

Возвращаемое значение в случае ошибки

Единственный способ определить факт ошибки - использовать функцию GetLastError.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Тестируемый символ

char ch = 'е';

//Тестируем символ

if(IsCharLower(ch))

MessageBox(NULL, "Нижний регистр", "", MB_OK);

else

MessageBox(NULL, "Не нижний регистр", "", MB_OK);

return 0;

}

В результате работы этой программы на экран выводится сообщение "Нижний регистр".

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | IsCharLowerA и IsCharLowerW


IsCharUpper

Определяет является ли символ символом верхнего регистра. Данная проверка основывается на языковых настройках, установленных пользователем во время установки операционной системы. Изменить их можно в Панели Управления.

Прототип

BOOL WINAPI IsCharUpper(

_In_ TCHAR ch

);

Параметры

ch [in]

Тестируемый символ.

Возвращаемое значение

Если символ является символом верхнего регистра, то функция вернет ненулевое значение. В противном случае она вернет значение нуль.

Возвращаемое значение в случае ошибки

Единственный способ определить факт ошибки - использовать функцию GetLastError.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Тестируемый символ

char ch = 'Н';

//Тестируем символ

if(IsCharUpper(ch))

MessageBox(NULL, "Верхний регистр", "", MB_OK);

else

MessageBox(NULL, "Не верхний регистр", "", MB_OK);

return 0;

}

В результате работы данной программы на экран будет выведено сообщение "Верхний регистр".

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | IsCharUpperA и IsCharUpperW


LCMapString

Для локали, заданной по идентификатору, отображает одну строку символов в другую, выполняя задланное преобразование, или же создает ключ сортировки для входной строки.

Так как компания Microsft реализует переход на описание локалей по их наименованию, а не по идентификатору, то приложениям в целях переносимости рекомендуется использовать функцию LCMapStringEx, вместо LCMapString. Эта рекомендация особенно актуальна для индивидуальных (custom) локалей, включая локали, созданные компанией Microsoft. Приложения, спроектированные для работы на операционной системе Windows Vista, или более новой версии системы, должны использовать функцию LCMapStringEx.

Прототип

int LCMapString(

_In_ LCID Locale,

_In_ DWORD dwMapFlags,

_In_ LPCTSTR lpSrcStr,

_In_ int cchSrc,

_Out_opt_ LPTSTR lpDestStr,

_In_ int cchDest

);

Параметры

Locale [in]

Идентификатор используемой локали. Для его создания вы можете использовать макрос MAKELCID, или использовать одно из предопределенных значений, приведенных здесь.

dwMapFlags [in]

Набор флагов, задающих тип преобразования, выполняемого во время отображения строки, или тип создаваемого ключа сортировки. Допустимые значения флагов приведены здесь.

lpSrcStr [in]

Указатель на исходную строку, которую функция отображает, или на базе которой создает ключ сортировки. Данная строка не может иметь нулевой размер.

cchSrc[in]

Размер исходной строки lpSrcStr, в символах. Данный размер может включать в себя завершающий NULL символ, но может и не включать его. Если NULL символ включается в размер, то поведение функции остается неизменным, так как NULL символ не сортируется и всегда отображается в самого себя.

Приложение может указать в этом параметре отрицательное значение, указывая тем самым, что исходная строка завершается NULL символом. В этом случае, при отображении строки функция сама определит длину исходной строки и запишет NULL символ в конец результирующей строки lpDestStr.

Приложение не может задать в этом параметре значение нуль.

lpDestStr [out, opt]

Указатель на буфер, в который функция запишет отображенную строку или ключ сортировки. Если функция используется для создания ключа сортировки, то результирующая строка может состоять из нечетного числа байт. При использовании флага LCMAP_BYTEREV будет развернуто только четное число байт. Последний байт (оставшийся от деления их количества на 2) не будет развернут в ключе сортировки.

Учтите, что исходная и результирующие строки (буферы, в которых они размещаются) могут совпадать только при использовании флага LCMAP_UPPERCASE или LCMAP_LOWERCASE. Во всех остальных случаях они должны различаться. Если это условие не выполнено, то функция завершится ошибкой

После ошибки, результирующий буфер может содержать неполные данные, или вообще не содержать никакого результата. В этом случае, рекомендуется рассматривать такие результаты как неверные.

cchDest [in]

Размер целевого буфера lpDestStr, в символах. Если функция используется для отображения строки, то в данном параметре указывается количество символов. Если значение параметра cchSrc учитывает завершающий NULL символ, то значение параметра cchDest также должно учитывать завершающий NULL символ.

Если функция используется для создания ключа сортировки, то в параметре cchDest указывается размер целевого буфера в байтах. Данный размер должен учитывать байт 0x00, который служит признаком окончания ключа сортировки.

Приложение может указать в параметре cchDest значение нуль. В этом случае, функция не будет использовать значение параметра lpDestStr и вернет размер буфера необходимый для размещения в нем отображенной строки или колюча сортировки.

Возвращаемое значение

Количество символов или байт в результирующей отображенной строке или ключе сортировки с учетом завершающего NULL символа. Если значение параметра cchDest равно нулю, то функция возвращает размер буфера необходимый для размещения в нем отображенной строки или ключа сортировки с учетом завершающего NULL символа.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации об ошибке используйте функцию GetLastError. Она вернет один из кодов, приведенных ниже.

ERROR_INSUFFICIENT_BUFFER - целевой буфер имеет недостаточный размер, или же указатель на него равен NULL.

ERROR_INVALID_FLAGS - недопустимый набор флагов.

ERROR_INVALID_PARAMETER - недопустимое значение какого-либо параметра.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Исходная строка

char in_s[] = "Привет\0";

//Определяем необходимый размер буфера

size_t size = 0;

size = LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_UPPERCASE, in_s, -1, NULL, 0);

//Подготавливаем буфер

char* out_s;

out_s = (char*)malloc(size*sizeof(char));

//Конвертируем строку

LCMapString(LOCALE_SYSTEM_DEFAULT, LCMAP_UPPERCASE, in_s, -1, out_s, size);

//Выводим результат конвертирования

MessageBox(NULL, out_s, "", MB_OK);

//Освобождам память

free(out_s);

return 0;

}

В данном примере функция LCMapString используется для приведения символов строки "Привет" к верхнему регистру. Функция вызывается дважды. Первый раз для определения необходимого размера буфера. Второй раз для самого конвертирования. В результате работы этой программы на экран выводится строка "ПРИВЕТ".

Примечание

Аналогично примечаниям к функции LCMapStringEx.

ANSI версия функции переводит исходную и/или результирующую строку в Unicode, опираясь на кодовую страницу Windows по умолчанию, ассоциированную с заданной локалью. Если в ANSI версии функции задана локаль, поддерживающая только Unicode, функция успешно отработает. Это произойдет благодаря тому, что операционная система использует кодовую страницу CP_ACP, задающую кодовую страницу Windows по умолчанию (ANSI). Тем не менее, символы не представленные в системной кодовой странице будут отображены в виде знаков вопроса (?).

Заголовочный файл | winnls.h (подключен в windows.h)
Экспортирующая библиотека | kernel32.dll
ANSI и Unicode наименования | LCMapStringA и LCMapStringW


LCMapStringEx

Появилась в Windows Vista. Для локали, заданной по наименованию, отображает входную строку символов в другую, используя заданное преобразование, или же создает ключ сортировки для входной строки.

Приложения, спроектированные для работы только на Windows Vista или более новых версиях операционной системы, должны использовать эту функцию вместо LCMapString.

Прототип

int LCMapStringEx(

_In_opt_ LPCWSTR lpLocaleName,

_In_ DWORD dwMapFlags,

_In_ LPCWSTR lpSrcStr,

_In_ int cchSrc,

_Out_opt_ LPWSTR lpDestStr,

_In_ int cchDest,

_In_opt_ LPNLSVERSIONINFO lpVersionInformation,

_In_opt_ LPVOID lpReserved,

_In_opt_ LPARAM sortHandle

);

Параметры

lpLocaleName [in, opt]

Указатель на наименование локали, или одно из предопределенных значений, перечисленных здесь.

dwMapFlags [in]

Набор флагов, задающих преобразование во время отображения строки, или тип создаваемого ключа сортировки. Допустимые значения флагов перечислены здесь.

lpSrcStr [in]

Указатель на исходную строку, которую функция отображает, или же на основе которой создает ключ сортировки. Данная строка не может иметь нулевой размер.

cchSrc [in]

Размер исходной строки lpSrcStr, в символах. Размер исходной строки может включать завершающий NULL символ, но может его и не учитывать. Если завершающий NULL символ включен в указанный размер строки, это никак не скажется на резльтатах отображения, так как завершающий NULL символ не сортируется и всегда отображается в самого себя.

Прлоджение может указать в этом параметре отрицательное значение, указывая тем самым, что строка завершается NULL символом. В этом случае, если функция LCMapStringEx работает в режиме отображения строки, она сама вычислит длину строки и поставит завершающий NULL символ в конец выходной строки lpDestStr.

Приложение не может установить в этом параметре значение нуль.

lpDestStr [out, opt]

Указатель на буфер, в который функция запишет спроецированную строку или ключ сортировки. Если приложение задало флаг LCMAP_SORTKEY, функция запишет в этот буфер ключ сортировки. Он записывается в виде массива байтов, который может состоять из нуля байтов.

Если функция завершается ошибкой, целевой буфер может содержать частичный результат, или вообще не изменится. В этом случае, рекомендуется считать результат неверным.

cchDest [in]

Размер буфера lpDestStr, в символах. Если функция используется для отображения строки, то данный параметр задает количество символов. Если размер исходной строки cchSrc включает в себя завершающий NULL символ, то значение параметра cchDest также должно включать в себя завершающий NULL символ.

Если приложение использует функцию для создания ключа сортировки, то размер выходного буфера указывается в байтах. Данный размер должен включать в себя место для байта 0x00, завершающего ключ сортировки.

Приложение может указать в параметре cchDest значение нуль. В этом случае функция не использует параметр lpDestStr и возвращает нобходимый для отображенной строки или ключа сортировки размер буфера.

lpVersionInformation [in, opt]

Зарезервировано. Должно быть равно NULL.

lpReserved [in]

Зарезервировано. Должно быть равно NULL.

sortHandle [in, opt]

Зарезервировано. Должно быть равно нулю.

Возвращаемое значение

Количество символов, или байт в спроецированной строке или ключе сортировки, включая завершающий NULL символ.

Если значение параметра cchDest равно нулю, то функция вернет необходимый размер буфера для размещения в нем спроецированной строки или ключа сортировки. Если исходная строка завершается NULL символом, то данный размер также включает в себя завершающий NULL символ.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации, приложение может использовать функцию GetLastError. Она вернет один из кодов, перечисленных ниже.

ERROR_INSUFFICIENT_BUFFER - буфер имеет недостаточный размер, или указатель на него равен NULL.

ERROR_INVALID_FLAGS - недопустимый набор флагов.

ERROR_INVALID_PARAMETER - недопустимое значение какого-либо параметра.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

//Вводим константу LOCALE_NAME_SYSTEM_DEFAULT

#if defined(__GNUC__)

#define LOCALE_NAME_SYSTEM_DEFAULT (const WCHAR []){'!','x','-','s','y','s','-','d','e','f','a','u','l','t','-','l','o','c','a','l','e',0}

#elif defined(_MSC_VER)

#define LOCALE_NAME_SYSTEM_DEFAULT L"!x-sys-default-locale"

#else

static const WCHAR LOCALE_NAME_SYSTEM_DEFAULT[] = {'!','x','-','s','y','s','-','d','e','f','a','u','l','t','-','l','o','c','a','l','e',0};

#endif

//Прототип функции LCMapStringEx

typedef WINAPI int (*LPLCMAPSTRINGEX)(LPCWSTR, DWORD, LPCWSTR, int, LPWSTR, int, LPNLSVERSIONINFO, LPVOID, LPARAM);

LPLCMAPSTRINGEX lpfLCMapStringEx;

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Находим адрес функции LCMapStringEx

HMODULE hkernel;

hkernel = GetModuleHandle("kernel32.dll");

lpfLCMapStringEx = (LPLCMAPSTRINGEX)GetProcAddress(hkernel, "LCMapStringEx");

if(! lpfLCMapStringEx)

return;

//Исходная строка

wchar_t in_s[] = L"hello\0";

//Определяем необходимый размер буфера

size_t size = 0;

size = lpfLCMapStringEx(LOCALE_NAME_SYSTEM_DEFAULT, LCMAP_UPPERCASE, in_s, -1, NULL, 0, NULL, NULL, 0);

//Подготавливаем буфер

wchar_t* out_s;

out_s = (wchar_t*)malloc(size*sizeof(wchar_t));

//Конвертируем строку

lpfLCMapStringEx(LOCALE_NAME_SYSTEM_DEFAULT, LCMAP_UPPERCASE, in_s, -1, out_s, size, NULL, NULL, 0);

//Выводим результат конвертирования

MessageBoxW(NULL, out_s, L"", MB_OK);

//Освобождам память

free(out_s);

return 0;

}

В данном примере функция LCMapStringEx используется для того, чтобы привести все символы исходной строки "hello" к верхнему регистру. Функция вызывается дважды. Первый раз для определения необходимого размера буфера. Второй раз для самого конвертирования.

В результате работы этой программы на экран выводится сообщение "HELLO".

Примечание

Для создания ключа сортировки приложение может использовать функцию LCMapString или LCMapStringEx. Для этого ему нужно в параметре dwMapFlags задать флаг LCMAP_SORTKEY.

Другим назначением функций LCMapString и LCMapStringEx является отображение строк. В этом случае приложение не должно задавать флаг LCMAP_SORTKEY в параметре dwMapFlags, но использовать какую-либо комбинацию флагов.

Начиная с Windows Vista данная функция может обрабатывать данные индивидуальных (custom) локалей. Для таких данных не гарантируется их идентичность при запусках на разных компьютерах или при разных запусках приложения.

Начиная с Windows 8, если ваше приложение передает в функцию тэги языка, взятые из пространства имен Windows.Globalization, оно должно предварительно их сконвертировать с помощью функции ResolveLocaleName.

Заголовочный файл | Winnls.h (подключен в windows.h)
Экспортирующая библиотека | kernel32.dll


LoadString

Загружает строковый ресурс из исполняемого файла, ассоциированного с заданным модулем, копирует строку в буфер, и добавляет завершающий NULL символ.

Прототип

int WINAPI LoadString(

_In_opt_ HINSTANCE hInstance,

_In_ UINT uID,

_Out_ LPTSTR lpBuffer,

_In_ int nBufferMax

);

Параметры

hInstance [in, opt]

Описатель экземпляра модуля, исполняемый файл которого содержит строковый ресурс. Для того, чтобы получить описатель самого приложения, вызовите фукцию GetModuleHandle с параметром NULL.

uID [in]

Идентификатор загружаемой строки.

lpBuffer [out]

Указатель на буфер, в который заносится строка. Он должен иметь достаточный размер (минимум 8 байт).

nBufferMax [in]

Размер буфера, в символах. Если длина строки превышает размер буфера, то она обрезается, и в её конец устанавливается NULL символ. Если значение этого параметра равно нулю, то в буфер lpBuffer записывается указатель на сам ресурс доступный только для чтения.

Возвращаемое значение

Количество символов, скопированных в буфер, не считая завершающий NULL символ.

Возвращаемое значение в случае ошибки

Если строковый ресурс не существует, то функция возвращает значение нуль. Для получения дополнительной информации об ошибке используйте функцию GetLastError,

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include "Constants.h"

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Буфер под строку

char str[SIZE_BUFFER];

//Загружаем строку

LoadString(hThisInstance, IDS_HELLO, str, SIZE_BUFFER);

//Выводим строку на экран

MessageBox(NULL, str, "", MB_OK);

return 0;

}

В данном примере из ресурсов приложения загружается строка, которая впоследствии выводится на экран. Ниже приводится содержимое файла ресурсов приложения.

#include "Constants.h"

STRINGTABLE

{

IDS_HELLO, "Hello"

}

Для задания строкового ресурса используется объявление STRINGTABLE.

Ниже приводится содержимое заголовочного файла Constsnts.h, содержащего идентификатор ресурса и размер буфера под загружаемую строку (SIZE_BUFFER).

//Идентификатор ресурса

#define IDS_HELLO 0x100

//Размер буфера под строку

#define SIZE_BUFFER 100

Примечание

Неправильное использование этой функции может нарушить безопасность вашего приложения. Под неправильным использованием понимается указание неверного размера буфера в параметре nBufferMax. Например, если lpBuffer указывает на буфер szBuffer, который объявлен, как TCHAR szBuffer[100], то объявление sizeof(szBuffer) вернет размер буфера в байтах, это может привести к переполнению буфера в случае использования Unicode версии функции. Переполнение буфера является причиной большинства проблем безопасности приложения. В этом случае, конструкция sizeof(szBuffer)/sizeof(TCHAR) или sizeof(szBuffer)/sizeof(szBuffer[0]) вернет правильный размер буфера.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | LoadStringA и LoadStringW


lstrcat

Присоединяет одну строку к другой.

Прототип

LPTSTR WINAPI lstrcat(

_Inout_ LPTSTR lpString1,

_In_ LPTSTR lpString2

);

Параметры

lpString1 [in, out]

Первая завершающаяся NULL символом строка. Данный буфер должен иметь достаточный размер для того чтобы вместить в себе обе строки.

lpString2 [in]

Завершающаяся NULL символом строка, которая должна быть присоединена к строке lpString1.

Возвращаемое значение

Указатель на буфер lpString1.

Возвращаемое значение в случае ошибки

Значение NULL. При этом строка lpString1 может не завершаться NULL символом.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Строки

char name[100] = "Сергей \0";

char second_name[] = "Норсеев\0";

//Соединяем строки

lstrcat(name, second_name);

//Выводим результирующую строку

MessageBox(NULL, name, "", MB_OK);

return 0;

}

В результате работы данной программы на экран будет выведено сообщение "Сергей Норсеев".

Примечание

Неосторожное использование этой функции может нарушить безопасность вашего приложения. Для обнаружения ошибок доступа и других ошибок данная функция использует структуруную обработку исключений (SEH). Когда функция отлавливает ошибку она возвращает значение NULL без завершения формиируемой строки (с помощью NULL символа) и без уведомления кода, вызвавшего данную функцию. Вызывающую данную функцию поток не должен полагаться на то, что единственной возможной причиной ошибки является недостаточность места.

Буфер lpString1 должен иметь достаточный размер для того, чтобы вместить в себя дополнительно строку lpString2 и завершающий NULL символ. Если это условие не выполнено, то может произойти переполнение буфера. Нарушения доступа во время переполнения буфера может привести к краху вашего приложения. В наихудшем случае, переполнение буфера может позволить атакующему внедрить исполняемый код в ваш процесс, особенно если строка lpString1 размещается в стеке.

Заголовочный файл | winbase.h (подключен в windows.h)
Экспортирующая библиотека | kernel32.dll
ANSI и Unicode наименования | lstrcatA и lstrcatW


lstrcmp

Сравнивает две строки символов. Сравнение осуществляется с учетом регистра.

Для сравнения строк без учета регистра используйте функцию lstrcmpi.

Прототип

int WINAPI lstrcmp(

_In_ LPCTSTR lpString1,

_In_ LPCTSTR lpString2

);

Параметры

lpString1 [in]

Первая сравниваемая строка. Она должна завершаться NULL символом.

lpString2 [in]

Вторая сравниваемая строка. Она должна завершаться NULL символом.

Возвращаемое значение

Если строка lpString1 меньше строки lpString2, функция возвращает отрицательное значение.

Если строка lpString1 больше строки lpString2, функция возвращает положительное значение.

Если строки совпадают, функция возвращает значение нуль.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Строки

char s1[] = "Строка\0";

char s2[] = "Строка\0";

//Сравниваем строки

if(! lstrcmp(s1, s2))

MessageBox(NULL, "Строки совпадают", "", MB_OK);

else

MessageBox(NULL, "Строки отличаются", "", MB_OK);

return 0;

}

В результате работы данной программы на экран выводится сообщение "Строки совпадают".

Примечание

Функция lstrcmp сравнивает две строки путем сравнения друг с дургом первых символов строк, затем вторых символов и так далее до тех пор пока либо не будут найдены отличающиеся символы, либо не будет достигнут конец какой-либо строки.

Учтите что строки lpString1 и lpString2 должны завершаться NULL символом. В противном случае сравнение строк может быть выполнено неправильно.

Функция вызывает функцию CompareString, используя локаль текущего потока, и вычитая 2 из значения, возвращенного этой функции. Таким образом поддерживаются соглашения языка C для сравнения строк.

То какая строка больше (или явябтся ли они идентичными) определяется на основе языка (пользовательской локали) выбранной пользователем во время установки операционной системы, или измененной им в Панели Управления. Если язык (пользовательская локаль) не выбран, система сравнивает строки на основе значений по умолчанию.

Если система поддерживает двухбайтовые наборы символов (DBCS), то функция может сравнивать две строки DBCS.

Функция lstrcmp использует сортировку слов (word sort), а не сортировку строк. Сортировка слов интерпретирует дефисы и апострофы иначе чем другие не алфавитно-цифровые символы. Это различие сделано для того, чтобы гарантировать, что такие слова как "coop" и "co-op" в отсортированном списке останутся вместе.

Заголовочный файл | winbase.h (подключен в windows.h)
Экспортирующая библиотека | kernel32.dll
ANSI и Unicode наименования | lstrcmpA и lstrcmpW


lstrcmpi

Сравнивает две строки символов. Сравнение осуществляется без учета регистра.

Для сравнения строк с учетом регистра используйте функцию lstrcmp.

Прототип

int WINAPI lstrcmpi(

_In_ LPCTSTR lpString1,

_In_ LPCTSTR lpString2

);

Параметры

lpString1 [in]

Первая сравниваемая строка. Она должна завершаться NULL символов.

lpString2 [in]

Вторая сравниваемая строка. Она должна завершаться NULL символом.

Возвращаемое значение

Если строка lpString1 меньше строки lpString2, функция вернет отрицательное значение.

Если строка lpString1 больше строки lpString2, функция вернет положительное значение.

Если строки эквивалентны, функция вернет значение нуль.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Строки

char s1[] = "Строка\0";

char s2[] = "СТРОКА\0";

//Сравниваем строки

if(! lstrcmpi(s1, s2))

MessageBox(NULL, "Строки совпадают", "", MB_OK);

else

MessageBox(NULL, "Строки отличаются", "", MB_OK);

return 0;

}

В данном примере сравниваются две строки, различающиеся только регистром символов. Поскольку функция lstrcmpi сравнивает строки без учета регистра, то строки признаются равными. В результате работы этой программы на экран выводится сообщение "Строки совпадают".

Примечание

Функция lstrcmpi сравнивает строки посимвольно. Сначала друг с другом сравниваются первые символы строк, потом вторые символы и так далее до тех пор, пока либо не будут найдены различающиеся символы, либо не будет достигнут конец строки.

Учтите, что строки lpString1 и lpString2 должны завершаться NULL символом. Если это не так, то сравнение может быть выполнено неправильно.

Функция lstrcmpi использует функцию CompareString, передавай ей текущую локаль потока, и вычитая 2 из значения, возвращенного функцией CompareString. Данное вычитание делается для поддержки соглашений языка C в части сравнения строк.

Функция lstrcmpi может не подходить для сравнения строк в некоторых локалях. В этом случае используйте функцию CompareString, которая позволяет явно задавать параметры сравнения. Например, для японского языка используйте флаги NORM_IGNORECASE, NORM_IGNOREKANATYPE и NORM_IGNOREWIDTH для обеспечения правильного сравнения строк. Флаги NORM_IGNOREKANATYPE и NORM_IGNOREWIDTH игнорируется в не Азиатских локалях, пожтому вы можете использовать эти флаги для всех локалей, обеспечивая тем самым правильное сравнение вне зависимости от локали. Однако помните, что использование этих флагов снижает производительность, поэтому используйте их только там, где это действительно необходимо.

В операционной системе, поддерживающей двухбайтовые наборы символов (DBCS) функция может сравнивать две строки DBCS.

Функция lstrcmpi использует сортировку слов, а не строк. Сортировка слов интерпретирует дефисы и апострофы иначе чем другие не алфавитно-цифровые символы. Это различие сделано для того, чтобы гарантировать, что такие слова как "coop" и "co-op" в отсортированном списке останутся вместе.

Заголовочный файл | winbase.h (подключен в windows.h)
Экспортирующая библиотека | kernel32.dll
ANSI и Unicode наименования | lstrcmpiA и lstrcmpiW


lstrcpy

Копирует строку в буфер.

Прототип

LPTSTR WINAPI lstrcpy(

_Out_ LPTSTR lpString1,

_In_ LPTSTR lpString2

);

Параметры

lpString1 [out]

Указатель на буфер, в который заносится содержимое строки lpString2. Буфер должен иметь достаточный размер для того, чтобы вместить в себя строку и завершающий NULL символ.

lpString2 [in]

Копируемая строка. Должна завершаться NULL символом.

Возвращаемое значение

Указатель на буфер.

Возвращаемое значение в случае ошибки

Значение NULL. Строка записанная в lpString1 может не завершаться NULL символом.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Буфер и строка

char Buff[100] ;

char str[] = "Строка\0";

//Копируем строку в буфер

lstrcpy(Buff, str);

//Выводим на экран содержимое буфера

MessageBox(NULL, Buff, "", MB_OK);

return 0;

}

В результате работы этой программы на экран выводится сообщение "Строка".

Примечание

В операционной системе поддерживающей двухбайтовые наборы символы (DBCS) функция может копировать строку, состоящую из символов двухбайтового набора символов.

Если исходный и целевой буферы перекрываются, поведение функции lstrcpy непредсказуемо.

Неправильное использование этой функции может скомпрометировать безопасность вашего приложения. Для обнаружения нарушения доступа и других ошибок функция использует структурную обработку исключений (SEH). Когда такая ошибка отлавливается функция возвращает значение NULL, без завершения строки и без уведомления вызывающего кода об ошибке. Использующее функцию приложение не должно полагаться на то, что недостаточный размер буфера - единственная возможная причина ошибки.

Буфер lpString1 должен иметь достаточный размер для того, чтобы вместить в себя строку lpString2 и завершающий NULL символ. Если это условие не выполнено, то может произойти переполнение буфера.

Преполнение буфера приводит к многочисленным проблемам безопасности приложения, в том числе к возможности реализации атак "отказ в обслуживании" (dos). В наихудшем случае переполнение буфера может позволить атакующему внедрить исполняемый код в ваш процесс. Это особенно актуально, если буфер lpString1 располагается в стеке.

Заголовочный файл | winbase.h (подключен в windows.h)
Экспортирующая библиотека | kernel32.dll
ANSI и Unicode наименования | lstrcpyA и lstrcpyW


lstrcpyn

Копирует заданное количество символов из исходной строки в буфер.

Прототип

LPTSTR WINAPI lstrcpyn(

_Out_ LPTSTR lpString1,

_In_ LPCTSTR lpString2,

_In_ int iMaxLength

);

Параметры

lpString1 [out]

Буфер, в который записываются копируемые символы. Буфер должен иметь достаточный размер для того чтобы вместить в себя iMaxLength символов TCHAR и завершающий NULL символ.

lpString2 [in]

Исходная строка, из которой копируются символы.

iMaxLength [in]

Количество символов TCHAR, копируемых из строки lpString2 в буфер lpString1, включая завершающий NULL символ.

Возвращаемое значение

Указатель на буфер. Функция завершается успехом даже если исходная строка состоит из боле чем iMaxLength символов.

Возвращаемое значение в случае ошибки

Значение NULL. В этом случае строка lpString1 может не завершаться NULL символом.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Буфер и строка

char Buff[128] ;

char str[] = "Привет, мир!\0";

//Копируем строку в буфер

lstrcpyn(Buff, str, 7);

//Выводим на экран содержимое буфера

MessageBox(NULL, Buff, "", MB_OK);

return 0;

}

В результате работы этой программы на экран выводится сообщение "Привет".

Примечание

Буфер lpString1 должен иметь достаточный размер для того, чтобы вместить в себя строку длиной iMaxLength символов, включая завершающий NULL символ.

Если исходный и целевой буферы перекрываются, то поведение функции непредсказуемо.

Неправильное использование функции может привести к компрометации безопасности вашего приложения. Для обнаружения ошибок нарушения доступа и других ошибок функция использует структурную обработку исключений (SEH). Если функция поймала ошибку, она возвращает значение NULL, без завершения строки и без уведомления вызывающего кода об ошибке. Ваше приложение не должно полагаться на то, что недостаточный размер буфера является единственной возможной причиной возникновения ошибки.

Если буфер lpString1 имеет недостаточный размер для того чтобы вместить в себя копируемую строку, то может произойти переполнение буфера. При копировании всей строки помните о том, что оператор sizeof возвращает количество байт. Например, если параметр lpString1 указывает на буфер szString1, объявленнй как TCHAR szSring1[100], то оператор sizeof(szString1) вернет размер буфера в байтах, а не в символах TCHAR. Это может привести к переполнению буфера для Unicode версии функции.

Ситуации переполнения буфера являются причиной многих проблем безопасности в приложениях, в частности они могут приводить к реализации атак "отказ в обслуживании" (dos) на ваше приложение. В худшем случае, переполнение буфера может позволить атакующему внедрить в ваш процесс исполняемый код. Это особенно актуально если буфер lpString1 располагается в стеке.

Конструкция sizeof(szString1)/sizeof(szString1[0]) вернет правильный размер буфера в символах.

Заголовочный файл | winbase.h (подключен в windows.h)
Экспортирующая библиотека | kernel32.dll
ANSI и Unicode наименования | lstrcpynA и lstrcpynW


lstrlen

Определяет длину заданной строки (не включая завершающий NULL символ).

Прототип

int WINAPI lstrlen(

_In_ LPCTSTR lpString

);

Параметры

lpString [in]

Завершающаяся NULL символом строка.

Возвращаемое значение

Длина строки в символах. Если значение параметра lpString равно NULL, функция вернет значение нуль.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Буфер и строка

char s[128] ;

char str[] = "Привет, мир!\0";

//Формируем строку с длиной строки

sprintf(s, "%d", lstrlen(str));

//Выводим на экран сформированную строку

MessageBox(NULL, s, "", MB_OK);

return 0;

}

В результате работы этой программы на экран выводится сообщение "12", что соответствует длине строки "Привет, мир!".

Примечание

Неправильное использование данной функции может скомпрометировать безопасность вашего приложения. Функция lstrlen полагается на то, что строка lpString1 завершается NULL символом, или указатель на нее равен NULL. Если эти условия не выполнены, то использование функции может привести к переполнению буфера или к реализации атаки "отказ в обслуживании" (dos) на ваше приложение.

Заголовочный файл | winbase.h (подключен в windows.h)
Экспортирующая библиотека | kernel32.dll
ANSI и Unicode наименования | lstrlenA и lstrlenW


MultiByteToWideChar

Отображает строку символов в кодировку UTF-16. Конвертируемая строка не обязательно состоит из символов многобайтового набора символов (multibyte character set).

Внимание: неосторожное использование функции MultiByteToWideChar может нарушить безопасность вашего приложения. Вызов этой функции может привести к переполнению буфера,так как размер входного буфера lpMultiByteStr задается в байтах, а размер выходного буфера lpWideCharStr в символах. Для предотвращения переполнения буфера, ваше приложение должно явно задать размеры буферов, осовываясь на типах данных, записываемых в эти буферы.

Кодовые страницы ANSI могут различаться на разных компьютерах, или могут быть изменены на отдельном компьютере, приводя к порче данных. Для надежного хранения данных, приложения должны использовать Unicode (UTF-8 или UTF-16), вместо кодовых страниц, за исключением стандартных форматов данных, не допускающих использование Unicode. Если использование Unicode невозможно, приложения должны тэгировать поток данных, указывая используемую кодировку, если это позволяют протоколы обмена. HTML и XML допускают тэгирование, а текстовые файлы нет.

Прототип

int MultiByteToWideChar(

_In_ UINT CodePage,

_In_ DWORD dwFlags,

_In_ LPCSTR lpMultiByteStr,

_In_ int cbMultiByte,

_Out_opt_ LPWSTR lpWideCharStr,

_In_ int cchWideChar

);

Параметры

CodePage [in]

Кодовая страница, используемая при конвертировании строки. Используемая кодовая страница должна быть установлена или доступна в системе. Ваше приложение может использовать одно из значений перечисленных здесь.

dwFlags [in]

Набор флагов, задающий тип конвертирования. Флаг MB_PRECOMPOSED используется по умолчанию. Флаги MB_PRECOMPOSED и MB_COMPOSITE не могут использоваться совместно друг с другом. Флаги MB_USEGLYPHCHARS и MB_ERR_INVALID_CHARS могут быть установлены независимо от других флагов.

Полный перечень флагов представлен здесь.

Для кодовых страниц, приведенных ниже, параметр dwFlags должен содержать значение нуль. В противном случае, функция завершится с ошибкой ERROR_INVALID_FLAGS.

· 50220,
· 50221,
· 50222,
· 50225,
· 50227,
· 50229,
· с 57002 по 57011,
· 65000 (UTF-7),
· 42 (Symbol).

Для кодировки UTF-8 и 54936 (GB18030, начиная с Windows Vista), параметр dwFlags должен содержать значение нуль или MB_ERR_INVALID_CHARS. В противном случае функция завершится с ошибкой ERROR_INVALID_FLAGS.

lpMultiByteStr [in]

Указатель на конвертируемую строку.

cbMultiByte [in]

Размер строки lpMultiByteStr, в байтах. Данный параметр может содержать значение -1, говорящее об использовании строки, завершающейся NULL символом. Если значение параметра cbMultiByte равно нулю, то функция завершается с ошибкой.

Если значение параметра cbMultiByte равно -1, то функция обрабатывает всю входную строку, включая завершающий NULL символ. Благодаря этому результирующая Unicode строка уже содержит завершающий NULL символ, а функция возвращает длину строки включая этот символ.

Если параметр cbMultiByte содержит положительное целое число, то функция обрабатывает только заданное количество байт. Если указанный размер не захватывает завершающий NULL символ, результирующая Unicode строка будет без него, а функция вернет длину без учета завершающего символа.

lpWideCharStr [out, opt]

Указатель на буфер, в который будет записана сконвертированная строка.

cchWideChar [in]

Размер буфера lpWideCharStr, в символах. Если значение этого параметра равно нулю, то функция вернет требуемый размер буфера, в символах, включая завершающий NULL символ, и не будет использовать буфер lpWideCharStr.

Возвращаемое значение

Количество символов, записанных в буфер lpWideCharStr. Если значение параметра cchWideChar было равно нулю, то функция возвращает требуемый размер буфера lpWideCharStr, в символах. Если входной байт (последовательность символов) недопустим, то для кодировки UTF вовзращается значение U+FFFD.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации об ошибке используйте функцию GetLastError. Она вернет одно из значений, перечисленных ниже.

· ERROR_INSUFFICIENT_BUFFER. Указанный размер буфера слишком мал, или в качестве указателя на буфер ошибочно указано значение NULL.
· ERROR_INVALID_FLAGS. Недопустимая комбинация флагов.
· ERROR_INVALID_PARAMETER. Недопустимое значение какого-либо параметра.
· ERROR_NO_UNICODE_TRANSLATION, В строке обнаружен недопустимый для Unicode символ.

Пример использования

Пример использования приведен здесь.

Примечание

По умолчанию функция конвертирует входную строку с использованием составных символов. Если предварительной составной формы (precomposed form) нет, то функция пытается использовать составную форму (composite form).

Использование флага MB_PRECOMPOSED для большинства кодовых страниц практически не приводит к повышению эффективности, так как большинство входных данных уже имеют составную форму (composed already). Учтите вызов функции NormalizeString после конвертирования строки с помощью MultiByteToWideChar. Функция NormalizeString формирует более аккуратные, стандартизованные и целостные данные, и также может работать быстрее. Учтите, что в перечислении NORM_FORM, передаваемом в функцию NormalizeString, значение NormalizationC соответствует флагу MB_PRECOMPOSED, а NormalizationD - MB_COMPOSITE.

Как говорилось ранее, выходной буфер может быть переполнен, если функция предварительно не вызывалась со значением параметра cchWideChar равным нулю, с целью получения необходимого размера. При использовании флага MB_COMPOSITE, выходной буфер может быть на три или более символов (для каждого входного символа) длиннее.

Буферы lpMultiByteStr и lpWideCharStr не должны совпадать. Если они совпадают, то функция завершится с ошибкой, а функция GetLastError вернет ERROR_INVALID_PARAMETER.

Функция MultiByteToWideChar не поместит в выходную строку завершающий NULL символ, если длина входной строки его не "захватывает". Для установки завершающего NULL символа приложение должно передать в функцию значение -1, или учесть завершающий NULL символ при определении количества символов входной строки.

Функция завершится ошибкой при установленном флаге MB_ERR_INVALID_CHARS, если в исходной строке встретится недопустимый символ. Недопустимый символ удовлетворяет одному из условий ниже.

· Символ, не являющийся символом по умолчанию (default character) во входной строке, но переводимый в символ по умолчанию при не установленном флаге MB_ERR_INVALID_CHARS.
· Для строк DBCS, символ имеющий лидирующий байт (lead byte) и некорректный младший байт (trail byte).

Начиная с Windows Vista данная функция полностью соответствует спецификации Unicode 4.1 для UTF-8 и UTF-16. Функция используемая в более ранних версиях операционной системы кодирует или декодирует суррогатные половины (surrogate halves) или неподходящие суррогатные пары (surrogate pairs). Код, написанный для более ранних версий операционной системы и опирающийся на эту особенность при кодировании случайных нетекстовых двоичных данных может столкнуться с проблемами. Тем не менее, код, использующий данную функцию для корректных UTF-8 строк, будет работать точно также как и на более ранних версиях операционной системы.

Windows XP: для предотвращения проблемы безопасности, вызванной символами UTF-8 не самой короткой формы (non-shortest-form), функция MultiByteToWideChar удаляет эти символы.

Начиная с Windows 8 функция MultiByteToWideChar объявлена в заголовочном файле Stringapiset.h. До Windows 8, она объявлялась в Winnls.h.

Windows Phone 8: данная функция поддерживается.

Windows Phone 8.1: данная функция поддерживается.

Заголовочный файл | Stringapiset.h (подключен в windows.h)
Экспортирующая библиотека | kernel32.dll


NormalizeString

Появилась в Windows Vista. Приводит строку символов к виду, соответствующему стандарту Unicode 4.0 TR#15.

Прототип

int NormalizeString(

_In_ NORM_FORM NormForm,

_In_ LPCWSTR lpSrcString,

_In_ int cwSrcLength,

_Out_opt_ LPWSTR lpDstString,

_In_ int cwDstLength

);

Параметры

NormForm [in]

Форма нормализации. Перечисление NORM_FORM задает допустимые формы нормализации.

lpSrcStrong [in]

Указатель на исходную ненормализованную строку.

cwSrcLength [in]

Длина, в символах, буфера, содержащего исходную строку. Приложение мождет указать в этом параметре значение -1, если функция должна обработать завершающуюся NULL-символом строку и автоматически вычислить её длину.

lpDstString [out, opt]

Указатель на буфер, в который функция запишет результирующую строку. Если значение параметра cwDstLength равно нулю, то параметр lpDstString содержит значение NULL.

Если длина исходной строки не захватывает NULL символ, то в результирующей строке NULL символа не будет. Для создания результирующей строки, завершающейся NULL символом, приложение должно указать значение -1 или корректную длину строки, с учетом заверщающего NULL символа.

cwDstLength [in]

Длина, в символах, буфера, в который будет записана выходная строка. Приложение может установить в этом параметре значение нуль, для запроса требуемого размера целевого буфера.

Возвращаемое значение

Длина нормализованной строки, размещенной в целевом буфере. Если значение параметра cwDstLength равно нулю, то функция возвращает требуемый размер буфера для конвертирования.

Если исходная строка завершается NULL символом, или если значение параметра cwSrcLength равно -1, то строка, записанная в выходной буфер, завершается NULL символом. В этом случае возвращенный функцией размер включает в себя завершающий NULL символ.

Возвращаемое значение в случае ошибки

Значение меньшее или равное нулю. Для получения дополнительной информации об ошибке используйте функцию GetLastError. Данная функция вернет один из кодов ошибки, перечисленных ниже.

· ERROR_INSUFFICIENT_BUFFER - указан недостаточно большой размер буфера, или в качестве буфера указано значение NULL.
· ERROR_INVALID_PARAMETER - недопустимое значение параметра.
· ERROR_NO_UNICODE_TRANSLATION - в строке обнаружен недопустимый Unicode. При этом функция вернет положение ошибки в строке со знаком минус.
· ERROR_SUCCESS - операция успешно выполнена, но результаты не сохранены.

Пример использования

Ниже приводится пример использования функции NormalizeString.

#include <windows.h>

//Вводимтип NORM_FORM

typedef enum _NORM_FORM {

NormalizationOther = 0,

NormalizationC = 0x1,

NormalizationD = 0x2,

NormalizationKC = 0x5,

NormalizationKD = 0x6

} NORM_FORM;

//Прототип функции NormalizeString

WINAPI typedef int (*NORMALIZESTRING)(NORM_FORM, LPCWSTR, int, LPWSTR, int);

NORMALIZESTRING lpfNS;

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Нормализуемая Unicode строка

wchar_t str[] = L"Unicode string";

//Загружаем библиотеку Normaliz.dll

HINSTANCE hNorm;

hNorm = LoadLibrary("Normaliz.dll");

//Получаем адрес функции NormalizeString

lpfNS = (NORMALIZESTRING)GetProcAddress(hNorm,"NormalizeString");

//Определяем требуемый размер выходного буфера

int _size = 0;

_size = lpfNS(NormalizationC,str,-1,NULL,0);

//Выделяем память под выходной буфер

wchar_t *lpout;

lpout = (wchar_t*)malloc(_size*sizeof(wchar_t));

//Нормализуем строку

_size = lpfNS(NormalizationC, str, -1, lpout, _size);

//Выводим нормализованную строку

MessageBoxW(NULL,lpout,L"",MB_OK);

//Освобождаем память

free(lpout);

return 0;

}

В данном примере мы дважды вызываем функцию NormalizeSting. Первый раз для определения необходимого размера выходного буфера. Второй раз, после подготовки выходного буфера, для самого конвертирования. Адрес функции NormalizeString находится с помощью функций LoadLibrary и GetProcAddress. После нормализации строки она выводится на экран.

Примечание

Некоторые Unicode символы имеют несколько экивалентных двоичных представлений. Они могут состоять из набора комбинируемых и/или композитных символов Unicode. Стандарт Unicode описывает процесс выполнения нормализации, который возвращает одно двоичное представление при наличии нескольких эквивалентных двоичных представлений символов. Нормализация может быть выполнена несколькими алгоритмами, называемыми формами нормализации. Каждая из форм подчиняется своим правилам. Windows 32 API и .NET Framework поддерживают формы нормализации: C, D, KC и KD. Они соответствуют своим описаниям в дополнении 15 "Формы нормализации" стандарта Unicode. Нормализованные строки обычно оцениваются (evaluated) путем последовательного сравнения.

Заголовочный файл | Winnls.h (подключен в windows.h)
Экспортирующая библиотека | Normaliz.dll


OemToChar

Переводит строку из набора символов OEM в ANSI или в набор широких символов.

Прототип

BOOL WINAPI OemToChar(

_In_ LPCSTR lpszSrc,

_Out_ LPTSTR lpszDst

);

Параметры

lpszSrc [in]

Завершающаяся NULL символом строка, состоящая из символов кодовой страницы OEM.

lpszDst [out]

Указатель на буфер, в который записывается сконвертированная строка. Если используется ANSI версия функции, то параметры lpszSrc и lpszDst могут указывать на один и тот же буфер. Если же используются широкие символы, то это не верно.

Возвращаемое значение

Функция возвращает ненулевое значений.

Возвращаемое значение в случае ошибки

Если в Unicode версии функции значения параметров lpszSrc и lpszDst совпадают, функция возвращает значение нуль. В этом случае функция GetLastError вернет значение ERROR_INVALID_ADDRESS.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

int main()

{

//Читаем строку в кодировке OEM

char s[100];

fgets(s, 100, stdin);

//Подготавливаем буфер для ANSI строки

char* p;

p = (char*)malloc(lstrlen(s) + 1);

//Конвертируем строку

OemToChar(s, p);

//Выводим результат конвертирования

MessageBox(NULL, p, "", MB_OK);

//Освобождаем память

free(p);

return 0;

}

Примечание

Неправильное использование этой функции может скомпрометировать безопасность вашего приложения.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | OemToCharA и OemToCharW


OemToCharBuff

Переводит заданное количество символов строки из набора символов OEM в набор символов ANSI или Unicode.

Прототип

BOOL WINAPI OemToCharBuff(

_In_ LPCSTR lpszSrc,

_Out_ LPTSTR lpszDst,

_In_ DWORD cchDstLength

);

Параметры

lpszSrc [in]

Один или несколько символов из набора символов OEM.

lpszDst [out]

Указатель на целевой буфер, в который записывается сконвертированная строка. Если используется ANSI версия функции, то параметры lpszSrc и lpszDst могут указывать на один и тот же буфер. Для Unicode версии функции они должны указывать на разные буферы.

cchDstLength [in]

Количество конвертируемых символов из строки lpszSrc.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Если в Unicode версии функции параметры lpszSrc и lpszDst указывают на один и тот же буфер, функция вернет значение нуль. В этом случае функция GetLastError вернет значение ERROR_INVALID_ADDRESS.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

int main()

{

//Читаем строку в кодировке OEM

char s[100];

fgets(s, 100, stdin);

//Определяем и сохраняем длину введенной строки

size_t size;

size = lstrlen(s);

//Подготавливаем буфер для ANSI строки

char* p;

p = (char*)malloc(size + 1);

//Конвертируем строку

OemToCharBuff(s, p, size);

//Выводим результат конвертирования

MessageBox(NULL, p, "", MB_OK);

//Освобождаем память

free(p);

return 0;

}

Примечание

В отличие от функции OemToChar функция OemToCharBuff не прекращает конвертирование символов когда в строке lpszSrc встречает NULL символ. Функция OemToCharBuff конвертирует все cchDstLength символов.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | OemToCharBuffA и OemToCharBuffW


WideCharToMultiByte

Отображает строку в кодировке UTF-16 (широкие символы) в новую строку символов. Новая строка необязательно состоит из символов многобайтного набора символов.

Внимание. Неправильное использование функции WideCharToMultiByte может нарушить безопасность вашего приложения. Вызов этой функции может првиести к переполнению буфера. Сложность заключается в том, что размер входного буфера lpWideCharStr указывается в символах Unicode, тогда как размер выходного буфера lpMultiByteStr задается в байтах. Для предотвращения переполнения буфера, ваше приложение должно задавать размер буфера в соответствии с типом данных, заносимых в этот буфер.

Конвертирование символов из кодировки UTF-16 в кодировку отличную от Unicode может приводить к потере данных. Это происходит потому, что целевая кодовая страница может быть не в состоянии отобразить все символы, используемые в строке Unicode.

Кодовые страницы ANSI могут различаться на разных компьютерах, или же могут быть изменены на одном компьютере. Это приводит к повреждению данных. Для наибольшей надежности приложения должны использовать Unicode, например UTF-8 или UTF-16, вместо специфичной кодовой страницы. Тем не менее старые стандарты и форматы даных могут не позволять использовать Unicode. Если использование Unicode невозможно, приложение должно тэгировать поток данных соответствующим наименованием кодировки, при условии, что используемый протокол позволяет это делать. Файлы HTML и XML позволяют тэгировать данные, а текстовые файлы - нет.

Прототип

int WideCharToMultiByte(

_In_ UINT CodePage,

_In_ DWORD dwFlags,

_In_ LPCWSTR lpWideCharStr,

_In_ int cchWideChar,

_Out_opt_ LPSTR lpMultiByteStr,

_In_ int cbMultiByte,

_In_opt_ LPCSTR lpDefaultChar,

_Out_opt_ LPBOOL lpUsedDefaultChar

);

Параметры

CodePage [in]

Кодовая страница, используемая при конвертировании. Данный параметр может задавать люую кодовую страницу установленную или доступную в операционной системе. Ваше приложение может использовать одну из констант перечисленных здесь.

dwFlags [in]

Набор флагов, задающих тип конвертирования.Приложение может использовать комбинацию значений, перечисленных здесь. Функция работает максимально быстро когда ни один из этих флагов не установлен. Для получения всех возможных результатов конвертирования приложение должно задать флаги WC_NO_BEST_FIT_CHARS и WC_COMPOSITECHECK с подфлагом WC_DEFAULTCHAR. Если все 3 флага не будут заданы, то некоторые результаты конвертирования будут отсутствовать (some results will be missing).

Для кодовых страниц перечисленных ниже, параметр dwFlags должен равняться нулю. В противном случае функция завершится с ошибкой ERROR_INVALID_FLAGS.

· 50220
· 50221
· 50222
· 50225
· 50227
· 50229
· с 57002 по 57011
· 65000 (UTF-7)
· 42 (Symbol)

Учтите: для кодовой страницы 65001 (UTF-8) и 54936 (GB18030, Windows Vista и новее), значение параметра dwFlags должно быть равно нулю или WC_ERR_INVALID_CHARS. В противном случае функция завершится с ошибкой ERROR_INVALID_FLAGS.

lpWideCharStr [in]

Указатель на конвертируемую строку Unicode.

cchWideChar [in]

Размер, в символах, строки lpWideCharStr. Если строка завершается NULL символом, то данный параметр может быть равен -1. Если значение этого параметра равно нулю, функция завершается ошибкой.

Если значение этого параметра равно -1, функция обработает всю строку, включая завершающий NULL символ. Благодаря этому, результирующая строка уже содержит завершающий NULL символ, и длина, возвращаемая функцией, также учитывает этот символ.

Если параметр cchWideChar содержит положительное целое, функция обработает только заданное количество символов. Если указанный размер не включает в себя NULL символ, то результирующая строка и возвращаемая функцией длина строки также не будут включать завершающий NULL символ.

lpMultiByteStr [out, opt]

Указатель на буфер, в который заносится сконвертированная строка.

cbMultiByte [in]

Размер, в байтах, буфера lpMultiByteStr. Если значение этого параметра равно нулю, функция вернет требуемый размер буфера lpMultiByteStr и не будет использовать это буфер,

lpDefaultChar [in, opt]

Указатель на символ, используемый в том случае, если функция не может отобразить символ исходной строки в заданной кодировке. Если значение этого параметра равно NULL, то функция использует системный символ по умолчанию. Для его получения используйте функцию GetCPInfo или GetCPInfoEx.

Для кодовых страниц CP_UTF7 и CP_UTF8, значение параметра lpDefaultChar должно быть равно NULL. В противном случае функция завершится ошибкой ERROR_INVALID_PARAMETER.

lpUsedDefaultChar [out, opt]

Указатель на флаг, указывающий использовала ли функция при конвертировании строки символ по умолчанию. Данный флаг устанавливается в значение TRUE если один или несколько символов в исходной строке не могут быть отображены в заданной кодовой странице. В противном случае, значение данного флага равно FALSE. Параметр lpUsedDefaultChar может быть равен NULL.

Для кодовых страниц CP_UTF7 и CP_UTF8, значение параметра lpUsedDefaultChar должно быть равно NULL. В противном случае функция завершится ошибкой ERROR_INVALID_PARAMETER.

Возвращаемое значение

Количество байт, записанных в буфер lpMultiByteStr. Если значение параметра cbMultiByte равно нулю, функция возвращает требуемый размер, в байтах, буфера lpMultiByteStr.

Возвращаемое значение в случае ошибки

Если входная последовательность байт/символов недопустима, то для кодировок UTF возвращается значение U+FFFD.

Значение нуль. Для получения дополнительной инфрмации об ошибке используйте функцию GetLastError. Она вернет один из кодов, перечисленных ниже.

· ERROR_INSUFFICIENT_BUFFER - буфер имеет недостаточный размер, или значение указателя на буфер равно NULL.
· ERROR_INVALID_FLAGS - недопустимое значение флагов.
· ERROR_INVALID_PARAMETER - недопустимое значение какого-либо параметра.
· ERROR_NO_UNICODE_TRANSLATION - в строке найден недопустимый Unicode.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Конвертируемая строка

wchar_t us[] = L"Hello, World!";

//Определяем необходимый размер буфера под выходную строку

size_t size = 0;

size = WideCharToMultiByte(CP_ACP, 0, us, -1, NULL, 0, NULL, NULL);

//Подготавливаем буфер

char* s;

s = (char*) malloc(size);

//Конвертируем строку

WideCharToMultiByte(CP_ACP, 0, us, -1, s, size, NULL, NULL);

//Выводим результат конвертирования

MessageBox(NULL, s, "", MB_OK);

//Освобождаем память

free(s);

return 0;

}

В данном примере мы дважды вызываем функцию WideCharToMultiByte: первый раз для определения необходимого размера буфера, второй раз для самого конвертирования.

Примечание

Указатели lpMultiByteStr и lpWideCharStr не должны совпадать. Если же они совпадают, то функция завершается ошибкой, а GetLastError вернет код ERROR_INVALID_PARAMETER.

Если указанный размер входной строки не включает в себя завершающий NULL символ, то и выходная строка на будет завершаться NULL символом. Для предотвращения этого приложение должно указать размер входной строки с учетом завершающего NULL символа, или же передать в функцию значение -1.

Если значение cbMultiByte меньше, чем cchWideChar, то в буфер lpMultiByteStr будет записано cbMultiByte символов.Однако, если значение параметра CodePage равно CP_SYMBOL, и значение cbMultiByte меньше, чем cchWideChar, то функция не запишет в буфер lpMultiByteStr ни одного символа.

Функция работает наиболее эффективно когда оба параметра lpDefaultChar и lpUsedDefaultChar равны NULL. Таблица ниже показыват поведение функции для четырех возможных комбинаций этих параметров.

lpDefaultChar | lpUsedDefaultChar | Результат
NULL | NULL | Проверка не осуществляется. Наиболее эффективно для использования в функции.
не NULL | NULL | Символ по умочланию используется, но флаг lpUsedDefaultChar не устанавливается.
NULL | не NULL | Используется системный символ по умолчанию. Если необходимо устанавливается флаг lpUsedDefaultChar.
не NULL | не NULL | Используется заданный символ по умолчанию и, если необходимо, устанавливается флаг lpUsedDefaultChar.

Начиная с Windows Vista, данная функция полностью соответствует спецификации Unicode 4.1 для кодировок UTF-8 и UTF-16. Функция используемая в более ранних версиях операционной системы кодировала и декодировала отдельные суррогатные половины (surrogate halves) и суррогатные пары (surrogate pairs). Программный код, написанный для ранних версий Windows и использующий данное поведение для кодирования случайных нетекстовых двоичных данных может привести к появлению ошибок. Тем не менее, код использующий данную функцию для создания корректных строк UTF-8, будет работать так же, как и на ранних версиях Windows.

Начиная с Windows 8, функция WideCharToMultiByte объявлена в заголовочном файле Stringapiset.h. До Windows 8 она была объявлена в файле Winnls.h.

Поддерживается в Windows Phone 8.

WC_COMPOSITECHECK и связанные с ним флаги

Unicode разрешает множественные представления одной и той же строки (с лингвистической точки зрения). Например, буква A с диэрезой (dieresis) (умлаутом (umlaut)) может быть представлена как предварительно составленный символ Unicode "A" (U+00C4), или как комбинация буквы A и символа диэрезы ("A" + "¨", то есть U+0041 и U+0308). Большинство кодовых страниц предоставляют только составные (composed) символы.

Флаг WC_COMPOSITECHECK заставляет функцию WideCharToMultiByte проверять разрозненные символы Unicode на возможность их объединения до конвертирования в требуемую кодовую страницу. Этот флаг доступен только при конвертировании в однобайтовые (SBCS) и двухбайтовые (DBCS) кодовые страницы (до 50000, кроме кодовой страницы 42). Если вашему приложению нужно конвертировать разрозненные данные Unicode в однобайтовую или двухбайтовую кодовую страницу, то данный флаг может быть очень полезен. Однако, не все символы могут быть сконвертированы таким образом. Поэтому самым надежным является хранение данных в виде Unicode.

Когда приложение использует флаг WC_COMPOSITECHECK, некоторые комбинации символов могут остаться не полными или же оставлять дополнительные непробельные символы после себя. Например символы A + ¨ + ¨ объединятся в A + ¨. Ипсользование флага WC_DISCARDNS заставляет функцию отбрасывать дополнительные непробельные символы. Использование флага WC_DEFAULTCHAR заставляет функцию использовать вместо них замещающий символ по умолчанию (обычно "?"). Использование флага WC_SEPCHARS заставляет функцию попытаться сконвертировать каждый дополнительный непробельный символ в целевую кодовую страницу. Обычно данный флаг также заставляет использовать замещающий символ ("?"). Однако в кодовой странице 1258 (Вьетнамская) и 20269, непробельные символы существуют и могут быть использованы. Конвертирование для этих кодовых страниц нежелательно. Некоторые комбинации не могут быть корректно сконвертированы в кодовую страницу 1258, также флаг WC_COMPOSITECHECK повреждает данные для кодовой страницы 20269. Как говорилось ранее, наиболее надежно проектировать свое приложение так, чтобы все данные хранились в формате Unicode.

Заголовочный файл | Stringapiset.h (подключен в windows.h)
Экспортирующая библиотека | kernel32.dll


wsprintf

Записывает форматированные данные в заданный буфер. Переданные аргументы конвертируются и копируются в выходной буфер в соответствии с форматом, описанным в форматной строке. Функция завершает созданную строку NULL символом, однако возвращаемое функцией количество символов не включает в себя завершающий NULL символ.

Прототип

int __cdecl wsprintf(

_Out_ LPTSTR lpOut,

_In_ LPCTSTR lpFmt,

_In_ ...

);

Параметры

lpOut [out]

Указатель на буфер, в который заносится форматированный вывод. Максимально допустимый размер буфера составляет 1024 байта.

lpFmt [in]

Спецификация формата (форматная строка). В этой строке дополнительно к выводимым ASCII символам описывается формат каждого выводимого в строку аргумента. Формат подробно описан в примечаниях.

... [in]

Один или несколько дополнительных аргументов. Количество и тип этих параметров зависит от форматной строки lpFmt.

Возвращаемое значение

Количество символов, занесенных в выходной буфер, не включая завершающий NULL символ.

Возвращаемое значение в случае ошибки

Значение меньшее ожидаемого размера вывода. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

int main()

{

char s[100];

//Формируем строку с адресом буфера

wsprintf(s, "%#p", s);

//Выводим сформированную строку

printf("%s", s);

return 0;

}

В данном примере на экран выводится адрес буфера s. В моем случае на экран выводится строка "0X0023FE4C" (у вас оно может быть другим).

Примечание

Неосторожное использование функции может привести к компрометации безопасности вашего приложения. Строка lpOut может не завершаться NULL символом. Также использование формата %s может привести к переполнению буфера. Нарушение доступа может привести к реализации атаки "отказ в обслуживании" (dos) на ваше приложение. В худшем случае, атакующий может получить возможность внедрить исполняемый код.

Форматная строка lpFmt содержит описание формата выводимых аргументов. Описание формата, изложенное ниже, всегда начинается со знака процента (%). Если следом за ним располагается символ, не являющийся форматным полем, то символ не форматируется (например, последовательность %% образует один символ %).

Форматная строка читается слева направо. Когда встречается первое описание формата (если оно есть), функция берет первый аргумент после форматной строки, конвертирует его на основе указанного формата и копирует в выходной буфер. При обнаружении второго описания формата обрабатывается второй аргумент и так далее. Если количество аргументов превышает количество описаний форматов, то дополнительные аргументы игнорируются. Если же количество аргументов недостаточно, то поведение функции неопределено.

Описание формата имеет форму приведенную ниже.

%[-][#][0][width][.precision]type

Каждое поле является отдельным символом или числом, задающим отдельную настройку форматирования. Символы type, располагающиеся после дополнительных полей форматирования определяют то как следует интерпретировать соответствующий аргумент (как символ, строку или число). Самый простой формат состоит только из знака процента и символа типа (например, %s). Дополнительные поля управляют другими настройками форматирования. В таблице ниже перечислены дополнительные и минимально необходимые поля и их назначение.

Поле | Назначение
- | Дополняет вывод справа пустыми символами или нулями, обеспечивая запонение поля по ширине и выравнивая вывод по левому краю. Если это поле опущено, вывод дополняется слева, обеспечивая выравнивание по правому краю.
# | Перед шестнадцатеричными значениями ставятся префиксы 0x (нижний регистр) или 0X (верхний регистр).
0 | Дополняет вывод нулями до достижения необходимой ширины. Если это поле опущено, вывод дополняется пробелами.
width | Копировать в выходной буфер минимально заданное количество символов. Поле width содерджит неотрицательное целое значение. Явное указание ширины никогда не приводит к обрезанию значения. Если количество символов в выводе больше заданной ширины, или если поле width опущено, печатаются все символы выводимого значения с учетом заданной точности.
.precision | Для чисел, копировать в выходной буфер минимально заданное количество цифр. Если количество цифр в аргументе меньше заданного разрешения, выводимое число слева дополняется нулями. Если количество цифр превышает заданное разрешение, то число не обрезается. Если указанное разрешение равно нулю или опущено, или в описании формата присутствует точка (.) без следующего за ней числа, разрешение приравнивается к 1. Для строк, копировать в выходной буфер максимально заданное количество символов.
type | Определяет как следует интерпретировать соответствующий аргумент (как символ, строку или число).

В таблице ниже приводятся допустимые символы типов и их значение.

Символ типа | Интерпретация
c | Отдельный символ. Если приложение использует Unicode значение интерпретируется как значение типа WCHAR, в противном случае как значение типа __wchar_t.
C | Отдельный символ. Если приложение использует Unicode значение интерпретируется как значение типа __wchar_t, в противном случае как значение типа WCHAR.
d | Знаковое десятичное целое. Эквивалентно i.
hc, hC | Отдельный символ. Функция wsprintf игнорирует символьные аргументы, содержащие цифру или нуль. Значение аргумента всегда интерпретируется как значение типа __wchar_t, даже если приложение использует Unicode.
hd | Знаковое короткое целое
hs, hS | Строка. Значение всегда интерпретируется как значение типа LPSTR, даже если приложение использует Unicode.
hu | Беззнаковое короткое целое.
i | Знаковое десятичное целое. Эквивалентно d.
Ic, IC | Отдельный символ. Функция wsprintf игнорирует символьные аргументы, содержащие цифру или нуль. Значение аргумента всегда интерпретируется как значение типа WCHAR, даже если приложение не использует Unicode.
Id | Длинное знаковое целое. Эквивалентно Ii.
Ii | Длинное знаковое целое. Эквивалентно Id.
ls, lS | Строка. Значение аргумента всегда интерпретируется как значение типа LPWSTR, даже если приложение не использует Unicode. Эквивалентно ws.
lu | Длинное беззнаковое целое.
lx, lX | Длинное беззнаковое шестнадцатеричное целое в верхнем или нижнем регистре.
p | Указатель. Адрес печатается в шестнадцатеричной системе счисления.
s | Строка. Если приложение использует Unicode, то значение аргумента интерпретируется как значение типа LPWSTR. Если же приложение не использует Unicode, то значение интерпретируется как значение типа LPSTR.
S | Строка. Если приложение использует Unicode, то значение аргумента интерпретируется как значение типа LPSTR. Если же оно не использует Unicode, то значение аргшумента интерпретируется как значение типа LPWSTR.
u | Беззнаковое целое
x, X | Беззнаковое шестнадцатеричное целое в нижнем или верхнем регистре.

Важно помнить, что функция wsprintf использует соглашение _cdecl (соглашение языка C), а не _stdcall (стандартное соглашение о вызове). В соответствии с этим в обязанности вызывающего кода входит извлечение переданных аргументов из стека и помещение их в стек справа налево. В модулях языка C данную задачу выполняет компилятор.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | wsprintfA и wsprintfW


ABC

Содержит ширину символов шрифта TrueType.

Прототип

typedef struct _ABC {

int abcA;

UINT abcB;

int abcC;

} ABC, *PABC;

Поля структуры

abcA

A расстояние символа. Это расстояние добавляется к текущему положению перед отрисовыванием символа.

abcB

B расстояние символа. Это ширина отрисовываемой части символа.

abcC

C расстояние символа. Это расстояние добавляется к текущему положению, обеспечивая свободное пространство справо от отрисовываемого символа.

Примечание

Общая ширина символа равна сумме расстояний A, B и C. Расстояния A и C могут быть отрицательными. Это говорит о наличии в символе свисаний или выступов (underhangs or overhangs).

Заголовочный файл: wingdi.h (включен в windows.h)


ABCFLOAT

Содержит расстояния A, B и C для символа шрифта.

Прототип

typedef struct _ABCFLOAT {

FLOAT abcfA;

FLOAT abcfB;

FLOAT abcfC;

} ABCFLOAT, *PABCFLOAT;

Поля структуры

abcfA

A расстояние символа. Это расстояние, добавляемое к текущему положению перед отрисовкой символа.

abcfB

B расстояние символа. Это ширина отрисовываемой части символа.

abcfC

C расстояние символа. Это расстояние, добавляемое к текущему положению справа от отрисованного символа.

Примечание

Расстояния A, B и C отсчитываются вдоль базовой линии шрифта.

Общая ширина символа равна сумме расстояний A, B и C. Расстояния A и C могут быть отрицательными. Это говорит о наличии в символе свисаний или выступов (underhangs or overhangs).

Заголовочный файл: wingdi.h (включен в windows.h)


ACCESSTIMEOUT

Содержит информацию о периоде ожидания (time-out period) настроек доступа Microsoft Win32 (Microsoft Win32 accessibility features).

Период ожидания доступности - это длительность промежутка времени, который должен истечь во время клавиатурного ввода или ввода от мыши перед тем как операционная система автоматически выключает настройки доступа (turns off accessibility features). Это интервал создан для компьютеров, которые доступны для нескольких пользователей. В них настройки, выбранные одним пользователем неудобны для другого пользователя.

Настройки доступа, изменяются по таймауту, устанавливаемому настройками фильтрации клавиш (FilterKey features) (медленные клавишы (SlowKeys), упругие клавишы (BounceKeys) и повторяющиеся клавишы (RepeatKeys)), кнопок мыши (MouseKeys), клавиш переключателей (ToggleKeys) и залипающих клавиш (StickyKeys). Таймаут доступа также влияет на настройку контрастности (contrast mode setting).

Прототип

typedef struct tagACCESSTIMEOUT {

UINT cbSize;

DWORD dwFlags;

DWORD iTimeOutMSec;

} ACCESSTIMEOUT, *LPACCESSTIMEOUT;

Поля структуры

cbSize

Размер структуры в байтах.

dwFlags

Набор флагов, которые определяют поведение таймаута. Допустимые флаги перечислены ниже.

ATF_ONOFFFEEDBACK - еси этот флаг установлен, то операционная система по истечении таймаута воспроизводит нисходящий звуковой сигнал (descending siren sound) и отключает настройки доступа.

ATF_TIMEON - если это флаг установолен то для настроек доступа был установлен таймаут. Если этот флаг не установлен, то настройки игнорируют тайм-аут даже если он явно задан.

iTimeOutMSec

Длительность таймаута в миллисекундах.

Примечание

Используйте структуру ACCESTIMEOUT при вызове функции SystemParametersInfo с параметром uiAction равным SPI_GEACCESSTIMEOUT или SPI_SETACCESSTIMEOUT. При использовании значения SPI_GETACCESSTIMEOUT вы должны задать значение поля cbSize структуры ACCESSTIMEOUT. Функция SystemParanetersInfo заполнит все остаальные поля. Задавайте все поля этой структуры когда используете значение SPI_SETACCESSTIMEOUT.

Заголовочный файл: winuser.h (включен в windows.h)


ANIMATIONINFO

Описывает эффекты анимации, связанные с действиями пользователя. Данная структура используется в функции SystemParametersInfo с параметрами SPI_GETANIMATION и SPI_SETANIMATION.

Прототип

typedef struct tagANIMATIONINFO {

UINT cbSize;

int iMinAnimate;

} ANIMATIONINFO, *LPANIMATIONINFO;

Поля структуры

cbSize

Размер структуры в байтах. Использующий данную структуру поток должен записать в это поле значение sizeof(ANIMATIONINFO).

iMinAnimate

Если значение этого поля отлично от нуля, то анимация сворачивания (minimize) и восстановления (restore) включена. В противном случае она выключена.

Заголовочный файл: winuser.h (включен в windows.h)


AUDIODESCRIPTION

Содержит информацию, ассоциированную с аудио описаниями (audio desciptions). Данная структура используется в функции SystemParametersInfo, в которой определены значение SPI_GETAUDIODESCRIPTION или SPI_SETAUDIODESCRIPTION.

Прототип

typedef struct tagAUDIODESCRIPTION {

UINT cbSize;

BOOL Enabled;

LCID Locale;

} AUDIODESCRIPTION, *LPAUDIODESCRIPTION;

Поля структуры

cbSize

Размер структуры в байтах. Вызывающий поток должен устанавливать значение этого поля следующим значением: sizeof(AUDIODESCRIPTION).

Enabled

Если значение этого поля равно TRUE, аудио описания доступны. В противном случае (если они не доступны), его значение равно FALSE.

Locale

Идентификатор локали (locale identifier - LCID) языка аудио описания.

Примечание

Чтобы скомпилировать приложение, использующее эту структуру определите _WIN32_WINNT как значение 0x0600 или выше.

Заголовочный файл: winuser.h (включен в windows.h)


AXESLIST

Содержит информацию обо всех осях ММ-шрифта (axes of a multiple master font).

Прототип

typedef struct tagAXESLIST {

DWORD axlReserved;

DWORD axlNumAxes;

AXISINFO axlAxisInfo[MM_MAX_NUMAXES];

} AXESLIST, *PAXESLIST;

Поля структуры

axlReserved

Зарезервировано. Должно содержать значение STAMP_AXESLIST.

axlNumAxes

Количество осей для заданного ММ-шрифта.

axlAxisInfo

Массив структур AXISINFO. Каждая структура AXISINFO содержит информацию об оси заданного ММ-шрифта. Данное поле аналогично полю dvValues структуры DESIGNVECTOR.

Примечание

Шрифт PostScript Open Type не поддерживает функциональность группового фотошаблона (multiple master functionality).

Информация об осях ММ-шрифта хранится в виде структур AXISINFO. Поле axlNumAxes задает фактический размер массива axlAxisInfo. Константа MM_MAX_NUMAXES, равная 16, задает максимально доступный размер массива axlAxisInfo.

Заголовочный файл: wingdi.h (включен в windows.h)


AXISINFO

Содержит информацию об оси ММ-шрифта (axis of a multiple master font).

Прототип

typedef struct tagAXISINFO {

LONG axMinValue;

LONG axMaxValue;

TCHAR axAxisName[MM_MAX_AXES_NAMELEN];

} AXISINFO, *PAXISINFO;

Поля структуры

axMinValue

Минимальное значение для оси.

axMaxValue

Максимальное значение для оси.

axAxisName

Наименование оси, заданное в виде массива символов.

Примечание

Структура содержит наименование оси в ММ-шрифте, а также минимальное и максимальное допустимые значения для оси. Длина аименования задается константой MM_MAX_AXES_NAMELEN, равной 16. Приложение запрашивает эти значения перед установкой желательных значений в массиве DESIGNVECTOR.

Шрифт PostSript Open Type не поддерживает функциональность группового фотошаблона (multiple master functionality).

В ANSI версии структуры AXISINFO поле axAxisName должно содержать массив байтов.

Заголовочный файл: wingdi.h (включен в windows.h)


BITMAP

Описывает тип, ширину, высоту, цветовой формат и биты растрового изображения (bitmap).

Прототип

typedef struct tagBITMAP {

LONG bmType;

LONG bmWidth;

LONG bmHeight;

LONG bmWidthBytes;

WORD bmPlanes;

WORD bmBitsPixel;

LPVOID bmBits;

} BITMAP, *PBITMAP;

Поля структуры

bmType

Тип растрового изображения. Значение данного поля должно быть равно нулю.

bmWidth

Ширина растрового изображения в пикселях. Значение этого поля должно быть больше нуля.

bmHeight

Высота растрового изображения в пикселях. Значение этого поля должно быть больше нуля.

bmWidthBytes

Количество байт в каждой строке (scan line). Значение этого поля должно быть кратно 2, так как система предполагает, что биты растрового изображения образуют массив выровненный по слову.

bmPlanes

Количество цветовых плоскостей.

bmBitsPixel

Количество бит, необходимых для задания цвета пикселя.

bmBits

Указатель на биты растрового изображения. Данное поле должно содержать указатель на массив однобайтовых символов.

Примечание

Растровые изображения могут быть монохромными или цветными. Монохромные изображения используют однобитный формат с одной плоскостью. Каждая строка кратна (is multiple) 16 битам.

Строки организованы так, как показано ниже для монохромного изображения высотой n.

Строка 0

Строка 1

...

Строка n-2

Строка n-1

Пиксели монохромного устройства могут быть белыми или черными. Если соответствующий бит растрового изображения равен 1, то пиксель имеет цвет переднего плана (foreground color); если же соответствующий бит равен нулю, то пиксель имеет цвет фона (background color).

Все устройства, имеющие способность RC_BITBLT, поддерживают растровые изображения. Более подробно смотрите в описании функции GetDeviceCaps.

Каждое устройство имеет уникальный формат цвета. Для переноса растрового изображения с одного устройства на другое используйте функции GetDIBits и SetDIBits.

Заголовочный файл: wingdi.h (включен в windows.h)


BITMAPCOREHEADER

Содержит информацию о размерах и цветовом формате независящего от устройства растрового изображения (Device Independent Bitmap - DIB).

Прототип

typedef struct tagBITMAPCOREHEADER {

DWORD bcSize;

WORD bcWidth;

WORD bcHeight;

WORD bcPlanes;

WORD bcBitCount;

} BITMAPCOREHEADER, *PBITMAPCOREHEADER;

Поля структуры

bcSize

Размер структуры в байтах.

bcWidth

Ширина растрового изображения, в пикселях.

bcHeight

Высота растрового изображения, в пикселях.

bcPlanes

Количество плоскостей для целевого устройства. Значение этого поля должно быть равно 1.

bcBitCount

Количество бит в одном пикселе. Допустимые значения этого поля: 1, 4, 8 и 24.

Примечание

Структура BITMAPCOREINFO объединяет структуру BITMAPCOREHEADER и цветовую таблицу, давая тем самым полное описание размеров и цветов DIB.

Для определения положения цветовой таблицы в структуре BITMAPCOREINFO приложения должны использовать информацию, хранящуюся в поле bcSize, так, как показано ниже.

pColor = ((LPBYTE) pBitmapCoreInfo +

(WORD) (pBitmapCoreInfo -> bcSize))

Заголовочный файл: wingdi.h (включен в windows.h)


BITMAPCOREINFO

Описывает размеры и цвета независящего от устройства растрового изображения (Device Independent Bitmap - DIB).

Прототип

typedef struct _BITMAPCOREINFO {

BITMAPCOREHEADER bmciHeader;

RGBTRIPLE bmciColors[1];

} BITMAPCOREINFO, *PBITMAPCOREINFO;

Поля структуры

bmciHeader

Структура BITMAPCOREHEADER, содержащая информацию о размерах и цветовом формате DIB.

bmciColors

Массив структур RGBTRIPLE, описывающих цвета в растровом изображении.

Примечание

DIB состоит из двух частей: структуры BITMAPCOREINFO, описывающей размеры и цвета растрового изображения, и массива байт, задающих пиксели растрового изображения. Биты в массиве упакованы, но каждая строка (scan line) должна быть дополнена нулями до границы длинного целого (LONG). "Началом" (origin) растрового изображения является его левый нижний угол.

Поле bcBitCounter структуры BITMAPCOREHEADER задает количество бит, описывающих каждый пиксель и максимальное количество цветов в растровом изображении. Допустимые значения этого поля перечислены в таблице ниже.

Значение | Описание
1 | Растровое изображение является двуцветным, массив bmciColors содержит два элемента. Каждый бит в массиве растрового изображения описывает пиксель. Если бит сброшен, пиксель имеет цвет первого элемента в таблице bmciColors. Если же бит установлен, пиксель имеет цвет второго элемента таблицы.
4 | Растровое изображение имеет максимум 16 цветов, массив bmciColors содержит 16 элементов. Каждый пиксель представляется в виде 4-битного индекса в таблице цветов. Каждый байт описывает два пикселя. Например, если первый байт растрового изображения равен 0x1F, то первый пиксель имеет цвет второго элемента таблицы; а второй пиксель - цвет шестнадцатого элемента таблицы.
8 | Растровое изображение имеет максимум 256 цветов, массив bmciColors содержит 256 элементов. Каждый байт описывает отдельный пиксель.
24 | Растровое изобрадение имеет максимум 2^24 цветов, значение поля bmciColors равно NULL. Каждая группа из трех байт в массиве растрового изображения описывает относительную интенсивность синего, зеленого и красного цветов для каждого пикселя.

Цвета в таблице bmciColors должны появляться в порядке их важности.

Также, для функций, использующих DIB, поле bmciColors может содержать массив 16-разрядных целых, задающих индексы цветов в текущей логической палитре. В этом случае приложение должно вызывать функции, работающие с DIB (CreateDIBitmap, CreateDIBPatternBrush и CreateDIBSection) с параметром iUsage равным DIB_PAL_COLORS.

Помните, что массив bmciColors не должен содержать индексы в палитре, если растровое изображение сохраняется в файл или передается в другое приложение. Во всех случаях когда приложение не является единственным и исключительным пользователем растрового изображения, его цветовая таблица должна содержать непосредственные значения цветов в формате RGB.

Заголовочный файл: wingdi.h (включен в windows.h)


BITMAPFILEHEADER

Содержит информацию о типе, размере и схеме (layout) файла, содержащего DIB.

Прототип

typedef struct tagBITMAPFILEHEADER {

WORD bfType;

DWORD bfSize;

WORD bfReserved1;

WORD bfReserved2;

DWORD bfOffBits;

} BITMAPFILEHEADER, *PBITMAPFILEHEADER;

Поля структуры

bfType

Тип файла. Должен быть равен "BM".

bfSize

Размер файла в байтах.

bfReserved1

Зарезервировано. Должно быть равно нулю.

bfReserved2

Зарезервировано. Должно быть равно нулю.

bfOffBits

Смещение битов изображения от начала файла, в байтах.

Примечание

Сразу за структурой BITMAPFILEHEADER в файле DIB располагается структура BITMAPINFO или BITMAPCOREINFO.

Заголовочный файл: wingdi.h (включен в windows.h)


BITMAPINFO

Описывает размеры и цветовую информацию о растровом независимом от устройства изображении, (Device-Independent Bitmap, DIB).

Прототип

typedef struct tagBITMAPINFO {

BITMAPINFOHEADER bmiHeader;

RGBQUAD bmiColors[1];

} BITMAPINFO, *PBITMAPINFO;

Поля структуры

bmiHeader

Структура BITMAPINFOHEADER, которая содержит информацию о разрешении цветового формата.

bmiColors

Содержит что-то одно из нижеследующего.

· Массив структур RGBQUAD. Элементы массива составляют таблицу цветов.
· Массив 16-битных беззнаковых целых, которые определяют индексы в текущей реализованной логической палитре.Её использование разрешено для функций, работающих с DIB. Когда элементы bmiColors содержат индексы в реализованной логической палитре, они также должный вызывать следующие функции: CreateDIBitmap, CreateDIBPatternBrush, CreateDIBSection. Параметр iUsage функции CreateDIBSection должен быть равен DIB_PAL_COLORS.

Количесвто элементов в массиве зависит от значения полей biBitCount и biClrUsed в структуре BITMAPINFOHEADER.

Цвета в таблице bmiColors появляются в порядке их важности.

Примечание

DIB состоит из двух частей: структуры BITMAPINFO, описывающей разрешения и цвета растрового изображения, и массива байт, описывающих пиксели растрового изоюражения. Биты упакованы в одном массиве, но каждая группа бит дополняется нулями до достижения границы типа данных.

Если высота растрового изображения положительна, то изображение "растёт" из левого нижнего угла. Если высота растрового изображения отрицательна, то изображение "растёт" из левого верхнего угла.

Растровое изображение является упакованным когда массив следует сразу после заголовка BITMAPINFO. Пожтому начало этого массива должно быть выровнено по границе DWORD.

Поле bmiColors не должно содержать индексы палитры если растровое изображение сохраняется в файл или передаётся в другое приложение.

Если приложение не является единоличным владельцем растрового изображения, то таблица цветов должна содержать явные значения RGB.

Заголовочный файл: wingdi.h (включен в windows.h)


BITMAPINFOHEADER

Содержит информацию о размерах и цветовом формате растрового изображения, не зависящего от устройства (Device-Independent Bitmap - DIB).

Прототип

typedef struct tagBITMAPINFOHEADER {

DWORD biSize;

LONG biWidth;

LONG biHeight;

WORD biPlanes;

WORD biBitCount;

DWORD biCompression;

DWORD biSizeImage;

LONG biXPelsPerMeter;

LONG biYPelsPerMeter;

DWORD biClrUsed;

DWORD biClrImportant;

} BITMAPINFOHEADER, *PBITMAPINFOHEADER;

Поля структуры

biSize

Размер структуры в байтах.

biWidth

Ширина растрового изображения в пикселях.

Если значение поля biCompression равно BI_JPEG или BI_PNG, то поле biWidth содержит ширину распакованного JPEG или PNG изображения.

biHeight

Высота изображения в пикселях. Если значение biHeight положительно, то изображение строится из левого нижнего угла. Если же значение biHeight отрицательно, то изображение строится из левого верхнего угла.

Если biHeight отрицателен, то поле biCompression должно быть равно BI_RGB или BI_BITFIELDS. Изображения с отрицательным biHeight не могут быть сжатыми.

Если значение поля biCompression равно BI_JPEG или BI_PNG, то поле biHeight содержит высоту распакованного JPEG или PNG изображения.

biPlanes

Число плоскостей (planes) целевого устройства. Это значение должно быть равно единице.

biBitCount

Количесто бит на пиксель. Это поле задаёт число бит, описывающих каждый пиксель и максимальное количество цветов в растровом изображении. Это поле принимает одно из перечисленных ниже значений.

0 - число бит на пискель задаётся отдельно или подразумевается при использовании JPEG или PNG формата.

1 - изображение монохромное и поле bmiColors структуры BITMAPINFO содержит два элемента. Каждый бит в массиве описывает пиксель. Если бит сброшен, то пиксель отображается с цветом, соответствующем первому элементу в таблице bmiColors. Если бит установлен, то пиксель имеет цвет, соответствующий второму элементу в таблице bmiColors.

4 - изображение имеет максимум 16 цветов, и поле bmiColors структуры BITMAPINFO содержит 16 элементов. Каждый пиксель изображения представляется 4-битным индексом в таблице цветов. Например, если первый байт в битовой карте (bitmap) равен 0x1F, то этот байт описывает два пикселя. Первый пиксель имеет цвет, соответствующий второму элементу таблицы цветов. Второй пиксель имеет цвет, соответствующий 16-ому элементу таблицы цветов.

8 - изображение имеет максимум 256 цветов, и поле bmiColors структуры BITMAPINFO содержит 256 элементов. В этом случае каждый байт в массиве описывает отдельный пиксель.

16 - изображение имеет максимум 2^16 цветов. Если поле biCompression структуры BITMAPINFOHEADER содержит значение BI_RGB, то значение поля bmiColors структуры BITMAPINFO равно NULL. Каждое слово (WORD) в массиве представляет собой пиксель.Относительные интенсивности красного, зелёного и синего цветов представляются с помощью пяти бит для каждой компоненты цвета. Значение для синего цвета хранится в младших пяти битах, за ними идёт по пять бит для зелёного и красного цветов. Старший значащий бит не используется.

Цветовая таблица bmiColors используется для оптимизации использования цветов на устройствах основанных на палитре (palette-based devices) и должно содержать количество элементов, определённое в поле biClrUsed структуры BITMAPINFOHEADER.

Если поле biCompression структуры BITMAPINFOHEADER содержит значение BI_BITFIELDS, то поле bmiColors содержит три цветовых маски, размером в двойное слово (DWORD), которые описывают компоненты красного, зеленого и синего цветов, соответствено, для каждого пикселя. Каждое слово (WORD) в массиве битовой карты (bitmap) описывает отдельный пиксель.

Когда значение поля biCompression равно BI_BITFIELDS, биты установленные в каждой DWORD маске должны быть непрерывными и не должны пересекаться с установленными битами другой маски. В пикселе могут использоваться не все биты.

24 - изображение имеет максимум 2^24 цветов, и значение поля bmiColors структуры BITMAPINFO равно NULL. Каждые три байта в массиве представляют относительные интенсивности синего, зеленого и красного цветов соотвественно, для каждого пикселя. Таблица цветов bmiColors используется для оптимизации использования цветов на устройствах основанных на палитре (palette-based devices) и должно содержать количество элементов, определённое в поле biClrUsed структуры BITMAPINFOHEADER.

32 - изображение имеет максимум 2^32 цветов. Если значение поля biCompression структуры BITMAPINFOHEADER равно BI_RGB, то значение поля bmiColors структуры BITMAPINFO равно NULL. Каждое двойное слово (DWORD) в массиве описывает относительные интенсивности синего, зелёного и красного цветов для пикселя. Значение для синего цвета хранится в младших 8 битах, за ними следуют по 8 бит для зелёного и красного цветов. Старший байт в каждом двойном слове (DWORD) не используется. Таблица цветов bmiColors используется для оптимизации использования цветов на устройствах основанных на палитре (palette-based devices) и должно содержать количество элементов, определённое в поле biClrUsed структуры BITMAPINFOHEADER.

Если значение поля biCompression равно BI_BITFIELDS, то поле bmiColors содержит три цветовых маски размером в двойное слово (DWORD) каждая, которые описывают компоненты красного, зеленого и синего цветов, соответственно, для каждого пикселя. Каждое двойное слово (DWORD) в массиве описывает отдельный пиксель.

Когда значение поля biCompression равно BI_BITFIELDS биты установленные в каждой маске должны быть непрерывными и не пересекаться с установленными битами в другой маске. В пикселе могут использоваться не все биты.

biCompression

Тип сжатия для сжатого растрового изображения. Допустимые значения этого поля перечислены здесь.

biSizeImage

Размер изображения в байтах. Для изображения BI_RGB значение данного поля должно равняться нулю.

Если значение поля biCompression равно BI_JPEG или BI_PNG, то поле biSizeImage содержит размер буфера JPEG или PNG изображения.

biXPelsPerMeter

Желательное для изображения горизонтальное разрешение в пикселях на метр целевого устройства. Приложение может использовать это поле для выбора из ресурсов растрового изображения наилучшим образом соответствующего характеристикам текущего устройства.

biYPelsPerMeter

Желательное для изображения вертикальное разрешение в пикселях на метр целевого устройства.

biClrUsed

Количество индексов цветов в таблице цветов, которые фактически используются в растровом изображении. Если значение этого поля равно нулю, то изображение использует максимальное количество цветов, соответствующее значению поля biBitCount для режима сжатия указанного в поле biCompression.

Если значение поля biClrUsed отлично от нуля и значение поля biBitCount меньше 16, то поле biClrUsed содержит фактическое количество доступных цветов. Если значение поля biBitCount 16 или больше, то biClrUsed определяет размер таблицы цветов, используемой для оптимизации работы системных палитр цветов. Если значение biBitCount равно 16 или 32, то оптимальная палитра цветов запускается сразу же после указания трех DWORD масок.

Изображение, в котором массив идет сразу за структурой BITMAPINFO, является упакованным изображением. Упакованные изображения требуют чтобы значение поля biClrUsed было равно нулю или фактическому значению размера таблицы цветов.

biClrImportant

Количество индексов цветов, которое необходимо для отображения растрового изображения. Если значение этого поля равно нулю, то требуются все цвета.

Примечание

Структура BITMAPINFO объединяет структуру BITMAPINFOHEADER и таблицу цветов для предоставления полного описания размеров и цветов растрового изображения, не зависящего от устройства (DIB).

Заголовочный файл: wingdi.h (включен в windows.h)


BITMAPV4HEADER

Данная структура является информационным заголовочным файлом растрового изображения, расширенным вариантом структуры BITMAPINFOHEADER.

Для получения дополнительной функциональности приложения могут использовать структуру BITMAPV5HEADER.

Прототип

typedef struct {

DWORD bV4Size;

LONG bV4Width;

LONG bV4Height;

WORD bV4Planes;

WORD bV4BitCount;

DWORD bV4V4Compression;

DWORD bV4SizeImage;

LONG bV4XPelsPerMeter;

LONG bV4YPelsPerMeter;

DWORD bV4ClrUsed;

DWORD bV4ClrImportant;

DWORD bV4RedMask;

DWORD bV4GreenMask;

DWORD bV4BlueMask;

DWORD bV4AlphaMask;

DWORD bV4CSType;

CIEXYZTRIPLE bV4Endpoints;

DWORD bV4GammaRed;

DWORD bV4GammaGreen;

DWORD bV4GammaBlue;

} BITMAPV4HEADER, *PBITMAPV4HEADER;

Поля структуры

bV4Size

Размер структуры в байтах. Приложения должны использовать это поле для определения типа используемой структуры.

bV4Width

Ширина изображения в пикселях.

Если поле bV4V4Compression содержит значение BI_JPEG или BI_PNG, то поле bV4Width задает ширину JPEG или PNG изображения в пикселях.

bV4Height

Высота изображения в пикселях. Если значение bV4Height больше нуля, то изображение является DIB, ориентированным снизу вверх. Его начало расположено в левом нижнем углу. Если же значение bV4Height меньше нуля, то изображение является DIB, ориентированным сверху вниз. Его начало расположено в левом верхнем углу.

Если bV4Height меньше нуля (DIB, ориентированное сверху вниз), то поле bV4V4Compression должно содержать значение BI_RGB или BI_BITFIELDS. Изображения ориентированные сверху вниз не могут быть сжатыми.

Если же поле bV4V4Compression содержит значение BI_JPEG или BI_PNG, то поле bV4Height задает высоту JPEG или PNG изображения в пикселях.

bV4Planes

Количество плоскостей (;planes) целевого устройства. Значение этого поля должно быть равно единице.

bV4BitCount

Количество бит в одном пикселе. Данное поле определяет количество бит, описывающих 1 пиксель и максимальное количество цветов в изображении. Допустимые значения этого поля перечислены ниже.

0 - количество бит задается форматом JPEG или PNG файла.

1 - изображение является монохромным, и поле bmiColors структуры BITMAPINFO содержит всего два элемента. Каждый бит в массиве описывает отдельный пиксель. Если бит сброшен, пиксель имеет цвет первого элемента таблицы bmiColors; если же бит установлен, то пиксель имеет цвет второго элемента таблицы.

4 - изображение имеет максимум 16 цветов, а поле bmiColors структуры BITMAPINFO содержит 16 элементов. Каждый пиксель изображения представлен в виде 4-битного индекса в таблице цветов. Каждый байт изображения, описывает 2 пикселя. Например, если байт равен 0x1F, то первый пиксель имеет цвет второго элемента таблицы, а второй пиксель имеет цвет 16 элемента.

8 - изображение имеет максимум 256 цветов, а поле bmiColors содердит 256 элементов. В этом случае каждый байт в массиве описывает отдельный пиксель.

16 - изображение меет максимум 2^16 цветов. Если поле bV4V4Compression структуры BITMAPV4HEADER имеет значение BI_RGB, то значение поля bmiColors структуры BITMAPINFO равно NULL, Каждое слово (WORD) в массиве изображения представляет отдельный пиксель. Относительные интенсивности кпасного, зеленого и синего цветов представляются 5 битами для каждой компоненты цвета. Значение для синего цвета располагается в 5 младших значащих битах, сразу за которыми располагаются значения для зеленого и красного цветов соотвественно. Старший значащий бит не используется. Таблица цветов bmiColors используется для оптимизации цветов при работе на устройствах, основанных на палитре, и должна содержать bV4ClrUsed элементов.

Если значение поля bV4V4Compression равно BI_BITFIELDS, то поле bmiColors содержит три цветовых маски размером в двойное слово (DWORD), которые задают компоненты красного, зеленого и синего цветов каждого пикселя. Каждое слово (WORD) в массиве описывает отдельный пиксель.

24 - изображение имеет максимум 2^24 цветов, значение поля bmiColors структуры BITMAPINFO равно NULL. Кажжые три байта в массиве задают относительную интенсивность синего, зеленого и красного цветов в пикселе. Таблица bmiColors используется для оптимизации цветов устройствах, основанных на палитре, и должна содержать bV4ClrUsed элементов.

32 - изображение имеет максимум 2^32 цетов. Если поле bV4V4Compression содержит значение BI_RGB, то значение поля bmiColors структуры BITMAPINFO равно NULL. Каждое двойное слово (DWORD) в массиве описывает относительую интенсивность синего, зеленого и красного цветов в пикселе. Значение интенсивности синего цвета задается в младших 8 битах, следом за котороми идут по 8 бит для зеленого и красного цветов. Старший байт в каждом двойном слове не используется. Таблица цветов bmiColors используется для оптимизации цветов на устройствах, основанных на палитре. Она должна содержать bV4ClrUsed элементов.

Если значение поля bV4V4Compression равно BI_BITFIELDS, то поле bmiColors содержит три маски размером в двойное слово (DWORD), задающих компоненты красного, зеленого и синего цветов для каждого пикселя. Каждое двойное слово (DWORD) в массиве задает отдельный пиксель.

bV4V4Compression

Тип сжатия ихображения, ориентированного снизу вверх (DIB, ориентированные сверху вниз не могут быть сжатыми). Допустиме значения этого поля перечислены здесь.

bV4SizeImage

Размер изображения в байтах. Для изображений BI_RGB он может быть равен нулю.

Если значение поля bV4V4Compression равно BI_JPEG или BI_PNG, то поле bV4SizeImage задает размер буфера под JPEG или PNG изображение.

bV4XPelsPerMeter

Горизонтальное разрешение целевого устройства в пикселях на метр. Приложение может использовать это значение для выбора того изображения, которое лучше всего соответствует характеристикам текущего устройства.

bV4YPelsPerMeter

Вертикальное разрешение целевого устройства в пикселях на метр.

bV4ClrUsed

Количество цветов в таблице, которые фактически используются в растровом изображении. Если значение этого поля равно нулю, то изображение использует все цвета, задаваемые полем bV4BitCount для режима сжатия bV4V4Compression.

Если значения поля bV4ClrUsed отлично от нуля и значение bV4BitCount меньше 16, то поле bV4ClrUsed задает фактическое количество цветов поддерживаемых графическим устройством и его драйвером. Если значение поля bV4BitCount равно 16 или более, то поле bV4ClrUsed залает размер таблицы цветов, используемой для повышения производительности системных палитр. Если значение поля bV4BitCount равно 16 или 32, то оптимальная цветовая палитра начинается сразу за структурой BITMAPV4HEADER.

bV4ClrImportant

Количество цветов, необходимых для отображения изображения. Если значение этого поля равно нулю, то для его отображения нужны все цвета.

bV4RedMask

Цветовая маска, задающая красную компоненту каждого пикселя. Допустима только если значение поля bV4V4Compression равно BI_BITFIELDS.

bV4GreenMask

Цветовая маска, задающая зеленую компоненту каждого пикселя. Допустима только если значение поля bV4V4Compression равно BI_BITFIELDS.

bV4BlueMask

Цветовая маска, задающая синюю компоненту каждого пикселя. Допустима только если значение поля bV4V4Compression равно BI_BITFIELDS.

bV4AlphaMask

Цветовая маска, задающая компоненту альфа канала для каждого пикселя.

bV4CSType

Пространство цветов DIB. Допустимые значения этого поля перечислены ниже.

LCS_CALIBRATED_RGB - значения цветов и гамма значения приведены в соответствующих полях.

bV4Endpoints

Структура CIEXYZTRIPLE, которая задает координаты (x, y и z) трех цветов (красного, зеленого и синего) в логическом пространстве цветов, ассоциированном с растровым изображением. Данное поле игнорируется если значение поля bV4CSType отлично от LCS_CALIBRATED_RGB.

Учтите, что пространство цветов это модель численного представления цветов в терминах трех или более координат. Например, пространство RGB представляет каждый цвет в терминах трех координат: красной, зеленой и синей компонент.

bV4GammaRed

Характеристика чувствительности для красного цвета. Данное поле игнорируется если цвета не являются откалиброванными значениями в формате RGB, а значение поля bV4CSType отлично от LCS_CALIBRATED_RGB, Значение задается в беззнаковом формате 16.16. Старшие 16 бит задают беззнаковое целое значение. Младшие 16 бит задают дробную часть.

bV4GammaGreen

Характеристика чувствительности для зеленого цвета. Данное поле используется только если значение поля bV4CSType равно LCS_CALIBRATED_RGB, Значение задается в беззнаковом формате 16.16. Старшие 16 бит задают беззнаковое целое значение. Младшие 16 бит задают дробную часть.

bV4GammaBlue

Характеристика чувствительности для синего цвета. Данное поле используется только если значение поля bV4CSType равно LCS_CALIBRATED_RGB, Значение задается в беззнаковом формате 16.16. Старшие 16 бит задают беззнаковое целое значение. Младшие 16 бит задают дробную часть.

Примечание

Структура BITMAPV4HEADER позволяет передавать в функцию StretchDIBits JPEG и PNG изображения.

Заголовочный файл: wingdi.h (включен в windows.h)


BITMAPV5HEADER

Данная структура является заголовочным файлом, содержащим информацию о растровом изображении. Это расширенная версия структуры BITMAPINFOHEADER.

Прототип

typedef struct {

DWORD bV5Size;

LONG bV5Width;

LONG bV5Height;

WORD bV5Planes;

WORD bV5BitCount;

DWORD bV5Compression;

DWORD bV5SizeImage;

LONG bV5XPelsPerMeter;

LONG bV5YPelsPerMeter;

DWORD bV5ClrUsed;

DWORD bV5ClrImportant;

DWORD bV5RedMask;

DWORD bV5GreenMask;

DWORD bV5BlueMask;

DWORD bV5AlphaMask;

DWORD bV5CSType;

CIEXYZTRIPLE bV5Endpoints;

DWORD bV5GammaRed;

DWORD bV5GammaGreen;

DWORD bV5GammaBlue;

DWORD bV5Intent;

DWORD bV5ProfileData;

DWORD bV5ProfileSize;

DWORD bV5Reserved;

} BITMAPV5HEADER, *PBITMAPV5HEADER;

Поля структуры

bV5Size

Размер структуры в байтах. Приложения должны использовать это поле для определения того какая структура описывает информацию о растровом изображении.

bV5Width

Ширина изображения в пикселях.

Если значение поля bV5Compression равно BI_JPEG или BI_PNG, то поле bV5Width содержит ширину распакованного JPEG или PNG изображения.

bV5Height

Высота изображения в пикселях. Если значение bV5Height положительно, то изображение строится из левого нижнего угла. Если же значение bV5Height отрицательно, то изображение строится из левого верхнего угла.

Если bV5Height отрицателен, то поле bV5Compression должно быть равно BI_RGB или BI_BITFIELDS. Изображения с отрицательным bV5Height не могут быть сжатыми.

Если значение поля bV5Compression равно BI_JPEG или BI_PNG, то поле bV5Height содержит высоту распакованного JPEG или PNG изображения.

bV5Planes

Количество плоскостей (planes) целевого устройства. Значение этого поля должно быть равно единице.

bV5BitCount

Число бит, описывающих каждый пиксель и максимальное количество цветов в растровом изображении. Это поле принимает одно из перечисленных ниже значений.

0 - число бит на пискель задаётся отдельно или подразумевается при использовании JPEG или PNG формата.

1 - изображение монохромное и поле bmiColors структуры BITMAPINFO содержит два элемента. Каждый бит в массиве описывает пиксель. Если бит сброшен, то пиксель отображается с цветом, соответствующем первому элементу в таблице bmiColors. Если бит установлен, то пиксель имеет цвет, соответствующий второму элементу в таблице bmiColors.

4 - изображение имеет максимум 16 цветов, и поле bmiColors структуры BITMAPINFO содержит 16 элементов. Каждый пиксель изображения представляется 4-битным индексом в таблице цветов. Например, если первый байт в битовой карте (bitmap) равен 0x1F, то этот байт описывает два пикселя. Первый пиксель имеет цвет, соответствующий второму элементу таблицы цветов. Второй пиксель имеет цвет, соответствующий 16-ому элементу таблицы цветов.

8 - изображение имеет максимум 256 цветов, и поле bmiColors структуры BITMAPINFO содержит 256 элементов. В этом случае каждый байт в массиве описывает отдельный пиксель.

16 - изображение имеет максимум 2^16 цветов. Если поле bV5Compression структуры BITMAPV5HEADER содержит значение BI_RGB, то значение поля bmiColors структуры BITMAPINFO равно NULL. Каждое слово (WORD) в массиве представляет собой пиксель.Относительные интенсивности красного, зелёного и синего цветов представляются с помощью пяти бит для каждой компоненты цвета. Значение для синего цвета хранится в младших пяти битах, за ними идёт по пять бит для зелёного и красного цветов. Старший значащий бит не используется.

Цветовая таблица bmiColors используется для оптимизации использования цветов на устройствах основанных на палитре (palette-based devices) и должно содержать количество элементов, определённое в поле bV5ClrUsed структуры BITMAPV5HEADER.

Если поле bV5Compression структуры BITMAPV5HEADER содержит значение BI_BITFIELDS, то поле bmiColors содержит три цветовых маски, размером в двойное слово (DWORD), которые описывают компоненты красного, зеленого и синего цветов, соответствено, для каждого пикселя. Каждое слово (WORD) в массиве битовой карты (bitmap) описывает отдельный пиксель.

Когда значение поля bV5Compression равно BI_BITFIELDS, биты установленные в каждой DWORD маске должны быть непрерывными и не должны пересекаться с установленными битами другой маски. В пикселе могут использоваться не все биты.

24 - изображение имеет максимум 2^24 цветов, и значение поля bmiColors структуры BITMAPINFO равно NULL. Каждые три байта в массиве представляют относительные интенсивности синего, зеленого и красного цветов соотвественно, для каждого пикселя. Таблица цветов bmiColors используется для оптимизации использования цветов на устройствах основанных на палитре (palette-based devices) и должно содержать количество элементов, определённое в поле bV5ClrUsed структуры BITMAPV5HEADER.

32 - изображение имеет максимум 2^32 цветов. Если значение поля bV5Compression структуры BITMAPV5HEADER равно BI_RGB, то значение поля bmiColors структуры BITMAPINFO равно NULL. Каждое двойное слово (DWORD) в массиве описывает относительные интенсивности синего, зелёного и красного цветов для пикселя. Значение для синего цвета хранится в младших 8 битах, за ними следуют по 8 бит для зелёного и красного цветов. Старший байт в каждом двойном слове (DWORD) не используется. Таблица цветов bmiColors используется для оптимизации использования цветов на устройствах основанных на палитре (palette-based devices) и должно содержать количество элементов, определённое в поле bV5ClrUsed структуры BITMAPV5HEADER.

Если значение поля bV5Compression равно BI_BITFIELDS, то поле bmiColors содержит три цветовых маски размером в двойное слово (DWORD) каждая, которые описывают компоненты красного, зеленого и синего цветов, соответственно, для каждого пикселя. Каждое двойное слово (DWORD) в массиве описывает отдельный пиксель.

bV5Compression

Указывает на то, что изображение не сжато. Поля bV5RedMask,bV5GreenMask и bV5BlueMask описывают компоненты красного, зелёного и синего цветов для каждого пикселя. Это допускается при использовании изоюражении с 16 и 32 битами на пиксель.

Допустимые значения поля BV5Compression перечислены здесь.

bV5SizeImage

Размер изображения в байтах. Если значение поля bV5Compression равно BI_RGB, то значение поля bV5SizeImage может быть равно нулю.

Если же значение поля bV5Compression равно BI_JPEG или BI_PNG, то поле bV5SizeImage содержит размер буфера JPEG или PNG изображения.

bV5XPelsPerMeter

Желательное для изображения горизонтальное разрешение в пикселях на метр целевого устройства. Приложение может использовать это поле для выбора из ресурсов растрового изображения наилучшим образом соответствующего характеристикам текущего устройства.

bV5YPelsPerMeter

Желательное для изображения вертикальное разрешение в пикселях на метр целевого устройства.

bV5ClrUsed

Количество индексов цветов в таблице цветов, которые фактически используются в растровом изображении. Если значение этого поля равно нулю, то изображение использует максимальное количество цветов, соответствующее значению поля bV5BitCount для режима сжатия указанного в поле bV5Compression.

Если значение поля bV5ClrUsed отлично от нуля и значение поля bV5BitCount меньше 16, то поле bV5ClrUsed содержит фактическое количество доступных цветов. Если значение поля bV5BitCount 16 или больше, то bV5ClrUsed определяет размер таблицы цветов, используемой для оптимизации работы системных палитр цветов. Если значение biBitCount равно 16 или 32, то оптимальная палитра цветов запускается сразу же после заполнения структуры BITMAPV5HEADER.

Если значение bV5ClrUsed отлично от нуля, то используется таблица цветов и поле bV5ClrUsed содержит количество элементов в этой таблице.

bV5ClrImportant

Количество индексов цветов, которое необходимо для отображения растрового изображения. Если значение этого поля равно нулю, то необходимы все цвета.

bV5RedMask

Цветовая маска, описывающая для каждого пикселя компоненту красного цвета. Используется только если значение поля bV5Compression равно BI_BITFIELDS.

bV5GreenMask

Цветовая маска, описывающая для каждого пикселя компоненту зелёного цвета. Используется только если значение поля bV5Compression равно BI_BITFIELDS.

bV5BlueMask

Цветовая маска, описывающая для каждого пикселя компоненту синего цвета. Используется только если значение поля bV5Compression равно BI_BITFIELDS.

bV5AlphaMask

Цветовая маска, описывающая альфа-компоненту (alpha component) для каждого пикселя.

bV5CSType

Пространство цветов (color space) для расттрового изображения не зависящего от устройства (DIB).

Ниже перечислены допустимые значения этого поля.

LCS_CALIBRATED_RGB - это значение подразумевает, что конечные точки (endpoints) и значения гаммы (gamma values) указаны в соответствующих полях.

LCS_sRGB - указывает, что используется пространство цветов sRGB.

LCS_WINDOWS_COLOR_SPACE - указывает, что используется ситемное пространство цветов по умолчанию (sRGB).

PROFILE_LINKED - поле bV5ProfileData указывает на имя файла с используемым профилем (значения гамм и конечных точек игнорируются).

PROFILE_EMBEDDED - поле bV5ProfileData содержит адрес буфера памяти, в котором хранится используеый профиль (значения гамм и конечных точек игнорируются).

bV5Endpoints

Структура CIEXYZTRIPLE, которая описывает координаты трёх цветов (красного, зелёного и синего) в логическом пространстве цветов связанном с растровым изображением. Значение этого поля игнорируется если значение поля bV5CSType отлично от LCS_CALIBRATED_RGB.

bV5GammaRed

Характеристика чувствительности красного цвета (toned response curve). Используется если значение поля bV5CSType равно LCS_CALIBRATED_RGB. Указывается в формате 16.16. Старшие 16 бит содержат беззнаковое целое значение. Младшие 16 бит содержат дробную часть.

bV5GammaGreen

Характеристика чувствительности зелёного цвета (toned response curve). Используется если значение поля bV5CSType равно LCS_CALIBRATED_RGB. Указывается в формате 16.16. Старшие 16 бит содержат беззнаковое целое значение. Младшие 16 бит содержат дробную часть.

bV5GammaBlue

Характеристика чувствительности синего цвета (toned response curve). Используется если значение поля bV5CSType равно LCS_CALIBRATED_RGB. Указывается в формате 16.16. Старшие 16 бит содержат беззнаковое целое значение. Младшие 16 бит содержат дробную часть.

bV5Intent

Схема цветопередачи (rendering intent) для растрового изображения. Допустимые значения этого поля перечислены ниже.

LCS_GM_ABS_COLORIMETRIC - сохранение белой точки. Соответствие цветов их самому близкому цвету в целевой палитре.

LCS_GM_BUSINESS - сохранение насыщенности. Используется для бизнес-графики и в случаях, когда смешивание цветов не требуется.

LCS_GM_GRAPHICS - сохранение колориметрического соответствия. Используется для графического дизайна и подбора цветов.

LCS_GM_IMAGES - сохранение контраста. Используется для фотографий и естественных изображений (natural images).

bV5ProfileData

Смещение в байтах от начала структуры BITMAPV5HEADER до начала данных профиля (profile data). Если профиль включен, то данные профиля представляют собой фактический профиль (данные профиля являются строкой с именем файла профиля). Они не могут быть Unicode строкой. Эта строка должна состоять исключительно из символов стандартного набора символа Windows (кодовая страница 1252). Значение этого поля игнорируется если значение поля bV5CSType не равно PROFILE_LINKED или PROFILE_EMBEDDED.

bV5ProfileSize

Размер прикрепленных данных профиля в байтах.

bV5Reserved

Зарезервировано. Значение этого поля должно быть равно нулю.

Примечание

Когда растровое изображение, не зависящее от устройства (DIB) загружено в память, данные профиля должны содержать таблицу цветов, и поле bV5ProfileData должно содержать смещение данных профиля от начала структуры BITMAPV5HEADER. Значение, сохранённое в поле bV5ProfileData будет отличаться от размера структуры BITMAPV5HEADER, полученного с помощью оператора sizeof, так как биты растрового изображения не идут следом за таблицей цветов в памяти. Приложения должны модифицировать значение этого поля после загрузки DIB в память.

В сжатых DIB, данные профиля должны следовать за битовой картой (bitmap). Поле bV5ProfileData также содержать смещение данных профиля от начала структуры BITMAPV5HEADER.

Приложения должны иметь доступ к данным профиля только тогда когда значение поля bV5Size равно размеру структуры BITMAPV5HEADER и значение поля bV5CSType равно PROFILE_EMBEDDED или PROFILE_LINKED.

Заголовочный файл: wingdi.h (включен в windows.h)


BLENDFUNCTION

Структура BLENDFUNCTION управляет смешиванием цветов для исходного и целевого растровых изображений.

Прототип

typedef struct _BLENDFUNCTION {

BYTE BlendOp;

BYTE BlendFlags;

BYTE SourceConstantAlpha;

BYTE AlphaFormat;

} BLENDFUNCTION, *PBLENDFUNCTION, *LPBLENDFUNCTION;

Поля структуры

BlendOp

Исходная операция смешивания. Сейчас, допустимо только значение AC_SRC_OVER.

BlendFlags

Должно быть равно нулю.

SourceConstantAlpha

Определяет альфа значение прозрачности, которое будет использоваться на всём исходном растровом изображении. Данное значение комбинируется с альфа значением каждого пикселя целевого растрового изображения. Если вы устанавливаете значение этого поля в нуль, то ваше изображение полностью прозрачно. Если же вы устанавливаете значение этого поля равным 255, то используется альфа значение каждого пикселя.

AlphaFormat

Данное поле определяет как следует интерпретировать исходные и целевые растровые изображения. Для него допустимо всего одно значение:

AC_SRC_ALPHA - данный флаг устанавливается когдарастровое изображение имеет альфа канал (то есть альфа значение на каждый пиксель). Заметьте, что функции API используют предварительно умноженное значение альфа канала, то есть значения красного, зеленого и синего каналов в растровом изображении должны быть предварительно помноженными на значение альфа канала. Например, если значение альфа канала равно x, то значения красного, зеленого и синего каналов должны быть умножены на x и поделены на число 0xFF перед вызовом функции.

Примечание

Если значение поля AlphaFormat равно AC_SRC_ALPHA, то исходное растровое изображение должно иметь глубину 32 бита на пиксель (bpp).

Если значение поля BlendOp равно AC_SRC_OVER, то исходное растровое изображение помещается поверх целевого растрового изображения на основе значений альфа канала пикселей исходного растрового изображения.

Если исходное растровое изображение не имеет альфа канала (то есть флаг AC_SRC_ALPHA не установлен), то значение поля SourceConstantAlpha устанавливает смешивание следующим образом:

Dst.Red = Src.Red*(SCA/255) + DST.Red*(1-(SCA/255))

Dst.Green = Src.Green*(SCA/255) + DST.Green*(1-(SCA/255))

Dst.Blue = Src.Blue*(SCA/255) + Dst.Blue*(1-(SCA/255))

Здесь и далее: SCA - значение поля SourceConstantAlpha. Это значение деится на 255 так как оно находится в интервале от 0 до 255.

Если целевое растровое изображение имеет альфа канал, то итоговое значение альфа канала:

Dst.Alpha = Src.Alpha*(SCA/255) + Dst.Alpha*(1-(SCA/255))

Если исходное растровое изображение не использует поле SourceConstantAlpha (то есть значение этого поля равно 0xFF), то:

Dst.Red = Src.Red + (1-Src.Alpha)*Dst.Red

Dst.Green = Src.Green + (1-Src.Alpha)*Dst.Green

Dst.Blue = Src.Blue + (1-Src.Alpha)*Dst.Blue

Если целевое растровое изображение имеет альфа канал, то:

Dst.Alpha = Src.Alpha + (1-Src.Alpha)*Dst.Alpha

Если исходное растровое изображение имеет и значение поля SourceConstantAlpha отличное от 0xFF и альфа канал, то источник предварительно умножается на значение поля SourceConstantAlpha и смешивается на основе значения альфа канала (значение поля SourceConstantAlpha делится на 255, так как значение этого поля находится в интервале от 0 до 255).

Src.Red = Src.Red * SourceConstantAlpha/255;

Src.Green = Src.Green * SourceConstantAlpha/255;

Src.Blue = Src.Blue * SourceConstantAlpha/255;

Src.Alpha = Src.Alpha * SourceConstantAlpha/255;

Dst.Red = Src.Red + (1-Src.Alpha)*Dst.Red;

Dst.Green = Src.Green + (1-Src.Alpha)*Dst.Green;

Dst.Blue = Src.Blue + (1-Src.Alpha)*Dst.Blue;

Dst.Alpha = Src.Alpha + (1-Src.Alpha)*Dst.Alpha;

Здесь:

Src.Red - значение красного канала исходного растрового изображения,

Src.Green - значение зеленого канала исходного растрового изображения,

Src.Blue - значение синего канала исходного растрового изображения,

Src.Alpha - значение альфа канала исходного растрового изображения,

Dst.Red - значение красного канала целевого растрового изображения,

Dst.Green - значение зеленого канала целевого растрового изображения,

Dst.Blue - значение синего канала целевого растрового изображения,

Dst.Alpha - значение альфа канала целевого растрового изображения.

Заголовочный файл: Wingdi.h (включен в windows.h)


BSMINFO

Содержит информацию об окне, которое отклонило запрос, рассылаемый с помощью функции BroadcastSystemMessageEx.

Прототип

typedef struct {

UINT cbSize;

HDESK hdesk;

HWND hwnd;

LUID luid;

} BSMINFO, *PBSMINFO;

Поля структуры

cbSize

Размер структуры в байтах.

hdesk

Описатель рабочего стола, которому принадлежит окно указанное в поле hwnd. Данное значение возвращается только если в функции BroadcastSystemMessageEx указаны флаги BSF_RETURNHDESK и BSF_QUERY.

hwnd

Дескриптор окна, которое отклонило запрос. Данное значение возвращается только если в функции BroadcastSystemMessageEx указан флаг BSF_QUERY.

luid

Локально уникальный идентификатор (LUID) окна.

Заголовочный файл: winuser.h (включен в windows.h)


CANDIDATEFORM

Содержит информацию о положении кандидатного окна.

Прототип

typedef struct tagCANDIDATEFORM {

DWORD dwIndex;

DWORD dwStyle;

POINT ptCurrentPos;

RECT rcArea;

} CANDIDATEFORM, *PCANDIDATEFORM;

Поля структуры

dwIndex

Идентификатор кандидатного списка. Для первого списка его значение равно нулю; для второго списка его значение равно единице и так далее. Максимальное значение равно трём.

dwStyle

Стиль положения. Он принимает одно из значений перечисленных ниже.

CFS_CANDIDATEPOS - в поле ptCurrentPos. содержится положение левого верхнего угла кандидатного окна-списка. Положение этого окна задается в клиентской системе координат.

CFS_EXCLUDE - исключить кандидатное окно из области, описываемой полем rcArea. Поле ptCurrentPos описывает координаты текущего положения курсора.

ptCurrentPos

Структура POINT, содержащая координаты левого верхнего угла кандидатного окна или положения курсора, в зависимости от значения поля dwStyle.

rcArea

Структура RECT, содержащая координаты левого верхнего и правого нижнего углов исключаемой области.

Заголовочный файл: Imm.h (включен в windows.h)


CHANGEFILTERSTRUCT

Появилась в Windows 7. Содержит дополнительную информацию возвращаемую функцией ChangeWindowMessageFilterEx.

Прототип

typedef struct tagCHANGEFILTERSTRUCT {

DWORD cbSize;

DWORD ExtStatus;

} CHANGEFILTERSTRUCT, *PCHANGEFILTERSTRUCT;

Поля структуры

cbSize

Размер структуры в байтах. Значение данного поля должно быть равно sizeof(CHANGEFILTERSTRUCT). В противном случае функция вернет ошибку ERROR_INVALID_PARAMETER.

ExtStatus

Если функция ChangeWindowMessageFilterEx завершилась успехом, то данное поле содержит одно из перечисленных ниже значений (в скобках указано фактическое значение константы).

MSGFLTINFO_NONE (0) - см. примечание. Возвращается в ответ на MSGFLT_ALLOW и MSGFLT_DISALLOW.

MSGFLTINFO_ALLOWED_HIGHER (3) - сообщение разрешено к передаче. Возвращается в ответ на MSGFLT_DISALLOW.

MSGFLTINFO_ALREADYALLOWED_FORWND (1) - сообщение уже разрешено редактируемым фильтром. В этом случае функция ни изменяет настройки фильтра. Возвращается в ответ на MSGFLT_ALLOW.

MSGFLTINFO_ALREADYDISALLOWED_FORWND (2) - сообщение уже заблокировано редактируемым фильтром. В этом случае функция ни изменяет настройки фильтра. Возвращается в ответ на MSGFLT_DISALLOW.

Примечание

Некоторые сообщения с номером меньшим чем WM_USER проходят через фильтр вне зависимости от его настроек. При редактировании фильтра эти сообщения все равно будут передаваться адресату.

Приложения могут использовать функцию ChangeWindowMessageFilter для редактирования фильтра применительно ко всему процессу (а не отдельному окну). Если сообщение разрешено филтром процесса или фильтром окна, то оно будет доставляться окну.

В таблице ниже перечислены возможные значения, возвращаемые в поле ExtStatus.

Сообщение разрешено для передачи | Сообщение разрешено фильтром | Запрашиваемая операция | Значение ExtStatus в случае успеха
Нет | Нет | MSGFLT_ALLOW | MSGFLTINFO_NONE
Нет | Нет | MSGFLT_DISALLOW | MSGFLTINFO_ALREADYDISALLOWED_FORWND
Нет | Нет | MSGFLT_RESET | MSGFLTINFO_NONE
Нет | Да | MSGFLT_ALLOW | MSGFLTINFO_ALREADYALLOWED_FORWND
Нет | Да | MSGFLT_DISALLOW | MSGFLTINFO_NONE
Нет | Да | MSGFLT_RESET | MSGFLTINFO_NONE
Да | Нет | MSGFLT_ALLOW | MSGFLTINFO_NONE
Да | Нет | MSGFLT_DISALLOW | MSGFLTINFO_ALLOWED_HIGHER
Да | Нет | MSGFLT_RESET | MSGFLTINFO_NONE
Да | Да | MSGFLT_ALLOW | MSGFLTINFO_ALREADYALLOWED_FORWND
Да | Да | MSGFLT_DISALLOW | MSGFLTINFO_ALLOWED_HIGHER
Да | Да | MSGFLT_RESET | MSGFLTINFO_NONE

Заголовочный файл: winuser.h (включен в windows.h)


CIEXYZ

Описывает координаты концевой точки (endpoint) в логическом пространстве цветов (logical color space).

Прототип

typedef struct tagCIEXYZ {

FXPT2DOT30 ciexyzX;

FXPT2DOT30 ciexyzY;

FXPT2DOT30 ciexyzZ;

} CIEXYZ;

Поля структуры

ciexyzX

Координата по оси X.

ciexyzY

Координата по оси Y.

ciexyzZ

Координата по оси Z.

Примечание

Данная структура не описана в MSDN, но представлена в заголовочном файле wingdi.h.

Тип данных FXPT2DOT30 эквивалентен типу Long.

Заголовочный файл: wingdi.h (включен в windows.h)


CIEXYZTRIPLE

Содержит x,y и z координаты трёх концевых точек (endpoints) красного, зелёного и синего цветов в логическом пространстве цветов (logical color space).

Прототип

typedef struct tagCIEXYZTRIPLE {

CIEXYZ ciexyzRed;

CIEXYZ ciexyzGreen;

CIEXYZ ciexyzBlue;

} CIEXYZTRIPLE typedef CIEXYZTRIPLE FAR* LPCIEXYZTRIPLE;

Поля структуры

ciexyzRed

Координаты концевой точки для красного цвета в виде структуры CIEXYZ.

ciexyzGreen

Координаты концевой точки для зелёного цвета в виде структуры CIEXYZ.

ciexyzBlue

Координаты концевой точки для синего цвета в виде структуры CIEXYZ.

Заголовочный файл: wingdi.h (включен в windows.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)


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)


COMPOSITIONFORM

Содержит информацию о положении композитного окна.

Прототип

typedef struct tagCOMPOSITIONFORM {

DWORD dwStyle;

POINT ptCurrentPos;

RECT rcArea;

} COMPOSITIONFORM, *PCOMPOSITIONFORM;

Поля структуры

dwStyle

Стиль положения. Принимает одно из перечисленных ниже значений.

CFS_DEFAULT - переместить композитное окно в положение по умолчанию. Окно IME может отображать композитное окно за пределами клиентской области, например, в плавающем окне.

CFS_FORCE_POSITION - левый верхний угол композитного окна расположен в точке ptCurrentPos. Координаты являются координатами относительно левого верхнего угла окна, содержащего композитное окно и не корректируются системой IME.

CFS_POINT - левый верхний угол композитного окна расположен в точке ptCurrentPos. Координаты являются координатами относительно левого верхнего угла окна, содержащего композитное окно и корректируются системой IME.

CFS_RECT - положение композитного окна определяется полем rcArea. Координаты являются координатами относительно левого верхнего угла окна, содержащего композитное окно.

ptCurrentPos

Структура POINT, содержащая координаты левого верхнего угла композитного окна.

rcArea

Структура RECT, содержащая координаты левого верхнего и правого нижнего углов композитного окна.

Примечание

Некоторые окна IME корректируют положение композитного окна, указанного системой или приложением. Для избежания корректировки используйте стиль CFS_FORCE_POSITION.

Заголовочный файл: Imm.h (включен в windows.h)


COPYDATASTRUCT

Содержит данные, передаваемые другому приложению посредством сообщения WM_COPYDATA.

Прототип

typedef struct tagCOPYDATASTRUCT {

ULONG_PTR dwData;

DWORD cbData;

PVOID lpData;

} COPYDATASTRUCT, *PCOPYDATASTRUCT;

Поля структуры

dwData

Указатель на данные, которые должны быть переданы принимающему приложению. (по Джеффри Рихтеру в это поле разрешено записывать любое значение).

cbData

Размер в байтах данных, на которые указывает поле lpData.

lpData

Указатель на данные, которые должны быть переданы принимающему приложению. Это поле может равняться NULL.

Заголовочный файл: winuser.h (включен в windows.h)


CPINFO

Содержит информацию о кодовой странице. Данная структура используется функцией GetCPInfo.

Прототип

typedef struct _cpinfo {

UINT MaxCharSize;

BYTE DefaultChar[MAX_DEFAULTCHAR];

BYTE LeadByte[MAX_LEADBYTES];

} CPINFO, *LPCPINFO;

Поля структуры

MaxCharSize

Максимальная длина, в байтах, символа в кодовой странице. Длина может равняться 1 для однобайтового набора символов (SBCS), 2 для двухбайтового набора символов (DBCS), или более 2 для наборов символов других типов. Функция не может использовать это размер для отделения однобайтового и двухбайтового наборов символов от других наборов символов, так как могут присутствовать другие факторы (factors), например, использование кодовых страниц ISCII или ISO-2022-xx.

DefaultChar

Символ по умолчанию используемый при транслировании символьных строк в заданную кодовую страницу. Этот символ используется функцией WideCharToMultiByte если символ по умолчанию не задан явным образом. Обычно это символ "?".

LeadByte

Массив диапазонов лидирующих байт. Количество диапазонов лидирующих байтов может изменяться. Сам массив имеет фиксированный размер. Если кодовая страница не имеет лидирующих байтов, все элементы массива равны NULL. Если же кодовая страница имеет лидирующие байты, массив задает стартовое и конечное значение для каждого интервала. Стартовое и конечное значения входят в интервал. Максимальное количество интервалов для кодовой страницы равно пяти. Массив использует два байта для описания каждого интервала. Два соседствующих друг с другом NULL байта располагаются после последнего интервала.

Учтите, что некоторые кодовые страницы используют лидирующие байты совместно с другими механизмами кодирования. Обычно это поле используется для пополнения подмножества кодовых страниц, которые используют лидирующие байты.

Примечание

Лидирующие байты уникальны для двухбайтовых кодовых страниц (DBCS) и позволяют использовать более 256 символов. Лидирующий байт - это первый байт в двухбайтовом коде символа. Для каждой двухбайтовой кодовой страницы лидирующий байт принадлежит определенному интервалу байтов. Данный интервал различается для разных кодовых страниц.

Информация о лидирующих байтах не очень полезна для большинства кодовых страниц, и не предоставляется для многих многобайтных кодировок, например, UTF-8 и GB18030. Вашим приложениям не рекомендуется использовать эту информацию для того, чтобы предсказать результат работы функции MultiByteToWideChar и WideCharToMultiByte. Функция могла бы ограничиться использованием символа по умолчанию или же использовать другое поведение по умолчанию при обнаружении неизвестного байта, следующего за лидирующим байтом.

Структура CPINFOEX, используемая функцией GetCPInfoEx является расширенной версией этой структуры.

Заголовочный файл: winnls.h (включен в windows.h)


CPINFOEX

Содержит информацию о кодовой странице. Данная структура используется функцией GetCPInfoEx.

Прототип

typedef struct _cpinfoex {

UINT MaxCharSize;

BYTE DefaultChar[MAX_DEFAULTCHAR];

BYTE LeadByte[MAX_LEADBYTES];

WCHAR UnicodeDefaultChar;

UINT CodePage;

TCHAR CodePageName[MAX_PATH];

} CPINFOEX, *LPCPINFOEX;

Поля структуры

MaxCharSize

Максимальная длина, в байтах, символа в кодовой странице. Длина может равняться 1 для однобайтового набора символов (SBCS), 2 для двухбайтового набора символов (DBCS), или более 2 для наборов символов других типов. Функция не может использовать это размер для отделения однобайтового и двухбайтового наборов символов от других наборов символов, так как могут присутствовать другие факторы (factors), например, использование кодовых страниц ISCII или ISO-2022-xx.

DefaultChar

Символ по умолчанию используемый при транслировании символьных строк в заданную кодовую страницу. Этот символ используется функцией WideCharToMultiByte если символ по умолчанию не задан явным образом. Обычно это символ "?".

LeadByte

Массив диапазонов лидирующих байт. Количество диапазонов лидирующих байтов может изменяться. Сам массив имеет фиксированный размер. Если кодовая страница не имеет лидирующих байтов, все элементы массива равны NULL. Если же кодовая страница имеет лидирующие байты, массив задает стартовое и конечное значение для каждого интервала. Стартовое и конечное значения входят в интервал. Максимальное количество интервалов для кодовой страницы равно пяти. Массив использует два байта для описания каждого интервала. Два соседствующих друг с другом NULL байта располагаются после последнего интервала.

Учтите, что некоторые кодовые страницы используют лидирующие байты совместно с другими механизмами кодирования. Обычно это поле используется для пополнения подмножества кодовых страниц, которые используют лидирующие байты.

UnicodeDefaultChar

Символ Unicode по умолчанию, используемый при транслировании символов из заданной кодовой страницы. Обычно это символ "?" или средняя точка катаканы (katakana middle dot). Данный символ используется функцией MultiByteToWideChar.

CodePage

Значение кодовой страницы. Это значение зависит от кодовой страницы, переданной в функцию GetCPInfoEx.

CodePageName

Полное наименование кодовой страницы. Учтите, что это наименование локализовано и не является уникальным или постоянным для операционной системы или компьютера.

Примечание

Лидирующие байты уникальны для двухбайтовых кодовых страниц (DBCS) и позволяют использовать более 256 символов. Лидирующий байт - это первый байт в двухбайтовом коде символа. Для каждой двухбайтовой кодовой страницы лидирующий байт принадлежит определенному интервалу байтов. Данный интервал различается для разных кодовых страниц.

Информация о лидирующих байтах не очень полезна для большинства кодовых страниц, и не предоставляется для многих многобайтных кодировок, например, UTF-8 и GB18030. Вашим приложениям не рекомендуется использовать эту информацию для того, чтобы предсказать результат работы функции MultiByteToWideChar и WideCharToMultiByte. Функция могла бы ограничиться использованием символа по умолчанию или же использовать другое поведение по умолчанию при обнаружении неизвестного байта, следующего за лидирующим байтом.

Заголовочный файл: winnls.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)


CURSORINFO

Содержит информацию о курсоре.

Прототип

typedef struct {

DWORD cbSize;

DWORD flags;

HCURSOR hCursor;

POINT ptScreenPos;

} CURSORINFO, *PCURSORINFO, *LPCURSORINFO;

Поля структуры

cbSize

Размер структуры, в байтах. Вызывающий поток должен записать в это поле значение sizeof(CURSORINFO).

flags

Состояние курсора. Данный параметр принимает одно из значений перечисленных ниже.

0 - курсор скрыт.

CURSOR_SHOWING (0x00000001) - курсор отображается на экране.

CURSOR_SUPPRESED (0x00000002) - Windows 8: курсор скрыт. Данный флаг свидетеьствует о том, что система не отображает курсор так как пользователь осуществляет ввод посредством касаний стилуса, а не с помощью мыши.

hCursor

Описатель курсора.

ptScreenPos

Структура POINT, которая содержит экранные координаты курсора.

Заголовочный файл: Winuser.h (включен в windows.h)


DDEACK

Содержит флаги состояния, которые приложение DDE передает своему партнеру вместе с сообщением WM_DDE_ACK. Эти флаги описывают детальную информацию об ответе приложения на сообщения WM_DDE_DATA, WM_DDE_POKE, WM_DDE_EXECUTE, WM_DDE_ADVISE, WM_DDE_UNADVISE и WM_DDE_REQUEST.

Прототип

typedef struct {

unsigned short bAppReturnCode :8;

unsigned short reserved :6;

unsigned short fBusy :1;

unsigned short fAck :1;

} DDEACK;

Поля структуры

bAppReturnCode

Определённый приложением код возврата.

reserved

Зарезервировано.

fBusy

Указывает, что приложение во время получения сообщения было занято и поэтому не смогло ответить на него. Знчаение, отличне от нуля говорит о том, что приложение было занято и не могло ответить на сообщение. Значение поля fBusy имеет смысл только если значение поля fAck равно нулю.

fAck

Указывает, что приложение получило сообщение от своего партнера. Ненулевое значение этого поля говорит о том, что сообщение принято.

Заголовочный файл: Dde.h (включен в windows.h)


DDEADVISE

Содержит флаги, которые определяют как приложение сервер DDE должен переслать данные клиенту. Клиент передает дескриптор на эту структуру серверу вместе с сообщением WM_DDE_ADVISE.

Прототип

typedef struct {

unsigned short reserved :14;

unsigned short fDeferUpd :1;

short fAckReq :1;

short cfFormat;

} DDEADVISE;

Поля структуры

reserved

Зарезервировано.

fDeferUpd

Указывает, должен ли сервер отложить отправку клиенту обновленных данных. Если значение этого поля отлично от нуля, то сервер должен отправить сообщение WM_DDE_DATA с дескриптором данных равным NULL каждый раз при изменении данных. В ответ на это клиент может послать серверу сообщение WM_DDE_REQUEST для получения описателя обновленных данных.

fAckReq

Указывает, должен ли сервер установить флаг fAckReq в сообщении WM_DDE_DATA. Если значение этого поля отлично от нуля, то сервер должен установить бит fAckReq.

cfFormat

Предпочтительный для клиента формат данных. Должен быть указан стандартный или зарегистрированный формат буфера обмена. Стандартные форматы буфера обмена перечислены здесь.

Заголовочный файл: Dde.h (включен в windows.h)


DDEDATA

Содержит данные и информацию о данных, пересылаемых в сообщении WM_DDE_DATA.

Прототип

typedef struct {

unsigned short unused :12;

unsigned short fResponse :1;

unsigned short fRelease :1;

unsigned short reserved :1;

BYTE fAckReq :1;

short cfFormat;

BYTE Value[1];

} DDEDATA;

Поля структуры

unused

Не используется.

fResponse

Указывает в ответ на какое сообщение WM_DDE_REQUEST или WM_DDE_ADVISE отправляются данные. Если значение этого поля отлично от нуля, то данные пересылаются в ответ на сообщение WM_DDE_REQUEST.

fRelease

Указывает должно ли приложение, получающее сообщение WM_DDE_POKE освобождать данные. Если значение этого поля отлично от нуля, то приложение должно освободить данные (free the data).

reserved

Зарезервировано.

fAckReq

Указывает, должно ли приложение, получающее сообщение WM_DDE_DATA подтвердить получение данных путем отправки сообщения WM_DDE_ACK. Если значение этого поля отлично от нуля, то приложение должно отправить подтверждение.

cfFormat

Формат данных. Он должен соответствовать стандартному или зарегистрированному формату буфера обмена. Стандартные форматы буфера обмена перечислены здесь.

value

Содержит сами данные. Длина и тип данных зависит от значения поля cfFormat.

Заголовочный файл: Dde.h (включен в windows.h)


DDEPOKE

Содержит данные и информацию о данных, передаваемую с сообщением WM_DDE_POKE.

Прототип

typedef struct {

unsigned short unused :13;

unsigned short fRelease :1;

unsigned short fReserved :2;

short cfFormat;

BYTE Value[1];

} DDEPOKE;

Поля структуры

unused

Не используется.

fRelease

Указывает должно ли приложение, отвечающее на сообщение WM_DDE_POKE освобождать даные. Если значение этого поля отлично от нуля, то приложение должно освободить данные.

fReserved

Зарезервировано.

cfFormat

Формат данных. Он должен соответствовать стандартному или зарегистрированному формату буфера обмена. Стандартные форматы буфера обмена перечислены здесь.

value

Содержит данные. Длина и тип данных зависит от значения поля cfFormat.

Заголовочный файл: Dde.h (включен в windows.h)


DESIGNVECTOR

Используется приложениями для задания ограничительных значений для осей ММ-шрифта (axes of a multiple master font).

Прототип

typedef struct tagDESIGNVECTOR {

DWORD dvReserved;

DWORD dvNumAxes;

LONG dvValues[MM_MAX_NUMAXES];

} DESIGNVECTOR, *PDESIGNVECTOR;

Поля структуры

dvReserved

Зарезервировано. Данное поле должно содержать значение STAMP_DESIGNVECTOR.

dvNumAxes

Количество значений в массиве dvValues.

dvValues

Массив, задающий значения для осей ММ-шрифта формата OpenType. Данный массив соответствует (corresponds) массиву axlAxisInfo структуры AXESLIST.

Примечание

Поле dvNumAxes задает фактический размер массива dvValues, и тем самым, структуры DESIGNVECTOR. Константа MM_MAX_NUMAXES, равная 16, задает максимально допустимый размер массива dvValues.

Шрифт PostSript Open Type не поддерживает функциональность группового фотошаблона (multiple master functionality).

Заголовочный файл: wingdi.h (включен в windows.h)


DEVICE_SCALE_FACTOR (перечисление)

Указывает масштабный коэффициент устройства, в процентах. Используется IApplicationDesignModeSettings::SetApplicationViewState и IApplicationDesignModeSettings::IsApplicationViewStateSupported.

Появилось в Windows Vista и Windows Server 2008.

Прототип

typedef enum DEVICE_SCALE_FACTOR {

SCALE_100_PERCENT = 100,

SCALE_140_PERCENT = 140,

SCALE_180_PERCENT = 180

} DEVICE_SCALE_FACTOR;

Возможные значения

SCALE_100_PERCENT

100%. Масштабный коэффициент для устройства равен 1.0.

SCALE_140_PERCENT

140%. Масштабный коэффициент для устройства равен 1.4.

SCALE_180_PERCENT

180%. Масштабный коэффициент для устройства равен 1.8.

Заголовочный файл: Shtypes.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)


DIBSECTION

Содержит информацию о независящем от устройства растровом изображении (DIB), созданном функцией CreateDIBSection. Структура содежит информацию о размерах растрового изображения, цветовом формате, цветовых масках, дополнительном объекте проекция файла и смещении бит растрового изображения. Приложение может заполнить эту структуру с помощью функции GetObject.

Прототип

typedef struct tagDIBSECTION {

BITMAP dsBm;

BITMAPINFOHEADER dsBmih;

DWORD dsBitfields[3];

HANDLE dshSection;

DWORD dsOffset;

} DIBSECTION, *PDIBSECTION;

Поля структуры

dsBm

Структура BITMAP, содержащая информацию о DIB, а именно: тип, размеры, глубина цвета, указатель на биты растрового изображения.

dsBmih

Структура BITMAPINFOHEADER, содержащая информацию о цветовом формате DIB.

dsBitfields

Задает три цветовых маски для DIB. Это поле допустимо только в том случае, если значение поля BitCount структуры BITMAPINFOHEADER больше 8. Каждая цветовая маска задает биты, используемые при кодировании трех каналов цвета (красный, зеленый и синий).

dshSection

Содержит описатель объекта проекция файла, используемого функцией CreateDIBSection при создании DIB. Если при вызове функции CreateDIBSection значение параметра hSection было равно NULL, и система сама выделяла память под изображение, то значение поля dshSection так же будет равно NULL.

dsOffset

Смещение битов растрового изображения внутри объекта проекция файла dshSection. Если значение поля dshSection равно NULL, то значение поля dsOffset не имеет смысла.

Заголовочный файл: wingdi.h (включен в windows.h)


DLGITEMTEMPLATE

Описывает размеры и стиль элементов управления диалогового окна. Одна или несколько таких структур используется совместно со структурой DLGTEMPLATE для формирования стандартного шаблона диалогового окна.

Прототип

typedef struct {

DWORD style;

DWORD dwExtendedStyle;

short x;

short y;

short cx;

short cy;

WORD id;

} DLGITEMTEMPLATE, *PDLGITEMTEMPLATE;

Поля структуры

style

Стиль элемента управления. Данное поле может содержать комбинацию оконных стилей (таких, как WS_BORDER) и одного или нескольких стилей элементов управления (таких, как BS_PUSHBUTTON и ES_LEFT).

dwExtendedStyle

Расширенные стили окна. Это поле не используется при создании элементов управления диалогового окна, но, приложения, использующие шаблон диалогового окна для создания окон других типов, могут его использовать. Данные стили перечислены здесь.

x

Координата по горизонтали, в шаблонных единицах, левого верхнего угла элемента управления. Начало координат расположено в левом верхнем углу клиентской области диалогового окна.

y

Координата по вертикали, в шаблонных единицах, левого верхнего угла элемента управления. Начало координат расположено в левом верхнем углу клиентской области диалогового окна.

cx

Ширина элемента управления, в шаблонных единицах.

cy

Высота элемента управления, в шаблонных единицах.

id

Идентификатор элемента управления.

Примечание

В стандартном шаблоне диалогового окна, вслед за структурой DLGITEMTEMPLATE всегда располагается три массива переменной длины, определяющих класс, заголовок, и дополнительный параметр элемента управления. Каждый массив состоит из одного или нескольких 16-разрядных элементов.

Каждая структура DLGITEMTEMPLATE в шаблоне должна быть выровнена по границе двойного слова (DWORD). Массивы класса и заголовка должны быть выровнены по границе слова (WORD). Дополнительный параметр должен быть выровнен по границе слова (WORD).

Сразу за каждой структурой DLGITEMTEMPLATE располагается массив класса, который определяет оконный класс элемента управления. Если первый элемент этого массива - значение, отличное от 0xFFFF, то система интерпретирует массив как завершающуюся NULL символом строку Unicode, определяющую наименование зарегистрированного оконного класса. Если значение первого элемента равно 0xFFFF, то массив содержит еще один дополнительный элемент, задающий ординал предопределенного системного класса. Ординал принимает одно из значений перечисленных ниже.

0x0080 - кнопка (Button),

0x0081 - поле ввода (Edit),

0x0082 - статический элемент управления (Static),

0x0083 - список (List box),

0x0084 - полоса прокрутки (Scroll bar),

0x0085 - комбинированный список (Combo box).

Вслед за массивом класса располагается масив заголовка, содержащий начальный текст или идентификатор ресурса элемента управления. Если значение первого элемента этого массива равно 0xFFFF, то массив содержит один дополнительный элемент, задающий порядковый номер ресурса, такого как иконка. Вы можете использовать идентификаторы ресурсов для таких элементов управления, как статический элемент управления, отображающий иконку, или какой-либо другой ресурс, отличный от текста. Если значение первого элемента массива отлично от 0xFFFF, то система интерпретирует массив как завершающуюся NULL символом строку Unicode, содержащую начальный текст.

Вслед за массивом заголовка, начиная с границы слова (WORD) располагается массив начальных данных (creation data). Начальные данные могут иметь произвольный размер и формат. Если первое слово начальных данных отлично от нуля, то оно задает их размер, в байтах (включая, слово размера). Оконная процедура элемента управления должна уметь интерпретировать эти данные. Когда система создает элемент управления, она передает указатель на начальные данные в качестве значения параметра lParam сообщения WM_CREATE, отправляемого элементу управления.

Если вы задаете в массиве класса или заголовка строку символов, то вы должны использовать формат Unicode. Для создания Unicode строки на основе ANSI строки используйте функцию MultiByteToWideChar.

Значения полей x, y, cx и cy задаются в шаблонных единицах. Для пересчета их значений в единицы экрана (пиксели) используйте функцию MapDialogRect.

Заголовочный файл: Winuser.h (включен в Windows.h)


DLGITEMTEMPLATEEX

Блок текста, используемый в расширенном шаблоне диалогового окна. Сам расширенный шаблон диалогового окнна описывается структурой DLGTEMPLATEEX.

Структура DLGITEMTEMPLATEEX документирована, но в заголовочных файлах не задана.

Прототип

typedef struct {

DWORD helpID;

DWORD exStyle;

DWORD style;

short x;

short y;

short cx;

short cy;

DWORD id;

sz_Or_Ord windowClass;

sz_Or_Ord title;

WORD extraCount;

} DLGITEMTEMPLATEEX;

Поля структуры

helpID

Идентификатор контекста помощи для элемента управления. Когда система отправляет сообщение WM_HELP, значение helpID передается в качестве значения поля dwContextId структуры HELPINFO.

exStyle

Расширенные стили окна. Это поле не используется при создании элементов управления в диалоговых окнах, но приложения, которые используют шаблон диалогового окна для создания окон других типов, могут использовать это поле. Расширенные оконныне стили перечислены здесь.

style

Стиль элемента уравления. Это поле может представлять собой комбинацию оконных стилей (таких как WS_BORDER) и одного или нескольких стилей элементов управления (таких, как BS_PUSHBUTTON и ES_LEFT).

x

Координата по горизонтали, в шаблонных единицах, левого верхнего угла элемента управления. Начало координат всегда располагается в левом верхнем углу клиентской области диалогового окна.

y

Координата по вертикали, в шаблонных единицах, левого верхнего угла элемента управления. Начало координат всегда располагается в левом верхнем углу клиентской области диалогового окна.

cx

Ширина элемента управления, в шаблонных единицах.

cy

Высота элемента управления, в шаблонных единицах.

id

Идентификатор элемента управления.

windowClass

Массив 16-разрядных элементов переменной длины, задающий оконный класс элемента управления. Если значение первого элемента этого массива отлично от 0xFFFF, то система интерпретирует массив как завершающуюся NULL символом строку Unicode, задающую наименование зарегистрированного оконного класса.

Если значение первого элемента равно 0xFFFF, то массив содержит еще один дополнительный элемент, задающий порядковый номер предопределенного системного класса. Допустимые значения этих номеров перечислены ниже.

0x0080 - Кнопка (Button).

0x0081 - Поле ввода (Edit).

0x0082 - Статический элемент управления (Static).

0x0083 - Список (List box).

0x0084 - Полоса прокрутки (Scroll bar).

0x0085 - Комбинированный список (Combo box).

title

Массив 16-разрядных элементов переменной длины, содержащий начальный заголовок или идентификатор ресурса элемента управления. Если значение первого элемента массива равно 0xFFFF, то массив содержит оджин дополнительный элемент, задающий порядковый номер ресурса, такого как иконка в исполняемом файле. Вы можете использовать идентификатор ресурса для таких элементов управления, как статический элемент управления отображающий иконку или какой-либо другой ресурс отображаемый вместо текста. Если же значение первого элемента отлично от 0xFFFF, то система интерпретирует массив как завершающуюся NULL символом строку Unicode, задающую начальный текст.

extraCount

Размер, в байтах, дополнительных данных, следующих за этим полем. Если значение этого поля больше нуля, то дополнительные данные начинаются с ближайшей границы слова (WORD). Дополнительные данные могут иметь произвольный формат и размер. Оконная процедура элемента управления должна быть в состоянии обработать эти данные. Когда система создает элемент управления, она передает указатель на эти данные в параметре lParam сообщения WM_CREATE, отправляемом элементу управления.

Примечание

Расширенный шаблон диалогового окна состоит из заголовка DLGTEMPLATEEX, вслед за которым располагаются структуры DLGITEMTEMPLATEEX, по одной для каждого элемента управления в диалоговом окне.

Каждая структура DLGITEMTEMPLATEEX должна быть выровнена по границе двойного слова (DWORD). Массивы windowClass и title должны быть выровнены по границе слова (WORD). Массив дополнительных данных, если он есть, должен быть выровнен по границе слова (WORD).

При задании символов в массивах windowClass и title вы должгы использовать Unicode. Для создания Unicode строк на основе ANSI строк используйте функцию MultiByteToWideChar.

Значения полей x, y, cx и cy задаются в шаблонных единицах. Дя их конвертирования в единицы экрана (пиксели) используйте функцию MapDialogRect.


DLGTEMPLATE

Описывает размеры и стиль диалогового окна. Данная структура всегда располагается в начале шаблона диалогового окна и задает количество элементов управления, каждый из которых описывается структурой DLGITEMTEMPLATE.

Прототип

typedef struct {

DWORD style;

DWORD dwExtendedStyle;

WORD cdit;

short x;

short y;

short cx;

short cy;

} DLGTEMPLATE, *LPDLGTEMPLATE;

Поля структуры

style

Стиль диалогового окна. Данное поле может содержать произвольную комбинацию оконных стилей (например WS_CAPTION и WS_SYSMENU) и стилей диалоговых окон (например, DS_CENTER).

Если данное поле содержит стиль DS_SETFONT, то заголовок шаблона диалогового окна содержит дополнительные данные, определяющие шрифт, используемый для отрисовки текста в клиентской области окна и элементах управления диалогового окна. Данные шрифта начинаются на границе слова (WORD) сразу после массива заголовка (title array). данные шрифта задают 16-разрядное значение размера шрифтаи наименование шрифта в виде строки Unicode. По возможности система создает шрифт, соответствующий указанным параметрам. После создания шрифта система отправляет диалоговому окну и всем элементам управления сообщение WM_SETFONT, передавая им описатель шрифта. Если стиль DS_SETFONT не установлен, то шаблон диалогового окна не содержит данных об используемом шрифте.

Стиль DS_SHELLFONT в заголовке DLGTEMPLATE не поддерживается.

dwExtendedStyle

Расширенные стили окна. Данное поле не используется при создании диалоговых окон, но приложения, использующие шаблон диалогового окна, могут использовать его для создания окон других типов. Расширенные стили окон перечислены здесь. Как показывают мои эксперименты значение данного поля все-таки используется при создании диалоговых окон.

cdit

Количество элементов управления диалогового окна.

x

Горизонтальная координата левого верхнего угла диалогового окна, в шаблонных единицах.

y

Вертикальная координата левого верхнего уга диалогового окна, в шаблонных единицах.

cx

Ширина диалогового окна, в шаблонных единицах.

cy

Высота диалогового окна, в шаблонных единицах.

Примечание

В стандартном шаблоне диалогового вслед за структурой DLGTEMPLATE идет три массива переменной длины, описывающих меню, оконный класс и заголовок диалогового окна. Если установлен стиль DS_SETFONT, то вслед за ними следует 16-разрядное значение размера шрифта и еще один массив переменной длины, задающий наименование шрифта. Каждый массив состоит из одного или нескольких 16-разрядных элементов. Массивы меню, оконного класса, заголовка и шрифта должны быть вырловнены по границе слова (WORD).

Сразу за структурой DLGTEMPLATE следует массив меню, который задает наименование ресурса меню диалогового окна. Если значение первого элемента этого массива равно 0x0000, то у диалогового окна нет меню, и у массива нет других элементов. Если значение первого элемента равно 0xFFFF, то массив имеет один дополнительный элемент, содержащий идентификатор ресура меню в исполняемом файле. Если же значение первого элемента отлично от вышеприведенных, то данный массив интерпретируется системой как завершающаяся NULL символом строка Unicode, содержащая наименование ресурса меню в исполняемом файле.

Вслед за массивом меню располагается массив оконного класса, идентифицирующий оконный класс диалогового окна. Если значение первого элемента этого массива равно 0x0000, то система будет использовать предопределенный класс, а массив больше не имеет элементов. Если значение первого элемента равно 0xFFFF, то массив имеет один дополнительный элемент, содержащий идентификатор предопределенного системного оконного класса. Если же значение первого элемента отлично от вышеприведенных, то данный массив интерпретируется системой как завершающаяся NULL символом строка Unicode, содержащая наименование зарегистрированного оконного класса.

Вслед за массивом класса располагается массив заголовка, представляющий собой завершающуюся NULL-символом строку Unicode, содержащую заголовок диалогового окна. Если значение первого элемента этого массива равно 0x0000, то у диалогового окна нет заголовка, а массив не содержит элементов.

Если установлен стиль DS_SETFONT, то следом за массивом заголовка располагается 16-разрядное значение размера шрифта и массив наименования шрифта. Наименование шрифта задается в виде завершающейся NULL символом строки Unicode, содержащей наименование шрифта. Прочитав эти значения, система, если это возможно, создает шрифт, имеющий указанные характеристики, и отправляет в диалоговую процедуру окна и в оконные процедуры элементов управления сообщение WM_SETFONT.

Вслед за заголовком DLGTEMPLATE располагается одна или несколько структур DLGITEMTEMPLATE, которая описывает размеры и стиль элементов управления диалогового окна. Поле cdit задает количество структур DLGITEMTEMPLATE в шаблоне. Структуры DLGITEMTEMPLATE должны быть выровнены по границе двойного слова (DWORD).

Строки в массивах меню, оконного класса, заголовка и шрифта должны задаваться в кодировке Unicode.

Значения полей x, y, cx и cy задаются в шаблонных единицах. Для конвертирования этих значений в экранные единицы (пиксели) используйте функцию MapDialogRect.

Заголовочный файл: Winuser.h (включен в Windows.h)


DLGTEMPLATEEX

Расширенный шаблон диалогового окна начинается со структуры DLGTEMPLATEEX, которая описывает диалоговое окно и количество элементов управления диалогового окна. Каждый элемент управления диалогового окна в расширенном шаблоне описывается структурой DLGITEMTEMPLATEEX.

Структура DLGTEMPLATEEX не описана в каком-либо стандартном заголовочном файле. Её описание приводится здесь для описания формата расширенного шаблона диалогового окна.

Прототип

typedef struct {

WORD dlgVer;

WORD signature;

DWORD helpID;

DWORD exStyle;

DWORD style;

WORD cDlgItems;

short x;

short y;

short cx;

short cy;

sz_Or_Ord menu;

sz_Or_Ord windowClass;

WCHAR title[titleLen];

WORD pointsize;

WORD weight;

BYTE italic;

BYTE charset;

WCHAR typeface[stringLen];

} DLGTEMPLATEEX;

Поля структуры

dlgVer

Номер версии расширенного шаблона диалогового окна. Значение этого поля должно быть равно единице.

signature

Определяет является ли шаблон расширенным шаблоном диалогового окна. Если значение этого поля равно 0xFFFF, то структура описывает расширенный шаблон диалогового окна. В этом случае поле dlgVer задает номер версии шаблона. Если же значение поля signature отлично от 0xFFFF, то используется стандартный шаблон диалогового окна на основе структур DLGTEMPLATE и DLGITEMTEMPLATE.

helpID

Идентификатор контекста помощи диалогового окна. Когда система отправляет сообщение WM_HELP, она передает это значение в поле wContextId структуры HELPINFO.

exStyle

Расширенные оконные стили. Это поле не используется при создании диалоговых окон, но приложения, использующие шаблон диалогового окна для создания окон других типов, могут использовать это поле. Расширенные оконные стили перечислены здесь.

style

Стили диалогового окна. Значение данного поля представляет собой комбинацию оконных стилей (перечислены здесь) и стилей диалоговых окон (перечислены здесь).

Если поле style включает стили DS_SETFONT или DS_SHELLFONT, то заголовок DLGTEMPLATEEX расширенного шаблона диалогового окна содержит 4 дополнительных поля (pointsize, weight, italic и typeface), которые описывают шрифт, используемый для отображения текста в клиентской области и элементах управления. Если это возможно, система создает шрифт, соответствующий заданным параметрам. После создания шрифта система отправляет диалоговому окну и каждому элементу уравления сообщение WM_SETFONT, передавая тем самым описатель используемого шрифта.

cDlgItems

Количество элементов управления в диалоговом окне.

x

Координата по горизонтали, в шаблонных единицах, левого верхнего угла диалогового окна.

y

Координата по вертикали, в шаблонных единицах, левого верхнего угла диалогового окна.

cx

Ширина, в шаблонных единицах, диалогового окна.

cy

Высота, в шаблонных единицах, диалогового окна.

menu

Массив переменной длины 16-разрядных элементов, который задает ресурс меню диалогового окна. Если значение первого элемента этого массива равно 0x0000, то у диалогового окна нет меню, а массив не имеет дополнительных элементов. Если же значение первого элемента равно 0xFFFF, то массив имеет один дополнительный элемент, задающий порядковый номер ресурса меню в исполняемом файле. Если же первый элемент массива содержит значение отличное от вышеперечисленных, то система интерпретирует массив как завершающуюся NULL символом строку Unicode, задающую наименование ресурса меню в исполняемом файле.

windowClass

Массив переменной длины 16-разрядных элементов, который задает класс диалогового окна. Если значение первого элемента массива равно 0x0000, то система использует предопределенный класс диалогового окна, а массив не содержит больше элементов. Если же значение первого элемента равно 0xFFFF, то массив содержит один дополнительный элемент, задающий порядковый номер предопределенного системного оконного класса. Если же значение первого элемента отлично от вышеперечисленных, то система интерпретирует массив как завершающуюся NULL символом строку Unicode, задающую наименование зарегистрированного оконного класса.

title

Заголовок диалогового окна. Если первый элемент этого массива равен 0x0000, то диалоговое окно не имеет заголовка, а в массиве больше нет ни одного элемента.

pointsize

Размер шрифта, используемого при отображении текста в диалоговом окне и его элементах управления.

Это поле присутствует, только если в поле style задан стиль DS_SETFONT или DS_SHELLFONT.

weight

Насыщенность шрифта. Следует заметить, что хотя значение данного поля может быть равно любому значению, допустимому для поля lfWeight структуры LOGFONT, значение поля weight автоматически будет заменено на значение FW_NORMAL.

Данное поле присутствует только если в поле style задан стиль DS_SETFONT или DS_SHELLFONT.

italic

Определяет используется ли курсив. Если значение этого поля равно TRUE, то используется курсивное начертание шрифта.

Данное поле присутствует только если в поле style задан стиль DS_SETFONT или DS_SHELLFONT.

charset

Используемый набор символов. Более подробную информацию смотрите в описании поля lfcharset структуры LOGFONT.

Данное поле присутствует только если в поле style задан стиль DS_SETFONT или DS_SHELLFONT.

typeface

Наименование начертания шрифта.

Данное поле присутствует только если в поле style задан стиль DS_SETFONT или DS_SHELLFONT.

Примечание

Вы можете использовать расширенный шаблон диалогового окна вместо стандартного шаблона диалогового окна в функциях CreateDialogIndirectParam, DialogBoxIndirectParam, CreateDialogIndirect и DialogBoxIndirect.

Вслед за структурой DLGTEMPLATEEX в расширенном шаблоне диалогового окна располагается ода или несколько структур DLGITEMTEMPLATEEX, описывающих элементы управления диалогового окна. Поле cDlgItems структуры DLGTEMPLATEEX определяет количество структур DLGITEMTEMPLATEEX, расположенных в шаблоне.

Каждая структура DLGITEMTEMPLATEEX в шаблоне должна быть выровнена по границе двойного слова (DWORD). Если поле style содержит стиль DS_SETFONT или DS_SHELLFONT, то первая структура DLGITEMTEMPLATEEX начинается с первой границы двойного слова после строки typeface. Если эти стили не заданы, то первая структура начинается с ближайшей границы двойного слова после строки title.

Массивы menu, windowClass, title и typeface должны быть выровнены по границе слова (WORD).

Если в массивах menu, windowClass, title и typeface вы задаете строку, то вы должны использовать Unicode. Для создания Unicode строк на основе ANSI строк используйте функцию MultiByteToWideChar.

Значения полей x, y, cx и cy задаются в шаблонных единицах. Для конвертирования значения этих полей в единицы экрана (пиксели) используйте функцию MapDialogRect.


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)


DRAWTEXTPARAMS

Содержит дополнительные опции форматирования для функции DrawTextEx.

Прототип

typedef struct {

UINT cbSize;

int iTabLength;

int iLeftMargin;

int iRightMargin;

UINT uiLengthDrawn;

} DRAWTEXTPARAMS, *LPDRAWTEXTPARAMS;

Поля структуры

cbSize

Размер структуры, в байтах.

iTabLength

Размер каждого шага табуляции, в единицах эквивалентных средней ширине символа.

iLeftMargin

Размер левого поля, в единицах эквивалентных средней ширине символа.

iRightMargin

Размер правого поля, в единицах эквивалентных средней ширине символа.

uiLengthDrawn

Количество символов, обработанных функцией DrawTextEx, включая символы пробела. Данное число может равняться длине строки или индексу первой строки, вышедшей за нижнюю границу области рисования. Учтите, что если задан флаг DT_NOCLIP, функция DrawTextEx всегда обрабатывает всю строку.

Заголовочный файл: winuser.h (включен в windows.h)


ENUMLOGFONT

Описывает атрибуты шрифта, его полное наименование и стиль.

Прототип

typedef struct tagENUMLOGFONT {

LOGFONT elfLogFont;

TCHAR elfFullName[LF_FULLFACESIZE];

TCHAR elfStyle[LF_FACESIZE];

} ENUMLOGFONT, *LPENUMLOGFONT;

Поля структуры

elfLogFont

Структура LOGFONT, описывающая атрибуты шрифта.

elfFullName

Уникальное наименование шрифта. Например, "ABCD Font Company TrueType Bold Italic Sans Serif".

elfStyle

Стиль шрифта. Например, полужирный курсив.

Заголовочный файл: wingdi.h (включен в windows.h)


ENUMLOGFONTEX

Содержит информацию о перечисляемом шрифте.

Прототип

typedef struct tagENUMLOGFONTEX {

LOGFONT elfLogFont;

TCHAR elfFullName[LF_FULLFACESIZE];

TCHAR elfStyle[LF_FACESIZE];

TCHAR elfScript[LF_FACESIZE];

} ENUMLOGFONTEX, *LPENUMLOGFONTEX;

Поля структуры

elfLogFont

Структура LOGFONT, описывающая атрибуты шрифта.

elfFullName

Уникальное наименование шрифта. Например, "ABC Font Company TrueType Bold Italic SansSerif".

elfStyle

Стиль шрифта. Например, полужирный курсив.

elfScript

Набор символов шрифта. Например, кириллица.

Заголовочный файл: wingdi.h (включен в windows.h)


ENUMLOGFONTEXDV

Содержит информацию, используемую при создании шрифта.

Прототип

typedef struct tagENUMLOGFONTEXDV {

ENUMLOGFONTEX elfEnumLogfontEx;

DESIGNVECTOR elfDesignVector;

} ENUMLOGFONTEXDV, *PENUMLOGFONTEXDV;

Поля структуры

elfEnumLogfontEx

Структура ENUMLOGFONTEX, содержащая информацию о логических атрибутах шрифта.

elfDesignVector

Сруктура DESIGNVECTOR. Если шрифт не является ММ-шрифтом семейства OpenType, то данное поле заполнено нулями.

Примечание

Фактический размер структуры ENUMLOGFONTEXDV зависит от структуры DESIGNVECTOR, размер которой, в свою очередь, зависит от значения поля dvNumAxes этой структуры.

Функции EnumFonts, EnumFontFamilies и EnumFontFamiliesEx были изменены так, чтобы передавать в функцию обратного вызова указатели на структуры ENUMTEXTMETRIC и ENUMLOGFONTEXDV.

Заголовочный файл: wingdi.h (включен в windows.h)


ENUMTEXTMETRIC

Содержит информацию о физическом шрифте.

Прототип

typedef struct tagENUMTEXTMETRIC {

NEWTEXTMETRICEX etmNewTextMetricEx;

AXESLIST etmAxesList;

} ENUMTEXTMETRIC, *PENUMTEXTMETRIC;

Поля структуры

etmNewTextMetricEx

Структура NEWTEXTMETRICEX, содержащая информацию о физическом шрифте.

etmAxesList

Структура AXESLIST, содержащая информацию об осях шрифта. Используется только для ММ-шрифтов.

Примечание

Структура ENUMTEXTMETRIC является расширенным вариантом структуры NEWTEXTMETRICEX и включает информацию об осях для ММ-шрифтов.

Функции EnumFonts, EnumFontFamilies и EnumFontFamiliesEx были изменены так, чтобы передавать в функцию обратного вызова указатели на структуры ENUMTEXTMETRIC и ENUMLOGFONTEXDV.

Заголовочный файл: wingdi.h (включен в windows.h)


EXTLOGPEN

Описывает стиль пера, ширину и атрибуты кисти для расширенного пера. Данная структура используется функцией GetObject при возвращении информации о пере, созданном функцией ExtCreatePen.

Прототип

typedef struct tagEXTLOGPEN {

DWORD elpPenStyle;

DWORD elpWidth;

UINT elpBrushStyle;

COLORREF elpColor;

ULONG_PTR elpHatch;

DWORD elpNumEntries;

DWORD elpStyleEntry[1];

} EXTLOGPEN, *PEXTLOGPEN;

Поля структуры

elpPenStyle

Набор флагов задающих тип, стиль, концевой элемент (end cap) и атрибуты соединения (join). Значения из каждой группы могут быть получены с помощью битовой операции И с соответствующей маской.

Для получения типа пера используется маска PS_TYPE_MASK.

Типы перьев перечислены ниже.

PS_GEOMETRIC - геометрическое перо.

PS_COSMETIC - косметическое перо.

Для получения стиля пера используется маска PS_STYLE_MASK.

Допустимые стили перьев перечислены здесь.

Концевой элемент задается только для геометрических перьев. Для его получения используется маска PS_ENDCAP_MASK. Допустимые значения перечислены ниже.

PS_ENDCAP_ROUND - окружность.

PS_ENDCAP_SQUARE - квадрат.

PS_ENDCAP_FLAT - грань (flat).

Соединение задается только для геометрических перьев. Для его получения используется маска PS_JOIN_MASK. Допустимые значения перечислены ниже.

PS_JOIN_BEVEL - конические соединения (beveled).

PS_JOIN_MITER - если соединения находятся в границах, установленных функцией SetMiterLimit, то они скашиваются под углом в 45 градусов (mitered). Если же они превышают это ограничение, соединения конические (beveled).

PS_JOIN_ROUND - соединения имеют форму окружности.

elpWidth

Ширина пера. Если значение поля elpPenStyle равно PS_GEOMETRIC, то значение поля elpWidth задает ширину линии в логических единицах. В протичном случае, для косметического пера, значение этого поля равно 1, то есть ширина линий равна одному пикселю.

elpBrushStyle

Кистевые стили пера. Допустимые значения этого поля перечислены здесь.

elpColor

Если значение поля elpBrushStyle содержит флаг BS_SOLID или BS_HATCHED, то значение поля elpColor задает цвет линий, рисуемых пером. При использовании флага BS_HATCHED функции SetBkMode и SetBkColor задают цвет фона.

Если значение поля elpBrushStyle содержит флаг BS_HOLLOW или BS_PATTERN, то значение поля elpColor игнорируется.

Если значение поля elpBrushStyle содержит флаг BS_DIBPATTERN или BS_DIBPATTERNPT, то младшее слово значения поля elpColor определяет как следует интерпретировать элементы массива bmiColors структуры BITMAPINFO. Допустимые значения перечислены ниже.

DIB_PAL_COLORS - массив 16-разрядных индексов в текущей логической палитре.

DIB_RGB_COLORS - цвета в формате RGB.

Для создания значения типа COLORREF используется макрос RGB.

elpHatch

Если значение поля elpBrushStyle содержит флаг BS_PATTERN, то поле elpHatch содержит описатель растрового изображения (bitmap), задающего шаблон.

Если значение поля elpBrushStyle содержит флаг BS_SOLID или BS_HOLLOW, то значение поля elpHatch игнорируется.

Если значение поля elpBrushStyle содержит флаг BS_DIBPATTERN, то поле elpHatch содержит описатель упакованного независящего от устройства растрового изображения (Device Independent Bitmap - DIB). Для получения этого описателя приложение вызывает функцию GlobalAlloc с флагом GMEM_MOVEABLE (или функцию LocalAlloc с флагом LMEM_MOVEABLE) для выделения блока памяти и затем размещает в нем упакованное DIB. Упакованное DIB состоит из структуры BITMAPINFO, сразу за которой располагается массив байтов, описывающих пиксели растрового изображения.

Если значение поля elpBrushStyle содержит флаг BS_DIBPATTERNPT, то поле elpHatch содержит указатель на упакованное DIB. Указатель получается из блока памяти выделенного функцией LocalAlloc с флагом LMEM_FIXED или функцией GlobalAlloc с флагом GMEM_FIXED, или же он может быть возвращен функцией LocalLock, в которую передан описатель DIB, или аналогичной ей. Упакованное DIB состоит из структуры BITMAPINFO, сразу за которой располагается массив байтов, описывающих пиксели растрового изображения.

Если значение поля elpBrushStyle содержит флаг BS_HATCHED, то значение поля elpHatch задает направление линий штриховки. Допустимые значения перечислены здесь.

elpNumEntries

Количество элементов в массиве стилей elpStyleEntry. Если в значении поля elpPenStyle не задан флаг PS_USERSTYLE, то значение поля elpNumEntries равно нулю.

elpStyleEntry

Пользовательский массив стилей. В определении массив имеет фиксированную длину, но он используется как бесконечно повторяемый. Первый элемент массива задает длину первого штриха. Второй элемент задает длину первого пропуска (gap). Затем длины штрихов и пропусков меняются местами.

Если значение поля elpWidth задает геоометрические линии, то длины задаются в логических единицах. В противном случае линии являются косметическими, и их длины задаются в единицах устройства.

Заголовочный файл: wingdi.h (включен в windows.h)


FILTERKEYS

Содержит информацию о фильтрации клавиш, которая позволяет пользователю с ограниченными возможностями устанавливать частоту повторений (повторяющиеся клавишы (RepeatKeys)), задержку принятия (медленные клавишы (SlowKeys)) и частоту ошибок (ошибочные клавишы (BounceKeys)).

Прототип

typedef struct tagFILTERKEYS {

UINT cbSize;

DWORD dwFlags;

DWORD iWaitMSec;

DWORD iDelayMSec;

DWORD iRepeatMSec;

DWORD iBounceMSec;

} FILTERKEYS, *LPFILTERKEYS;

Поля структуры

cbSize

Размер структуры в байтах.

dwFlags

Набор флагов, коорый определяет настройки фильтрации клавиш. Допустимые флаги перечислены здесь.

iWaitMSec

Длительность, в миллисекундах, в течение которого пользователь должен удерживать клавишу в нажатом состоянии перед этим как она будет принята компьютером.

iDelayMSec

Длительность, в миллисекундах, в течение которого пользователь должен удерживать клавишу в нажатом состоянии перед тем, как начнется её повтор.

iRepeatMSec

Длительность, в миллисекундах, интервала между каждым повторением клавишы.

iBounceMSec

Длительность, в миллисекундах, интервала, который должен истечь после отпускания клавишы перед тем как компьютер будет принимать повторное нажатие этой же клавишы.

Примечание

Используйте структуру FILTERKEYS при вызове функции SystemParametersInfo, в которой значение параметра uiAction равно SPI_GETFILTERKEYS или SPI_SETFILTERKEYS. При использовании SPI_GETFILTERKEYS, вы должны указать значение поля cbSize структуры FILTERKEYS. Функция SystemParametersInfo заполнит все остальные поля. При использовании значения SPI_SETFILTERKEYS вы должны заполнять все поля структуры.

Поле iBounceMSec управляет ошибочными клавишами (BounceKeys). Поля IWaitMSec, iDelayMSec и iRepeatMSec работают вместе и управляют повторяющимися клавишами (RepeatKeys) и медленными клавишами (SlowKeys). Если ошибочные клавишы (BounceKeys) включены (то есть, значение поля iBounceMSec отлично от нуля), то повторяющиеся клавишы (RepeatKeys) и медленные клавишы (SlowKeys) должны быть выключены (то есть значения полей iWaitMSec, iDelayMSec и iRepeatMSec должны быть равны нулю). Аналогично, если ошибочные клавишы (BounceKeys) выключены (значение iBounceMSec равно нулю), значения полей iWaitMSec, iDelayMSec и iRepeatMSec должны быть отличны от нуля.

Максимальным допустимым значением полей iBounceMSec, iWaitMSec, iDelayMSec и iRepeatMSec является 20 000 миллисекунд.

Заголовочный файл: winuser.h (включен в windows.h)


FIXED

Сдержит целую и дробную части вещественного числа с фиксированной запятой (fixed-point real number).

Прототип

typedef struct _FIXED {

WORD fract;

short value;

} FIXED;

Поля структуры

fract

Дробная часть числа.

value

Целая часть числа.

Примечание

Структура FIXED используется для описания полей структуры MAT2.

Заголовочный файл: wingdi.h (включен в windows.h)


FONTSIGNATURE

Содержит информацию, идентифицирующую кодовую страницу и поддиапазоны Unicode (subranges), для которых заданный шрифт предоставляет глифы (glyphs).

Прототип

typedef struct tagFONTSIGNATURE {

DWORD fsUsb[4];

DWORD fsCsb[2];

} FONTSIGNATURE, *PFONTSIGNATURE;

Поля структуры

fsUsb

128-битовое поле, задающее 126 подмножеств Unicode. Каждый бит, кроме двух самых старших, задает отдельный поддиапазон. Самый старший бит всегда равен 1 и является сигнатурой шрифта; второй старший бит зарезервирован и должен быть равен нулю. Поддиапазоны Unicode пронумерованы в соответствии со стандартом ISO 10646.

fsCsb

64-битовое поле, задающее набор символов или кодовую страницу. Кодовая страница сохраняется в младших 32-битах этого поля. Старшие 32 бита используются для кодовых страниц, отсутствующих в Windows (non-Windows code pages).

Примечание

Интерфейс графического устройства (GDI) полагается на кодовые страницы, заданные в 32-разрядном значении. При этом, старшие 2 бита этого значения зарезервированы для внутреннего использования GDI и не могут ссылаться на кодовые страницы.

Заголовочный файл: wingdi.h (включен в windows.h)


GCP_RESULTS

Содержит информацию о символах строки. В данную структуру заносятся результаты работы функции GetCharacterPlacement. Для некоторых языков, первый элемент массивов может содержать дополнительную, специфичную для языка информацию.

Прототип

typedef struct tagGCP_RESULTS {

DWORD lStructSize;

LPTSTR lpOutString;

UINT *lpOrder;

int *lpDx;

int *lpCaretPos;

LPSTR lpClass;

LPWSTR lpGlyphs;

UINT nGlyphs;

int nMaxFit;

} GCP_RESULTS, *LPGCP_RESULTS;

Поля структуры

lStructSize

Размер структуры, в байтах.

lpOutString

Указатель на буфер, в который заносится строка вывода данных, или NULL, если данная строка не требуется. Строка вывода данных - это версия исходной строки, которая находится в состоянии, в котором должна отобразиться заданным устройством. Обычно, она идентична оригинальной строке, но может и отличаться от неё. Например, если требуется переупорядочить строку и установлен флаг GCP_REORDER, или если исходная строка превышает максимальный размер при установленном флаге GCP_MAXEXTENT.

lpOrder

Указатель на массив, в который запишутся индексы расстановки, или NULL, если данные индексы не требуются. Интерпреация индексов расстановки зависит от значений других полей структуры GCP_RESULTS. Если возвращаются глифы, то индексы lpOrder предназначены для массива lpGlyphs; если индексы глифов не возвращаются, но запрошен массив lpOrder, то возвращаемые индексы предназначены для массива lpOutString. Например, в последнем случае значение lpOrder[i] задает положение символа исходной строки lpString[i] в строке выходных данных lpOutString.

Обычно это используется когда функция GetFontLanguageInfo возвращает флаг GCP_REORDER, который говорит о том, что исходная строка должна быть переупорядочена. Например, для иврита, в котором текст читается справа налево, массив lpOrder содержит точное положение каждого символа исходной строки.

lpDx

Указатель на массив, в который заносятся расстояния между соседними ячейками символов, или NULL, есди данные расстояния не требуются. Если выполнена отрисовка (rendering) глифов, то расстояния для глифов не равны расстояниям для символов. Данный массив может быть использован в функции ExtTextOut.

Расстояния в данном массиве задаются в порядке отображения символов. Для того чтобы найти расстояние для i-го символа оригинальной строки, используйте массив lpOrder так, как показано ниже.

width = lpDx[lpOrder[i]];

lpCaretPos

Указатель на массив, в который заносятся значения положения каретки, или NULL, если информация о положении каретки не требуется. Каждое значение задает положение каретки непосредственно перед соответствующим символом. В некоторых языках каретка для каждого символа может располагаться не слева перед ним. Например, в иврите, в котором текст читается справа налево, каретка располагаеся справа от символа. Если выполняется переупорядочивание символов, то элементы массива lpCaretPos соответствуют оригинальной строке, не строке вывода данных. Это означает, что некоторые соседние значения могут быть идентичными друг другу.

Элементы в массиве lpCaretPos соответствуют входному порядку. Найти положение каретки для i-го символа исходной строки можно так, как показано в примере ниже.

position = lpCaretPos[i];

lpClass

Указатель на массив, содержащий и в который заносятся классификации символов. Значения, определяющие как располагаются символы в строке похожи (но не аналогичны) значениям CT_CTYPE2, которые возвращает функция GetStringTypeEx. Каждый элемент массива может быть равен нулю, или одному из значений, перечисленных ниже.

GCPCLASS_ARABIC - арабский символ.

GCPCLASS_HEBREW - символ иврита.

GCPCLASS_LATIN - символ из латиницы или другого однобайтового набора символов для языка с направлением письма слева направо.

GCPCLASS_LATINNUMBER - цифра из латиницы или другого однобайтового набора символов для языка с направлением письма слева направо.

GCPCLASS_LOCALNUMBER - цифра из набора символов, ассоциированного с текущим шрифтом.

Дополнительно, при установке в массиве lpClass значений с флагом GCP_CLASSIN могут использоваться значения, перечисленные ниже.

GCPCLASS_LATINNUMERICSEPARATOR - только для вводимы данных. Символ, используемый для разделения латинских цифр, например, запятая или точка в десятичной дроби.

GCPCLASS_LATINNUMERICTERMINATOR - только для вводимых данных. Символ, используемый для завершения латинских цифр такой как знак плюса или минуса.

GCPCLASS_NEUTRAL - только для вводимых данных. У символа нет классификации.

GCPCLASS_NUMERICSEPARATOR - только для вводимых данных. Символ, используемый для разделения цифр, например, запятая или точка в десятичной дроби.

Для языков,использующих флаг GCP_REORDER, совместно с флагом GCP_CLASSIN также могут использоваться значения перечисленные ниже. В отличие от предыдущих значений, которые могут использоваться в любой части массива lpClass, все значения, перечисляемые ниже используются только в первом элементе массива (in the first location in the array). Все значения комбинируются с другими классификациями.

Учтите, что значения GCPCLASS_PREBOUNDLTR и GCPCLASS_PREBOUNDRTL, так же как GCPCLASS_POSTBOUNDLTR и GCPCLASS_POSTBOUNDRTL являются взаимно исключающими.

GCPCLASS_PREBOUNDLTR - данное значение устанавливается в элементе lpClass[0] перед строкой чтобы связать строку с направлением чтения слева направо.

GCPCLASS_PREBOUNDRTL - данное значение устанавливается в элементе lpClass[0] перед строкой чтобы связать строку направлением чтения справа налево.

GCPCLASS_POSTBOUNDLTR - данное значение устанавливается в элементе lpClass[0] после строки чтобы связать строку с направлением чтения слева направо.

GCPCLASS_POSTBOUNDRTL - данное значение устанавливается в элементе lpClass[0] после строки чтобы связать строку с направлением чтения справа налево.

Для задания способа размещения символов укажите классификацию для соответствующего элемента массива; функция оставляет такие классификации без изменений и вычисляет классификации только для элементов массива, значение которых равно нулю. Заданные классификации используются только при установленном флаге GCP_CLASSIN и заданном массиве lpClass.

Если функция GetFontLanguageInfo для текущего шрифта не возвращает значения GCP_REORDER, то значимым (meaningful) является только флаг GCPCLASS_LATIN.

lpGlyphs

Указатель на массив, в который заносятся значения, идентифицирующие глифы, используемые для отображения строки, или значение NULL, если данная информация не требуется. Количество глифов в массиве может быть меньше чем количество символов в исходной строке, если строка содержит сшитые глифы (лигатуры). Также, если требуется переупорядочивание, то порядок глифов может быть не последовательным.

Данный массив полезен если над строкой выполняется более одной операции, включающей в себя сшивку символов, кернинга или изменения порядка. Использование значений из этого массива при последующих операциях позволяет сэкономить время, так как не нужно каждый раз создавать индексы глифов.

Данный массив всегда содержит индексы глифов и при его использовании в функции ExtTextOut всегда должен применяться флаг ETO_GLYPH_INDEX.

При использовании флага GCP_LIGATE вы можете ограничить количество символов, которые будут сшиты (например, в арабском языке широко распространены лигатуры из трех символов). Данная настройка устанавливается в параметре lpGcpResults->lpGlyphs[0]. Если максимальное количество символов не устанавливается, то значение данного параметра должно быть равно нулю.

В случае языков, для которых функция GetFontLanguageInfo возвращает флаг GCP_GLYPHSHAPE, глифы символов будут различаться в зависимости от того, располагается этот символ в начале, середине или конце слова. Оычно, первый символ исходной строки также будет первым символом в слове, аналогично последний символ исзодной строки будет интерпретирован как последний символ слова. Однако, если отображаемая строка является частью полной строки, например, явяляется отображдаемой частью прокручиваемого текста, такое правило интерпетации может приводить к ошибкам. В таких случаях, желательно явно указывать, чтобы первые или последние символы принимали форму отличную от начальной или конечной форм. Для осуществления этого опять используется первый элемент массива lpGlyphs путем выполнения операции ИЛИ над значениями лигатуры и значениями GCPGLYPH_LINKBEFORE и/или GCPGLYPH_LINKAFTER. Например, значение GCPGLYPH_LINKBEFORE|2 означает, что размер лигатур ограничен двумя символами, а первый символ в строке должен интерпретироваться как символ в середине слова.

nGlyphs

При передаче структуры в функцию в данном поле должен храниться размер массивов, на которые указывают соответствующие поля структуры. При возвращении структуры функцией, в данное поле занесено количество заполненных глифов, в массивах с выходными данными. Если подстановка глифов не требуется (то есть, каждый входной символ отображается только в один глиф), то значение этого поля после работы функции равно его значению до вызова функции.

nMaxFit

Количество символов, которые вмещаются в ширину, заданную в параметре nMaxExtent функции GetCharacterPlacement. Если установлен флаг GCP_MAXEXTENT или GCP_JUSTIFY, то значение поля nMaxFit может быть меньше чем количество символов в исходной строке. Данное поле устанавливается вне зависимости от того, установлены флаги GCP_MAXEXTENT и GCP_JUSTIFY или нет.В отличие от поля nGlyphs, которое задает количество выходных глифов, поле nMaxFit работает с количнством символов в исходной строке. Для латинских однобайтовых наборов символов значения этих двух полей будут равны друг другу.

Примечание

Нужны значения полей lpGlyphs и lpOutString или нет зависит от результата работы функции GetFontLanguageInfo.

В случае шрифта для такого языка как английский, для которого не возвращается ни один из флагов: GCP_DBCS, GCP_REORDER, GCP_GLYPHSHAPE, GCP_LIGATE, GCP_DIACRITIC или GCP_KASHIDA, для выполнения операции ни один из массивов не нужен. (Но, тем не менее, они могут использоваться. Если используется массив lpOutString, то он будет идентичен массиву lpInputString, переданному в функцию GetCharacterPlacement). Тем не менее, учтите, что если используется флаг GCP_MAXEXTENT, то массив lpOutString (если он используется) будет содержать усеченную строку, если же данный флаг не используется, то массив lpOutString будет содержать точную копию оригинальной строки.

В случае шрифтов для таких языков, как иврит, в которых есть переупорядочивание но обычно нет дополнительных форм глифа, должен использоваться массив lpOutString. Он предоставит строку в правильном порядке чтения. Одновременно с этим, массив lpGlyphs обычно не нужен. (Иврит может иметь расширенные глифы, если используется шрифт TrueType/Open).

Для таких языков как тайский или арабский, для которых функция GetFontLanguageInfo возвращает флаг GCP_GLYPHSHAPE, массив lpOutString должен обеспечить правильный порядок строки, переданной в функцию GetCharacterPlacement, но эти значения все еще будут символами, не имеющими формы. Для правильного отображения на экране должен использоваться массив lpGlyphs.

Заголовочный файл: wingdi.h (включен в windows.h)


GLYPHMETRICS

Содержит информацию о расположении и ориентации глифа в символьной ячейке (character cell).

Прототип

typedef struct _GLYPHMETRICS {

UINT gmBlackBoxX;

UINT gmBlackBoxY;

POINT gmptGlyphOrigin;

short gmCellIncX;

short gmCellIncY;

} GLYPHMETRICS, *LPGLYPHMETRICS;

Поля структуры

gmBlackBoxX

Ширина наименьшего прямоугольника, полностью охватывающего глиф.

gmBlackBoxY

Высота наименьшего прямоугольника, полностью охватывающего глиф.

gmptGlyphOrigin

Координаты левого верхнего угла наименьшего прямоугольника полностью охватывающего глиф. В виде структуры POINT.

gmCellIncX

Расстояние по горизонтали между началом ячейки текущего символа и ячейкой следующего символа.

gmCellInY

Расстояние по вертикали между началом ячейки текущего символа и ячейкой следующего символа.

Примечание

Все значения в структуре GLYPHMETRICS задаются в единицах устройства (device units).

Заголовочный файл: wingdi.h (включен в windows.h)


GLYPHSET

Содержит информацию об интервале (range) кодовых точек (code points) Unicode.

Прототип

typedef struct tagGLYPHSET {

DWORD cbThis;

DWORD flAccel;

DWORD cGlyphsSupported;

DWORD cRanges;

WCRANGE ranges[1];

} GLYPHSET, *PGLYPHSET;

Поля структуры

cbThis

Размер структуры в байтах.

flAccel

Набор флагов, описывающих максимальный размер индексов глифов. Данное поле может содержать значение, указанное ниже.

GS_8BIT_INDICES - индексы глифов интерпретируются как 8-битные широкие значения. В противном случае они интерпретируются как 16-битные широкие значения.

cGlyphsSupported

Общее количество кодовых точек Unicode поддерживаемых шрифтом.

cRanges

Общее количество интервалов в массиве ranges.

ranges

Массив структур WCRANGE, описывающих поддерживаемые шрифтом интервалы Unicode.

Заголовочный файл: wingdi.h (включен в windows.h)


GRADIENT_RECT

Задает индексы двух точек в массиве pVertex в функции GradientFill. Эти две точки являются левым верхним и правым нижним углами прямоугольника.

Прототип

typedef struct _GRADIENT_RECT {

ULONG UpperLeft;

ULONG LowerRight;

} GRADIENT_RECT, *PGRADIENT_RECT;

Поля структуры

UpperLeft

Левый верхний угол прямоугольника.

LowerRight

Правый нижний угол прямоугольника.

Примечание

Структура GRADIENT_RECT задает элементы массива pVertex, используемые когда параметр ulMode функции GradientFill имеет значение GRADIENT_FILL_RECT_H или GRADIENT_FILL_RECT_V.

Заголовочный файл: wingdi.h (включен в windows.h)


GRADIENT_TRIANGLE

Задает индексы трех точек в массиве pVertex в функции GradientFill. Эти три точки образуют треугольник.

Прототип

typedef struct _GRADIENT_TRIANGLE {

ULONG Vertex1;

ULONG Vertex2;

ULONG Vertex3;

} GRADIENT_TRIANGLE, *PGRADIENT_TRIANGLE;

Поля структуры

Vertex1

Первая точка треугольника на пересечении его сторон.

Vertex2

Вторая точка треугольника на пересечении его сторон.

Vertex3

Третья точка треугольника на пересечении его сторон.

Примечание

Структура GRADIENT_TRIANGLE задает элементы массива pVertex, которые используются, когда параметр ulMode функции GradientFill имеет значение GRADIENT_FILL_TRANGLE.

Заголовочный файл: wingdi.h (включен в windows.h)


GUITHREADINFO

Содержит информацию о графическом интерфейсе потока.

Прототип

typedef struct tagGUITHREADINFO {

DWORD cbSize;

DWORD flags;

HWND hwndActive;

HWND hwndFocus;

HWND hwndCapture;

HWND hwndMenuOwner;

HWND hwndMoveSize;

HWND hwndCaret;

RECT rcCaret;

} GUITHREADINFO, *PGUITHREADINFO;

Поля структуры

cbSize

Размер структуры в байтах. Вызывающий поток должен устанавливать значение этого поля равным sizeof(GUITHREADINFO).

flags

Состояние потока. Данное поле может принимать одно из перечисленных ниже значений или их сочетание (в скобках указано фактическое значение флага).

GUI_CARETBLINK (0x00000001) - состояние мигания каретки. Данный флаг установлен, если каретка видима.

GUI_INMENUMODE (0x00000004) - состояние меню потока. Данный флаг установлен, если поток находится в режиме меню (menu mode).

GUI_INMOVESIZE (0x00000002) - данный флаг установлен, если поток находится в цикле изменения положения или размера окна.

GUI_POPUPMENUMODE(0x00000010) - состояние всплывающего меню (pop-up menu). Данный флаг установлен, если поток имеет активное всплывающее меню.

GUI_SYSTEMMENUMODE (0x00000008) - состояние системного меню потока. Данный флаг установлен, если поток находится в режиме системного меню.

hwndActive

Описатель активного окна потока.

hwndFocus

Описатель окна, которому принадлежит фокус ввода клавиатуры.

hwndCapture

Описатель окна, захватившего мышь.

hwndMenuOwner

Описатель окна, которому принадлежит какое-либо активное меню.

hwndMoveSize

Описатель окна, находящегося в цикле изменения положения и размеров.

hwndCaret

Описатель окна, в котором отображается каретка.

rcCaret

Структура RECT, описывающая прямоугольник, в котором находится каретка. Координаты ограничивающего прямоугольника задаются в клиентских координатах окна hwndCaret.

Примечание

Данная структура используется совместно с функцией GetGUIThreadInfo, возвращающей информацию об активном окне и графическом интерфейсе заданного потока.

Для использования этой структуры необходимо переопределить значение константы WINVER на значение 0x500 (или выше).

Заголовочный файл: winuser.h (включен в windows.h)


HARDWAREINPUT

Появилась в Windows XP. Содержит информацию об имитированном событии ввода от устройства ввода отличном от клавиатуры и мыши.

Прототип

typedef struct tagHARDWAREINPUT {

DWORD uMsg;

WORD wParamL;

WORD wParamH;

} HARDWAREINPUT, *PHARDWAREINPUT;

Поля структуры

uMsg

Сообщение, сгенерированное устройством ввода.

wParamL

Младшее слова параметра lParam сообщения uMsg.

wParamH

Старшее слово параметра lParam сообщения uMsg.

Заголовочный файл: 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


HIGHCONTRAST

Содержит информацию о режиме высокой контрастности. Этот режим устанавливает схему пользовательского интерфейса для наилучшей видимости для слабовидящих пользователей.

Прототип

typedef struct tagHIGHCONTRAST {

UINT cbSize;

DWORD dwFlags;

LPTSTR lpszDefaultScheme;

} HIGHCONTRAST, *LPHIGHCONTRAST;

Поля структуры

cbSize

Размер структуры в байтах.

dwFlags

Набор флагов. Допустимые флаги перечислены здесь.

lpszDefaultScheme

Указатель на строку, которая содержит наименование цветовой схемы, которая будет установлена по умолчанию.

Примечание

Приложение использует эту структуру когда вызывает функцию SystemParametersInfo со значением SPI_GETHIGHCONRAST или SPI_SETHIGHCONTRAST. При использовании SPI_GETHIGHCONRAST приложение должно заполнить поле cbSize структуры HIGHCONTRAST. Функция SystemParametersInfo заполнит остальные поля. При использовании SPI_SETHIGHCONTRAST приложение должно заполнить все поля структуры.

Заголовочный файл: winuser.h (включен в windows.h)


ICONINFO

Содержит информацию об иконке или курсоре.

Прототип

typedef struct _ICONINFO {

BOOL fIcon;

DWORD xHotspot;

DWORD yHotspot;

HBITMAP hbmMask;

HBITMAP hbmColor;

} ICONINFO, *PICONINFO;

Поля структуры

fIcon

Определяет описывает структура иконку или курсор. Если значение этого поля равно TRUE, то структура описывает иконку. Если же значение этого поля равно FALSE, то структура описывает курсор.

xHotspot

Координата по горизонтали стрелки курсора. Если структура описывает иконку, то данное поле игнорируется.

yHotspot

Координата по вертикали стрелки курсора. Если структура описывает иконку, то данное поле игнорируется.

hbmMask

Описатель битовой карты маски иконки (icon bitmask bitmap). Если структура описывает чернобелую иконку, то данная маска форматируется так, что её верхняя половина является AND маской, а младшая - XOR маской. Поэтому высота должна быть кратна двум. Если структура описывает цветную иконку, то данная маска описывает только AND маску иконки.

hbmColor

Описатель битовой карты цвета иконки. Это поле может быть необязательным в том случае, если структура описывает чернобелую иконку. AND маска поля hbmMask используется с флагом SRCAND, затем используется битовая карта цвета (операция XOR) с флагом SRCINVERT.

Заголовочный файл: winuser.h (включен в windows.h)


ICONINFOEX

Появилась в Windows Vista. Содержит информацию об иконке или курсоре. Расширяет структуру ICONINFO. Используется в функции GetIconInfoEx.

Прототип

typedef struct _ICONINFOEX {

DWORD cbSize;

BOOL fIcon;

DWORD xHotspot;

DWORD yHotspot;

HBITMAP hbmMask;

HBITMAP hbmColor;

WORD wResID;

TCHAR szModName[MAX_PATH];

TCHAR szResName[MAX_PATH];

} ICONINFOEX;

Поля структуры

cbSize

Размер структуры в байтах.

fIcon

Определяет что описывает данная структура. Если значение этого поля равно TRUE, то структура описывает иконку. Если же значение этого поля равно FALSE, то структура описывает курсор.

xHotSpot

Координата по горизонтали стрелки курсора. Если структура описывает иконку, то данное поле игнорируется.

yHotspot

Координата по вертикали стрелки курсора. Если структура описывает иконку, то данное поле игнорируется.

hbmMask

Описатель битовой карты маски иконки (icon bitmask bitmap). Если структура описывает чернобелую иконку, то данная маска форматируется так, что её верхняя половина является AND маской, а младшая - XOR маской. Поэтому высота должна быть кратна двум. Если структура описывает цветную иконку, то данная маска описывает только AND маску иконки.

hbmColor

Описатель битовой карты цвета иконки. Это поле может быть необязательным в том случае, если структура описывает чернобелую иконку. AND маска поля hbmMask используется с флагом SRCAND, затем используется битовая карта цвета (операция XOR) с флагом SRCINVERT.

wResID

Биты ресурса иконки или курсора. Эти биты обычно загружаются вызовом функций LookupIconIdFromDirectoryEx и LoadResource.

szModName

Путь к модулю.

szResName

Путь к ресурсу (path of the resource).

Заголовочный файл: winuser.h (включен в windows.h)


ICONMETRICS

Содержит метрики иконок. Эта структура используется в функции SystemParametersInfo с параметрами SPI_GETICONMETRICS и SPI_SETICONMETRICS.

Прототип

typedef struct tagICONMETRICS {

UINT cbSize;

int iHorzSpacing;

int iVertSpacing;

int iTitleWrap;

LOGFONT lfFont;

} ICONMETRICS, *PICONMETRICS, *LPICONMETRICS;

Поля структуры

cbSize

Размер структуры в байтах.

iHorzSpacing

Горизонтальный размер в пикселях каждой иконки.

iVertSpacing

Вертикальный размер в пикселях каждой иконки.

iTitleWrap

Если значение этого поля отлично от нуля, то подпись иконки переосится на новую строку. Если значение этого поля равно нулю, то подпись не переносится.

lfFont

Структура LOGFONT, которая описывает шрифт используемый для подписи иконки.

Заголовочный файл: winuser.h


INITCOMMONCONTROLSEX

Содержит информацию, используемую для загрузки классов элементов управления из динамической библиотеки (DLL). Эта структура используется совместно с функцией InitCommonControlsEx.

Прототип

typedef struct tagINITCOMMONCONTROLSEX {

DWORD dwSize;

DWORD dwICC;

} INITCOMMONCONTROLSEX, *LPINITCOMMONCONTROLSEX;

Поля структуры

dwSize

Размер структуры в байтах.

dwICC

Набор флагов, указывающий какие классы элементов управления будут загружены из динамической библиотеки. Данный параметр представляет собой комбинацию значений перечисленных здесь.

Заголовочный файл: Commctrl.h


INPUT

Используется функцией SendInput для хранения информации об искуственно созданном событии ввода, таком как клавиатурный ввод (keystrokes), перемещение мыши или нажатие на кнопку мыши.

Прототип

typedef struct tagINPUT {

DWORD type;

union {

MOUSEINPUT mi;

KEYBDINPUT ki;

HARDWAREINPUT hi;

};

} INPUT, *PINPUT;

Поля структуры

type

Тип события ввода. Допустимые значения этого поля перечислены ниже.

INPUT_MOUSE (0) - событие мыши. Используется поле mi.

INPUT_KEYBOARD (1) - событие клавиатуры. Используется поле ki.

INPUT_HARDWARE (2) - событие аппаратуры. Используется поле hi.

mi

Структура MOUSEINPUT, содержащая информацию об имитируемом событии мыши.

ki

Структура KEYBDINPUT, содержащая информацию об имитируемом событии клавиатуры.

hi

Структура HARDWAREINPUT, содержащее информацию об имитируемом событии аппаратуры.

Примечание

INPUT_KEYBOARD поддерживает методы неклавиатурного ввода, такие как распознавание рукописного ввода или распознавание голоса так же, как если бы это был текстовый ввод с использованием флага KEYEVENTF_UNICODE.

Заголовочный файл: winuser.h (включен в windows.h)


KERNINGPAIR

Описывает кернинговую пару (kerning pair).

Прототип

typedef struct tagKERNINGPAIR {

WORD wFirst;

WORD wSecond;

int iKernAmount;

} KERNINGPAIR, *LPKERNINGPAIR;

Поля структуры

wFirst

Код первого символа в составе кернинговой пары.

wSecond

Код второго символа в составе кернинговой пары.

iKernAmount

Размер кернинга, если эти символы будут располагаться друг за другом. Обычно это значение меньше нуля, так как при кернинге символы располагаются ближе друг к другу чем без кернинга. Значение указано в логических единицах. Это значит, что оно зависит от текущего режима отображения (mapping mode).

Заголовочный файл: wingdi.h (включен в windows.h)


KEYBDINPUT

Содержит информацию об имитируемом событии клавиатуры.

Прототип

typedef struct tagKEYBDINPUT {

WORD wVk;

WORD wScan;

DWORD dwFlags;

DWORD time;

ULONG_PTR dwExtraInfo;

} KEYBDINPUT, *PKEYBDINPUT;

Поля структуры

wVk

Код виртуальной клавиши. Данный параметр принимает значения от 1 до 254. Допустимые значения кодов приведены здесь. Если поле dwFlags содержит флаг KEYEVENTF_UNICODE, то поле wVk должно содержать значение ноль.

wScan

Аппаратный скан код (scan code) клавиши. Если поле dwFlags содержит флаг KEYEVENTF_UNICODE, поле wScan задает символ Unicode, который будет отправлен приложению переднего плана.

dwFlags

Набор флагов, задающих аспекты события. Допустимые флаги перечислены ниже.

KEYEVENTF_EXTENDEDKEY (0x0001) - если он задан, то перед скан кодом стоит байт префикса 0xE0 (224).

KEYEVENTF_KEYUP (0x0002) - клавиша отпускается. Если этот флаг не задан, то клавиша нажимается.

KEYEVENTF_SCANCODE (0x0008) - поле wScan задает клавишу, а поле wVk игнорируется.

KEYEVENTF_UNICODE (0x0004) - система синтезирует набор клавиш (keystroke) VK_PACKET. Поле wVk должно содержать значение ноль. Данный флаг должен объединяться с флагом KEYEVENTF_KEYUP.

time

Время события в миллисекундах. Если значение этого поля равно нулю, то система сама поставит время.

dwExtraInfo

Дополнительное значение, ассоциированное с сообщением. Для получения этой информации приложение может использовать функцию GetMessageExtraInfo.

Примечание

Помимо событий клавиатуры поддерживаются неклавиатурные методы ввода, такие как распознавание ручного ввода, или распознавание голоса также, как если бы это был текстовый ввод с флагом KEYEVENTF_UNICODE. Если задан флаг KEYEVENTF_UNICODE, функция SendInput отправляет сообщение WM_KEYDOWN или WM_KEYUP в очередь сообщений потока переднего плана с параметром wParam равным VK_PACKET. Функция GetMessage или PeekMessage извлечет это сообщение, он будет передано в функцию TranslateMessage, которая отправит сообщение WM_CHAR с символом Unicode, заданным в поле wScan. Если сообщение отправляется ANSI окну, то этот символ будет автоматически сконвертирован в соответствующее значение ANSI.

Для определения клавиатурного ввода в терминах скан кодов (scan code) установите флаг KEYEVENTF_SCANCODE. Это полезно для имитации клавиатурного ввода, независящего от используемой клавиатуры. Значение виртуальной клавиши может изменяться в зависимости от текущей раскладки клавиатуры (keyboard layout), или от того, какие еще клавиши были нажаты. В отличие от него скан код всегда постоянен.

Заголовочный файл: winuser.h (включен в windows.h)


LOGBRUSH

Описывает стиль, цвет и шаблон физической кисти. Данная структура используется в функциях CreateBrushIndirect и ExtCreatePen.

Прототип

typedef struct tagLOGBRUSH {

UINT lbStyle;

COLORREF lbColor;

ULONG_PTR lbHatch;

} LOGBRUSH, *PLOGBRUSH;

Поля структуры

lbStyle

Стиль кисти. Допустимые значения этго поля перечислены здесь.

lbColor

Цвет, которым рисует кисть. Если значение поля lbStyle равно BS_HOLLOW или BS_PATTERN, то значение поля lbColor игнорируется.

Если значение поля lbStyle равно BS_DIBPATTERN или BS_DIBPATTERNPT то младшее слово значения поля lbColor определяет что конкететно содержится в массиве bmiColors структуры BITMAPINFO, значения цветов в формате RGB или индексы в текущей логической палитре. Допустимые значения поля lbColor перечислены ниже.

DIB_PAL_COLORS - таблица цветов состоит из массива 16-разрядных индексов в текущей логической палитре.

DIB_RGB_COLORS - таблица цветов состоит из значений в формате RGB.

Если значение поля lbStyle равно BS_HATCHED или BS_SOLID, то поле lbColor должно содержать цвет в виде значения типа COLORREF. Для его создания используйте макрос RGB.

lbHatch

Стиль штриховки. Значение этого поля зависит от стиля кисти, заданного в поле lbStyle.

Если значение поля lbStyle равно BS_DIBPATTERN, то поле lbHatch содержит описатель упакованного растрового изобрпажения, не зависящего от устройства (Device Independent Bitmap - DIB). Для получения этого описателя приложение вызывает функцию GlobalAlloc с флагом GMEM_MOVEABLE (или LocalAlloc с флагом LMEM_MOVEABLE) для выделения блока памяти и затем полмещает в этот блок упакованное DIB. Упакованное DIB состоит из структуры BITMAPINFO, сразу за которой располагается массив байтов, описывающих отдельные пиксели растрового изображения.

Если значение поля lbStyle равно BS_DIBPATTERNPT, то поле lbHatch содержит указатель на упакованное DIB. Данный указатель получается на основе блока памяти созданного функцией LocalAlloc с флагом LMEM_FIXED или функцией GlobalAlloc с флагом GMEM_FIXED, также его возвращает функция LocalLock. Упакованное DIB состоит из структуры BITMAPINFO, сразу за которой располагается массив байтов, описывающих отдельные пиксели растрового изображения.

Если значение поля lbStyle равно BS_HATCHED, то поле lbHatch задает ориентацию линий штриховки. Допустимые значения перечислены здесь.

Если значение поля lbStyle равно BS_PATTERN, то поле lbHatch содержит описатель битовой карты (bitmap), задающей шаблон. Битовая карта не может быть DIB-секцией растрового изображения (bitmap), которую создает функция CreateDIBSection.

Если значение поля lbStyle равно BS_SOLID или BS_HOLLOW, то значение поля lbHatch игнорируется.

Примечание

Хотя поле lbColor задает цвет переднего плана (foreground) заштрихованной кисти, цвет фона по-прежнему управляется функциями SetBkMode и SetBkColor.

Заголовочный файл: wingdi.h (включен в windows.h)


LOGFONT

Описывает атрибуты шрифта.

Прототип

typedef struct tagLOGFONT {

LONG lfHeight;

LONG lfWidth;

LONG lfEscapement;

LONG lfOrientation;

LONG lfWeight;

BYTE lfItalic;

BYTE lfUnderline;

BYTE lfStrikeOut;

BYTE lfCharSet;

BYTE lfOutPrecision;

BYTE lfClipPrecision;

BYTE lfQuality;

BYTE lfPitchAndFamily;

TCHAR lfFaceName[LF_FACESIZE];

} LOGFONT, *PLOGFONT;

Поля структуры

lfHeight

Высота в логических единицах символьной ячейки шрифта или символа. Значение высоты символа является величиной высоты ячейки символа, минус величина внутреннего межстрочного интервала. Механизм отображения логического шрифта в физический интерпретирует значение, указанное в поле lfHeight следующим образом.

>0 - Механизм отображения логического шрифта в физический преобразует эту величину в единицы измерения устройства, сверяя с высотой ячейки доступных шрифтов.

0 - используется заданное по умолчанию значение высоты.

<0 - Механизм отображения логического шрифта в физический преобразует эту величину в единицы измерения устройства, сверяя его абсолютную величину с высотой ячейки доступных шрифтов.

При сравнении высоты, механизм отображения логического шрифта в физический ищет наибольший шрифт, который не выходит за пределы требуемого размера.

Это отображение происходит тогда, когда шрифт используется в первый раз.

lfWidth

Средняя ширина, в логических единицах, символов шрифта. Если её значение равно нулю, то отношение ширины знака устройства к высоте знака согласуется, опираясь на преобразование в цифровую форму отношения ширины знака доступных шрифтов к его высоте, чтобы найти самое близкое соответствие, опрределенное абсолютной величиной разности.

lfEscapement

Угол, в десятых долях градуса, между вектором наклона и осью X устройства. Вектор наклона параллелен к основной линии строки текста.

Когда графический режим установлен с флагом GM_ADVANCED, вы можете задать угол наклона строки независимо от ориентации угла символов строки.

Когда графический режим установлен с флагом GM_COMPATIBLE, поле lfEscapement задает и наклон и ориентацию. Значения полей lfEscapement и lfOrientation должны совпадать.

lfOrientation

Угол, в десятых долях градуса, между основной линией каждого символа и осью X устройства.

lfWeight

Насыщенность шрифта в интервале от 0 до 1000. Например, 400 - нормальная; 700 - полужирная. Если его значение равно нулю, то используется насыщенность по умолчанию. Для удобства определен набор констант насыщенности. Он представлен здесь.

lfItalic

Если значение TRUE, то используется курсивный шрифт.

lfUnderline

Если значение TRUE, то используется подчеркнутый шрифт.

lfStrikeOut

Если значение TRUE, то используется зачеркнутый шрифт.

lfCharSet

Набор символов. Предопределенные наборы символов перечислены здесь.

Значение OEM_CHARSET устанавливает набор символов, зависящий от операционной системы.

DEFAULT_CHARSET устанавливает набор символов, основанный на текущей системной локали. Например, когда системной локалью является Английский язык, он возвращает значение ANSI_CHARSET.

В операционной системе могут существовать шрифты с другими наборами символов. Если приложение использует шрифт с неизвестным набором символов, то оно не должно пытаться транслировать или интерпретировать строки, представленные этим шрифтом.

Это поле важно для процесса отображения шрифтов. Чтобы гарантировать совместимые результаты, необходимо задать корректный набор символов. Если вы устанавливаете название шрифта в поле lfFaceName, то удлостоверьтесь, что значение lfCharSet соответствует набору символов шрифта, указанного в lfFaceName.

lfOutPrecision

Точность вывода. Она определяет как точно вывод должен соответствовать высоте требуемого шрифта, ширине, ориентации символов, наклону, шагу разрядки и типу шрифта. Его значением может быть одно из значений перечисленных здесь.

Приложения могут использовать значение OUT_DEVICE_PRECIS, OUT_RASTER_PRECIS, OUT_TT_PRECIS и OUT_PS_ONLY_PRECIS для управления выбором шрифта при наличии нескольких шрифтов с одинаковым наименованием. Например, если операционная система содержит шрифт Symbol в растровом формате и в формате TrueType, то значение OUT_TT_PRECIS укажет системе выбрать шрифт в формате TrueType. Значение OUT_TT_ONLY_PRECIS вынуждает систему использовать шрифт в формате TrueType даже если он имеет другое наименование.

lfClipPrecision

Точность отсечения. Она определяет, как отсечь символы, которые частично находятся вне области отсечения. Поле может принимать одно из значений, перечисленных здесь, или их комбинацию.

lfQuality

Качество вывода. Оно определяет, как тщательно графический интерфейс устройства (GDI) должен пытаться найти соответствие атрибутов логического шрифта с такими же атрибутами фактического физического шрифта. Значение данного может принимать одно из значений, перечисленных здесь.

Если не выбрано ни значение ANTIALIASED_QUALITY, ни NONANTIALIASED_QUALITY, то шрифт сглаживается только в том случае, если пользователь выбрал в Панели Управления гладкие шрифты для видеотерминала.

lfPitchAndFamily

Ширина символов и семейство шрифта. Два младших бита устанавливают ширину символов шрифта и могут принимать одно из перечисленных ниже значений.

DEFAULT_PITCH

FIXED_PITCH

VARIABLE_PITCH

Биты с 4 по 7 этого поля структуры содержат семейство шрифта и принимают одно из значений, перечисленных здесь.

Для получения полного значения поля структуры может быть использована операция OR.

Семейство шрифта описывает внешний вид шрифта в общих чертах. Они необходимы для определения шрифта, когла его точное наименование недоступно.

lfFaceName

Заканчивающаяся нулем строка, которая содержит наименование шрифта. Длина этой строки не должна превышать 32 символов TCHAR, включая завершающий нуль. Если lfFaceName - это пустая строка, то GDI использует первый найденный шрифт, который соответствует другим указанным атрибутам.

Примечание

При нижеследующих обстоятельствах сглаживание шрифта по технологии ClearType не поддерживается.

· Текст отображается на принтере.
· Вывод на экран установлен для 256 цветов или меньше.
· Текст обрабатывается клиентом терминального сервера.
· Используемый шрифт не является шрифтом TrueType или шрифтом в формате OpenType с контурами в формате TrueType.Например, следующие шрифты не поддерживают сглаживание ClearType: Type 1, Postscript OpenType без контуров формата TrueType, растровые, векторные шрифты и шрифты, поставляемые с устройством.
· Используемый шрифт настроен на внелренные точечные рисунки, для любых размеров шрифта, которые содержат внедренные точечные рисунки. Это обычно встречается в восточно-азиатских шрифтах.

Заголовочный файл: wingdi.h (включен в windows.h)


LOGPALETTE

Описывает логическую палитру.

Прототип

typedef struct tagLOGPALETTE {

WORD palVersion;

WORD palNumEntries;

PALETTEENTRY palPalEntry[1];

} LOGPALETTE;

Поля структуры

palVersion

Номер версии системы.

palNumEntries

Количество элементов в логической палитре.

palPalEntry

Массив структур PALETTEENTRY, описывающих цвет и использование каждого элемента логической палитры.

Примечание

Цвета в палитре должны располагаться в порядке важности, так как первые элементы палитры скорее всего будут помещены в системную палитру.

Заголовочный файл: wingdi.h (включен в windows.h)


LOGPEN

Описывает стиль, ширину и цвет пера. Данную структуру использует функция CreatePenIndirect.

Прототип

typedef struct tagLOGPEN {

UINT lopnStyle;

POINT lopnWidth;

COLORREF lopnColor;

} LOGPEN, *PLOGPEN;

Поля структуры

lopnStyle

Стиль пера. Допустимые значения этого поля перечислены здесь.

lopnWidth

Структура POINT, содержащая ширину пера в логических единицах. Если значение этого поля равно NULL, то на растровых устройствах перо имеет ширину один пиксель. Поле y структуры POINT не используется.

lopnColor

Цвет пера. Для создания значения типа COLORREF используйте макрос RGB.

Примечание

Если ширина пера больше единицы, а стиль пера PS_INSIDEFRAME, то для всех объектов GDI кроме полигонов и ломаных линия отрисовывается внутри фрейма. Если цвет пера не является доступным значением RGB, то используется логический (смешанный) цвет. Если ширина пера меньше или равна единице, то стиль PS_INSIDEFRAME эквивалентен стилю PS_SOLID.

Заголовочный файл: wingdi.h (включен в windows.h)


MAT2

Содержит значения для трансформационной матрицы, которую использует функция GetGlyphOutline.

Прототип

typedef struct _MAT2 {

FIXED eM11;

FIXED eM12;

FIXED eM21;

FIXED eM22;

} MAT2, *LPMAT2;

Поля структуры

eM11

Структура FIXED, содержащая элемент M11 трансформационной матрицы 3 на 3.

eM12

Структура FIXED, содержащая элемент M12 трансформационной матрицы 3 на 3.

eM21

Структура FIXED, содержащая элемент M21 трансформационной матрицы 3 на 3.

eM22

Структура FIXED, содержащая элемент M22 трансформационной матрицы 3 на 3.

Примечание

Матрица тождественного преобразования осуществляет трансформацию, в которой трансформированные графические объекты идентичны исходным объектам. В этой матрице, значение eM11 равно 1, значение eM12 нуль, значение eM21 нуль, значение eM22 единица.

Заголовочный файл: wingdi.h (включен в windows.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)


MDINEXTMENU

Содержит информацию об активируемом меню.

Прототип

typedef struct tagMDINEXTMENU {

HMENU hmenuIn;

HMENU hmenuNext;

HWND hwndNext;

} MDINEXTMENU, *PMDINEXTMENU;

Поля структуры

hmenuIn

Описатель текущего меню.

hmenuNext

Описатель активируемого меню.

hwndNext

Описатель окна, которое будет получать уведомительные сообщения от меню.

Заголовочный файл: winuser.h (включен в windows.h)


MENUBARINFO

Содержит информацию о полоске меню (menu bar).

Прототип

typedef struct tagMENUBARINFO {

DWORD cbSize;

RECT rcBar;

HMENU hMenu;

HWND hwndMenu;

BOOL fBarFocused;

BOOL fFocused;

} MENUBARINFO, *PMENUBARINFO;

Поля структуры

cbSize

Размер стурктуры, в байтах. Ваше приложение должно записать в это поле значение sizeof(MANUBARINFO).

rcBar

Координаты полоски меню, выскакивающего (popup) меню, или пункта меню.

hMenu

Описатель полоски меню или выскакивающего меню.

hwndMenu

Описатель подменю.

fBarFocused

Если полоска меню или выскакивающее меню владеет фокусом ввода, то данное поле содержит значение TRUE. В противном случае данное поле содержит значение FALSE.

fFocused

Если пункт меню владеет фокусом ввода, то данное поле содержит значение TRUE. В противном случае оно содержит значение FALSE.

Заголовочный файл: winuser.h (включен в windows.h)


MENUGETOBJECTINFO

Содержит информацию о меню, над которым располагается курсор мыши.

Прототип

typedef struct tagMENUGETOBJECTINFO {

DWORD dwFlags;

UINT uPos;

HMENU hmenu;

PVOID riid;

PVOID pvObj;

} MENUGETOBJECTINFO, *PMENUGETOBJECTINFO;

Поля структуры

dwFlags

Положение курсора мыши внутри пункта меню, задаваемого полем uPos. Данное поле принимает одно из значений, перечисленных ниже.

MNGOF_BOTTOMGAP (0x00000002) - курсор находится в нижней части пункта меню uPos.

MNGOF_TOPGAP (0x00000001) - курсор находится в верхней части пукта меню uPos.

Если ни один из этих флагов не задан, то курсор находится непосредственно над пунктом меню uPos.

uPos

Положение пункта меню, над которым находится курсор мыши.

hmenu

Описатель меню, над которым находится курсор мыши.

riid

Идентификатор запрошенного интерфейса. Сейчас это может быть только IDropTarget.

pvObj

Указатель на интерфейс, задаваемый полем riid. Данный указатель возвращается приложением при обработке сообщения.

Примечание

Структура MENUGETOBJECTINFO используется только в меню, поддерживающих операции drag-and-drop. При отправке сообщения WM_MENUGETOBJECT, его параметр lParam указывает на структуру MENUGETOBJECTINFO.

Для создания меню, поддерживающего операции drag-and-drop, вызовите функцию SetMenuInfo с флагом MNS_DRAGDROP.

Заголовочный файл: winuser.h (включен в windows.h)


MENUINFO

Содержит информацию о меню.

Прототип

typedef struct tagMENUINFO {

DWORD cbSize;

DWORD fMask;

DWORD dwStyle;

UINT cyMax;

HBRUSH hbrBack;

DWORD dwContextHelpID;

ULONG_PTR dwMenuData;

} MENUINFO, *LPMENUINFO, const *LPCMENUINFO;

Поля структуры

cbSize

Размер структуры, в байтах. Приложение должно записать в это поле значение sizeof(MENUINFO).

fMask

Набор флагов, задающих устанавливаемые или запрашиваемые поля. Допустимые флаги перечислены ниже.

MIM_APPLYTOSUBMENUS (0x80000000) - настройки применяются к меню и ко всем его подменю. Функция SetMenuInfo использует этот флаг, а функция GetMenuInfo его игнорирует.

MIM_BACKGROUND (0x00000002) - возвращает или устанавливает значение поля hbrBack.

MIM_HELPID (0x00000004) - возвращает или устанавливает значение поля dwContextHelpID.

MIM_MAXHEIGHT (0x00000001) - возвращает или устанавливает значение поля cyMax.

MIM_MENUDATA (0x00000008) - возвращает или устанавливает знчаение поля dwMenuData.

MIM_STYLE (0x00000010) - возвращает или устанавливает значение поля dwStyle.

dwStyle

Стиль меню. Данное поле содержит одно из значений, перечисленных ниже, или их комбинацию.

MNS_AUTODISMISS (0x10000000) - меню автоматически закрывается, если курсор мыши находится вне его границ приблизительно 10 секунд.

MNS_CHECKORBMP (0x04000000) - для галочки (check mark) и растрового изображения (bitmap) резервируется место. Если отображается галочка, то растровое изображение не отображается. Все галочки и растровые изображения выровнены. Данный стиль используется для меню, в котором некоторые пункты пользуются галочками, а некоторые - растровыми изображениями.

MNS_DRAGDROP (0x20000000) - пункт меню является целевым или исходным местом операции перетаскивания OLE. Владелец меню принимает сообщения WM_MENUDRAG и WM_MENUGETOBJECT.

MNS_MODELESS (0x40000000) - меню немодальное, то есть во время отображения меню не создается модального цикла обработки сообщений.

MNS_NOCHECK (0x80000000) - слева от меню не резервируется место для галочки. Пункт меню может быть выбран, но рядом с ним не будет отображаться галочка.

MNS_NOTIFYBYPOS (0x08000000) - когда пользователь выбирает пункт меню, его владельцу отправляется сообщение WM_MENUCOMMAND, а не WM_COMMAND. MNS_NOTIFYBYPOS - это стиль заголовка меню, он не работает применительно к отдельным подменю.

cyMax

Максимальная высота меню в пикселях. Когда меню превышает это значение, автоматически используется полоса прокрутки. Если знчаеие этого поля равно нулю, то используется высота экрана.

hbrBack

Описатель кисти, используемой для фона меню.

dwContextHelpID

Идентификатор контекста помощи. Это же значение используется в функциях GetMenuContextHelpId и SetMenuContextHelpId.

dwMenuData

Определенное приложением значение.

Заголовочный файл: winuser.h (включен в windows.h)


MENUITEMINFO

Содержит информацию о пункте меню.

Прототип

typedef struct tagMENUITEMINFO {

UINT cbSize;

UINT fMask;

UINT fType;

UINT fState;

UINT wID;

HMENU hSubMenu;

HBITMAP hbmpChecked;

HBITMAP hbmpUnchecked;

ULONG_PTR dwItemData;

LPTSTR dwTypeData;

UINT cch;

HBITMAP hbmpItem;

} MENUITEMINFO, *LPMENUITEMINFO;

Поля структуры

cbSize

Размер структуры, в байтах. Приложение должно записать в это поле значение sizeof(MENUITEMINFO).

fMask

Определяет поля структуры, которые будут возвращены или установлены. Данное поле содержит одно из значений, перечисленных здесь, или их комбинацию.

fType

Тип пункта меню. Данное поле содержит одно из значений, перечисленных здесь, или их комбинацию.

Флаги MFT_BITMAP, MFT_SEPARATOR и MFT_STRING не могут сочетаться друг с другом.

Поле fType используется только если в поле fMask установлен флаг MIIM_FTYPE или MIIM_TYPE.

fState

Состояние пункта меню. Данное поле содержит одно из значений, перечисленных здесь, или их комбинацию.

Для использования поля fState установите в поле fMask флаг MIIM_STATE.

wID

Определенное приложением значение, идентифицирующее пункт меню. Для использования этого поля, установите в поле fMask флаг MIIM_ID.

hSubMenu

Описатель раскрывающегося меню или подменю, ассоциированного с пунктом меню. Если пункт меню не открывает раскрывающееся меню или подменю, то значение поля hSubMenu равно NULL. Для использования поля hSubMenu, установите в поле fMask флаг MIIM_SUBMENU.

hbmpChecked

Описатель растрового изображения, отображаемого рядом с пунктом меню, когда он выбран. Если значение этого поля равно NULL, то используется растровое изображение по умолчанию. Если задан тип MFT_RADIOCHECK, то изображением по умолчанию является жирная точка (bullet). В противном случае, это флажок (check mark). Для использования поля hbmpChecked установите в поле fMask флаг MIIM_CHECKMARKS.

hbmpUnchecked

Описатель растрового изображения, отображаемого рядом с пунктом меню, когда он не выбран. Если значение этого поля равно NULL, то растровое изображение не используется. Для использования поля hbmpUnchecked, установите в поле fMask флаг MIIM_CHECKMARKS.

dwItemData

Определенное приложением значение, ассоциированное с пунктом меню. Для использования этого поля, установите в поле fMask флаг MIIM_DATA.

dwTypeData

Содержимое пункта меню. Значение этого поля зависит от значения в поле fType и используется только если в поле fMask установлен флаг MIIM_TYPE.

При получении содержимого пункта меню типа MFT_STRING, первоначально нужно определить размер строки. Для этого в поле dwTypeData установите значение NULL и вызовите функцию GetMenuItemInfo. Значение cch+1 составит требуемый размер. Затем выбелите память под буфер этого размера, разместите указатель на него в поле dwTypeData, увеличьте на единицу значение поля cch, и повторно вызовите функцию GetMenuItemInfo для заполнения буфера строкой. Если пункт меню имеет другой тип, то функция GetMenuItemInfo запишет в поле dwTypeData значение, тип которого зависит от значения поля fType.

При использовании функции SetMenuItemInfo, поле dwTypeData должно содержать значение, тип которого соответствует значению поля fType.

Поле dwTypeData используется только, если в поле fMask установлен флаг MIIM_STRING или MIIM_TYPE.

cch

Длина текста пункта меню, в символах, при получении информации о пункте меню типа MFT_STRING. Поле cch используется только если в поле fMask установлен флаг MIIM_TYPE, в противном случае значение этого поля равно нулю. Также, значение поля cch игнорируется при установке содержимого пункта меню функцией SetMenuItemInfo.

Перед использованием функции GetMenuItemInfo, приложение должно записать в поле cch длину буфера, на который указывает поле dwTypeData. Если запрашивается информация о пункте меню типа MFT_STRING (задается в поле fType), то функция GetMenuItemInfo устанавливает в поле cch длину текста пункта меню. Если же запрашивается информация о пункте меню какого-либо другого типа, то функция GetMenuItemInfo устанавливает в поле cch значение нуль.

Поле ссh используется только, если в поле fMask установлен флаг MIIM_STRING или MIIM_TYPE.

hbmpItem

Описатель отображаемого растрового изображения. Данное поле может содержать одно из значений, перечисленных здесь. Данное поле используется только если в поле fMask установлен флаг MIIM_BITMAP.

Примечание

Структура MENUITEMINFO используется совместно с функциями GetMenuItemInfo, InsertMenuItem и SetMenuItemInfo.

Меню может отображать пункты с использованием текста, растрового изображения, или и текста и растрового изображения.

Заголовочный файл: winuser.h (включен в windows.h)


MENUITEMTEMPLATE

Описывает пункт меню в шаблоне меню.

Прототип

typedef struct {

WORD mtOption;

WORD mtID;

WCHAR mtString[1];

} MENUITEMTEMPLATE, *PMENUITEMTEMPLATE;

Поля структуры

mtOption

Набор флагов, определяющих отображение пункта меню. Допустимые значения флагов перечислены ниже.

MF_CHECKED (0x00000008L) - рядом с пунктом меню отображается галочка выбора (check mark).

MF_GRAYED (0x00000001L) - пункт меню изначально неактивен и отображается закрашенным серым цветом.

MF_HELP (0x00004000L) - пункт меню имеет слева от себя вертикальную разделительную линию (vertical separator).

MF_END - пункт является последним в списке текущего меню.

MF_MENUBARBREAK (0x00000020L) - пункт меню располагается в новой колонке. Старые и новые колонки разделяются полоской (bar).

MF_MENUBREAK (0x00000040L) - пункт меню располагается в новой колонке.

MF_OWNERDRAW (0x00000100L) - за отрисовку пункта меню, включая его подсветку, выбор и неактивное состояние, отвечает окно, которому принадлежит меню. Данный флаг недопустим для пункта меню в полоске меню (menu bar).

MF_POPUP (0x00000010L) - пункт меню открывает раскрывающееся меню или подменю. Пункты меню, задаваемые в шаблоне после пункта с флагом MF_POPUP формируют раскрывающееся меню. Пункт меню с флагом MF_END является последним пунктом в раскрывающемся меню.

mtID

Идентификатор пункта меню. Данное значение отправляется окну, владеющему меню. Поле mtID отсутствует в структуре MENUITEMTEMPLATE, если последняя описывает раскрывающееся меню или подменю.

mtString

Unicode строка с наименованием пункта меню.

Примечание

Из комментария к статье msdn: если значение поля mtString равно 0x0000, то это значит, что пункт меню является разделителем. В этом случае поле mtID также должно содержать значение 0x0000.

Заголовочный файл: winuser.h (включен в windows.h)


MENUITEMTEMPLATEHEADER

Описывает заголовок шаблона меню. Шаблон меню состоит из заголовка и одного или нескольких списков пунктов меню.

Прототип

typedef struct {

WORD versionNumber;

WORD offset;

} MENUITEMTEMPLATEHEADER, *PMENUITEMTEMPLATEHEADER;

Поля структуры

versionNumber

Номер версии. Значение данного поля должно быть равно нулю.

offset

Смещение данных, в байтах, от конца заголовка. Список пунктов меню начинается с этого смещения. Обычно, значение данного поля равно нулю, и список пунктов меню начинается сразу за заголовком.

Примечание

Список пунктов меню состоит из одной или нескольких структур MENUITEMTEMPLATE.

Заголовочный файл: winuser.h (включен в windows.h)


METAFILEPICT

Описывает формат метафайла изображения используемый для обмена данными метафайла с помощью буфера обмена.

Прототип

typedef struct tagMETAFILEPICT {

LONG mm;

LONG xExt;

LONG yExt;

HMETAFILE hMF;

} METAFILEPICT, *LPMETAFILEPICT;

Поля структуры

mm

Режим отображения, в котором отрисовывается изображение.

xExt

Размер изображения для всех режимов, за исключением MM_ISOTROPIC и MM_ANISOTROPIC. Данное поле определяет ширину прямоугольника, внутри которого отрисовывается изображение. Координаты задаются в единицах, зависящих от режима отображения.

yExt

Размер изображения для всех режимов, за исключением MM_ISOTROPIC и MM_ANISOTROPIC. Данное поле определяет высоту прямоугольника, внутри которого отрисовывается изображение. Координаты задаются в единицах, зависящих от режима отображения. Для режимов MM_ISOTROPIC и MM_ANISOTROPIC, которые могут масштабироваться, поля xExt и yExt содержат дополнительный предлагаемый размер в единицах MM_HIMETRIC. Для изображений MM_ANISOTROPIC, значения полей xExt и yExt могут быть равны нулю при отсутствии предлагаемого размера. Для изображений MM_ISOTROPIC соотношение сторон должно указываться, даже если предлагаемый размер отсутствует. (Если предлагаемый размер указан, то соотношение сторон определяется на основе размера). Задать соотношение сторон без указания предлагаемого размера можно путём установки отрицательных значений полей xExt и yExt. Отрицательные значения полей xExt и yExt игнорируются, используется только их отношение.

hMF

Описатель метафайла памяти.

Заголовочный файл: wingdi.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)


MINIMIZEDMETRICS

Содержит масштабируемые метрики свёрнутого окна. Эта структура используется в функции SystemParametrsInfo с параметрами SPI_GETMINIMIZEDMETRICS и SPI_SETMINIMIZEDMETRICS.

Прототип

typedef struct tagMINIMIZEDMETRICS {

UINT cbSize;

int iWidth;

int iHorzGap;

int iVertGap;

int iArrange;

} MINIMIZEDMETRICS, *PMINIMIZEDMETRICS, *LPMINIMIZEDMETRICS;

Поля структуры

cbSize

Размер структуры в байтах. Использующий данную структуру поток должен записать в это поле значение sizeof(MINIMIZEDMETRICS).

iWidth

Ширина свёрнутого окна, в пикселях.

iHorzGap

Расстояние, в пикселях, по горизонтали между упорядоченными свёрнутыми окнами.

iVertGap

Расстояние, в пикселях, по вертикали между упорядоченными свёрнутыми окнами.

iArrange

Начальное положение и направление используемые при упорядочивании свёрнутых окон. Начальное положение задаётся одним из следующих значений:

ARW_BOTTOMLEFT - начало в левом нижнем углу рабочей области.

ARW_BOTTOMRIGHT - начало в правом нижнем углу рабочей области.

ARW_TOPLEFT - начало в левом верхнем углу рабочей области.

ARW_TOPRIGHT - начало в правом верхнем углу рабочей области.

Направление задаётся одним из следующих значений.

ARW_LEFT - влево (совместимо только с ARW_BOTTOMRIGHT и ARW_TOPRIGHT).

ARW_RIGHT - вправо (совместимо только с ARW_BOTTOMLEFT и ARW_TOPLEFT).

ARW_UP - вверх (совместимо только с ARW_BOTTOMLEFT и ARW_BOTTOMRIGHT).

ARW_DOWN - вниз (совместимо только с ARW_TOPLEFT и ARW_TOPRIGHT).

ARW_HIDE - скрывать свёрнутые окна, удаляя их из видимой области экрана.

Заголовочный файл: 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)


MONITORINFO

Содержит информацию о мониторе.

Функция GetMonitorInfo записывает информацию о мониторе в структуру MONITORINFO или MONITORINFOEX.

Структура MONITORINFO является подмножеством структуры MONITORINFOEX. Структура MONITORINFOEX дополнительно содержит поле со строкой, содержащей наименование монитора.

Прототип

typedef struct tagMONITORINFO {

DWORD cbSize;

RECT rcMonitor;

RECT rcWork;

DWORD dwFlags;

} MONITORINFO, *LPMONITORINFO;

Поля структуры

cbSize

Размер структуры в байтах.

Установите значение этого поля равным sizeof(MONITORINFO) перед вызовом функции GetMonitorInfo. По нему функция определяет какая структура ей передана в качестве параметра.

rcMonitor

Структура RECT, которая описывает прямоугольник монитора, выраженный в координатах виртуального экрана. Заметьте: если монитор не является основным монитором, то некоторые координаты могут иметь отрицательное значение.

rcWork

Структура RECT, которая описывает прямоугольник рабочей области монитора, выраженный в координатах виртуального экрана. Заметьте: если монитор не является основным монитором, то некоторые координаты могут иметь отрицательное значение.

dwFlags

Набор флагов, описывающих атрибуты монитора.

Определен всего один флаг.

MONITORINFOF_PRIMARY - монитор является основным монитором.

Заголовочный файл: winuser.h (включен в windows.h)


MONITORINFOEX

Содержит информацию о мониторе.

Функция GetMonitorInfo записывает информацию о мониторе в структуру MONITORINFO или MONITORINFOEX.

Структура MONITORINFOEX является надмножеством стуруктуры MONITORINFO. Структура MONITORINFOEX дополнительно содержит поле со строкой, содержащей наименование монитора.

Прототип

typedef struct tagMONITORINFOEX {

DWORD cbSize;

RECT rcMonitor;

RECT rcWork;

DWORD dwFlags;

TCHAR szDevice[CCHDEVICENAME];

} MONITORINFOEX, *LPMONITORINFOEX;

Поля структуры

cbSize

Размер структуры в байтах.

Установите значение этого поля равным sizeof(MONITORINFOEX) перед вызовом функции GetMonitorInfo. По нему функция определяет какая структура ей передана в качестве параметра.

rcMonitor

Структура RECT, которая описывает прямоугольник монитора, выраженный в координатах виртуального экрана. Заметьте: если монитор не является основным монитором, то некоторые координаты могут иметь отрицательное значение.

rcWork

Структура RECT, которая описывает прямоугольник рабочей области монитора, выраженный в координатах виртуального экрана. Окна используют этот прямоугольник для разворачивания приложения на экране. Нерабочая область rcMonitor содержит такие системные окна как: панель задач и боковые панели (side bars). Заметьте: если монитор не является основным монитором, то некоторые координаты могут иметь отрицательное значение.

dwFlags

Набор флагов, описывающих атрибуты монитора.

Определен всего один флаг.

MONITORINFOF_PRIMARY - монитор является основным монитором.

szDevice

Строка, которая определяет наименование используемого монитора. Большинство приложений не используют наименование монитора, поэтому они могут сэкономить несколько байт, используя структуру MONITORINFO.

Заголовочный файл: winuser.h (включен в windows.h)


MOUSEINPUT

Содержит информацию об имитируемом событии мыши.

Прототип

typedef struct tagMOUSEINPUT {

LONG dx;

LONG dy;

DWORD mouseData;

DWORD dwFlags;

DWORD time;

ULONG_PTR dwExtraInfo;

} MOUSEINPUT, *PMOUSEINPUT;

Поля структуры

dx

Абсолютное положение мыши, или величина перемещения с момента предыдущего события мыши, в зависимости от значения поля dwFlags. Абсолютное положение задается как горизонтальная координата мыши; оносительное перемещение задается в виде числа пикселей.

dy

Абсолютное положение мыши, или величина перемещения с момента предыдущего события мыши, в зависимости от значения поля dwFlags. Абсолютное положение задается как вертикальная координата мыши; оносительное перемещение задается в виде числа пикселей.

mouseData

Если поле dwFlags содержит флаг MOUSEEVENTF_WHEEL, то в поле mouseData хранится величина перемещения колёсика мыши. Положительное значение указывает, что колёсико было повернуто в прямом направлении, от пользователя; отрицательное значение указывает, что колёсико было повернуто в обрантом направлении, к пользователю. Одно деление колёсика (wheel click) задано как WHEEL_DELTA, или 120.

Windows Vista: если поле dwFlags содержит флаг MOUSEEVENTF_HWHEEL, то поле mouseData содержит величину перемещения. Положительное значение говорит о том, что колёсико повернуто вправо; отрицательное значение говорит о том, что колёско было повернуто влево. Одно деление колёсика (wheel click) задано как WHEEL_DELTA, или 120.

Если поле dwFlags не содержит ни один из флагов: MOUSEEVENTF_WHEEL, MOUSEEVENTF_XDOWN или MOUSEEVENTF_XUP, то поле mouseData должно содержать значение ноль.

Если поле dwFlags содержит MOUSEEVENTF_XDOWN или MOUSEEVENTF_XUP, то поле mouseData задает, какая дополнительная кнопка была нажата или отпущена. Допустимые значения перечислены ниже.

XBUTTON1 (0x0001) - первая дополнительная кнопка.

XBUTTON2 (0x0002) - вторая дополнительная кнопка.

dwFlags

Набор флагов, задающих различные аспекты перемещения мыши и щелчка кнопки. Допустимые значения флагов перечислены здесь.

Флаги, описывающие состояние кнопок мыши, задают изменение состояние, а не длительное состояние. Например, если нажата левая кнопка мыши, и она удерживается в нажатом состоянии, то флаг MOUSEEVENTF_LEFTDOWN устанавливается для первого нажатия, но не для последующего удержания. Аналогично, флаг MOUSEEVENTF_LEFTUP устанавливается только тогда, когда кнопка будет отпущена.

Вы не можете одновременно задавать флаги MOUSEEVENTF_WHEEL, MOUSEEVENTF_XDOWN или MOUSEEVENTF_XUP, так как все они используют поле mouseData.

time

Время события в миллисекундах. Если значение этого поля равно нулю, то система сама поставит время.

dwExtraInfo

Дополнительное значение, ассоциированное с событием. Приложение может использовать функцию GetMessageExtraInfo для получения этой дополнительной информации.

Примечание

Если мышь была перемещена, то установлен флаг MOUSEEVENTF_MOVE, при этом поля dx и dy содержат информацию о перемещении. Она задается в виде абсолютных или относительных целых величин.

Если задан флаг MOUSEEVENTF_ABSOLUTE, то поля dx и dy содержат абсолютные координаты в интервале между 0 и 65535. Процедура обработки события отображает эти координаты на поверхность экрана. Точка (0;0) отображается в левый верхний угол поверхности экрана; точка (65535, 65535) отображается в правый нижний угол. На системах с несколькими мониторами, координаты отображаются внутри основного монитора.

Если установлен флаг MOUSEEVENTF_VIRTUALDESK, координаты отображаются внутри всего виртуального рабочего стола (virtual desktop).

Если флаг MOUSEEVENTF_ABSOLUTE не установлен, то поля dx и dy задают перемещение мыши относительно положения в момент последнего события (последнее сообщенное положение). Положительные значения говорят о том, что мышь сместилась вправо (вниз); отрицательные значения говорят о том, что мышь сместилась влево (вверх).

Относительное перемещение зависит от скоорости мыши и двух пороговых значений мыши. Пользователь может изменить эти три параметра в настройке "Перемещение" на вкладке "Параметры указателя" в настройках мыши Панели Управления (см. рис. ниже). Вы можете получить и изменить значения этих параметров с помощью функции SystemParametersInfo.

Система применяет два теста для определения относительного перемещения мыши. Если заданное расстояние вдоль оси X или Y больше первого порогового значения мыши (threshold value), и скорость мыши отлична от нуля, система удваивает расстояние. Если заданное расстояние вдоль оси X или Y больше второго порогового значения мыши, и скорость мыши равна двум, система удваивает расстояние, полученное в результате первого теста. Таким образом возможна ситуация, при которой относительное перемещение мыши вдоль оси X или Y будет увеличено в 4 раза.

Заголовочный файл: winuser.h (включен в windows.h)


MOUSEKEYS

Содержит информацию о настройках режима управления курсором мыши (MouseKeys accessibility feature). Когда режим управления курсором мыши активирован, пользователь может использовать клавишы цифровой панели клавиатуры для управления курсором мыши, выполнения щелчков, двойных щелчков и пермещения объектов. Нажатием на клавишу NumLock пользователь может переключать цифровую панель между режимом управления мышью и режимом обычных операций.

Прототип

typedef struct _MOUSEKEYS {

DWORD cbSize;

DWORD dwFlags;

DWORD iMaxSpeed;

DWORD iTimeToMaxSpeed;

DWORD iCtrlSpeed;

DWORD dwReserved1;

DWORD dwReserved2;

} MOUSEKEYS, *LPMOUSEKEYS;

Поля структуры

cbSize

Размер структуры в байтах.

dwFlags

Набор флагов, которые определяют свойства режима управления курсором мыши. Допустимые флаги перечислены здесь.

iMaxSpeed

Максимальная скорость курсора мыши, при нажатой клавише перемещения курсора.

Windows 95/98: проверка диапазона не производится.

Windows NT/2000: допустимые значения должны находиться в интервале: от 10 до 360.

iTimeToMaxSpeed

Длительность, в миллисекундах, прмежутка времени, в течение которого курсор мыши должен развивать свою максимальную скорость при нажатой клавише перемещения курсора. Допустимые значения должны находиться в интервале: от 1000 до 5000.

iCtrlSpeed

Задает множитель, применяемый к скорости курсора мыши, когда пользователь удерживает в нажатом состоянии клавишу Ctrl, во время перемещения курсора мыши. Если флаг MKF_MODIFIERS не установлен, то значение данного поля игнорируется.

dwReserved1

Зарезервировано для будущего использования. Значение данного поля должно быть равно нулю.

dwReserved2

Зарезервировано для будущего использования. Значение данного поля должно быть равно нулю.

Примечание

Приложение использует структуру MOUSEKEYS при вызове функции SystemParametersInfo с параметром uiAction равным SPI_GETMOUSEKEYS или SPI_SETMOUSEKEYS. При использовании SPI_GETMOUSEKEYS приложение должно указать значение поля cbSize структуры MOUSEKEYS. Функция SystemParametersInfo заполняет все остальные поля. При использовании SPI_SETMOUSEKEYS приложение должно заполнять все поля структуры.

Если вы используете функцию SystemParametersInfo со значением SPI_SETMOUSEKEYS, то следующие флаги игнорируются: MKF_LEFTBUTTONDOWN, MKF_LEFTBUTTONSEL, MKF_MOUSEMODE, MKF_RIGHTBUTTONDOWN и MKF_RIGHTBUTTONSEL.

Заголовочный файл: 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)


MSGBOXPARAMS

Содержит информацию, используемую для отображения окна сообщения. Данную структуру использует функция MessageBoxIndirect.

Прототип

typedef struct {

UINT cbSize;

HWND hwndOwner;

HINSTANCE hInstance;

LPCTSTR lpszText;

LPCTSTR lpszCaption;

DWORD dwStyle;

LPCTSTR lpszIcon;

DWORD_PTR dwContextHelpId;

MSGBOXCALLBACK lpfnMsgBoxCallback;

DWORD dwLanguageId;

} MSGBOXPARAMS, *PMSGBOXPARAMS;

Поля структуры

cbSize

Размер структуры, в байтах.

hwndOwner

Описатель окна-владельца. Данное может содержать значение NULL.

hInstance

Описатель модуля, содержащего иконку, задаваемую полем lpszIcon, и строковый ресурс,задаваемый полем lpszText и lpszCaption.

lpszText

Завершающаяся NULL символом строка, или идентификатор строкового ресурса, содержащего текст отображаемого сообщения.

lpszCaption

Завершающаяся NULL символом строка, или идентификатор строкового ресурса, содержащего заголовок окна, отображающего сообщение. Если данное поле содержит значение NULL, то в окне отображается заголовок "Ошибка".

dwStyle

Комбинация флагов, определяющих содержимое и поведение окна сообщения. Данное поле аналогично параметру uType функции MessageBox.

Дополнительно, вы можете установить флаг MB_USERICON (0x00000080L). Данный флаг используется, когда окно должно отображать иконку, задаваемую полем lpszIcon.

lpszIcon

Идентификатор иконки, хранящейся в ресурсах. Данное поле может содержать или завершающуюся NULL-символом строку, или целочисленный идентификатор ресурса, созданный макросом MAKEINTRESOURCE.

Для загрузки одной из стандартных системных иконок, установите в поле hInstance значение NULL, а в поле lpszIcon одно из значений, перечисленных здесь.

Если в поле dwStyle не задан флаг MB_USERICON, то значение поля lpszIcon игнорируется.

dwContextHelpId

Задает контекст помощи (help context). Если происходит запрос помощи, значение данного поля заносится в структуру HELPINFO, которая отправляется окну-владельцу (с сообщением WM_HELP) или передается в функцию обратного вызова.

lpfnMsgBoxCallback

Указатель на функцию обратного вызова MsgBoxCallback, которая обрабатывает запросы помощи для окна сообщения.

Если значение этого поля равно NULL, то окно сообщения при запросе помощи будет отправлять своему владельцу сообщение WM_HELP.

dwLanguageId

Язык, на котором отображаются заголовки кнопок окна. Значение этого поля должно создаваться макросом MAKELANGID.

Каждая локализованная версия Windows обычно содержит ресурсы для ограниченного набора языков. Так. например, для американской версии предлагается LANG_ENGLISH, для французской - LANG_FRENCH, немецкая - LANG_GERMAN, японская - LANG_JAPANESE. Все версии предлагают LANG_NEUTRAL. Такие ограничения сужают набор допустимых значений, которые могут использоваться в качсетве значения поля dwLanguageId. Перед явным заданием идентификатора языка, вы должны перечислить локали, установленные в системе.

Заголовочный файл: winuser.h (включен в windows.h)


NCCALCSIZE_PARAMS

Содержит информацию, которую приложение может использовать при обработке сообщения WM_NCCALCSIZE.

Прототип

typedef struct tagNCCALCSIZE_PARAMS {

RECT rgrc[3];

PWINDOWPOS lppos;

} NCCALCSIZE_PARAMS, *LPNCCALCSIZE_PARAMS;

Поля структуры

rgrc

Массив прямоугольных областей. Когда оконная процедура получает сообщение WM_NCCALCSIZE первая прямоугольная область описывает новые координаты окна, положение или размер которого были изменены. Вторая прямоугольная область описывает координаты окна перед тем как его положение или размер были изменены. Третья прямоугольная область содержит координаты клиентской части окна перед тем как положение или размер окна были иземенены.

Координаты задаются в клиентской системе координат. Для окон верхнего уровня килентская система координат совпадает с экранной системой координат.

Каждая прямоугольная область описывается структурой RECT.

lppos

Адрес структуры WINDOWPOS.

Заголовочный файл: winuser.h (включен в windows.h)


NEWTEXTMETRIC

Содержит данные, описывающие физический шрифт.

Прототип

typedef struct tagNEWTEXTMETRIC {

LONG tmHeight;

LONG tmAscent;

LONG tmDescent;

LONG tmInternalLeading;

LONG tmExternalLeading;

LONG tmAveCharWidth;

LONG tmMaxCharWidth;

LONG tmWeight;

LONG tmOverhang;

LONG tmDigitizedAspectX;

LONG tmDigitizedAspectY;

TCHAR tmFirstChar;

TCHAR tmLastChar;

TCHAR tmDefaultChar;

TCHAR tmBreakChar;

BYTE tmItalic;

BYTE tmUnderlined;

BYTE tmStruckOut;

BYTE tmPitchAndFamily;

BYTE tmCharSet;

DWORD ntmFlags;

UINT ntmSizeEM;

UINT ntmCellHeight;

UINT ntmAvgWidth;

} NEWTEXTMETRIC, *PNEWTEXTMETRIC;

Поля структуры

tmHeight

Высота (верхний вынос + нижний спуск) символов.

tmAscent

Верхний вынос (ascent) (размер над базовой линией) символов.

tmDescent

Нижний вынос (descent) (размер под базовой линией) символов.

tmInternalLeading

Размер области внутри границ в составе размера tmHeight. В этой области могут находиться знаки ударения и другие диакритические символы. Разработчик может установить в это поле значение нуль.

tmExternalLeading

Размер дополнительной области, которую приложение вставляет между строками. Так как эта область находится вне границ шрифта, она не содержит меток (marks) и не изменяется выводом текста в режимах OPAQUE и TRANSPARENT. Разработчик может установить в это поле значение нуль.

tmAveCharWidth

Средняя ширина символов шрифта (в основном задается как ширина символа x). Данное значение не включает размер выступа (overhang), присутствующего в полужирных символах и символах, написанных курсивом.

tmMaxCharWidth

Ширина самого широкого символа шрифта.

tmWeight

Плотность (weight) шрифта.

tmOverhang

Дополнительная ширина строки, которая может быть добавлена к некоторым синтезированным (synthesized) шрифтам. При составлении некоторых атрибутов, таких как полужирное или курсивное начертание, интерфейс графичского устройства (GDI) или устройство может увеличить ширину строки на базис символа и/или строки. Например, GDI создает полужирную строку путем увеличения размера каждого символа и перепечатки (overstriking) на значение смещения; выделение шрифта курсивом осуществляется путем сдвига (shearing) строки. В обоих случаях, в базовой строке появляется выступ (overhang). Для полужирных строк, выступ - это расстояние, на которое смещается перепечатка (overstrike). Для курсивных строк, выступ - это расстояние, на которое смещается верхний край шрифта относительно нижнего.

Значение tmOverhang позволяет приложениям определять какая часть значения, возвращенного функцией GetTextExtentPoint32 для одного символа, составляет фактическую ширину символа, а какая - дополнительную ширину строки. Фактическая ширина равна экстенту (extent) минус выступ.

tmDigitizedAspectX

Горизонтальный аспект (aspect) устройства, для которого был создан шрифт.

tmDigitizedAspectY

Вертикальный аспект устройства, для которого был создан шрифт. Отношение полей tmDigitizedAspectX и tmDigitizedAspectY равно отношению аспектов устройства, для которого был создан шрифт.

tmFirstChar

Значение первого символа, заданного в шрифте.

tmLastChar

Значение последнего символа, заданного в шрифте.

tmDefaultChar

Значение символа, размещаемого на месте символов, отсутствующих в шрифте.

tmBreakChar

Значение символа, используемого для обозначения разрыва слов (word breaks) при выравнивании текста.

tmItalic

Если значение отлично от нуля, то задан курсивный шрифт.

tmUnderlined

Если значение отлично от нуля, то задан подчеркнутый шрифт.

tmStruckOut

Если значение отлично от нуля, то задан зачеркнутый шрифт.

tmPitchAndFamily

Шаг (pitch) и семейство шрифта. млдаший бит (0) задает шаг шрифта. Если он равен 1, то шрифт имеет переменный шаг (пропорциональный). Если он сброшен, шрифт имеет фиксированный шаг (моноширинный). Биты 1 и 2 задают тип шрифта. Если они оба равны нулю, шрифт является растровым; если бит 1 взведен, а бит 2 сброшен, шрифт является векторным; если бит 1 сброшен, а бит 2 взведен, или взведны оба бита, шрифт имеет какой-то другой тип. Бит 3 равен 1, если шрифт является шрифтом устройства (device font); в противном случае он сброшен.

Старшие 4 бита задают семейство шрифтов. Приложение может использовать значение 0xF0 и порязрядную операцию И для маскирования младших 4 бит поля tmPitchAndFamily. Так получается значение, которое можно сравнивать с наименованиями семейств шрифтов при поиске соответствия. Семейства шрифтов перечислены здесь.

tmCharSet

Набор символов шрифта.

ntmFlags

Набор флагов задающих, является ли шрифт курсивным, подчеркнутым (underscored), обрисованным (outlined), полужирным и т.д. Данное поле содержит произвольную комбинацию бит, описанных ниже.

Бит | Наименование | Описание
0 | NTM_ITALIC | курсив
5 | NTM_BOLD | полужирное начертание
8 | NTM_REGULAR | нормальный (regular)
16 | NTM_NONNEGATIVE_AC | ни у одного из глифов шрифта нет отрицательной области A и C.
17 | NTM_PS_OPENTYPE | шрифт PostScript OpenType
18 | NTM_TT_OPENTYPE | шрифт TrueType OpenType
19 | NTM_MULTIPLEMASTER | ММ-шрифт (multiple master font)
20 | NTM_TYPE1 | шрифт Type1.
21 | NTM_DSIG | Шрифт с цифровой сигнатурой (digital signature). Это позволяет осуществлять трассировку (traceability) и гарантировать, что шрифт проверен и не поврежден (not corrupted).

ntmSizeEM

Размер кегельной площадки (em square) шрифта. Данное значение задано в условных институциональных единицах (notional units) (то есть, в тех единицах, для которых был создан шрифт).

ntmCellHeight

Высота шрифта в условных институциональных единицах. Данное значение должно быть сверено (compared) со значением поля ntmSizeEM.

ntmAvgWidth

Средняя ширина символов шрифта в условных институциональных единицах. Данное значение должно быть сверено (compared) со значением поля ntmSizeEM.

Примечание

Последние 4 поля структуры NEWTEXTMETRIC не входят в состав структуры TEXTMETRIC. В остальном они идентичны друг другу.

Размеры в структуре NEWTEXTMETRIC обычно задаются в логических единицах (logical units); то есть, они зависят от текущего режима отображения (mapping mode) контекста монитора (display context).

Заголовочный файл: wingdi.h (включен в windows.h)


NEWTEXTMETRICEX

Содержит информацию о физическом шрифте.

Прототип

typedef struct tagNEWTEXTMETRICEX {

NEWTEXTMETRIC ntmTm;

FONTSIGNATURE ntmFontSig;

} NEWTEXTMETRICEX;

Поля структуры

ntmTm

Структура NEWTEXTMETRIC.

ntmFontSig

Структура FONTSIGNATURE, задающая область покрытия шрифта.

Заголовочный файл: wingdi.h (включен в windows.h)


NMHDR

Содержит информацию об уведомительном сообщении.

Прототип

typedef struct tagNMHDR {

HWND hwndFrom;

UINT_PTR idFrom;

UINT code;

} NMHDR;

Поля структуры

hwndFrom

Описатель окна элемента управления, от которого пришло сообщение.

idFrom

Идентификатор элемента управления, от которого пришло сообщение.

code

Код уведомления. Зависит от типа элемента управления и произошедшего события.

Заголовочный файл: winuser.h (включен в windows.h)


NONCLIENTMETRICS

Содержит масштабируемые метрики (scalable metrics) неклиентской области окна, которое нельзя свернуть. Эта структура используется в функции SystemParametersInfo с параметрами SPI_GETNONCLIENTMETRICS и SPI_SETNONCLIENTMETRICS.

Прототип

typedef struct tagNONCLIENTMETRICS {

UINT cbSize;

int iBorderWidth;

int iScrollWidth;

int iScrollHeight;

int iCaptionWidth;

int iCaptionHeight;

LOGFONT lfCaptionFont;

int iSmCaptionWidth;

int iSmCaptionHeight;

LOGFONT lfSmCaptionFont;

int iMenuWidth;

int iMenuHeight;

LOGFONT lfMenuFont;

LOGFONT lfStatusFont;

LOGFONT lfMessageFont;

#if (WINVER >= 0x0600)

int iPaddedBorderWidth;

#endif

} NONCLIENTMETRICS, *PNONCLIENTMETRICS, *LPNONCLIENTMETRICS;

Поля структуры

cbSize

Размер структуры в байтах. Использующий данную структуру поток должен записать в это поле значение sizeof(NONCLIENTMETRICS). Для информации о совместимости смотри примечание.

iBorderWidth

Толщина, в пикселях, изменяемой границы окна. Значение по умолчанию - 1.

iScrollWidth

Ширина, в пикселях, стандартной вертикальной полосы прокрутки.

iScrollHeight

Высота, в пикселях, стандартной горизонтальной полосы прокрутки.

iCaptionWidth

Ширина, в пикселях, кнопок заголовка (caption buttons).

iCaptionHeight

Высота, в пикселях, кнопок заголовка.

IfCaptionFont

Структура LOGFONT, которая содержит информацию о шрифте заголовка.

iSmCaptionWidth

Ширина, в пикселях, кнопок маленького заголовка (small caption buttons).

iSmCaptionHeight

Высота, в пикселях, маленьких заголовков (small captions).

IfSmCaptionFont

Структура LOGFONT, которая содержит информацию о шрифте маленьких заголовков.

iMenuWidth

Ширина, в пикселях, кнопок полосы меню (menu-bar buttons).

iMenuHeight

Высота, в пикселях, полосы меню (menu bar).

IfMenuFont

Структура LOGFONT, которая содержит информацию о шрифте, используемом в полосах меню.

IfStatusFont

Структура LOGFONT, которая содержит информацию о шрифте, используемом в строках статусов (status bars) и всплывающих подсказках (tooltips).

IfMessageFont

Структура LOGFONT, которая содержит информацию о шрифте, используемом в окнах сообщений (message boxes).

iPaddedBorderWidth

Толщина, в пикселях, наполненной границы (padded border). Значение по умолчанию - 4. Поля iPaddedBorderWidth и iBorderWidth используются для описания изменяемых (resizable) и неизменяемых (nonresizable) границ окна в Windows Aero. При компиляции приложения, использующего это поле вы должны описать _WIN32_WINNT как значение 0x0600 или большее.

Windows Server 2003 и Windows XP/2000: данное поле не поддерживается.

Примечание

Если поле iPaddedBorderWidth присутствует в структуре NONCLIENTMETRICS, то размер этой структуры на 4 байта больше, чем у приложений, скомпилированных с _WIN32_WINNT равным 0x0502 или меньше.

Windows Server 2003 и Windows XP/2000. Если приложение, скомпилированное для Windows Server 2008 или Windows Vista также должно работать на Windows Server 2003 или Windows XP/2000, то вы должны использовать функцию GetVersionEx для проверки версии операционной системы, на которой запущено приложение, и, если оно запущено на Windows Server 2003 или Windows XP/2000, перед вызовом функции SystemParametersInfo вычесть из значения поля cbSize размер поля iPaddedBorderWidth.

Заголовочный файл: winuser.h (включен в windows.h)


NORM_FORM (перечисление)

Появилось в Windows Vista. Определяет поодерживаемые формы нормализации.

Прототип

typedef enum _NORM_FORM {

NormalizationOther = 0,

NormalizationC = 0x1,

NormalizationD = 0x2,

NormalizationKC = 0x5,

NormalizationKD = 0x6

} NORM_FORM;

Возможные значения

NormalizationOther

Не поддерживается.

NormalizationC

Нормализация формы C, каноническая композиция. Каждая группа, состоящая из базлвого символа и комбинируемых с ним символов, приводится к каноническому предварительно составленному эквиваленту. Например, группа A + ¨ становится символом A.

NormalizationD

Нормализация формы D, каноническая декомпозиция. Каждый составной символ приводится к декомпозированному эквиваленту. Например, символ A приводится к группе символов A + ¨.

NormalizationKC

Нормализация формы KC, совместимая композиция. Каждая группа символов приводится к каноническому составному эквиваленту, все совместимые символы приводятся к своим эквивалентам. Например, лигатура (наборный знак из двух соединенных букв) fi становится f + i; аналогично, A + ¨ + ﬁ + n становится A + f + i + n.

NormalizationKD

Нормализация формы KD, совместимая декомпозиция. Каждый составной символ приводится к каноническому декомпозированному эквиваленту, все составные символы приводятся к своим эквивалентам. Например, последовательность символов A + ﬁ + n становится A + ¨ + f + i + n.

Заголовочный файл: winnls.h (включен в windows.h)


OUTLINETEXTMETRIC

Содержит метрики, описывающие шрифт TrueType.

Прототип

typedef struct _OUTLINETEXTMETRIC {

UINT otmSize;

TEXTMETRIC otmTextMetrics;

BYTE otmFiller;

PANOSE otmPanoseNumber;

UINT otmfsSelection;

UINT otmfsType;

int otmsCharSlopeRise;

int otmsCharSlopeRun;

int otmItalicAngle;

UINT otmEMSquare;

int otmAscent;

int otmDescent;

UINT otmLineGap;

UINT otmsCapEmHeight;

UINT otmsXHeight;

RECT otmrcFontBox;

int otmMacAscent;

int otmMacDescent;

UINT otmMacLineGap;

UINT otmusMinimumPPEM;

POINT otmptSubscriptSize;

POINT otmptSubscriptOffset;

POINT otmptSuperscriptSize;

POINT otmptSuperscriptOffset;

UINT otmsStrikeoutSize;

int otmsStrikeoutPosition;

int otmsUnderscoreSize;

int otmsUnderscorePosition;

PSTR otmpFamilyName;

PSTR otmpFaceName;

PSTR otmpStyleName;

PSTR otmpFullName;

} OUTLINETEXTMETRIC, *POUTLINETEXTMETRIC;

Поля структуры

otmSize

Размер структуры, в байтах.

otmTextMetrics

Структура TEXTMETRIC, содержащая дополнительную информацию о шрифте.

otmFiller

Значение, которое выравнивает структуру.

otmPanoseNumber

Номер ПАНОСЕ (PANOSE) шрифта. [Паносе - это система описания шрифтовой формы, введенная в обращение ElseWare Corporation. Каждый шрифт описывается по 10 параметрам, рассчитываемым математически, например, для латинских текстовых шрифтов это тип шрифта, наличие и форма засечек, насыщенность, пропорции, контраст, форма наплыва, форма концевых элементов, наклон, средняя линия, рост строчных. Каждому значению параметра присваивается свое число, в результате шрифтовая форма описывается последовательностью 10 чисел, которая включается в шрифтовой файл формата TrueType (http://www.paratype.ru/help/term/terms.asp?code=254) - примечание составителя]

otmfsSelection

Природа (nature) шаблона шрифта. Значение данного поля представляет собой комбинацию бит, перечисленных ниже.

Бит | Значение
0 | Курсив
1 | Подчеркнутый
2 | C противоположными цветами (negative)
3 | Контурный
4 | Зачеркнутый
5 | Полужирный

otmfsType

Задает является ли шрифт лицензионным (licensed). Лицензионный шрифты не должны редактироваться или меняться. Ели первый бит взведен, то шрифт не может быть встроен в документ. Если он сброшен, то шрифт может быть встроен. Если бит 2 взведен, то встраивание имеет режим "только чтение".

otmsCharSlopeRise

Наклон (slope) курсора. Если значение этого поля равно 1, то наклон - вертикаль. Приложения могут использовать это значение совместно со значением поля otmsCharSlopeRun для создания курсивного курсора, наклон которого совпадает с основным углом наклона курсивного шрифта (задан в поле otmItalicAngle).

otmsCharSlopeRun

Наклон (slope) курсора. Если значение этого поля равно нулю, то наклон - вертикаль. Приложения могут использовать это значение совместно со значением поля otmsCharSlopeRise для создания курсивного курсора, наклон которого совпадает с основным углом наклона курсивного шрифта (задан в поле otmItalicAngle).

otmItalicAngle

Угол наклона курсивного шрифта, в десятых долях градуса. Данный угол отсчитывается от вертикали против часовой стрелки. Для обычного шрифта данный угол равен нулю. Курсивный шрифт обычно имеет отрицательный угол наклона (то есть, он наклонен вправо).

otmEMSquare

Число логических единиц описывающих горизонтальный и вертикальный размеры кегельной площадки (em square) шрифта. (число единиц в горизонтальном направлении для кегельной площадки всегда равно числу елиниц в вертикальном направлении).

otmAscent

Размер максимального выступа символов над базовой линией. Это типографский подъем (ascent) шрифта.

otmDescent

Размер максимального выступа символов под базовой линией. Это типографский спуск (descent) шрифта.

otmLineGap

Типографский межстрочный интервал.

otmsCapEmHeight

Не поддерживается.

otmsXHeight

Не поддерживается.

otmrcFontBox

Ограничивающий шрифт прямоугольник (в виде структуры RECT).

otmMacAscent

Размер максимального выступа символов шрифта над базовой линией для компьютеров Macintosh.

otmMacDescent

Размер максимального выступа символов шрифта под базовой линией для компьютеров Macintosh.

otmMacLineGap

Межстрочный интервал для компьютеров Macintosh.

otmusMinimumPPEM

Наименьший рекомендуемый размер шрифта, в пикселях на кегельную площадку (em-square).

otmptSubscriptSize

Рекомендуемый для шрифта размер нижнего индекса (subscript) по горизонтали и вертикали. Задается в виде структуры POINT.

otmptSubscriptOffset

Рекомендуемое горизонтальное и вертикальное смещение нижнего индекса. Смещение нижнего индекса - это расстояние между символом текста и символом нижнего индекса. Задается в виде структуры POINT.

otmptSuperscriptSize

Рекомендуемый для шрифта размер верхнего индекса (superscript) по горизонтали и вертикали. Задается в виде структуры POINT.

otmptSuperscriptOffset

Рекомендуемое горизонтальное и вертикальное смещение верхнего индекса. Смещение верхнего индекса - это расстояние между базовой линией текста и базовой линией символа верхнего индекса. Задается в виде структуры POINT.

otmsStrikeoutSize

Ширина зачеркивающей линии шрифта. Обычно она равна ширине длинного тире (em dash) данного шрифта.

otmsStrikeoutPosition

Положение зачеркивающей линии относительно базовой линии шрифта. Положительное значение говорит о том, что зачеркивающая линия располагается выше базовой. Отрицательное - ниже.

otmsUnderscoreSize

Толщина символа подчеркивания для данного шрифта.

otmsUnderscorePosition

Положение символа подчеркивания для данного шрифта.

otmpFamilyName

Смещение строки, содержащей наименование семейства шрифтов, от начала структуры.

otmpFaceName

Смещение строки, содержащей наименование начертания шрифта (typeface name), от начала структуры. Данное наименование соответствует наименованию шрифта, заданному в структуре LOGFONT.

otmpStyleName

Смещение строки, содержащей наименование стиля шрифта, от начала структуры.

otmpFullName

Смещение строки, содержащей полное наименование шрифта, от начала структуры. Это наименование уникально для шрифта и часто включает в себя номер версии или другую идентификационную информацию.

Примечание

Размеры, указываемые в структуре заданы в логических единицах. Это значит, что они зависят от текущего режима отображения (mapping mode) заданного контекста изображения (display context).

Учтите, что структура OUTLINETEXTMETRIC описана с использованием текущей настройки упаковки (pack setting). Для избежания проблем, убедитесь в том, что приложение построено с применением упаковки по умолчанию (default packing). Например, 32-разрядная Windows по умолчанию использует 8-байтную упаковку. Для получения дополнительной информации смотрите топик "C-Compiler Packing Issues" в msdn.

Заголовочный файл: wingdi.h (включен в windows.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)


PALETTEENTRY

Описывает цвет и используется как элемент в логической палитре. Логическая палитра описывается структурой LOGPALETTE.

Прототип

typedef struct tagPALETTEENTRY {

BYTE peRed;

BYTE peGreen;

BYTE peBlue;

BYTE peFlags;

} PALETTEENTRY;

Поля структуры

peRed

Интенсивность красного цвета.

peGreen

Интенсивность зеленого цвета.

peBlue

Интенсивность синего цвета.

peFlags

Задает, как следует использовать элемент палитры. Значение данного поля может быть равно нулю или одному из значений, перечисленных ниже.

PC_EXPLICIT - младшее слово элемента палитры задает индекс аппаратной палитры. Данный флаг позволяет приложениям отображать информацию с использованием палитры устройства.

PC_NOCOLLAPSE - цвет задается в неиспользуемом элементе системной палитры и не соответствует существующему цвету в системной палитре. Если в системной палитре нет неиспользуемых элементов, то цвет отображается корректно. Если цвет присутствует в системной палитре, то цвета из других палитр могут быть подогнаны к этому цвету.

PC_RESERVED - элемент логической палитры используется для анимации. Данный флаг запрещает окнам корректировать цвета при их частом изменении. Если имеется неиспользуемый элемент системной палитры, то цвет располагается в этом элементе. В противном случае, цвет недоступен для анимации.

Заголовочный файл: wingdi.h (включен в windows.h)


PIXELFORMATDESCRIPTOR

Описывает формат пикселя поверхности рисования.

Прототип

typedef struct tagPIXELFORMATDESCRIPTOR {

WORD nSize;

WORD nVersion;

DWORD dwFlags;

BYTE iPixelType;

BYTE cColorBits;

BYTE cRedBits;

BYTE cRedShift;

BYTE cGreenBits;

BYTE cGreenShift;

BYTE cBlueBits;

BYTE cBlueShift;

BYTE cAlphaBits;

BYTE cAlphaShift;

BYTE cAccumBits;

BYTE cAccumRedBits;

BYTE cAccumGreenBits;

BYTE cAccumBlueBits;

BYTE cAccumAlphaBits;

BYTE cDepthBits;

BYTE cStencilBits;

BYTE cAuxBuffers;

BYTE iLayerType;

BYTE bReserved;

DWORD dwLayerMask;

DWORD dwVisibleMask;

DWORD dwDamageMask;

} PIXELFORMATDESCRIPTOR, *PPIXELFORMATDESCRIPTOR;

Поля структуры

nSize

размер структуры в байтах. Значение данного поля должно быть равно sizeof(PIXELFORMATDESCRIPTOR),

nVersion

Версия структуры. Значение данного поля должно быть равно 1.

dwFlags

Набор флагов, задающих свойства буфера пикселей. Большинство свойств не являются взаимоисключающими; вы можете устанавливать произвольную комбинацию флагов, с учетом их описания. Допустимые флаги перечислены здесь.

iPixelType

Тип данных о пикселях. Допустимые значения приведены ниже.

PFD_TYPE_RGBA - пиксели в формате RGBA. Каждый пиксель имеет 4 компонента в таком порядке: красный, зеленый, синий, альфа канал.

PFD_TYPE_COLORINDEX - пиксели задаются в виде индексов. Каждый пиксель использует индексы цветов.

cColorBits

Количество битовых слоев (bitplane) в каждом буфере цвета. Для типа RGBA данное поле задает размер цветового буфера, за исключением битового слоя альфа канала. Для индексного типа данное поле задает размер буфера индексов цветов (color-index buffer).

cRedBits

Количество битовых слоев красного цвета в каждом буфере формата RGBA.

cRedShift

Размер сдвига для битовых слоев красного цвета в каждом буфере формата RGBA.

cGreenBits

Количество битовых слоев зеленого цвета в каждом буфере формата RGBA.

cGreenShift

Размер сдвига для битовых слоев зеленого цвета в каждом буфере формата RGBA.

cBlueBits

Количество битовых слоев синего цвета в каждом буфере формата RGBA.

cBlueShift

Размер сдвига для битовых слоев синего цвета в каждом буфере формата RGBA.

cAlphaBits

Количество битовых слоев альфа канала в каждом буфере формата RGBA. Битовые слои алльфа канала не поддерживаются.

cAlphaShift

Размер сдвига для битовых слоев аьфа канала в каждом буфере формата RGBA. Битовые слои алльфа канала не поддерживаются.

cAccumBits

Общее количество битовых слоев в накопительном буфере.

cAccumRedBits

Количество битовых слоев красного цвета в накопительном буфере.

cAccumGreenBits

Количество битовых слоев зеленого цвета в накопительном буфере.

cAccumBlueBits

Количество битовых слоев синего цвета в накопительном буфере.

cAccumAlphaBits

Количество битовых слоев альфа канала в накопительном буфере.

cDepthBits

Размер (depth) буфера глубины (ось z).

cStencilBits

Размер (depth) буфера шаблонов (stencil buffer).

cAuxBuffers

Количество вспомогательных (auxiliary) буферов. Вспомогательные буферы не поддерживаются.

iLayerType

Игнорируется. Ранние реализации OpenGL использовали это поле, но сейчас оно не используется.

bReserved

Количество верхних (overlay) и нижних (underlay) плоскостей. Биты 0-3 задают до 15 верхних плоскостей, биты 4--7 задают до 15 нижних плоскостей.

dwLayerMask

Игнорируется. Ранние реализации OpenGL использовали это поле. Сейчас оно не используется.

dwVisibleMask

Прозрачный цвет или индекс нижней (underlay) плоскости. Если пиксели имеют формат RGBA, поле задает прозрачный цвет в формате RGB. Если пиксели имеют индексный тип, поле задает индекс прозрачности.

dwDamageMask

Игнорируется. Ранние реализации OpenGL использовали это поле. Сейчас оно не используется.
Примечание

Пожалуйста помните, что, как указывалось выше, некоторые свойства форматов пикселей не поддерживаются в текущей реализации. Текущая реализация это программная реализация Microsoft GDI для OpenGL. Производители аппаратного обеспечения могут улучшать (enhance) части OpenGL и могут поддерживать некоторые сволйства форматов пикселей, не поддерживаемые основной реализацией.

Заголовочный файл: wingdi.h


POINT

Определяет координаты точки.

Прототип

typedef struct tagPOINT {

LONG x;

LONG y;

} POINT, *PPOINT;

Поля структуры

x

координата точки по горизонтали

y

координата точки по вертикали

Заголовочный файл: Windef.h (включен в Windows.h)


POINTFX

Содержит координаты точек, описывающих контур символа в шрифте TrueType.

Прототип

typedef struct tagPOINTFX {

FIXED x;

FIXED y;

} POINTFX, *LPPOINTFX;

Поля структуры

x

Структура FIXED, содержащая горизонтальную координату точки контура символа шрифта TrueType.

y

Структура FIXED, содержащая вертикальную координату точки контура символа шрифта TrueType.

Примечание

Структура POINTFX входит в состав структур TTPOLYCURVE и TTPOLYGONHEADER. Значения в структуре POINTFX указываются в единицах устройства.

Заголовочный файл: wingdi.h (включен в windows.h)


POINTL

Содержит координаты точки.

Прототип

typedef struct _POINTL {

LONG x;

LONG y;

} POINTL, *PPOINTL;

Поля структуры

x

Горизонтальная координата точки.

y

Вертикальная координата точки.

Заголовочный файл: windef.h (включен в windows.h)


POINTS

Определяет координаты точки.

Прототип

typedef struct tagPOINTS {

SHORT x;

SHORT y;

} POINTS, *PPOINTS;

Поля структуры

x

координата точки по горизонтали

y

координата точки по вертикали

Заголовочный файл: Windef.h (включен в Windows.h)


POLYTEXT

Описывает как функция PolyTextOut должна отрисовать строку текста.

Прототип

typedef struct _POLYTEXT {

int x;

int y;

UINT n;

LPCTSTR lpstr;

UINT uiFlags;

RECT rcl;

int *pdx;

} POLYTEXT, *PPOLYTEXT;

Поля структуры

x

Координата точки привязки (reference point) по горизонтали. Строка выравнивается по этой точке с использованием текущего режима выравнивания (alignment mode).

y

Координата точки привязки по вертикали. Строка выравнивается по этой точке с использованием текущего режима выравнивания (alignment mode).

n

Длина строки lpstr.

lpstr

Указатель на строку, выводимую функцией PolyTextOut. Строка не должна заканчиваться NULL символом, так как поле n задает длину строки.

uiFlags

Набор флагов задающих должна ли строка быть непрозрачной и усеченной (clipped), а также сопровождается ли массив символов массивом размеров символов. Данное поле содержит одно из значений перечисленных ниже или их комбинацию.

ETO_OPAQUE - прямоугольник каждой строки является непрозрачным и закрашивается текущим цветом фона.

ETO_CLIPPED - каждая строка усекается своим прямоугольником.

rcl

Структура RECT, задающая рамеры непрозрачного прямоугольника или прямоугольника усечения. Если ни один из флагов ETO_OPAQUE и ETO_CLIPPING не задан, то значение этого поля игнорируется.

pdx

Указатель на массив, содержащий ширину каждого символа строки.

Заголовочный файл: Wingdi.h (включен в Windows.h)


POWERBROADCAST_SETTING

Отправляется с событием настройки питания и содержит данные, описывающие изменение. Поддерживается в операционных системах не ниже Windows Vista и Windows Server 2008.

Прототип

typedef struct {

GUID PowerSetting;

DWORD DataLength;

UCHAR Data[1];

} POWERBROADCAST_SETTING, *PPOWERBROADCAST_SETTING;

Поля структуры

PowerSetting

Указывает настройку питания, для которой отправляется это уведомление.

DataLength

Размер в байтах данных в поле Data.

Data

Новое значение настройки питания.

Заголовочный файл: winuser.h (включен в windows.h)


RASTERIZER_STATUS

Содержит информацию о том, установлен ли в системе шрифт TrueType. Данная структура заполняется функцией GetRasterizerCaps.

Прототип

typedef struct _RASTERIZER_STATUS {

short nSize;

short wFlags;

short nLanguageID;

} RASTERIZER_STATUS, *LPRASTERIZER_STATUS;

Поля структуры

nSize

Размер структуры, в байтах.

wFlags

Определяет установлен ли в системе хотя бы один шрифт TrueType и доступен ли он. Если значение этого поля содержит флаг TT_AVAILABLE, TT_ENABLED, ил оба этих флага, то в системе имеется шрифт TrueType.

nLanguageID

Язык системного файла Setup.ini.

Заголовочный файл: wingdi.h (включен в windows.h)


RAWHID

Описывает формат сырого ввода от устройства с человеко-машинным интерфейсом (HID). Появилась в Windows XP и Windows Server 2003.

Прототип

typedef struct tagRAWHID {

DWORD dwSizeHid;

DWORD dwCount;

BYTE bRawData[1];

} RAWHID, *PRAWHID, *LPRAWHID;

Поля структуры

dwSizeHid

Размер в байтах каждого пакета ввода от HID в bRawData.

dwCount

Количество пакетов ввода от HID в bRawData.

bRawData

Содержимое сырого ввода, представленное в виде массива байт.

Примечание

Каждое сообщение WM_INPUT может ссылаться на несколько пакетов ввода. Но все эти пакеты приходят от одного устройства. Размер массива bRawData вычисляется так: dwSizeHid*dwCount.

Заголовочный файл: winuser.h (включен в windows.h)


RAWINPUT

Содержит сырой ввод от устройства. Появилась в Windows XP и Windows Server 2003.

Прототип

typedef struct tagRAWINPUT {

RAWINPUTHEADER header;

union {

RAWMOUSE mouse;

RAWKEYBOARD keyboard;

RAWHID hid;

} data;

} RAWINPUT, *PRAWINPUT, *LPRAWINPUT;

Поля структуры

header

Структура RAWINPUTHEADER, содержащая заголовок сырых входных данных.

mouse

Структура RAWMOUSE. Используется если сырой ввод поступает от мыши.

keyboard

Структура RAWKEYBOARD. Используется если сырой ввод поступает от клавиатуры.

hid

Структура RAWHID. Используется если сырой ввод поступает от устройства с человеко-машинным интерфейсом (HID).

Примечание

Описатель этой структуры передается в качестве значения параметра lParam сообщения WM_INPUT.

Для получения детальной информации (такой как заголовок и содержимое сырого ввода) используйте функцию GetRawInputData.

Для чтения буферизованного RAWINPUT в цикле сообщений используйте функцию GetRawInputBuffer.

Для получения информации специфичной для устройства, вызовите функцию GetRawInputDeviceInfo с параметром hDevice, взятом из RAWINPUTHEADER.

Сырой ввод доступен лишь тогда, когда приложение вызывает RegisterRawInputDevices с действительными описаниями устройств.

Заголовочный файл: winuser.h (включен в windows.h)


RAWINPUTHEADER

Описывает заголовок сырых входных данных. Появилась в Windows XP и Windows Server 2003.

Прототип

typedef struct tagRAWINPUTHEADER {

DWORD dwType;

DWORD dwSize;

HANDLE hDevice;

WPARAM wParam;

} RAWINPUTHEADER, *PRAWINPUTHEADER;

Поля структуры

dwType

Тип сырого ввода. Содержит одно из перечисленных ниже значений.

RIM_TYPEHID - сырой ввод, поступающий от устройства, не являющегося ни клавиатурой ни мышью.

RIM_TYPEKEYBOARD - сырой ввод, поступающий от клавиатуры.

RIM_TYPEMOUSE - сырой ввод, поступающий от мыши.

dwSize

Размер в байтах поступающего пакета сырых данных. Он включает в себя RAWINPUT плюс, возможные, дополнительные пакеты в массиве RAWHID.

hDevice

Описатель устройства, создающего сырой ввод.

wParam

Значение, передаваемое в качестве параметра wParam сообщения WM_INPUT.

Заголовочный файл: winuser.h (включен в windows.h)


RAWKEYBOARD

Содержит информацию о состоянии клавиатуры. Появилась в Windows XP и Windows Server 2003.

Прототип

typedef struct tagRAWKEYBOARD {

USHORT MakeCode;

USHORT Flags;

USHORT Reserved;

USHORT VKey;

UINT Message;

ULONG ExtraInformation;

} RAWKEYBOARD, *PRAWKEYBOARD, *LPRAWKEYBOARD;

Поля структуры

MakeCode

Скан-код нажимаемой или отпускаемой клавишы.

Flags

Набор флагов. Состоит из одного или нескольких перечисленных ниже флагов.

RI_KEY_BREAK - клавиша была отпущена.

RI_KEY_E0 - это левая версия клавишы.

RI_KEY_E1 - это правая версия клавишы.

RI_KEY_MAKE - клавиша была нажата.

Reserved

Зарезервировано. Должно равняться нулю.

VKey

Виртуальный код клавишы. Существующие виртуальные коды клавиш смотри здесь.

Message

Соответствующее событию сообщение. Например, WM_KEYDOWN, WM_SYSKEYDOWN и др.

ExtraInformation

Дополнительная специфичная для устройства информация о событии.

Заголовочный файл: winuser.h (включен в windows.h)


RAWMOUSE

Содержит информацию о состоянии мыши. Появилась в Windows XP и Windows Server 2003.

Прототип

typedef struct tagRAWMOUSE {

USHORT usFlags;

union {

ULONG ulButtons;

struct {

USHORT usButtonFlags;

USHORT usButtonData;

};

};

ULONG ulRawButtons;

LONG lLastX;

LONG lLastY;

ULONG ulExtraInformation;

} RAWMOUSE, *PRAWMOUSE, *LPRAWMOUSE;

Поля структуры

usFlags

Состояние мыши. Данное поле может представлять собой любую разумную комбинацию следуюбщих флагов.

MOUSE_ATTRIBUTES_CHANGED - изменились атрибуты мыши. Приложение должно запросить новые атрибуты мыши.

MOUSE_MOVE_RELATIVE - данные о передвижении мыши относительно ее последнего положения.

MOUSE_MOVE_ABSOLUTE - данные о передвижении мыши, основанные на абсолютном положении мышии.

MOUSE_VIRTUAL_DESKTOP - координаты мыши спроецированы на виртуальный рабочий стол (для систем с несколькими мониторами).

ulButtons

Зарезервировано.

usButtonFlags

Переходное состояние кнопок мыши. Данное поле представляет одно из значений перечисленных ниже, или их комбинацию.

RI_MOUSE_LEFT_BUTTON_DOWN - была нажата левая кнопка мыши.

RI_MOUSE_LEFT_BUTTON_UP - левая кнопка мыши была отпущена.

RI_MOUSE_MIDDLE_BUTTON_DOWN - была нажата средняя кнопка мыши.

RI_MOUSE_MIDDLE_BUTTON_UP - средняя кнопка мыши была отпущена.

RI_MOUSE_RIGHT_BUTTON_DOWN - была нажата правая кнопка мыши.

RI_MOUSE_RIGHT_BUTTON_UP - правая кнопка мыши была отпущена.

RI_MOUSE_BUTTON_1_DOWN - то же самое что и RI_MOUSE_LEFT_BUTTON_DOWN.

RI_MOUSE_BUTTON_1_UP - то же самое что и RI_MOUSE_LEFT_BUTTON_UP.

RI_MOUSE_BUTTON_2_DOWN - то же самое что и RI_MOUSE_RIGHT_BUTTON_DOWN.

RI_MOUSE_BUTTON_2_UP - то же самое что и RI_MOUSE_RIGHT_BUTTON_UP.

RI_MOUSE_BUTTON_3_DOWN - то же самое что и RI_MOUSE_MIDDLE_BUTTON_DOWN.

RI_MOUSE_BUTTON_3_UP - то же самое что и RI_MOUSE_MIDDLE_BUTTON_UP.

RI_MOUSE_BUTTON_4_DOWN - была нажата первая дополнительная кнопка.

RI_MOUSE_BUTTON_4_UP - первая дополительная кнопка была отпущена.

RI_MOUSE_BUTTON_5_DOWN - была нажата вторая дополнительная кнопка.

RI_MOUSE_BUTTON_5_UP - вторая дополительная кнопка была отпущена.

RI_MOUSE_WHEEL - сырой ввод поступает от колеса прокрутки. Величина изменения колеса прокрутки сохраняется в usButtonData.

usButtonData

Если usButtonFlags равен RI_MOUSDE_WHEEL, то usButtonData хранит знаковое перемещение колеса прокрутки.

ulRawButtons

Сырое состояние кнопок мыши.

ILastX

Перемещение в горизонтальном направлении. Хранит знаковую величину перемещения, зависящую от значения usFlags.

ILastY

Перемещение в вертикальном направлении. Хранит знаковую величину перемещения, зависящую от значения usFlags.

ulExtraInformation

Дополнительная специфичная для устройства информация о событии.

Заголовочный файл: winuser.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)


RGBQUAD

Описывает цвет в виде относительных интенсивностей красного, зеленого и синего цветов.

Прототип

typedef struct tagRGBQUAD {

BYTE rgbBlue;

BYTE rgbGreen;

BYTE rgbRed;

BYTE rgbReserved;

} RGBQUAD;

Поля структуры

rgbBlue

Интенсивность синего цвета.

rgbGreen

Интенсивность зеленого цвета.

rgbRed

Интенсивность красного цвета.

rgbReserved

Зарезервировано. Значение данного поля должно равняться нулю.

Заголовочный файл: wingdi.h (включен в windows.h)


RGBTRIPLE

Описывает цвет, заданный в виде относительных интенсивностей красного, зеленого и синего цветов. Поле bmciColors структуры BITMAPCOREINFO содержит массив структур RGBTRIPLE.

Прототип

typedef struct tagRGBTRIPLE {

BYTE rgbtBlue;

BYTE rgbtGreen;

BYTE rgbtRed;

} RGBTRIPLE;

Поля структуры

rgbtBlue

Интенсивность синего цвета.

rgbtGreen

Интенсивность зеленого цвета.

rgbtRed

Интенсивность красного цвета.

Заголовочный файл: wingdi.h (включен в windows.h)


SHELLHOOKINFO

Недокументированная структура, упоминаемая в msdn.

Прототип

typedef struct

{

HWND hwnd;

RECT rc;

} SHELLHOOKINFO, *LPSHELLHOOKINFO;

Поля структуры

hWnd

Описатель окна.

rc

Структура RECT, описывающая прямоугольную область окна hWnd. Совпадает ли она с областью, возвращаемой функцией GetWindowRect для того же окна - вопрос открытый.


SIZE

Определяет ширину и высоту прямоугольника.

Прототип

typedef struct tagSIZE {

LONG cx;

LONG cy;

} SIZE, *PSIZE;

Поля структуры

cx

Ширина прямоугольника. Единица измерения зависит от используемой функции.

cy

Высота прямоугольника. Единица измерения зависит от используемой функции.

Заголовочный файл: windef.h (включен в windows.h)


SOUNDSENTRY

Содержит информацию о доступности функции охраны звука (SoundSentry accessibility feature). Когда эта функция включена, монитор компьютера отображает специальный значок (visual indication) только тогда когда происходит воспроизведение зука (sound is generated).

Windows 95/98: специальный значок отображается только тогда когда звук воспроизводится с помощью системного динамика (computer's internal speaker).

Windows NT/2000: специальный значок отображается когда звук воспроизводится с помощью мультимедийных служб (multimedia sound services) или посредством системного динамика (computer's speaker).

Прототип

typedef struct tagSOUNDSENTRY {

UINT cbSize;

DWORD dwFlags;

DWORD iFSTextEffect;

DWORD iFSTextEffectMSec;

DWORD iFSTextEffectColorBits;

DWORD iFSGrafEffect;

DWORD iFSGrafEffectMSec;

DWORD iFSGrafEffectColor;

DWORD iWindowsEffect;

DWORD iWindowsEffectMSec;

LPTSTR lpszWindowsEffectDLL;

DWORD iWindowsEffectOrdinal;

} SOUNDSENTRY, *LPSOUNDSENTRY;

Поля структуры

cbSize

Размер структуры в байтах.

dwFlags

Набор флагов, которые определяют свойства охранника звука (SoundSentry). Допустимые флаги перечислены ниже.

SSF_AVAILABLE - если этот флаг установлен, то функция охранника звука доступна.

SSF_INDICATOR - этот флаг не реализован.

SSF_SOUNDSENTRYON - если этот флаг установлен, то охранник звука включен.

iFSTextEffect

Windows 95/98: определяет отображение визуального сигнала когда приложение текстового режима, работающее в полноэкранной виртуальной машине, генерирует звук. Допустимые значения данного поля перечислены ниже.

SSTF_BORDER - мигание границы экрана, которая недоступна на некоторых мониторах.

SSTF_CHARS - мигание символов в углу экрана.

SSTF_DISPLAY - мигание всего монитора.

SSTF_NONE - нет никакого сигнала.

Windows NT/2000: данное поле зарезервировано для будущего использования. Его значение должно быть равно нулю.

iFSTextEffectMSec

Windows 95/98: определяет продолжительность, в миллисекундах, визульного сигнала, который отображается когда полноэкранное приложение текстового режима генерирует звук.

Windows NT/2000: данное поле зарезервировано для будущего использования. Его значение должно быть равно нулю.

iFSTextEffectColorBits

Windows 95/98: Определяет RGB значение цвета используемого при отображении визуального сигнала, показываемого когда полноэкранное приложение текстового режима генерирует звук.

Windows NT/2000: данное поле зарезервировано для будущего использования. Его значение должно быть равно нулю.

iFSGrafEffect

Windows 95/98: определяет представление визуального сигнала отображаемого когда приложение графического режима, запущенное в полноэкранной виртуальной машине, генерирует звук. Допустимые значения данного поля перечислены ниже.

SSGF_DISPLAY - мигание всего экрана.

SSGF_NONE - нет никакого визуального сигнала.

Windows NT/2000: данное поле зарезервировано для будущего использования. Его значение должно быть равно нулю.

iFSGrafEffectMSec

Windows 95/98: определяет продолжительность, в миллисекундах, визуального сигнала, который отображается когда полноэкранное приложение графического режима генерирует звук.

Windows NT/2000: данное поле зарезервировано для будущего использования. Его значение должно быть равно нулю.

iFSGrafEffectColor

Windows 95/98: Определяет RGB значение цвета, используемого при отображении визуального сигнала, когда полноэкранное приложение графического режима генерирует звук.

Windows NT/2000: данное поле зарезервировано для будущего использования. Его значение должно быть равно нулю.

iWindowsEffect

Определяет визуальный сигнал отображаемый когда оконное приложение или приложение MS-DOS, запущенное в окне генерирует (running in a window) звук. Допустимые значения данного поля перечислены ниже.

SSWF_CUSTOM - используется пользовательский (custom) визуальный сигнал.

SSWF_DISPLAY - мигание всего экрана.

SSWF_NONE - нет никакого визуального сиганала.

SSWF_TITLE - мигание заголовка активного окна.

SSWF_WINDOW - мигание активного окна.

iWindowEffectMSec

Windows 95/98: определяет прдолжительность, в миллисекундах, визуального сигнала, который отображается когда win-32 приложение (или произвольное приложение, запущенное в окне) генерирует звук.

Windows NT/2000: данное поле зарезервировано для будущего использования. Его значение должно быть равно нулю.

lpszWindowsEffectDLL

Данное поле зарезервировано для будущего использования. Его значение должно быть равно NULL.

iWindowsEffectOrdinal

Данное поле зарезервировано для будущего использования. Его значение должно быть равно нулю.

Примечание

Приложение использует структуру SOUNDSENTRY когда вызывает функцию SystemParametersInfo с параметром uiAction равным SPI_GETSOUNDSENTRY или SPI_SETSOUNDSENTRY. При использовании SPI_GETSOUNDSENTRY приложение должно заполнить поле cbSize структуры SOUNDSENTRY. Функция SystemParametersInfo заполнит остальные поля. При использовании SPI_SETSOUNDSENTRY приложение должно заполнить поля: cbSize, dwFlags и iWindowsEffect.

Заголовочный файл: winuser.h (включен в windows.h)


STICKYKEYS

Содержит информацию о доступности функции залипания клавиш (StickyKeys accessibility feature). Когда включен режим залипания клавиш, пользователь может нажать клавишу-модификатор (Shift, Ctrl или Alt) а затем последовательно (не одновременно) другую клавишу, для ввода модифицированных символов или других комбинаций клавиш. Нажатие клавишы-модификатора приводит к защелкиванию (latches) этой клавишы до тех пор пока пользователь не нажмет клавишу, не являющуюся модификатором, или не щелкнет кнопкой мышью. Двойное нажатие на клавишу-модификатор блокирует (locks) эту клавишу до тех пор пока пользователь не нажмет на неё в третий раз.

Прототип

typedef struct tagSTICKYKEYS {

DWORD cbSize;

DWORD dwFlags;

} STICKYKEYS, *LPSTICKYKEYS;

Поля структуры

cbSize

Размер структуры в байтах.

dwFlags

Набор флагов, которые определяют свойства режима залипания клавиш. Допустимые флаги перечислены здесь.

Примечание

Приложения используют структуру STICKYKEYS при вызове функции SystemParametersInfo с параметром uiAction равным SPI_GETSTICKYKEYS или SPI_SETSTICKYKEYS. При использовании SPI_GETSTICKYKEYS вы должны заполнить поле cbSize структуры STICKYKEYS. Функция SystemParametersInfo заполнит остальные поля. При использовании SPI_SETSTICKYKEYS вы должны заполнить все поля структуры.

Если вы вызывает функцию SystemParametersInfo с параметром SPI_SETSTICKYKEYS, то перечисленные ниже флаги игнорируются.

· SKF_LALTLATCHED
· SKF_LCTLLATCHED
· SKF_LSHIFTLATCHED
· SKF_RALTLATCHED
· SKF_RCTLLATCHED
· SKF_RSHIFTLATCHED
· SKF_LALTLOCKED
· SKF_LCTLLOCKED
· SKF_LSHIFTLOCKED
· SKF_RALTLOCKED
· SKF_RCTLLOCKED
· SKF_RSHIFTLOCKED

Заголовочный файл: winuser.h (включен в windows.h)


STYLESTRUCT

Содержит стили окна.

Прототип

typedef struct tagSTYLESTRUCT {

DWORD styleOld;

DWORD styleNew;

} STYLESTRUCT, *LPSTYLESTRUCT;

Поля структуры

styleOld

Предыдущий набор стилей или расширенных стилей окна.

styleNew

Новый набор стилей или расширенных стилей окна.

Заголовочный файл: winuser.h (включен в windows.h)


TEXTMETRIC

Содержит базовую информацию о физическом шрифте. Все размеры задаются в логических единицах (logical units);то есть, они зависят от текущего режима отображения (mapping mode) контекста отображения (display context).

Прототип

typedef struct tagTEXTMETRIC {

LONG tmHeight;

LONG tmAscent;

LONG tmDescent;

LONG tmInternalLeading;

LONG tmExternalLeading;

LONG tmAveCharWidth;

LONG tmMaxCharWidth;

LONG tmWeight;

LONG tmOverhang;

LONG tmDigitizedAspectX;

LONG tmDigitizedAspectY;

TCHAR tmFirstChar;

TCHAR tmLastChar;

TCHAR tmDefaultChar;

TCHAR tmBreakChar;

BYTE tmItalic;

BYTE tmUnderlined;

BYTE tmStruckOut;

BYTE tmPitchAndFamily;

BYTE tmCharSet;

} TEXTMETRIC, *PTEXTMETRIC;

Поля структуры

tmHeight

Высота (верхний вынос + нижний спуск) символов.

tmAscent

Верхний вынос (ascent) (размер над базовой линией) символов.

tmDescent

Нижний вынос (descent) (размер под базовой линией) символов.

tmInternalLeading

Размер области внутри границ в составе размера tmHeight. В этой области могут находиться знаки ударения и другие диакритические символы Разработчик может установить в это поле значение нуль.

tmExternalLeading

Размер дополнительной области, которую приложение вставляет между строками. Так как эта область находится вне границ шрифта, она не содержит меток (marks) и не изменяется выводом текста в режимах OPAQUE и TRANSPARENT. Разработчик может установить в это поле значение нуль.

tmAveCharWidth

Средняя ширина символов шрифта (в основном задается как ширина символа x). Данное значение не включает размер выступа (overhang), присутствующего в полужирных символах и символах, написанных курсивом.

tmMaxCharWidth

Ширина самого широкого символа шрифта.

tmWeight

Плотность (weight) шрифта.

tmOverhang

Дополнительная ширина строки, которая может быть добавлена к некоторым синтезированным (synthesized) шрифтам. При составлении некоторых атрибутов, таких как полужирное или курсивное начертание, интерфейс графичского устройства (GDI) или устройство может увеличить ширину строки на базис символа и/или строки. Например, GDI создает полужирную строку путем увеличения размера каждого символа и перепечатки (overstriking) на значение смещения; выделение шрифта курсивом осуществляется путем сдвига (shearing) строки. В обоих случаях, в базовой строке появляется выступ (overhang). Для полужирных строк, выступ - это расстояние, на которое смещается перепечатка (overstrike). Для курсивных строк, выступ - это расстояние, на которое смещается верхний край шрифта относительно нижнего.

Значение tmOverhang позволяет приложениям определять какая часть значения, возвращенного функцией GetTextExtentPoint32 для одного символа, составляет фактическую ширину символа, а какая - дополнительную ширину строки. Фактическая ширина равна экстенту (extent) минус выступ.

tmDigitizedAspectX

Горизонтальный аспект (aspect) устройства, для которого был создан шрифт.

tmDigitizedAspectY

Вертикальный аспект устройства, для которого был создан шрифт. Отношение полей tmDigitizedAspectX и tmDigitizedAspectY равно отношению аспектов устройства, для которого был создан шрифт.

tmFirstChar

Значение первого символа, заданного в шрифте.

tmLastChar

Значение последнего символа, заданного в шрифте.

tmDefaultChar

Значение символа, размещаемого на месте символов, отсутствующих в шрифте.

tmBreakChar

Значение символа, используемого для обозначения разрыва слов (word breaks) при выравнивании текста.

tmItalic

Если значение отлично от нуля, то задан курсивный шрифт.

tmUnderlined

Если значение отлично от нуля, то задан подчеркнутый шрифт.

tmStruckOut

Если значение отлично от нуля, то задан зачеркнутый шрифт.

tmPitchAndFamily

Задает информацию о шаге (pitch), технологии и семействе физического шрифта.

Младшие 4 бита содержат информацию о шаге и технологии шрифта. Константы этих битов перечислены ниже.

TMPF_FIXED_PITCH - если этот бит установлен, то шрифт имеет переменный шаг. Если же он сброшен, то шрифт имеет фиксированный шаг. Важно отметить, что данные значения (meanings) противоречат (opposite) тому, что подразумевается постоянным наименованиям (constant name).

TMPF_VECTOR - если этот бит установлен, то шрифт является векторным.

TMPF_TRUETYPE - если этот бит установлен, то шрифт принадлежит семейству TrueType.

TMPF_DEVICE - если этот бит установлен, то шрифт является шрифтом устройства (device font).

Приложение должно тщательно проверить информацию, закодированную в этих битах, не делая никаких предположений. Например, помимо установки собственных битов, семейства шрифтов TrueType и PostSript устанавливают бит TMPF_VECTOR. У моноширинного растрового шрифта все эти биты сброшены; пропорциональный (proportional) растровый шрифт устанавливает бит TMPF_FIXED_PITCH. Шрифт семейства PostScript для печатающего устройства устанавливает биты TMPF_DEVICE, TMPF_VECTOR и TMPF_FIXED_PITCH.

Старшие 4 бита поля tmPitchAndFamily задают семейство шрифтов. Приложение может использовать значение 0xF0 и порязрядную операцию И для маскирования младших 4 бит поля tmPitchAndFamily. Так получается значение, которое можно сравнивать с наименованиями семейств шрифтов при поиске соответствия. Семейства шрифтов перечислены здесь.

tmCharSet

Набор символов шрифта. Данное содержит одно из значений перечисленных ниже.

· ANSI_CHARSET,
· BALTIC_CHARSET,
· CHINESEBIG5_CHARSET,
· DEFAULT_CHARSET,
· EASTEUROPE_CHARSET,
· GB2312_CHARSET,
· GREEK_CHARSET,
· HANGUL_CHARSET,
· MAC_CHARSET,
· OEM_CHARSET,
· RUSSIAN_CHARSET,
· SHIFTJIS_CHARSET,
· SYMBOL_CHARSET,
· TURKISH_CHARSET,
· VIETNAMESE_CHARSET.

Для корейской редакции Windows:

· JOHAB_CHARSET.

Для ближневосточной редакции Windows:

· ARABIC_CHARSET,
· HEBREW_CHARSET.

Для тайской редакции Windows:

· THAI_CHARSET.

Примечание

Рисунок ниже иллюстрирует размеры шрифта (взят с сайта http://habrahabr.ru/post/121964/).

Заголовочный файл: wingdi.h (включен в windows.h)


TITLEBARINFO

Содержит информацию об области заголовка.

Прототип

typedef struct tagTITLEBARINFO {

DWORD cbSize;

RECT rcTitleBar;

DWORD rgstate[CCHILDREN_TITLEBAR+1];

} TITLEBARINFO, *PTITLEBARINFO, *LPTITLEBARINFO;

Поля структуры

cbSize

Размер структуры в байтах. Вызывающий поток должен установить значение этого поля равным sizeof(TITLEBARINFO).

rcTitleBar

Структура RECT, которая описывает прямоугольник области заголовка. В этот прямоугольник входят все элементы области заголовка кроме оконного меню.

rgstate

Массив, который описывает все элементы области заголовка. Ниже перечислены все элементы образующие область заголовка окна и соответствующие им индексы в массиве rgstate.

0 - сама область заголовка.

1 - зарезервировано.

2 - кнопка "свернуть".

3 - кнопка "развернуть".

4 - кнопка "помощь".

5 - кнопка "закрыть".

Для каждого элемента массива хранится одно из перечисленных ниже значений или их комбинация:

STATE_SYSTEM_FOCUSABLE - элемент может принимать фокус ввода.

STATE_SYSTEM_INVISIBLE - элемент невидим.

STATE_SYSTEM_OFFSCREEN - элемент не имеет визуального представления.

STATE_SYSTEM_UNAVAILABLE - элемент недоступен.

STATE_SYSTEM_PRESSED - элемент находится в нажатом состоянии.

Заголовочный файл: winuser.h (включен в windows.h)


TOGGLEKEYS

Содержит информацию о доступности режима озвучивания переключения режимов (ToggleKeys accessibility feature). Когда активирован режим озвучивания переключения режимов компьютер издает высокотональный сигнал (high-pitched tone) всякий раз, когда пользователь переводит в нажатое состояние клавишу CapsLock, NumLock или ScrollLock, и низкотональный сигнал (low-pitched tone) каждый раз, когда пользователь переводит одну из этих клавиш обратно в ненажатое состояние.

Прототип

typedef struct tagTOGGLEKEYS {

DWORD cbSize;

DWORD dwFlags;

} TOGGLEKEYS, *LPTOGGLEKEYS;

Поля структуры

cbSize

Размер структуры в байтах.

dwFlags

Набор флагов, которые определяют свойства режима озвучивания переключения режимов. Допустимые флаги перечислены здесь.

Примечание

Приложение использует структуру TOGGLEKEYS когда вызывает функцию SystemParametersInfo с параметром uiAction равным SPI_GETTOGGLEKEYS или SPI_SETTOGGLEKEYS. При использовании SPI_GETTOGGLEKEYS приложение должно заполнить поле cbSize этой структуры. Функция SystemParametersInfo заполнит все остальные поля. При использовании SPI_SETTOGGLEKEYS приложение должно заполнить все поля структуры.

Заголовочный файл: winuser.h (включен в windows.h)


TRIVERTEX

Содержит информацию о положении и цвете.

Прототип

typedef struct _TRIVERTEX {

LONG x;

Long y;

COLOR16 Red;

COLOR16 Green;

COLOR16 Blue;

COLOR16 Alpha;

} TRIVERTEX, *PTRIVERTEX;

Поля структуры

x

Горизонтальная координата левого верхнего угла прямоугольника, в логических единицах.

y

Вертикальная координата левого верхнего угла прямоугольника, в логических единицах.

Red

Информация о цвете в точке (x, y).

Green

Информация о цвете в точке (x, y).

Blue

Информация о цвете в точке (x, y).

Alpha

Информация о цвете в точке (x, y).

Примечание

Поля x и y задают координаты так же как и структура POINTL, поля Red, Green, Blue и Alpha содержат нформацию о цвете точки (x, y). Цветовая информация по каждому каналу задается в виде значения от 0x0000 до 0xFF00. Это позволяет иметь более высокое цветовое разрешение (color resolution) объекта, помещаемое в маленькие треугольники. Структура TRIVERTEX содержит информацию, передающуюся в параметре pVertex в функцию GradientFill.

Заголовочный файл: wingdi.h (включен в windows.h)


TTPOLYCURVE

Содержит информацию о кривой, образующей контур символа шрифта TrueType.

Прототип

typedef struct tagTTPOLYCURVE {

WORD wType;

WORD cpfx;

POINTFX apfx[1];

} TTPOLYCURVE, *LPTTPOLYCURVE;

Поля структуры

wType

Тип кривой, описываемой структурой. Данное поле содержит одно из значений перечисленных ниже.

TT_PRIM_LINE - кривая является ломаной линией (polyline).

TT_PRIM_QSPLINE - кривая является сплайном Безье второго порядка (quadric).

TT_PRIM_CSPLINE - кривая является кубическим сплайном Безье.

cpfx

Количество структур POINTFX в массиве.

apfx

Массив структур POINTFX, описывающий ломаную или спайн Безье.

Примечание

Когда приложение вызывает функцию GetGlyphOutline, она возвращает контур символа TrueType в виде структуры TTPOLYGONHEADER, вслед за которой располагается одна или несколько структур TTPOLYCURVE. Все точки возвращаются в виде структур POINTFX и описывают абсолютное (не относительное) положение. Начальная точка, с которой начинается контур, задается полем pfxStart структуры TTPOLYGONHEADER. Структуры TTPOLYCURVE могут задавать как ломаные линии, так и сплайны.

Ломаная линия является серией точек; линии отрисовываемые между точками образуют контур символа. Сплайны являются кривыми второго порядка (то есть b-сплайнами второго порядка) используемыми TrueType.

Заголовочный файл: wingdi.h (включен в windows.h)


TTPOLYGONHEADER

Задает начальное положение и тип контура символа TrueType.

Прототип

typedef struct _TTPOLYGONHEADER {

DWORD cb;

DWORD dwType;

POINTFX pfxStart;

} TTPOLYGONHEADER, *LPTTPOLYGONHEADER;

Поля структуры

cb

Количество байт, необходимых для структуры TTPOLYGONHEADER и структур (ы) TTPOLYCURVE, описывающих контур символа.

dwType

Тип возвращаемого контура. На сегодняшний день значение этого поля должно быть равно TT_POLYGON_TYPE.

pfxStart

Стартовая точка в контуре символа.

Примечание

Вслед за каждой структурой TTPOLYGONHEADER располагается одна или несколько структур TTPOLYCURVE.

Заголовочный файл: wingdi.h (включен в windows.h)


UPDATELAYEREDWINDOWINFO

Появилась в Windows Vista. Используется функцией UpdateLayeredWindowIndirect для описания положения, размера, формы, содержимого и прозрачности слоистого окна.

Прототип

typedef struct tagUPDATELAYEREDWINDOWINFO {

DWORD cbSize;

HDC hdcDst;

const POINT *pptDst;

const SIZE *psize;

HDC hdcSrc;

const POINT *pptSrc;

COLORREF crKey;

const BLENDFUNCTION *pblend;

DWORD dwFlags;

const RECT *prcDirty;

} UPDATELAYEREDWINDOWINFO, *PUPDATELAYEREDWINDOWINFO;

Поля структуры

cbSize

Размер структуры в байтах.

hdcDst

Описатель контекста устройства (DC) экрана. При вызове функции UpdateLayeredWindowIndirect значение этого поля желательно указывать равным NULL. Данный дескриптор используется для определения цветовой палитры при обновлении содержимого окна. Если значение поля hdcDst равно NULL, то используется палитра по умолчанию.

Если значение поля hdcSrc равно NULL, то и значение поля hdcDst также должно быть равно NULL.

pptDst

Указатель на структуру POINT, которая содержит информацию о новом положении слоистого окна. Если положение окна не изменяется, то значение этого поля может быть равно NULL.

psize

Указатель на структуру SIZE, которая содержит информацию о новых размерах слоистого окна. Если размер окна не изменяется, то значение этого поля может быть равно NULL. Если значение поля hdcSrc равно NULL, то значение поля psize также должно быть равно NULL.

hdcSrc

Описатель контекста устройства (DC) для поверхности, на которой размещено слоистое окно. Значение данного описателя может быть получено с помощью функции CreateCompatibleDC. Если форма и контекст отображения (visual context) окна не изменяется, то значение поля hdcSrc может быть равно NULL.

pptSrc

Указатель на структуру POINT, которая описывает положение слоя в контексте устройства. Если значение поля hdcSrc равно NULL, то значение поля pptSrc также должно быть равно NULL.

crKey

Цвет, который будет использоваться при формировании слоистого окна. Для формирования значения этого поля вы можете использовать макрос RGB.

pblend

Указатель на структуру BLENDFUNCTION, которая описывает параметры прозрачности слоистого окна.

dwFlags

Принимает одно из значений перечисленных ниже.

ULW_ALPHA - использовать информацию в поле pblend в качестве функции смешивания (blend function). Если формат дисплея 256 цветов или меньше, то эффект от этого флага такой же как и от флага ULW_OPAQUE.

ULW_COLORKEY - сделать цвет в crKey прозрачным (as the transparency color).

ULW_OPAQUE - нарисовать непрозрачное слоистое окно.

ULW_EX_NORESIZE - указывает функции UpdateLayeredWindowIndirect вернуть ошибку, если текущий размер окна не соответствует размеру указанному в поле psize.

Если значение поля hdcSrc равно NULL, то значение поля dwFlags должно быть равно нулю.

prcDirty

Указатель на структуру RECT, которая описывает область, которая должна быть обновлена. Значение данного поля может быть равно NULL. Если его значение отлично от NULL, то область в этом прямоугольнике будет обновляться из исходного DC (source DC).

Заголовочный файл: winuser.h (включен в windows.h)


WCRANGE

Описывает интервал символов Unicode.

Прототип

typedef struct tagWCRANGE {

WCHAR wcLow;

USHORT cGlyphs;

} WCRANGE, *PWCRANGE;

Поля структуры

wcLow

Младшая кодовая точка (code point) Unicode в интервале поддерживаемых кодовых точек.

cGlyphs

Количество поддерживаемых кодовых точек в данном интервале.

Заголовочный файл: wingdi.h (включен в windows.h)


WINDOWINFO

Содержит информацию об окне.

Прототип

typedef struct tagWINDOWINFO {

DWORD cbSize;

RECT rcWindow;

RECT rcClient;

DWORD dwStyle;

DWORD dwExStyle;

DWORD dwWindowStatus;

UINT cxWindowBorders;

UINT cyWindowBorders;

ATOM atomWindowType;

WORD wCreatorVersion;

} WINDOWINFO, *PWINDOWINFO, *LPWINDOWINFO;

Поля структуры

cbSize

Размер структуры в байтах. Вызывающий поток должен самостоятельно указать в этом поле значение sizeof(WINDOWINFO).

rcWindow

Структура RECT, в которой содержатся координаты окна.

rcClient

Структура RECT, в которой содержатся координаты клиентской области окна.

dwStyle

Набор стилей окна. Допустимые стили окон перечислены здесь.

dwExStyle

Набор расширенных стилей окна. Допустимые расширенные стили окна перечислены здесь.

dwWindowState

Состояние окна. Если значение этого поля равно WS_ACTIVECAPTION (0x0001), то окно активно. В противном случае значение этого поля равно нулю.

cxWindowBorders

Ширина границы окна в пикселях.

cyWindowBorders

Высота границы окна в пикселях.

atomWindowType

Атом оконного класса для заданного окна.

wCreatorVersion

Версия Windows приложения, которое создало заданное окно.

Заголовочный файл: winuser.h (включен в windows.h)


WINDOWPLACEMENT

Содержит информацию о положении окна на экране.

Прототип

typedef struct tagWINDOWPLACEMENT {

UINT length;

UINT flags;

UINT showCmd;

POINT ptMinPosition;

POINT ptMaxPosition;

RECT rcNormalPosition;

} WINDOWPLACEMENT, *PWINDOWPLACEMENT, *LPWINDOWPLACEMENT;

Поля структуры

length

Размер структуры в байтах. Перед вызовом функции GetWindowPlacement или SetWindowPlacement значение данного поля должно быть установлено равным sizeof(WINDOWPLACEMENT).

Если значение данного поля установлено неверно, то функции GetWindowPlacement и SetWindowPlacement завершаются ошибкой.

flags
Набор флагов, которые управляют положением свёрнутого окна и методом с помощью которого данное око будет восстанавливаться. Принимает одно из перечисленных ниже значений или их сочетание.

WPF_ASYNCWINDOWPLACEMENT - если вызывающий поток и поток, который владеет окном присоединены к разным очередям ввода, то система отправит запрос потоку, который владеет окном. Это защитит вызывающий поток от блокирования на время обработки запроса другим потоком.

WPF_RESTORETOMAXIMIZED - восстанавливаемое окно будет развёрнуто, независимо от того было ли оно развёрнутым перед сворачиванием или нет. Эта настройка действует только при следующем восстановлении окна. Она не изменяет поведение восстановления по умолчанию.

Данный флаг действителен только при задании для поля showCmd значения SW_SHOWMINIMIZED.

WPF_SETMINPOSITION - могут быть заданы координаты свёрнутого окна. Данный флаг должен указываться когда соответствующие координаты заданы в поле ptMinPosition.

showCmd

Текущее состояние отображения окна. Допустимые значения этого поля перечислены здесь.

ptMinPosition

Структура POINT, в которой содержатся координаты левого верхнего угла окна в свёрнутом состоянии.

ptMaxPosition

Структура POINT, в которой содержатся координаты левого верхнего угла окна в развёрнутом состоянии.

rcNormalPosition

Структура RECT, в которой содержатся координаты окна в восстановленном состоянии.

Примечания

Если заданное окно является окном верхнего уровня, у которого не установлен стиль WS_EX_TOOLWINDOW, то координаты заданные в полях ptMinPosition, ptMaxPosition и rcNormalPosition указаны в системе координат рабочей области (workspace coordinates). В противном случае данные координаты заданы в экранной системе коордиат.

Координаты рабочей области отличаются от экранных координат в том, что они учитывают расположение и размер панелей инструментов (toolbars) (включая панель задач). Координата (0,0) рабочей области это левый верхний угол пространства рабочей области (workspace area), область экрана не используется (not being used by) панелями инструментов приложений.

Координаты используемые в структуре WINDOWPLACEMENT должны использоваться только функциями GetWindowPlacement и SetWindowPlacement. Передача координат рабочей области в функцию, которая работает с экранными координатами (например, SetWindowPos) приведет к появлению окна в неправильном месте. Например, если панель задач расположена наверху экрана, то получение координат с помощью GetWindowPlacement и последующая их передача в SetWindowPos приведет к тому, что окно будет дрейфовать ("creep") на экране.

Заголовочный файл: winuser.h (включен в windows.h)


WINDOWPOS

Содержит информацию о размерах и положении окна.

Прототип

typedef struct tagWINDOWPOS {

HWND hwnd;

HWND hwndInsertAfter;

int x;

int y;

int cx;

int cy;

UINT flags;

} WINDOWPOS, *LPWINDOWPOS, *PWINDOWPOS;

Поля структуры

hwnd

Описатель окна

hwndInsertAfter

Определяет позицию окна в Z-последовательности. Это элемент может быть дескриптором окна, позади которого расположено описываемое окно, или может быть одним из частных значений, перечисленных в описании функции SetWindowPos.

x

Позиция левого края окна.

y

Позиция верхнего края окна.

cx

Ширина окна в пикселях.

cy

Высота окна в пикселях.

flags

Набор флагов, определяющих позицию окна. Допустимые флаги перечислены здесь.

Заголовочный файл: 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

Размер дополнительной памяти в байтах, выделяемой за экземпляром окна описываемого класса. Система инициализирует эти байты нулями. Если приложение использует WNDCLASS для регистрации диалогового окна, создаваемого с использованием директивы CLASS в файле ресурсов, в поле cbWndExtra должно храниться значение DLGWINDOWEXTRA.

hInstance

Описатель модуля, в котором содержится оконная процедура данного класса.

hIcon

Описатель иконки окна. Это поле структуры должно быть равно идентификатору ресурса, описывающего иконку. Если оно равно NULL, то используется иконка по умолчанию

hCursor

Описатель курсора окна. Это поле структуры должно быть равно идентификатору ресурса, описывающего курсор. Если NULL, то используется курсор по умолчанию

hbrBackground

Описатель кисти фона окна. Это поле может быть равно дескриптору кисти, которая используется для закраски фона. Или оно может быть системным цветом фона.

lpszMenuName

Строка с именем ресурса или идентификатор ресурса, описывающего меню окна. Если это поле равно NULL, то у данного окна нет меню.

lpszClassName

Строка с наименованием оконного класса.

Заголовочный файл: Winuser.h (включен в Windows.h)


WNDCLASSEX

Содержит атрибуты оконного класса. Является расширенным вариантом структуры 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)


KillTimer

Разрушает заданный таймер.

Прототип

BOOL WINAPI KillTimer(

_In_opt_ HWND hWnd,

_In_ UINT_PTR uIDEvent

);

Параметры

hWnd[in,opt]

Описатель окна, ассоциированного с таймером. Значение этого параметра должно совпадать со значением параметра hWnd, которое было передано в функцию SetTimer при создании таймера.

uIDEvent[in]

Идентификатор разрушаемого таймера. Если в функцию SetTimer был передан корректный описатель окна, то значение параметра uIDEvent должно совпадать со значением nIDEvent, переданным в функцию SetTimer. Если приложение вызывало функцию SetTimer со значением параметра hWnd равным NULL, то значение параметра uIDEvent должно совпадать со значением, возвращенным функцией SetTimer.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Нуль. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Функция KillTimer не удаляет соообщения WM_TIMER, уже помещенные в очередь сообщения.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll


SetTimer

Создаёт таймер с заданным интервалом срабатываний.

Прототип

UINT_PTR WINAPI SetTimer(

_In_opt_ HWND hWnd,

_In_ UINT_PTR nIDEvent,

_In_ UINT uElapse,

_In_opt_ TIMERPROC lpTimerFunc

);

Параметры

hWnd[in,opt]

Описатель окна ассоциированного с таймером. Окно должно принадлежать вызывающему потоку. Если значение этого параметра равно NULL, а параметр nIDEvent описывает существующий таймер, то этот таймер будет заменен так, чтобы установленный таймер был ассоциирован со значением описателя окна, отличным от NULL.

nIDEvent[in]

Ненулевой идентификатор таймера. Если значение параметра hWnd равно NULL, а параметр nIDEvent описывает несуществующий таймер, то значение параметра nIDEvent будет проигнорировано и будет создан новый идентификатор таймера. Если же значение параметра hWnd отлично от NULL и окно, описываемое им уже владеет таймером с идентификатором nIDEvent, то существуюий таймер будет заменен новым таймером.

Когда функция SetTimer заменяет таймер, последний сбрасывается. Поэтому сообщени, которое было отправлено по истечении текущего интервала времени, но до установки нового интервала воемени, игнорируется. Если функция не должна замещать таймер, тло значение параметра nIDEvent должно быть равно нулю, а параметра hWnd - NULL.

uElapse[in]

Интервал срабатывания таймера, в миллисекундах.

Если значение этого параметра меньше чем USER_TIMER_MINIMUM (0x0000000A), интервал устанавливается равным USER_TIMER_MINIMUM. Если значение параметра uElapse больше, чем USER_TIMER_MAXIMUM (0x7FFFFFFF), интервал устанавливается равным USER_TIMER_MAXIMUM.

lpTimerFunc[in,opt]

Указатель на функцию TimerProc, которая будет вызываться по истечении заданного интервала времени. Если значение этого параметра равно NULL, то по истечении интервала времени система будет помещать сообщение WM_TIMER в очередь сообщений приложения. Поле hwnd структуры MSG, описывающей сообщение, будет содержать значение параметра hWnd.

Возвращаемое значение

Если значение параметра hWnd равно NULL, то функция возвращает идентификатор нового таймера. Приложение может передать это значение в функцию KillTimer для разрушения таймера.

Если значение параметра hWnd отлично от NULL, то функция возвращает положительное целое. Приложение может передать значение параметра nIDEvent в функцию KillTimer для разрушения таймера.

Возвращаемое значение в случае ошибки

Нуль. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Приложение может обработать сообщение WM_TIMER путём его явной обработки в оконной процедуре или путём задания функции обратного вызова TimerProc, указываемой во время создания таймера. Если вы задали функцию обратного вызова, стандартная оконная процедура будет вызывать её при обработке сообщения WM_TIMER. Поэтому вы должны самостоятельно диспетчеризировать сообщения даже при использовании функции обратного вызова TimerProc.

Параметр wParam сообщения WM_TIMER будет содержать значение параметра nIDEvent.

Идентификатор таймера, nIDEvent, является специфическим для заданного окна. Другое окно может иметь собственный таймер с таким же идентификатором, что и у первого окна. При этом таймеры независимы друг от друга.

Функция SetTimer может повторно использовать идентификаторы таймеров в случае, когда значение параметра hWnd равно NULL.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll


DialogProc

Определенная приложением функция обратного вызова, используемая совместно с функциями семейств CreateDialog и DialogBox. Функция DialogProc обрабатывает сообщения, отправленные модальному или немодальному диалоговому окну. Тип данных DLGPROC определяет указатель на эту функцию обратного вызова. Наименование DialogProc может быть изменено приложением.

Прототип

INT_PTR CALLBACK DialogProc(

_In_ HWND hwndDlg,

_In_ UINT uMsg,

_In_ WPARAM wParam,

_In_ LPARAM lParam

);

Параметры

hwndDlg[in]

Описатель диалогового окна.

uMsg [in]

Оконное сообщение.

wParam [in]

Дополнительный параметр сообщения.

lParam [in]

Дополнительный параметр сообщения.

Возвращаемое значение

Обычно, если диалоговая процедура обрабатывает сообщение, то она должна вернуть значение TRUE. В противном случае она долдна вернуть значение FALSE. Если диалоговая процедура вернула значение FALSE, система обрататывает полученное сообщение по умолчанию.

Если диалоговая процедура обрабатывает сообщение, в ответ на которое должно быть возвращено некоторое значение, то она должна установить возвращаемое значение вызовом функции SetWindowLong(hwndDlg, DWL_MSGRESULT, lResult) непосредственно перед возвращением значения TRUE. Обратите внимание на то, что функция SetWindowLong должна быть вызвана непосредственно перед возвращением значения TRUE. Если её вызвать раньше, то возвращаемое значение может быть перезаписано вложенным (nested) оконным сообщением.

Сообщения, перечисленные ниже являются исключениями из описанных выше правил. Для получения детальной информации, смотрите описание данных сообщений.

· WM_CHARTOITEM
· WM_COMPAREITEM
· WM_CTLCOLORBTN
· WM_CTLCOLORDLG
· WM_CTLCOLOREDIT
· WM_CTLCOLORLISTBOX
· WM_CTLCOLORSCROLLBAR
· WM_CTLCOLORSTATIC
· WM_INITDIALOG
· WM_QUERYDRAGICON
· WM_VKEYTOITEM

Пример использования

Пример использования приведен здесь.

Примечание

Вы должны использовать диалоговую процедуру только при использовании диалогового класса для диалогового окна. Диалоговый класс является классом по умолчанию и используется когда в шаблоне диалогового окна явно не указан никакой другой класс. Хотя диалоговая процедура похожа на оконную процедуру, вы не должны вызывать функцию DefWindowProc для обработки нежелательных сообщений. Нежелательные сообщения обрабатываются оконной процедурой внутри диалогового окна.


EnumChildProc

Определяемая приложением функция обратного вызова используемая совместно с функцией EnumChildWindows при перечислении дочерних окон.

Прототип

BOOL CALLBACK EnumChildProc(

_In_ HWND hwnd,

_In_ LPARAM lParam

);

Параметры

hwnd[in]

Описатель очередного найденного дочернего окна.

lParam[in]

Определенное приложением значение переданное в функцию EnumChildWindows.

Возвращаемое значение

Для продолжения перечисления окон функция должна вернуть значение TRUE. Для того, чтобы прервать перечисление окон она должна вернуть значение FALSE.

Пример использования

Пример использования приведен здесь.

Примечание

Функция обратного вызова может выполнять любую требуемую операцию.

Приложение должно зарегистрировать эту функцию с помощью EnumChildWindows.


EnumFontsProc

Определенная приложением функция обратного вызова, обрабатывающая данные шрифта, предоставленные функцией EnumFonts. Тип FONTENUMPROC задает указатель на эту функцию. Наименование EnumFontsProc может быть изменено приложением.

Функция EnumFonts предоставляется только для совместимости с 16-разрядными версиями Windows. Вместо нее приложения должны использовать функцию EnumFontFamiliesEx.

Прототип

int CALLBACK EnumFontsProc(

_In_ const LOGFONT *lplf,

_In_ const TEXTMETRIC *lptm,

_In_ DWORD dwType,

_In_ LPARAM lpData

);

Параметры

lplf [in]

Указатель на структуру LOGFONT, содержащую информацию о логических атрибутах шрифта.

Данный параметр может указывать на структуру ENUMLOGFONTEXDV.

lptm [in]

Указатель на структуру TEXTMETRIC, содержащую информацию о физических атрибутах шрифта.

Данный параметр может указывать на структуру ENUMTEXTMETRIC.

dwType [in]

Тип шрифта. Данный параметр может содержать комбинацию значений перечисленных ниже.

DEVICE_FONTTYPE

RASTER_FONTTYPE

TRUETYPE_FONTTYPE

lpData [in]

Указатель на определенные приложением данные, переданные в функцию EnumFonts.

Возвращаемое значение

Для продолжения перечисления функция должна вернуть ненулевое значение. Для его остановки - значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Для определения типа шрифта может использоваться операция И (&) совместно с константами RASTER_FONTTYPE и DEVICE_FONTTYPE. Флаг RASTER_FONTTYPE задает является шрифт растровым или векторным. Если флаг установлен, то шрифт является растровым; если же бит сброшен, то это векторный шрифт. Флаг DEVICE_FONTTYPE определяет основан шрифт на базе устройства (is device-based) или на базе интерфейса графического устройства (GDI). Если флаг установлен. то шрифт основан на базе устройства. Если же он сброшен, то шрифт основан на базе GDI.

Если устройство допускает трансформации текста (масштабирование, начертание курсивом и так далее), то перечисляются только базовые шрифты. Пользователь должен узнать: предоставляет ли устройство возможность трансформации текста; это поможет определить, какие дополнительные шрифты предоставляются устройством.

Функция EnumFontsProc должна быть зарегистрирована путем передачи её адреса в функцию EnumFonts.


EnumFontFamExProc

Определенная приложением функция обратного вызова, используемая совместно с функцией EnumFontFamiliesEx. Данная функция обратного вызова используется для обработки шрифтов. Она вызывается один раз для каждого перечисляемого шрифта. Тип данных FONTENUMPROC задает указатель на функцию обратного вызова. Наименование EnumFontFamExProc может быть изменено приложением.

Прототип

int CALLBACK EnumFontFamExProc(

const LOGFONT *lpelfe,

const TEXTMETRIC *lpntme,

DWORD FontType,

LPARAM lParam

);

Параметры

lpelfe

Указатель на структуру LOGFONT, которая содержит информацию о логических атрибутах шрифта. Для получения дополнительной информации о шрифте, вы можете привести параметр lpelfe к типу указателя на структуру ENUMLOGFONTEX или ENUMLOGFONTEXDV.

lpntme

Указатель на структуру, содержащую информацию о физических атрибутах шрифта. Функция использует структуру NEWTEXTMETRICEX для шрифтов типа TrueType и структуру TEXTMETRIC для шрифтов других типов.

Также это может быть структура ENUMTEXTMETRIC.

FontType

Тип шрифта. Данное поле может содержать комбинацию значений, перечисленных ниже.

DEVICE_FONTTYPE

RASTER_FONTTYPE

TRUETYPE_FONTYPE

lParam

Определенные приложением данные, переданные в функцию EnumFontFamiliesEx.

Возвращаемое значение

Для продолжения перечисения функция должна вернуть ненулевое значение. Для его остановки функция должна вернуть значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Приложение должно зарегистрировать эту функцию обратного вызова, путем передачи её адреса в функцию EnumFontFamiliesEx.

Если с помощью функции SetGraphicsMode был установлен режим GM_ADVANCED и в параметре FontType был передан флаг DEVICE_FONTTYPE, функция EnumFontFamiliesEx будет перечислять шрифты типов 1 (type 1) и OpenType, установленные в системе. Если установленный режим отличен от GM_ADVANCED, функция будет перечислять шрифты типов 1, OpenType и TrueType.

В отличие от функции EnumFontFamProc функция EnumFontFamexProc прнимает расширенную информацию о шрифте. Структура ENUMLOGFONTEX включает в себя локализованное наименование скрипта (script) (набора символов). Структура NEWTEXTMETRICEX включает в себя сигнатуру шрифта.


EnumFontFamProc

Определенная приложением функция обратного вызова, используемая совместно с функцией EnumFontFamilies. Функция EnumFontFamProc принимает данные, описывающие доступные шрифты. Тип FONTENUMPROC определяет указатель на эту функцию обратного вызова. Наименование EnumFontFamProc может быть заменено на другое.

Функция EnumFontFamilies предоставлена только для совместимости с 16-разрядными версиями Windows. Приложения должны использовать функцию EnumFontFamiliesEx.

Прототип

int CALLBACK EnumFontFamProc(

_In_ ENUMLOGFONT *lpelf,

_In_ NEWTEXTMETRIC *lpntm,

_In_ DWORD FontType,

_In_ LPARAM lParam

);

Параметры

lpelf [in]

Указатель на структуру ENUMLOGFONT, которая содержит информацию о логических атрибутах шрифта.

Это может быть структура ENUMLOGFONTEXDV.

lpntm [in]

Если тип шрифта TrueType, то данный параметр содержит указатель на структуру NEWTEXTMETRIC, содержащую информацию о физических атрибутах шрифта. Если же тип шрифта отличен от TrueType, то данный параметр указывает на структуру TEXTMETRIC.

Данный параметр может указывать на структуру ENUMTEXTMETRIC.

FontType [in]

Тип шрифта. Данный параметр содержит комбинацию флагов перечисленных ниже.

DEVICE_FONTTYPE

RASTER_FONTTYPE

TRUETYPE_FONTTYPE

lParam [in]

Указатель на определенные приложением данные, переданные в функцию EnumFontFamilies.

Возвращаемое значение

Для продолжения перечисления функция должна вернуть ненулевое значение. Для его прекращения она должна вернуть значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Приложение должно зарегистрировать эту фунцию, путем передачи её адреса в функцию EnumFontFamilies.

Если с помощью функции SetGraphicsMode был установлен режим GM_ADVANCED и в параметре FontType был передан флаг DEVICE_FONTTYPE, функция EnumFontFamilies будет перечислять шрифты типов 1 (type 1) и OpenType, установленные в системе. Если установленный режим отличен от GM_ADVANCED, функция будет перечислять шрифты типов 1, OpenType и TrueType.

Оператор И (&) может быть использован с флагами RASTER_FONTTYPE, DEVICE_FONTTYPE и TRUETYPE_FONTTYPE для определения типа шрифта. Если установлен флаг RASTER_FONTTYPE, шрифт является растровым. Если установлен флаг TRUETYPE_FONTTYPE, шрифт имеет тип TrueType. Если ни один из этих флагов не установлен, то шрифт является векторным. Флаг DEVICE_FONTTYPE устанавливается, если устройство (например, лазерный принтер) поддерживает загружаемые шрифты TrueType или шрифт задан устройством (device-resident font). Данный флаг сброшен, если устройство является монитором, матричным принтером или другим растровым устройством. Приложение также может использовать флаг DEVICE_FONTTYPE для отделения поддерживаемых системой GDI растровых шрифтов от шрифтов, предоставленных устройством. Система GDI может имитировать полужирое, курсивное, подчеркнутое и зачеркнутое начертание растровых шрифтов, поддерживаемых GDI, но не шрифтов, предоставленных устройством.


EnumResLangProc

Определенная приложением функция обратного вызова используемая совместно с функциями EnumResourceLanguages и EnumResourceLanguagesEx. Данная функция принимает тип, наименование и язык ресурса. Тип ENUMRESLANGPROC описывает указатель на эту функцию. Вместо EnumResLangProc приложение может определить своё наименование этой функции.

Прототип

BOOL CALLBACK EnumResLangProc(

_In_opt_ HMODULE hModule,

_In_ LPCTSTR lpszType,

_In_ LPCTSTR lpszName,

_In_ WORD wIDLanguage,

_In_ LONG_PTR lParam

);

Параметры

hModule[in,opt]

Описатель на модуль, исполняемый файл которого содержит ресурсы, языки которых перечисляются. Если значение этого параметра равно NULL, то функция перечисляет языки ресурсов, находящихся в модуле, использовавшемся для создания текущего процесса.

lpszType[in]

Тип ресурса, языки которого перечисляются. Вместо указтаеля на строку, данный параметр может содержать значение MAKEINTRESOURCE(ID), где ID - целочисленный идентификатор, задающий предопределенный тип ресурса. Стандартные типы ресурсов перечислены здесь.

lpszName[in]

Наименование ресурса, языки которого перечисляются. Вместо указателя на строку с наименованием данный параметр может содержать значение MAKEINTRESOURCE(ID), где ID - целочисленный идентификатор ресурса.

wIDLanguage[in]

Идентификатор языка ресурса, для которого перечисляются языки. Значение этого параметра предоставляют функции EnumResourceLanguages и EnumResourceLanguagesEx.

lParam[in]

Определенное приложением значение, передаваемое в функцию EnumResourceLanguages и EnumResourceLanguagesEx. Данный параметр может использоваться для проверки на ошибки.

Возвращаемое значение

TRUE для продолжения перечисления. FALSE для его остановки.

Пример использования

Пример использования приведен здесь.

Примечание

Если значение IS_INTRESOURCE(lpszType) равно TRUE, то параметр lpszType содержит целочисленный идентификатор типа ресурса. В противном случае, данный параметр содержит указатель на завершающуюся NULL символом строку. Если первым символом строки является символ решетки (#), то последующие символы описывают целочисленный идентификатор типа ресурсов представленный в десятичной системе счисления. Например, строка "#258" задает идентификатор 258.

Аналогично, если значение IS_INTRESOURCE(lpszName) равно TRUE, то параметр lpszName содержит целочисленный идентификатор ресурса. В противном случае, данный параметр содержит указатель на завершающуюся NULL символом строку. Если первым символом строки является символ решетки (#), то последующие символы описывают целочисленный идентификатор ресурса, представленный в десятичной системе счисления.

Приложение должно зарегистрировать этй функцию путем передачи её адреса в функцию EnumResourceLanguages или EnumResourceLanguagesEx.

Если данная функция обратного вызова возвращает значение FALSE, то функция EnumResourceLanguages и EnumResourceLanguagesEx останавливает перечисление и возвращает значение FALSE. В Windows XP и более ранних версиях операционной системы функция GetLastError в этом случае вернет значение ERROR_SUCCESS. Начиная же с Windows Vista функция GetLastError возаращает значение ERROR_RESOURCE_ENUM_USER_STOP.


EnumResNameProc

Определяемая приложением функция обратного вызова используемая совместно с функциями EnumResourceNames и EnumResourceNamesEx. Она получает тип и наименование ресурса. Тип ENUMRESNAMEPROC описывает указатель на эту функцию обратного вызова. Вместо EnumResNameProc приложение может определить своё наименование этой функции.

Прототип

BOOL CALLBACK EnumResNameProc(

_In_opt_ HMODULE hModule,

_In_ LPCTSTR lpszType,

_In_ LPTSTR lpszName,

_In_ LONG_PTR lParam

);

Параметры

hModule[in,opt]

Описатель модуля, исполняемый файл которого содержит перечисляемые ресурсы. Если значение этого параметра равно NULL, то функция перечисляет наименования ресурсов в модуле, создавшем текущий процесс.

lpszType[in]

Тип ресурса, наименования которого перечисляются. Вместо указателя на строку данный параметр может содержать значение MAKEINTRESOURCE(ID), где ID - целочисленное значение, определяющее предопределенный тип ресурса. Стандартные типы ресурсов перечислены здесь.

lpszName[in]

Наименование ресурса заданного типа. Вместо указателя на строку, данный параметр может содержать значение MAKEINTRESOURCE(ID), где ID - целочисленный идентификатор ресурса.

lParam[in]

Определенный приложением параметр, переданный в функцию EnumResourceNames или EnumResourceNamesEx. Данный параметр может быть использован при проверке ошибок.

Возвращаемое значение

Для продолжения перечисления фунцкия должна вернуть значение TRUE. Для его остановки - значение FALSE.

Пример использования

Пример использования приведен здесь.

Примечание

Если значение IS_INTRESOURCE(lpszType) равно TRUE, то параметр lpszType содержит целочисленный идентификатор типа ресурса. В противном случае, он содержит указатель на завершающуюся NULL символом строку. Если первый символ строки - символ решетки (#), то последующие символы строки представляют собой целочисленный идентификатор типа ресурса, записанный в десятичной системе счисления. Например, строка "#258" представляет идентификатор 258.

Аналогично, если значение IS_INTRESOURCE(lpszName) равно TRUE, то параметр lpszName содержит целочисленный идентификатор ресурса. В пртивном случае, он содержит указатель на завершающуюся NULL символом строку. Если первый символ строки - символ решетки (#), то последующие символы строки представляют собой целочисленный идентификатор ресурса, записанный в десятичной системе счисления.

Приложение должно зарегистрировать эту функцию, путем передачи её адреса в функцию EnumResourceNames или EnumResourceNamesEx.

Если данная функция обратного вызова возвращает значение FALSE, то функция EnumResourceNames или EnumResourceNamesEx останавливает перечисление и возвращает значение FALSE. В Windows XP и более ранних версиях операционной системы функция GetLastError в этом случае возвращала значение ERROR_SUCCESS; начиная с Windows Vista функция GetLastError возвращает значение ERROR_RESOURCE_ENUM_USER_STOP.


EnumResTypeProc

Определенная приложением функция обратного вызова используемая совместно с функциями EnumResourceTypes и EnumResourceTypesEx. Она получает типы ресурсов. Тип ENUMRESTYPEPROC описывает указатель на эту функцию обратного вызова. Вместо EnumResTypeProc приложение может определить своё наименование этой функции.

Прототип

BOOL CALLBACK EnumResTypeProc(

_In_opt_ HMODULE hModule,

_In_ LPTSTR lpszType,

_In_ LONG_PTR lParam

);

Параметры

hModule[in,opt]

Описатель модуля, исполняемый файл которого содержит ресурсы, типы которых перечисляются. Если значение этого параметра равно NULL, то функция перечисляет типы ресурсов, находящихся в модуле, создавшем текущий процесс.

lpszType[in]

Найденный тип ресурса. Вместо указателя на строку, данный параметр может содержать значение MAKEINTRESOURCE(ID), где ID - целочисленный идентификатор типа ресурса. Стандартные типы ресурсов перечислены здесь.

lParam[in]

Определенное приложением значение переданное в функцию EnumResourceTypes или EnumResourceTypesEx. Этот параметр может быть использован при проверке ошибок.

Возвращаемое значение

Значение TRUE для продолжения перечисления. Значение FALSE для его остановки.

Пример использования

Пример использования приведен здесь.

Примечание

Если значение IS_INTRESOURCE(lpszType) равно TRUE, то параметр lpszType содержит целочисленный идентификатор типа ресурса. В противном случае, данный параметр содержи указатель на завершающуюся NULL символом строку. Если первый символ строки - символ решетка (#), то последующие символы представляют собой целочисленный идентификатор типа ресурса, представленный в десятичной системе счисления. Например, строка "#258" представляет идентификатор 258.

Приложение должно зарегистрировать эту функцию путем передачи её адреса в функцию EnumResourceTypes или EnumResourceTypesEx.

Если функция обратного вызова возвращает значение FALSE, то функция EnumResourceTypes и EnumResourceTypesEx останавливает перечисление и возвращает значение FALSE. В Windows XP и более ранних версиях операционной системы функция GetLastError в этом случае вернет значение ERROR_SUCCESS. Начиная с Windows Vista, функция GetLastError вернет значение ERROR_RESOURCE_ENUM_USER_STOP.


EnumThreadWndProc

Определенная приложением функция обратного вызова, используемая совместно с функцией EnumThreadWindows для перечисления окон заданного потока.

Прототип

BOOL CALLBACK EnumThreadWndProc(

_In_ HWND hwnd,

_In_ LPARAM lParam

);

Параметры

hwnd[in]

Описатель очередного найденного окна.

lParam[in]

Определенное приложением значение переданное в функцию EnumThreadWindows.

Возвращаемое значение

Для продолжения перечисления окон функция должна вернуть значение TRUE. Для того, чтобы прервать перечисление окон она должна вернуть значение FALSE.

Пример использования

Пример использования приведен здесь.

Примечание

Приложение должно зарегистрировать эту функцию с помощью EnumThreadWindows.


EnumUILanguagesProc

Определенная приложением функция обратного вызова, которая используется совместно с функцией EnumUILanguages. Тип UILANGUAGE_ENUMPROC описывает указатель на эту ункцию обратного вызова. Вместо EnumUILanguagesProc приложение может задать своё наименование этой функции.

Прототип

BOOL CALLBACK EnumUILanguagesProc(

_In_ LPTSTR lpUILanguageString,

_In_ LONG_PTR lParam

);

Параметры

lpUILanguageString[in]

Указатель на завершающуюся NULL символом строку, содержащую идентификатор или наименование языка, в зависимости от значения параметра dwFlags функции EnumUILanguages.

lParam[in]

Определенное приложением значение.

Возвращаемое значение

TRUE для продолжения перечисления. FALSE для его остановки.

Пример использования

Пример использлвания приведен здесь.

Примечание

Для регистрации этой функции обратного вызова, приложение должно передать её адрес в функцию EnumUILanguages.

Если при вызове функции EnumUILanguages задан флаг MUI_LANGUAGE_ID, то передаваемая в функцию обратного вызова строка будет содержать идентификатор языка в шестнадцатеричной системе счисления, не включая лидирующих символов 0x. Передаваемая строка имеет длину 4 символа. Например, для языка en-US будет передана строка "0409".


EnumWindowsProc

Определяемая приложением функция обратного вызова используемая совместно с функциями EnumWindows или EnumDesktopWindows при перечислении окон верхнего уровня.

Прототип

BOOL CALLBACK EnumWindowsProc(

_In_ HWND hwnd,

_In_ LPARAM lParam

);

Параметры

hwnd[in]

Описатель очередного окна верхнего уровня.

lParam[in]

Определенное приложением значение переданное в функцию EnumWindows или EnumDesktopWindows.

Возвращаемое значение

Для продолжения перечисления окон функция должна вернуть значение TRUE. Для того, чтобы прервать перечисление окон она должна вернуть значение FALSE.

Пример использования

Пример использования приведен здесь.

Примечание

Приложение должно зарегистрировать эту функцию обратного вызова с помощью функции EnumWindows или EnumDesktopWindows.


MsgBoxCallback

Определяемая приложением функция обратного вызова, используемая совместно с функцией MessageBoxIndirect. Данная функция обратного вызова вызывается при запросе пользователем помощи. Наименование MsgBoxCallback может быть заменено в приложении.

Прототип

VOID CALLBACK MsgBoxCallback(

LPHELPINFO lpHelpInfo

);

Параметры

lpHelpInfo [in]

Указатель на структуру HELPINFO.

Возвращаемое значение

Данная функция ничего не возвращает.

Пример использования

Пример использвоания приведен здесь.


SendAsyncProc

Определенная приложение функция обратного вызова используемая совместно с функцией SendMessageCallback. Система передает сообщение этой функции после передачи сообщения целевой оконной процедуре. Тип SENDASYNCPROC описывает указатель на эту функцию обратного вызова. Наименование SendAsyncProc может быть заменено в приложении.

Прототип

VOID CALLBACK SendAsyncProc(

_In_ HWND hwnd,

_In_ UINT uMsg,

_In_ ULONG_PTR dwData,

_In_ LRESULT lResult

);

Параметры

hwnd[in]

Описатель окна, оконная процедура которого получила сообщение.

Если функция SendMessageCallback была вызвана с параметром hwnd равным HWND_BROADCAST, то система вызывает SendAsyncProc для каждого окна верхнего уровня.

uMsg[in]

Код сообщения.

dwData[in]

Определенное приложением значение переданное из функции SendMessageCallback.

lResult[in]

Результат обработки сообщения. Данное значение зависит от рассылаемого сообщения.

Возвращаемое значение

Функция ничего не возвращает.

Пример использования

Пример использования приведен здесь.

Примечание

Функция SendAsyncProc устанавивается путем передачи указателя SENDASYNCPROC в функцию SendMessageCallback.

Функция обратного вызова вызывается только тогда когда поток, вызвавший SendMessageCallback вызывает GetMessage, PeekMessage или WaitMessage.


TimerProc

Определенная приложением функция обратного вызова, которая орабатывает сообщение WM_TIMER. Тип TIMERPROC описывает указатель на эту функцию обратного вызова. Наименование TimerProc может быть изменено приложением.

Прототип

VOID CALLBACK TimerProc(

_In_ HWND hwnd,

_In_ UINT uMsg,

_In_ UINT_PTR idEvent,

_In_ DWORD dwTime

);

Параметры

hwnd[in]

Описатель окна, ассоциированного с таймером.

uMsg[in]

Сообщение WM_TIMER.

idEvent[in]

Идентификатор таймера.

dwTime[in]

Количество милисекунд прошедших с момента старта системы. Это значение возвращается функцией GetTickCount.

Возвращаемое значение

Функция ничего не возвращает.

Пример использования

Пример использования приведен здесь.


Оконная процедура

Это функция обратного вызова, осуществляющая обработку оконных сообщений.

Прототип

LRESULT CALLBACK WndProc(

HWND hwnd,

UINT uMsg,

WPARAM wParam,

LPARAM lParam)

Параметры

hwnd

Описатель окна, которому адресовано оконное сообщение.

uMsg

Код сообщения. Возможные коды сообщений перечислены здесь.

wParam

Параметр сообщения. Зависит от его кода.

lParam

Параметр сообщения. Зависит от его кода.

Возвращаемое значение

Зависит от обрабатываемого сообщения

Пример использования

Смотри в примере оконного приложения.

Примечание

В том случае, если оконная процедура не желает самостоятельно обрабатывать оконное сообщение, она должна вызвать функцию DefWindowProc, которая осуществляет обработку сообщений по умолчанию.


AddFontMemResourceEx

Добавляет в систему шрифт из ресурса, хранящегося в памяти.

Прототип

HANDLE AddFontMemResourceEx(

_In_ PVOID pbFont,

_In_ DWORD cbFont,

_In_ PVOID pdv,

_In_ DWORD *pcFonts

);

Параметры

pbFont [in]

Указатель на ресурс шрифта.

cbFont [in]

Размер, в байтах, ресурса, на который указывает параметр pbFont.

pdv [in]

Зарезервировано. Должен быть равен нулю.

pcFonts [in]

Указатель на переменную, задающую количество установленных шрифтов.

Возвращаемое значение

Описатель добавленного шрифта. Данный описатель уникально идентифицирует установленные в системе шрифты.

Возвращаемое значение в случае ошибки

Значение нуль. Дополнительная информация об ошибке недоступна.

Пример использования

Пример использования приведен здесь.

Примечание

Данная функция позволяет приложению получить шрифт, встроенный в документ или веб-страницу. Шрифт, добавляемый функцией AddFontMemResourceEx всегда является закрытым для процесса, вызвавшего функцию и не перечисляется.

Образ памяти может содержать более одного шрифта. В случае успеха, параметр pcFonts указывает на переменную типа DWORD, значение которой задает количество добавленных в систему шрифтов. Например, это число могло быть равно 2 для вертикального и горизонтального азиатского шрифта.

После вызова функции приложение может освободить память pbFont, так как система сделала копию данной области памяти. Для удаления установленных шрифтов используйте функцию RemoveFontMemResourceEx. Когда процесс завершил работу, система выгрузит шрифты даже если процесс не вызвал функцию RemoveFontMemResourceEx.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


AddFontResource

Добавляет шрифт из заданного файла в системную таблицу шрифтов. Шрифт впоследствии может использоваться приложениями для вывода текста.

Для того чтобы пометить шрифт как закрытый и неперечисляемый используйте функцию AddFontResourceEx.

Прототип

int AddFontResource(

_In_ LPCTSTR lpszFilename

);

Параметры

lpszFilename [in]

Указатель на завершающуюся NULL символом строку, содержащую наименование файла со шрифтом. Допустимые типы файлов перечислены в таблице ниже.

Расширение файла | Содержимое
.fon | файл шрифта
.fnt | сырое растровое изображение шрифта
.ttf | сырой файл TrueType
.ttc | восточно-азиатская редакция Windows: коллекция шрифтов TrueType
.fot | файл TrueType
.otf | шрифт PostScript OpenType
.mmm | ММ-шрифт Type1. Должен использоваться совместно с файлами .pfm и .pfb
.pfb | двоичный файл шрифта Type 1. Используется совместно с файлом .pfm
.pfm | файл метрик шрифта Type 1. Используется совместно с файлом .pfb.

Для добавления информации, содержащейся в нескольких файлах, в строке lpszFilename наименования файлов должны разделяться символом "|". Например, "abcxxxxx.pfm | abcxxxxx.pfb".

Возвращаемое значение

Количество добавленных шрифтов.

Возвращаемое значение в случае ошибки

Значение нуль. Дополнительная информация об ошибке не предоставляется.

Пример использования

Пример использования приведен здесь.

Примечание

Приложения, которые добавляют или удаляют шрифты из системной таблицы шрифтов, должы уведомлять об этом другие окна. Для этого оно должно разослать сообщение WM_FONTCHANGE всем окнам верхнего уровня. Для рассылки сообщения приложение должно использовать функцию SendMessage, в которой параметр hwnd содержит значение HWND_BROADCAST.

Когда приложению больше не нужен шрифт, загруженный функцией AddFontResource, оно должно удалить его с помощью функции RemoveFontResource.

Функция AddFontResource устанавливает шрифт только для текущего сеанса. После перезапуска системы шрифт будет недоступен. Для сохранения шрифта даже после перезагрузки системы он должен быть перечислен в реестре.

Шрифты, перечисленные в реестре и установленные не в каталоге %windir%\fonts не могут быть изменены, удалены или заменены пока они загружены в сеансе. Для изменения одного из таких шрифтов необходимо сначала его удалить с помощью функции RemoveFontResource, удалить его из реестра (HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts), и перезапустить систему. После перезагрузки системы шрифт не загружен и может быть изменен.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll
ANSI и Unicode наименования | AddFontResourceA и AddFontResourceW


AddFontResourceEx

Добавляет в систему шрифт, хранящийся в заданном файле. Добавляемый шрифт может быть помечен как закрытый и неперечисляемый.

Прототип

int AddFontResourceEx(

_In_ LPCTSTR lpszFilename,

_In_ DWORD fl,

_In_ PVOID pdv

);

Параметры

lpszFilename [in]

Указатель на завершающуюся NULL символом строку, содержащую наименование файла со шрифтом. Допустимые типы файлов перечислены в таблице ниже.

Расширение файла | Содержимое
.fon | файл шрифта
.fnt | сырое растровое изображение шрифта
.ttf | сырой файл TrueType
.ttc | восточно-азиатская редакция Windows: коллекция шрифтов TrueType
.fot | файл TrueType
.otf | шрифт PostScript OpenType
.mmm | ММ-шрифт Type1. Должен использоваться совместно с файлами .pfm и .pfb
.pfb | двоичный файл шрифта Type 1. Используется совместно с файлом .pfm
.pfm | файл метрик шрифта Type 1. Используется совместно с файлом .pfb.

Для добавления информации, содержащейся в нескольких файлах, в строке lpszFilename наименования файлов должны разделяться символом "|". Например, "abcxxxxx.pfm | abcxxxxx.pfb".

fl [in]

Характеристики шрифта, добавляемого в систему. Даный параметр принимает одно из значений, перечисленных ниже.

FR_PRIVATE - только процесс, вызвавший функцию AddFontResourceEx может использовать этот шрифт. Если наименование шрифта совпадает с открытым шрифтом, то будет выбран закрытый шрифт. Когда процесс завершит свою работу, система удалит все шрифты, установленные данным поцессом с помощью функции AddFontResourceEx.

FR_NOT_ENUM - ни один из процессов, включая процесс, вызывающий функцию AddFontResourceEx, не может перечислить этот шрифт.

pdv [in]

Зарезервировано. Должно быть равно нулю.

Возвращаемое значение

Количество добавленных шрифтов.

Возвращаемое значение в случае ошибки

Значение нуль. Дополнительная информация об ошибке не предоставляется.

Пример использования

Пример использования приведен здесь.

Примечание

Данная функция позволяет поцессам использовать шрифты, не предоставляя их другим процессам.

Когда приложению больше не нужен шрифт, загруженный с помощью AddFontResourceEx, он должен удалить его с помощью функции RemoveFontResourceEx.

Функция AddFontResourceEx устанавливает шрифты только для текущего сеанса. После перезагрузки системы шрифты станут недоступными. Для того, чтобы шрифт оставался доступным даже после перезагрузки системы он должен быть перечислен в реестре.

Шрифты, перечисленные в реестре и установленные в каталоге отличном от %windir%\fonts\ не могут быть изменены, удалены или замещены до тех пор, пока они загружены в каком-либо сеансе. Для изменения такого шрифта вы должны его удалить функцией RemoveFontResource, удалить его из реестра (HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts) и перезагрузить систему. После перезагрузки системы, шрифт больше не загружен и может быть изменен.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll
ANSI и Unicode наименования | AddFontResourceExA и AddFontResourceExW


CreateFont

Создает логический шрифт с заданными характеристиками. Логический шрифт впоследствии может быть выбран для любого устройства.

Прототип

HFONT CreateFont(

_In_ int nHeight,

_In_ int nWidth,

_In_ int nEscapement,

_In_ int nOrientation,

_In_ int fnWeight,

_In_ DWORD fdwItalic,

_In_ DWORD fdwUnderline,

_In_ DWORD fdwStrikeOut,

_In_ DWORD fdwCharSet,

_In_ DWORD fdwOutputPrecision,

_In_ DWORD fdwClipPrecision,

_In_ DWORD fdwQuality,

_In_ DWORD fdwPitchAndFamily,

_In_ LPCTSTR lpszFace

);

Параметры

nHeight [in]

Высота, в логических единицах, знакоместа (character cell) или символа шрифта. Значение высоты символа (также известная как М высота (em height)) - это значение высоты знакоместа минус значение внутреннего просвета (internal-leading). Обработчик шрифта интерпретирует значение этого параметра так, как описано в таблице ниже.

Значение | Описание
>0 | Значение переводится в единицы устройства. Это значение используется (matches it) вместо (against) высоты знакоместа.
0 | Используется высота по умолчанию, которая лучше всего соотвествует другим настройкам.
<0 | Значение переводится в единицы устройства. Полученное абсолютное значение используется (matches it) вместо (against) высоты знакоместа.

При поиске подходящего шрифта система ищет шрифт с максимальной высотой, не превышающей заданного шрифта.

Данное преобразование выполняется при первом использовании шрифта.

Для режима MM_TEXT, вы можете использовать следующую формулу определения высоты шрифта с заданным ео размером в пунктах (кеглях) (point size).

nHeight = -MulDiv(PointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72);

nWidth [in]

Средняя ширина, в логических единицах, символов требуемого шрифта. Если значение этого параметра равно нулю, система выбирает наиболее подходящий размер. Наиболее подходящее значение определяется путем сравнения абсолютных значений разницы между текущим соотношением сторон (aspect ratio) устройства и оцифрованным соотношением сторон доступного шрифта.

nEscapment [in]

Угол, в десятых долях градуса, между вектором наклона шрифта (escapement vector) и осью x устройства. Вектор наклона шрифта параллелен базовой линии строки текста.

Если графический режим установлен в GM_ADVANCED, то вы можете задать угол наклона текста независимо от угла ориентации символов строки.

Если графический редим установлен в GM_COMPATIBLE, параметр nEscapment задает и наклон и ориентацию. В этом режиме значения параметров nEscapment и nOrientation должны совпадать.

nOrientation [in]

Угол, в десятых долях градуса, между базовой линией каждого символа и осью x устройства.

fnWeight [in]

Насыщенность (weight) шрифта в диапазоне от 0 до 1000. Например, 400 - обычный, 700 - полужирный. Если значение этого параметра равно нулю, то используется насыщенность по умолчанию.

Для удобства определено несколько констант. Они перечислены здесь.

fdwItalic [in]

Если значение равное TRUE, то используется начертание курсивом.

fdwUnderline [in]

Если значение равно TRUE, то используется подчеркнутое начертание.

fdwStrikeOut [in]

Если значение равно TRUE, то используется зачеркнутый шрифт.

fdwCharSet [in]

Набор символов. Определены значения, перечисленные ниже.

· ANSI_CHARSET
· BALTIC_CHARSET
· CHINESEBIG5_CHARSET
· DEFAULT_CHARSET
· EASTEUROPE_CHARSET
· GB2312_CHARSET
· GREEK_CHARSET
· HANGUL_CHARSET
· MAC_CHARSET
· OEM_CHARSET
· RUSSIAN_CHARSET
· SHIFTJIS_CHARSET
· SYMBOL_CHARSET
· TURKISH_CHARSET
· VIETNAMESE_CHARSET

Для корейской редакции Windows:

JOHAB_CHARSET

Для редакции Windows в Средней Азии:

· ARABIC_CHARSET
· HEBREW_CHARSET

Для тайландской редакции Windows

THAI_CHARSET

Значение OEM_CHARSET задает набор символов, зависящий от операционной системы.

Параметр DEFAULT_CHARSET задает набор символов, соответствующий текущей системной локали. Например, для английской (американской) локали, он установит ANSI_CHARSET.

В системе могут существовать шрифты с другими наборами символов. Если приложение использует шрифт с неизвестным набором символов, оно не должно пытаться перевести или интерпретировать строки, отображенные этим шрифтом.

Для гарантирования получения корректного результата не используйте значение OEM_CHARSET или DEFAULT_CHARSET. При задании наименования в параметре lpszFace, убедитесь в том, что значение fdwCharSet соответствует набору символов шрифта lpszFace.

fdwOutputPrecision [in]

Выходная точность (precision). Данный параметр задает насколько результат должен соответствовать затребованной высоте, ширине, ориентации символов, наклону, шагу (pitch), и типу шрифта. Допустимые значения параметра перечислены здесь.

Приложение может использовать значения OUT_DEVICE_PRECIS, OUT_RASTER_PRECIS, OUT_TT_PRECIS и OUT_PS_ONLY_PRECIS для управления тем, как система выбирает шрифт при наличии нескольких шрифтов с одинаковым наименованием. Например, если в системе есть два шрифта Symbol, в растровой форме и форме TrueType. Указание параметра OUT_TT_PRECIS заставит систему выбрать версию TrueType. Значение OUT_TT_ONLY_PRECIS заставляет систему выбирать TrueType, даже если для этого придется изменить наименование.

fdwClipPrecision [in]

Качество усечения. Данный параметр определяет как будут усекаться символы, частично выходящие за границы усечения. Данный параметр содержит одно из значений, перечисленных здесь, или их комбинацию.

fdwQuality [in]

Выходное качество. Данный параметр определяет насколько тщательно система GDI должна добваться соответствия логических атрибутов шрифта своим физическим эквивалентам. допустимые значения этого параметра перечислены здесь.

Если значение параметра fdwQuality равно DEFAULT_QUALITY, DRAFT_QUALITY или PROOF_QUALITY, а системный параметр SPI_GETFONTSMOOTHING равен TRUE, то шрифт сглаживается. Пользователи могут менять эту настройку в панели инструментов.

fdwPitchAndFamilny [in]

Шаг и семейство шрифта. Два младших бита определяют шаг (pitch) шрифта и принимают одно из значений, перечисленных ниже.

· DEFAULT_PITCH
· FIXED_PITCH
· VARIABLE_PITCH

Четыре старших бита задают семейство шрифтов. Они принимают одно из значений перечисленных здесь.

Приложение может сформировать значение параметра fdwPitchAndFamily с помощью логической операции ИЛИ, соединив константу шага с константой семейства.

Семейства шрифтов задают общий способ отображения шрифта. Они используются для залания шрифта, когда запрошенное начертание недоступно.

lpszFace [in]

Указатель на завершающуюся NULL символом строку, задвющую наименование начертания шрифта. Длина этой строки не должна превышать 32 символов, включая завершающий NULL символ. Для перечисления наименований начертаний доступных шрифтов используйте функцию EnumFontFamilies.

Если значение параметра lpszFace равно NULL, или он указывает на пустую строку, то система GDI использует первый найденный шрифт соответствующий другим заданным атрибутам.

Возвращаемое значение

Описатель логического шрифта.

Возвращаемое значение в случае ошибки

Значение NULL.

Пример использования

Пример использования приведен здесь.

Примечание

Когда шрифт вам больше не нужен, вызовите функцию DeleteObject для его удаления.

Для предоставления помощи в защите авторских прав вендоров, предоставляющих шрифты для Windows, приложения всегда должны сообщать точное наименование выбранного шрифта. Так как доступные шрифты могут варьироваться от истсемы к системе, не стоит рассчитывать на то, что выбранный шрифт всегда соответствует требуемому шрифту. Например, если вы запросили шрифт Palatino, но он не доступен в системе, менеджер шрифтов предоставит вам шрифт, имеющий такие же атрибуты, но с другим наименованием. Всегда сообщайте пользователю наименование выбранного шрифта.

Для получения подходящего шрифта на различных версиях операционной системы с разными языками, вызовите функцию EnumFontFamiliesEx с желаемыми атрибутами шрифта в структуре LOGFONT. Затем, получив наименование начертания шрифта, создайте шрифт функцией CreateFont или CreateFontIndirect.

Менеджер шрифтов для функций CreateFont, CreateFontIdirect и CreateFontIndirectEx распознает как английское, так и локализованное наименования начертания.

В ситуациях, перечисленных ниже, сглаживание ClearType не поддерживается.

· Текст выводится на принтер.
· Монитор имеет 256 цветов или меньше.
· Текст отображается в клиенте сервера терминалов.
· Шрифт имеет тип отличный от TrueType или OpenType со схемами TrueType (with TrueType outlines). Например, следующие шрифты не поддерживают сглаживание ClearType: тип 1, Postcript OpenType без схемы TrueType, шрифты на основе битовой карты (bitmap fonts), векторные шрифты, и шрифты устройства.
· Шрифт имеет настроенные встроенные битовые карты только для ограниченного числа размеров шрифта. Это обычно имеет место в восточноазиатских шрифтах.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll
ANSI и Unicode наименования | CreateFontA и CreateFontW


CreateFontIndirect

Создает логический шрифт, имеющий заданные характеристики. Данный шрифт впоследствии может быть выбран в качестве текущего шрифта контекста устройства.

Прототип

HFONT CreateFontIndirect(

_In_ const LOGFONT *lplf

);

Параметры

lplf [in]

Указатель на структуру LOGFONT, задающую характеристики логического шрифта.

Возвращаемое значение

Описатель логического шрифта.

Возвращаемое значение в случае ошибки

Значение NULL.

Пример использования

Пример использования приведен здесь.

Примечание

Функция CreateFontIndirect создает логический шрифт с характеристиками, указанными в структуре LOGFONT. Когда данный шрифт выбран функцией SelectObject, подсистема GDI пытается добиться того, чтобы логический шрифт соответствовал существующему физическому шрифту. Если это не удается, система предоставляет другой шрифт, параметры которого лучше всего соответствуют запрошенным характеристикам.

Для получения подходящего шрифта, для различных версий операционной системы, используйте функцию EnumFontFamiliesEx, указав желаемые характеристики шрифта в структуре LOGFONT. Получив наименование начертания (typeface name), создайте шрифт с помощью функции CreateFont или CreateFontIndirect.

Когда шрифт вам больше не нужен, удалите его с помощью функции DeleteObject.

Шрифты для многих высточно-азиатских языков имеюь ва наименования: английское и локализованное. Функции CreateFont и CreateFontIndirect принимают (take) локализованные наименования только в тех системах, локаль которых соответствует языку. Во всех остальных системах они обрабатывают только английское наименование. Самым лучшим вариантом является попробовать один вариант, а в случае ошибки попробовать другой вариант. Учтите, что если системная локаль не соответствует языку шрифта, функции EnumFonts, EnumFontFamilies и EnumFontFamiliesEx возвращают английское наименование.

Менеджер шрифтов (font mapper) в функциях CreateFont, CreateFontIndirect и CreateFontIndirectEx распознает английское и локализованное наименование независимо от локали.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll
ANSI и Unicode наименования | CreateFontIndirectA и CreateFontIndirectW


CreateFontIndirectEx

Определяет логический шрифт, имеющий характеристики, указанные в заданной структуре. Данный шрифт впоследствии может быть выбран в качестве текущего шрифта контекста устройства.

Прототип

HFONT CreateFontIndirectEx(

_In_ const ENUMLOGFONTEXDV *penumlfex

);

Параметры

penumlfex [in]

Указатель на структуру ENUMLOGFONTEXDV, содержащую характеристики ММ-шрифта (multiple master font).

Учтите, что функция игнорирует поле elfDesignVector структуры ENUMLOGFONTEXDV.

Возвращаемое значение

Описатель новой структуры ENUMLOGFONTEXDV.

Возвращаемое значение в случае ошибки

Значение нуль. Дополнительная информация об ошибке недоступна.

Пример использования

Пример использования приведен здесь (ручное заполнение структуры ENUMLOGFONTEXDV) и здесь (заполнение структуры ENUMLOGFONTEXDV с помощью функции EnumFontFamiliesEx).

Примечание

Функция CreateFontIndirectEx создает логический шрифт с характеристиками, указанными в структуре ENUMLOGFONTEXDV. Когда данный шрифт выбран функцией SelectObject, подсистема GDI пытается добиться того, чтобы логический шрифт соответствовал существующему физическому шрифту. Если это не удается, система предоставляет другой шрифт, параметры которого лучше всего соответствуют запрошенным характеристикам.

Когда шрифт вам больше не нужен, вызовите функцию DeleteObject для его удаления.

Менеджер шрифтов (font mapper) в функциях CreateFont, CreateFontIndirect и CreateFontIndirectEx распознает английское и локализованное наименование независимо от локали.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll
ANSI и Unicode наименования | CreateFontIndirectExA и CreateFontIndirectExW


DrawText

Отрисовывает отформатированный текст в заданном прямоугольнике. Текст форматируется заданным методом (расширение табуляции, выравнивание символов, разрыв строк и т.д.).

Для задания дополнительных опций форматирования используйте функцию DrawTextEx.

Прототип

int DrawText(

_In_ HDC hDC,

_Inout_ LPCTSTR lpchText,

_In_ int nCount,

_Inout_ LPRECT lpRect,

_In_ UINT uFormat

);

Параметры

hDC [in]

Описатель контекста устройства.

lpchText [in, out]

Указатель на строку с выводимым текстом. Если значение параметра nCount равно -1, то строка должна завершаться NULL-символом.

Если параметр uFormat содержит флаг DT_MODIFYSTRING, функция может добавить к строке 4 символа. Буфер, содержащий строку, должен иметь достаточный размер для этих дополнительных символов.

nCount [in]

Длина строки, в символах. Если значение этого параметра равно -1, то параметр lpchText указывает на завершающуюся NULL-символом строку. При этом функция DrawText сама вычисляет количество символов.

lpRect [in, out]

Указатель на структуру RECT, задающую прямоугольник (в логических координатах), в котором форматируется текст.

uFormat [in]

Метод форматирования текста. Данный параметр содержит одно из значений, перечисленных здесь, или их комбинацию.

Возвращаемое значение

Высота текста в логических единицах. Если задан флаг DT_VCENTER или DT_BOTTOM, то возвращается смещение нижнего края отрисованного текста от значения lpRect->top.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Функция DrawText при отрисовке текста использует выбранные в контексте устройства шрифт, цвет текста и фона. Если флаг DT_NOCLIP не задан, функция DrawText обрезает текст так, чтобы он не выходил за границы заданного прямоугольника. Учтите, что текст, имеющий значительный свисающий край может быть обрезан. Например, заглавная "W" в текстовой строке или текст, написанный курсивом. Если флаг DT_SINGLELINE не задан, то предполагается, что текст может выводиться в виде нескольких строк.

Если выбранный шрифт слишком велик для заданного прямоугольника, функция DrawText не будет пытаться подобрать меньший шрифт.

Режим выравнивания текста для контекста устройства должен включать флаги TA_LEFT, TA_TOP и TA_NOUPDATECP.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | DrawTextA и DrawTextW


DrawTextEx

Отрисовывает отформатированный текст в заданном прямоугольнике.

Прототип

int DrawTextEx(

_In_ HDC hdc,

_Inout_ LPTSTR lpchText,

_In_ int cchText,

_Inout_ LPRECT lprc,

_In_ UINT dwDTFormat,

_In_ LPDRAWTEXTPARAMS lpDTParams

);

Параметры

hdc [in]

Описатель контекста устройства, в который осуществляется вывод.

lpchText [in, out]

Указатель на строку, содержащую выводимый текст. Если значение параметра cchText равно -1, то строка должна завершаться NULL-символом.

Если параметр dwDTFormat содердит флаг DT_MODIFYSTRING, функция может добавить к строке 4 дополнительных символа. Поэтому буфер, содержащий строку, должен иметь достаточный размер для вмещения этих символов.

cchText [in]

Длина строки, на которую указыает параметр lpchText. Если значение параметра cchText равно -1, то параметр lpchText указывает на завершающуюся NULL-символом строку. При этом функция DrawTextEx сама вычислит количество символов в строке.

lprc [in, out]

Указатель на структуру RECT, задающую прямоугольник (в логических единицах), в котором форматируется текст.

dwDTFormat [in]

Опции форматирования. Данный параметр содержит одно из значений, перечисленных здесь, или их комбинацию.

lpDTParams [in]

Указатель на структуру DRAWTEXTPARAMS, задающую дополнительные опции форматирования. Данный параметр может содержать значение NULL.

Возвращаемое значение

Высота текста в логических единицах. Если задан флаг DT_VCENTER или DT_BOTTOM, то возвращается смещение нижнего края отрисованного текста от значения lpRect->top.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Функция DrawTextEx поддерживает только шрифты, для которых наклон (escapement) и ориентация равны нулю.

Режим выравнивания текста для контекста устройства должен включать флаги TA_LEFT, TA_TOP и TA_NOUPDATECP.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | DrawTextExA и DrawTextExW


EnumFontFamilies

Перечисляет шрифты заданного семейства, которые доступны на заданном устройстве.

Данная функция предоставлена только для совместимости с 16-разрядными версиями Windows. Приложения должны использовать функцию EnumFontFamiliesEx.

Прототип

int EnumFontFamilies(

_In_ HDC hdc,

_In_ LPCTSTR lpszFamily,

_In_ FONTENUMPROC lpEnumFontFamProc,

_In_ LPARAM lParam

);

Параметры

hdc [in]

Описатель контекста устройства, для которого перечисляются шрифты.

lpszFamily [in]

Указатель на завершающуюся NULL символом строку, задающую наименование семейства желаемых шрифтов. Если значение этого поля равно NULL, функция выбирает и перечисляет один шрифт для каждого доступного семейства.

lpEnumFontFamProc [in]

Указатель на заданную приложением функцию обратного вызова EnumFontFamProc.

lParam [in]

Указатель на предоставленные приложением данные. Эти данные передаются в функцию обратного вызова вместе с информацией о шрифте.

Возвращаемое значение

Последнее значение, возвращенное функцией обратного вызова. Зависит от реализации.

Пример использования

Пример использования приведен здесь.

Примечание

Для каждого найденного шрифта функция EnumFontFamilies извлекает информацию о нем и передает её в функцию, заданную параметром lpEnumFontFamProc. Эта функция может обрабатывать плученную информацию так, как считает нужным. Перечисление продолжается до тех пор, пока либо не будут перечислены все шрифты, либо функция обратного вызова не вернет значение нуль.

Если с помощью функции SetGraphicsMode был установлен режим GM_ADVANCED и в параметре FontType был передан флаг DEVICE_FONTTYPE, функция EnumFontFamilies будет перечислять шрифты типов 1 (type 1) и OpenType, установленные в системе. Если установленный режим отличен от GM_ADVANCED, функция будет перечислять шрифты типов 1, OpenType и TrueType.

Шрифты многих Восточно-Азиатских стран имеют два наименования: английское и локализованное. Если локаль системы не совпадает с языком шрифта функции EnumFonts, EnumFontFamilies и EnumFontFamiliesEx возвращают английское наименование.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll
ANSI и Unicode наименования | EnumFontFamiliesA и EnumFontFamiliesW


EnumFontFamiliesEx

Перечисляет все уникальные наименования шрифтов, установленных в системе, которые соответствуют характеристикам, заданным в структуре LOGFONT. Функция EnumFontFamiliesEx перечисляет шрифты основываясь на наименовании шрифта (typeface name), наборе символов или и том и том.

Прототип

int EnumFontFamiliesEx(

_In_ HDC hdc,

_In_ LPLOGFONT lpLogfont,

_In_ FONTENUMPROC lpEnumFontFamExProc,

_In_ LPARAM lParam,

DWORD dwFlags

);

Параметры

hdc [in]

Описатель контекста устройства, для которого перечисляются шрифты.

lpLogfont [in]

Указатель на структуру LOGFONT, которая содержит информацию о перечисляемых шрифтах. Функция проверяет поля, перечисленные ниже.

Поле | Описание
lfCharSet | Если в это поле занесено значение DEFAULT_CHARSET, фунцкия перечисляет все шрифты во всех наборах символов (если существует два шрифта с одинаковым наименованием, то перечисляется только один из них). Если же в этом поле указан корректный набор символов, то функция перечисляет шрифты только этого набора символов.
lfFaceName | Если в этом поле задана пустая строка, функция перечисляет по одному шрифту для каждого наименования начертания. Если же задано корректное наименование, функция перечисляет все шрифты заданного наименования.
lfPitchAndFamily | Должно быть равно нулю для всех языков операционной системы.

lpEnumFontFamexProc [in]

Указатель на определенную приложением функцию обратного вызова EnumFontFamExProc.

lParam [in]

Определенное приложением значение. Функция передает это значение в функцию обратного вызова вместе с информацией о шрифте.

dwFlags

Не используется и должно быть равно нулю.

Возвращаемое значение

Последнее значение, возвращенное функцией обратного вызова. Это значение зависит от того, какие семейства шрифтов доступны для заданного устройства.

Пример использования

Пример использования приведен здесь.

Примечание

Функция EnumFontFamiliesEx не использует тегированные наименования (tagged typeface) для идентифицирования наборов символов. Вместо этого функция передает в фугкцию обратного вызова корректное наименование начертания шрифта и отдельно набор символов. Функция перечисляет шрифты на основе значений полей lsCharSet и lfFaceName структуры LOGFONT.

Как и функция EnumFontFamilies, функция EnumFontFamiliesEx перечисляет все стили шрифтов. Разные стили шрифтов необязательно покрывают один и тот же набор символов. Например, полужирный шрифт Fontorama содержит символы ANSI, греческого алфавита и кириллицы; а курсивный шрифт Fontorama содержит только ANSI символы. Поэтому, нельзя полагаться на то, что заданный шрифт покрывает заданный набор символов, даже если это набор ANSI символов. Таблица ниже иллюстрирует различные сочетания значений полей lfCharSet и lfFaceName.

lfCharSet | lfFaceName | Описание
DEFAULT_CHARSET | '\0' | Перечисляются все уникальные шрифты во всех наборах символов. Если существует два шрифта с одинаковым наименованием, то перечисляется только один из них.
DEFAULT_CHARSET | задан шрифт | Перечисляются все наборы символов и стили заданного шрифта
задан набор символов | '\0' | Перечисляются все стили всех шрифтов заданного набора символов
задан набор символов | задан шрифт | Перечисляются все стили заданного шрифта в заданном наборе символов.

Функции обратного вызова для функций EnumFontFamilies и EnumFontFamiliesEx очень похожи. Главное отличие между ними состоит в структуре ENUMLOGFONTEX, содержащей поле скрипта (script field).

Учтите, что функция EnumFontFamiliesEx, основываясь на значениях полей lfCharSet и lfFaceName, будет перечислять шрифт столько раз, сколько отдельных наборов символов в нем реализовано. Это может привести к слишком большому списку шрифтов, который будет неудобен для пользователя. Например, шрифт Century Schoolbook может появляться для следующих наборов символов: балтийский (Baltic), западный (western), греческого, турецкого и кириллического. Для уменьшения размера списка приложение должно его фильтровать.

Шрифты многих Восточно-Азиатских языков имеют два наименования: английское и локализованное наименование. Если системная локаль не соответствует языку шрифта, функции EnumFonts, EnumFontFamilies и EnumFontFamiliesEx возвращают английское наименование.

Если с помощью функции SetGraphicsMode был установлен режим GM_ADVANCED, и в параметре FontType установлен флаг DEVICE_FONTTYPE, функция вернет список шрифтов типов 1 (Type 1) и OpenType. Если режим GM_ADVANCED не установлен, то функция вернет список шрифтов типа 1, OpenType и TrueType.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll
ANSI и Unicode наименования | EnumFontFamiliesExA и EnumFontFamiliesExW


EnumFonts

Перечисляет шрифты доступные на заданном устройстве. Для каждого шрифта с заданным наименованием (typeface name) функция EnumFonts возвращает информацию о шрифте и передает эту информацию в заданную приложением функцию обратного вызова. Данная функция обратного вызова может обработать шрифт так, как считает нужным. Перечисление продолжается до тех пор, пока либо не будут перечислены все шрифты, либо функция обратного вызова не вернет значение нуль.

Функция EnumFonts предоставляется только для совместимости с 16-разрядными версиями Windows. Вместо нее приложения должны использовать функцию EnumFontFamiliesEx.

Прототип

int EnumFonts(

_In_ HDC hdc,

_In_ LPCTSTR lpFaceName,

_In_ FONTENUMPROC lpFontFunc,

_In_ LPARAM lParam

);

Параметры

hdc [in]

Описатель контекста устройства для которого перечисляются шрифты.

lpFaceName [in]

Указатель на завершающуюся NULL символом строку, задающую наименование начертания (typeface ) перечисляемых шрифтов. Если значение этого параметра равно NULL, функция EnumFonts случайным образом выбирает и перечисляет один шрифт из каждого доступного начертания (typeface).

lpFontFunc [in]

Указатель на реализованную приложением функцию обратного вызова EnumFontsProc.

lParam [in]

Указатель на определенные приложением данные. Эти данные передаются в функцию обратного вызова вместе с информацией о шрифте.

Возвращаемое значение

Последнее значение, возвращенное функцией обратного вызова. Данное значение зависит от приложения.

Пример использования

Пример использования приведен здесь.

Примечание

Вместо функции EnumFonts используйте EnumFontFamiliesEx, Функция EnumFontFamiliesEx отличается от EnumFonts тем, возвращает наименования стилей шрифтов типа TrueType. Используя EnumFontFamiliesEx, вы можете получить информация о шрифтах, которые не могут быть перечислены функцией EnumFonts.

Шрифты для многих Восточно-Азиатских языков имеют два наименования: английское и локализованное. Если системная локаль не соответствует языку шрифта функции EnumFonts, EnumFontFamilies и EnumFontFamiliesEx возвращают английское наименование.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll
ANSI и Unicode наименования | EnumFontsA и EnumFontsW


ExtTextOut

Отрисовывает текст используя текущий выбранный шрифт, цвет фона и текста. Вы также можете задать параметры обрезки (clipping) и/или ретуширования (opaquing).

Прототип

BOOL ExtTextOut(

_In_ HDC hdc,

_In_ int X,

_In_ int Y,

_In_ UINT fuOptions,

_In_ const RECT *lprc,

_In_ LPCTSTR lpString,

_In_ UINT cbCount,

_In_ const INT *lpDx

);

Параметры

hdc [in]

Описатель контекста устройства.

X [in]

Горизонтальная координата базовой точки, используемой для позиционирования строки. Координата задается в логических единицах.

Y [in]

Вертикальная координата базовой точки, используемой для позиционирования строки. Координата задается в логических единицах.

fuOptions [in]

Задает как использовать заданный прямоугольник. Данный параметр содержит одно из значений, перечисленных здесь или их комбинацию.

Флаги ETO_GLYPH_INDEX и ETO_RTLREADING не могут использоваться совместно друг с другом. Так как флаг ETO_GLYPH_INDEX подразумевает обработку всех языков, функция игнорирует флаг ETO_RTLREADING при их совместном использовании.

lprc [in]

Указатель на структуру RECT, задающие логические координаты прямоугольника, использующегося для обрезки и/или ретуширования.

lpString [in]

Указатель на строку с отрисовываемым текстом. Строка не должна завершаться NULL символом, так как длину строки задает параметр cbCount.

cbCount [in]

Длина строки lpString.

Данное значение не должно превышать 8192.

lpDx [in]

Указатель на опциональный массив значений, задающих расстояние между оригинальной и смещенной ячейкой символа. Например, lpDx[i] задает расстояние, в логических единицах, между i-й и i+1 ячейкой символа.

Возвращаемое значение

Ненулевое значение. Однако, ANSI версия функции (ExtTextOutA), вызываемая с флагом ETO_GLYPH_INDEX, вернет значение TRUE, даже если текст не отрисован.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Текущая настройка выравнивания текста в контексте устройства задает, как используется базовая точка при позиционировании текста. Данная настройка возвращается функцией GetTextAlign. Для её изменения используется функция SetTextAlign. Для выравнивания текста используются флаги, перечисленные здесь. Из флагов, задающих выравнивание по горизонтали может быть выбран только один флаг. Аналогично, только один флаг может быть выбран из флагов задающих выравнивание по вертикали. И один флаг из флагов, задающих порядок изменения текущего положения.

Если значение параметра lpDx равно NULL, функция ExtTextOut использует расстояние между символами по умолчанию. Расстояние между оригинальной ячейкой и её содержимым, задаваемое в массиве lpDx указывается в логических единицах. Оригинальная ячейка задается в виде левого верхнего угла ячейки символа.

По умолчанию, текущее положение не используется и не обновляется функцией. Тем не менее, приложение может вызвать функцию SetTextAlign с флагом TA_UPDATECP для того, чтобы заставить систему использовать и обновлять текущее положение при каждом вызове функции ExtTextOut для данного контекста устройства. Если этот флаг установлен, то система игнорирует параметры X и Y в последующих вызовах функции ExtTextOut.

В ANSI версии функции ExtTextOut массив lpDX содержит столько же целочисленных значений (INT), сколько байтов в строке lpString. Для двухбайтовых символов (DBCS), вы можете разделить (apportion) значение элемента lpDx между лидирующим (lead) и ведомым (trail) байтами, при этом сумма двух байтов даст желаемое значение элемента. Для двухбайтовых символов в Unicode версии функции каждому символу соответствует один элемент массива.

Учтите, что значения alpDx, возвращенные функцией GetTextExtentExPoint не совпадают со значениями lpDx для функции ExtTextOut. Для использования значений alpDx в качестве значения параметра lpDx, вы должны их предварительно обрботать.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll
ANSI и Unicode наименования | ExtTextOutA и ExtTextOutW


GetAspectRatioFilterEx

Возвращает текущее соотношение сторон фильтра.

Прототип

BOOL GetAspectRatioFilterEx(

_In_ HDC hdc,

_Out_ LPSIZE lpAspectRatio

);

Параметры

HDC [in]

Описатель контекста устройства.

lpAspectRatio [in]

Указатель на структуру SIZE, в которую заносится текущее соотношение сторон.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

SIZE s;

char str[50];

if(GetAspectRatioFilterEx(GetDC(NULL),&s))

sprintf(str, "%d на %d", s.cx, s.cy);

else

sprintf(str, "%s", "Ошибка");

MessageBox(NULL, str, "", MB_OK);

return 0;

}

В данном примере на экран выводится текущее соотношение сторон фильтра экрана. Хотя вызов функции завершается успешно, на экран выводится строка "0 на 0".

Примечание

Соотношение сторон формируется шириной и высотой пикселя на заданном устройстве.

Система предоставляет специальный фильтр, фильтр соотношения сторон, который отбирает шрифты, созданные для специальных устройств. Приложение может потребовать, чтобы система отбирала только шрифты, соответствующие заданному соотношению сторон. Для этого используется функция SetMapperFlags.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


GetCharABCWidths

Возвращает ширину каждого символа в группе, следующих друг за другом символов для шрифта TrueType. Данная функция работает только для шрифтов TrueType.

Прототип

BOOL GetCharABCWidths(

_In_ HDC hdc,

_In_ UINT uFirstChar,

_In_ UINT uLastChar,

_Out_ LPABC lpabc

);

Параметры

hdc [in]

Описатель контекста устройства.

uFirstChar [in]

Первый символ группы последовательных символов текущего шрифта.

uLastChar [in]

Последний символ группы последовательных символов текущего шрифта.

lpabc [out]

Указатель на массив структур ABC, в которые записывается ширина каждого символа, в логических единицах. Данный массив содержит столько же элементов, сколько символов попадает в группу, заданную параметрами uFirstChar и uLastChar.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Создаем контекст устройства, совместимый с контекстом устройства экрана

HDC hdc;

hdc = CreateCompatibleDC(GetDC(NULL));

//Создаем TrueType шрифт

HFONT hfont;

hfont = CreateFont(24, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, RUSSIAN_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "TrueType");

//Выбираем созданный шрифт в контексте устройства

SelectObject(hdc, hfont);

//Удаляем шрифт

DeleteObject(hfont);

//Получаем ширину символов 'A' - 'D'

char str[10];

ABC abc[4];

if(GetCharABCWidths(hdc, 'A', 'D',abc))

sprintf(str, "A = %d; B = %d; C = %d", abc[0].abcA, abc[0].abcB, abc[0].abcC);

else

sprintf(str, "%s", "Ошибка");

MessageBox(NULL, str, "", MB_OK);

//Удаляем шрифт

DeleteObject(hfont);

//Удаляем контекст устройства

DeleteDC(hdc);

return 0;

}

В данном примере функция используется для получения ширины символов 'A', 'B', 'C' и 'D'. На экран выводится информация о ширине символа 'A'. Предварительные операции нужны для установки шрифта TrueType в контексте устройства. Для того, чтобы не менять контекст устройства экрана, мы с помощью функции CreateCompatibleDC создаем контекст устройства, совместимый с контекстом устройства экрана, и уже в нем меняем шрифт. Для создания шрифта используется функция CreateFont.

В случае успеха на экран выводится строка "A = 0; B = 13; C = 0" (у вас значения могут быть другими). Точная интерпретация расстояний A, B и C приведена в примечании и в описаниии структуры ABC.

Примечание

Растеризатор шрифта TrueType предоставляет значения расстояний A, B и C символов после того, как будет выбран размер точки (point size). Расстояние A - это расстояние добавляемое к текущему положению до расположения символа. Расстояние B - это ширина черной части символа. Расстояние C - это расстояние, добавляемое к текущему положению справа от символа. Общая ширина символа рассчитывается как A+B+C.

Если функция GetCharABCWidths возвращает отрицательные значения ширины A или C, то это означает, что символ включает в себя свисания или выступы (underhangs or overhangs).

Для пересчета расстояний A, B, C приложение должно использовать значение, хранящееся в поле otmEMSquare структуры OUTLINETEXTMETRIC. Данное значение может быть получено с помощью функции GetOutlineTextMetrics.

Расстояния A, B, C символа по умолчанию используются для символов, находящихся вне диапазона текущего выбранного шрифта.

Для получения ширины символа шрифта отличного от TrueType, приложение должно использовать функцию GetCharWidth.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll
ANSI и Unicode наименования | GetCharABCWidthsA и GetCharABCWidthsW


GetCharABCWidthsFloat

Возвращает значение ширины каждого символа в группе, следующих друг за другом символов, для текущего шрифта.

Прототип

BOOL GetCharABCWidthsFloat(

_In_ HDC hdc,

_In_ UINT iFirstChar,

_In_ UINT iLastChar,

_Out_ LPABCFLOAT lpABCF

);

Параметры

hdc [in]

Описатель контекста устройства.

iFirstChar [in]

Первый символ последовательности символов.

iLastChar [in]

Последний символ последовательности символов. Первый и последний символы входят в интервал символов, для которых определяется ширина. Если символ iLastChar предшествует символу iFirstChar, то произойдет ошибка.

lpABCF [out]

Указатель на массив структур ABCFLOAT, в который сохраняется информация о ширине каждого символа.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Получаем контекст устройства

HDC hdc;

hdc = GetDC(NULL);

//Получаем ширину символов

char str[20];

ABCFLOAT abcf[4];

int a[4];

if(GetCharABCWidthsFloat(hdc, 'A', 'D', abcf)){

sprintf(str, "A = %f; B = %f; C = %f", abcf[0].abcfA, abcf[0].abcfB, abcf[0].abcfC);

}else

sprintf(str, "%s", "Ошибка");

//Выводим строку на экран

MessageBox(NULL, str, "", MB_OK);

//Освобождаем контекст устройства

ReleaseDC(NULL, hdc);

return 0;

}

В данном примере функция используется для получения ширины символов 'A', 'B', 'C' и 'D'. На экран выводится информация о ширине символа 'A'

В случае успеха на экран выводится строка "A = 0.000000; B = 8.000000; C = 0.000000" (у вас значения могут быть другими). Точная интерпретация расстояний A, B и C приведена в примечании и в описаниии структуры ABC.

Примечание

В отличие от функции GetCharABCWidths, которая работает только со шрифтами TrueType, функция GetCharABCWidthsFloat работает со всеми шрифтами. Значения, возвращаемые этой функцией залабтся в соответствии со стандартным форматом вещественных чисел IEEE.

Если текущее преобразование мировых координат к координатам устройства не задано, то возвращаемые значения могут иметь дробную часть, даже если соответствующие им значения в пространстве устройства - целые числа.

Расстояние A - это расстояние добавляемое к текущему положению до расположения символа. Расстояние B - это ширина черной части символа. Расстояние C - это расстояние, добавляемое к текущему положению справа от символа. Общая ширина символа рассчитывается как A+B+C.

Расстояния A, B и C отсчитываются вдоль базовой линии шрифта.

Расстояния A, B, C символа по умолчанию используются для символов, находящихся вне диапазона текущего выбранного шрифта.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll
ANSI и Unicode наименования | GetCharABCWidthsFloatA и GetCharABCWidthsFloatW


GetCharABCWidthsI

Возвращает ширину каждого символа в группе, следующих друг за другом символов для шрифтов TrueType. Функция работает только для шрифтов TrueType. Размеры символов возвращаются в логических единицах.

Прототип

BOOL GetCharABCWidthsI(

_In_ HDC hdc,

_In_ UINT giFirst,

_In_ UINT cgi,

_In_ LPWORD pgi,

_Out_ LPABC lpabc

);

Параметры

hdc [in]

Описатель контекста устройства.

giFirst [in]

Первый символ в последовательности символов. Данный параметр используется только если значение параметра pgi равно NULL.

cgi [in]

Количество символов.

pgi [in]

Указатель на массив символов, для которых определяется ширина. Если значение этого параметра равно NULL, то вместо него используется параметр giFirst. Параметр cgi задает количество символов в массиве.

lpabc [out]

Указатель на массив структур ABC, в которые заносится ширина какждого символа, в логических единицах. данный массив должен содержать столько же элементов, сколько обрабатывается символов. Количество символов задается в параметре cgi.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Создаем контекст устройства, совместимый с контекстом устройства экрана

HDC hdc;

hdc = CreateCompatibleDC(GetDC(NULL));

//Создаем TrueType шрифт

HFONT hfont;

hfont = CreateFont(24, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, RUSSIAN_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "TrueType");

//Выбираем созданный шрифт в контексте устройства

SelectObject(hdc, hfont);

//Удаляем шрифт

DeleteObject(hfont);

//Символы, ширину которых мы будем определять

WORD chars[4] = {'A', 'D', 'F', 'R'};

//Получаем ширину каждого символа

ABC abc[4];

char str[10];

if(GetCharABCWidthsI(hdc, 0, 4, chars, abc))

sprintf(str, "A = %d; B = %d; C = %d", abc[0].abcA, abc[0].abcB, abc[0].abcC);

else

sprintf(str, "%s", "Ошибка");

MessageBox(NULL, str, "", MB_OK);

//Удаляем контекст устройства

DeleteDC(hdc);

return 0;

}

В данном примере функция используется для получения ширины символов 'A', 'D', 'F' и 'R'. На экран выводится информация о ширине символа 'A'. Предварительные операции нужны для установки шрифта TrueType в контексте устройства. Для того, чтобы не менять контекст устройства экрана, мы с помощью функции CreateCompatibleDC создаем контекст устройства, совместимый с контекстом устройства экрана, и уже в нем меняем шрифт. Для создания шрифта используется функция CreateFont.

В случае успеха на экран выводится строка "A = 0; B = 8; C = 0" (у вас значения могут быть другими). Точная интерпретация расстояний A, B и C приведена в примечании и в описаниии структуры ABC.

Примечание

Растеризатор шрифта TrueType предоставляет значения расстояний A, B и C символов после того, как будет выбран размер точки (point size). Расстояние A - это расстояние добавляемое к текущему положению до расположения символа. Расстояние B - это ширина черной части символа. Расстояние C - это расстояние, добавляемое к текущему положению справа от символа. Общая ширина символа рассчитывается как A+B+C.

Если функция GetCharABCWidthsI возвращает отрицательные значения ширины A или C, то это означает, что символ включает в себя свисания или выступы (underhangs or overhangs).

Для пересчета расстояний A, B, C в единицы шрифта (font design units) приложение должно использовать значение, хранящееся в поле otmEMSquare структуры OUTLINETEXTMETRIC. Данное значение может быть получено с помощью функции GetOutlineTextMetrics.

Расстояния A, B, C символа по умолчанию используются для символов, находящихся вне диапазона текущего выбранного шрифта.

Для получения ширины символов шрифта отличного от TrueType приложение должно использовать функцию GetCharWidthI.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


GetCharacterPlacement

Возвращает информацию о строке символов. Вовращаемая информация включает в себя: размеры симолов, положение каретки, порядок внутри строки и отображаемые глифы. Тип возвращаемой информации зависит от параметра dwFlags и базируется на текущем выбранном в контксте устройства шрифте.Функция копирует информацию в структуру GCP_RESULTS, или в один или несколько массивов, на которые указывает эта структура.

Хотя данная функция корректно работает с символьными строками, необходимость работы с постоянно увеличивающимся количеством языков и скриптов сделала её устаревшей. Сейчас она заменена модулем Uniscribe (https://msdn.microsoft.com/ru-ru/library/windows/desktop/dd374091(v=vs.85).aspx).

Рекомендуется, чтобы приложение использовало функцию GetFontLanguageInfo для определения того, какие флаги (GCP_DIACRITIC, GCP_DBCS, GCP_USEKERNING, GCP_LIGATE, GCP_REORDER, GCP_GLYPHSHAPE и GCP_KASHIDA) являются допустимыми для текущего шрифта. Если флаг недопустим, то функция GetCharacterPlacement проигнорирует его.

Флаг GCP_NODIACRITICS больше не описывается и не должен использоваться.

Прототип

DWORD GetCharacterPlacement(

_In_ HDC hdc,

_In_ LPCTSTR lpString,

_In_ int nCount,

_In_ int nMaxExtent,

_Inout_ LPGCP_RESULTS lpResults,

_In_ DWORD dwFlags

);

Параметры

hdc [in]

Описатель контекста устройства.

lpString [in]

Указатель на обрабатываемую строку символов. данная строка не должна заканчиваться NULL символом, так как параметр nCount задает её длину.

nCount [in]

Длина строки lpString.

nMaxExtent [in]

Максимальная длина обрабатываемой части строки (в логических единицах). Символы, которые выходят за эту границу при обработке игнорируются. Расчет запрошенных массивов порядка или глифов выполняется только для символов, попадающих в указанную границу. Данный параметр используется только если в параметре dwFlags задан флаг GCP_MAXEXTENT. Когда функция обрабатывает исходную строку, каждый символ и его размер добавляются к выходному массиву, массиву размеров и другим массивам только при условии, что суммарный размер не превысил максимального значения. Если это условие не выполнено, то обработка прекращается.

lpResults [un, out]

Указатель на структуру GCP_RESULTS, в которую заносятся результаты работы функции.

dwFlags [in]

Набор флагов, задающих правила обработки строки. Данный параметр содержит одно из значений, перечисленных здесь или их комбинацию.

Рекомендуется, чтобы приложения использовали функцию GetFontLanguageInfo для определения флагов, допустимых для текущего шрифта. Если флаг недопустим, то функция GetCharacterPlacement будет игнорировать значение данного параметра.

Флаг GCP_NODIACRITICS больше не описывается и не должен использоваться.

Возвращаемое значение

Ширина и высота строки в логических единицах. Ширина хранится в младшем слове, а высота - в старшем слове.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

#define LENGTH 6

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Получаем контекст устройства

HDC hdc;

hdc = GetDC(NULL);

//Строка, информацию о которой мы будем получать

char s[] = "abcdef";

//Подготавливаем структуру GCP_RESULTS

GCP_RESULTS gcpr;

gcpr.lStructSize = sizeof(GCP_RESULTS);

gcpr.lpOutString = (char*) malloc(LENGTH+1);

gcpr.lpOutString[LENGTH] = '\0'; //Завершающий NULL символ

gcpr.lpOrder = (int*) malloc(LENGTH*sizeof(int));

gcpr.lpDx = (int*) malloc(LENGTH*sizeof(int));

gcpr.lpCaretPos = NULL;

gcpr.lpClass = NULL;

gcpr.lpGlyphs = NULL;

gcpr.nGlyphs = LENGTH;

gcpr.nMaxFit = LENGTH;

char str[40];

//Запрашиваем информацию о символах

if(GetCharacterPlacement(hdc, s, LENGTH, 1, &gcpr, 0))

sprintf(str, "%s", "Успех");

else

sprintf(str, "%s", "Ошибка");

//Освобождаем контекст устройства

ReleaseDC(NULL, hdc);

//Выводим сообщение пользователю

MessageBox(NULL, str, "", MB_OK);

//Выводим смежное расстояние для символа f

sprintf(str, "F = %d", gcpr.lpDx[gcpr.lpOrder[LENGTH-1]]);

MessageBox(NULL, str, "", MB_OK);

//Освобождаем память

free(gcpr.lpOutString);

free(gcpr.lpOrder);

free(gcpr.lpDx);

return 0;

}

Примечание

Функция GetCharacterPlacement гарантирует, что приложение сможет корректно обработать текст независимо от национальной настройки и типа доступных шрифтов. Приложения используют эту функцию перед вызовом функции ExtTextOut и вместо функции GetTextExtentPoint32 (а также иногда вместо функций GetCharWidth32 и GetCharABCWidths).

Использование функции GetCharacterPlacement для получения межсимвольных расстояний и массива индексов не всегда необходимо, если конечно не требуется подстройка или кернинг. Для нелатинских шрифтов, приложения могут увеличить скорость отображения символов функцией ExtTextOut посредством заблаговременного получения межсимвольных расстояний и массивов индексов. Это особенно полезно если один и тот же текст отображается многократно, или при использовании межсимвольных интервалов для расположения каретки. Если при вызове функции ExtTextOut используется массив lpGlyphs, то должен быть установлен флаг ETO_GLYPH_INDEX.

Функция GetCharacterPlacement проверяет указатели lpOrder, lpDx, lpCaretPos, lpOutString и lpGlyphs, хранящиеся в структуре GCP_RESULTS, и, если они не равны NULL, заполняет соответствующие им массивы. Если функция не может заполнить массив, то она устанавливает значение соответствующего поля равным NULL. Для гарантирования получения корректной информации, приложение должно записать в эти поля корректные адреса и проверить их после того, как функция вернет управление. Если задан флаг GCP_JUSTIFY или GCP_USEKERNING, то поля lpDx и/или lpCaretPos должны содержать корректные адреса.

Учтите, что индексы глифов, записанные в массив GCP_RESULTS.lpGlyphs специфичны для текущего шрифта в контексте устройства. Поэтому они должны использоваться только для отрисовки текста в контексте устройства пока данный шрифт остается выбранным.

При расчете выравниввания, если завершающие символы строки являются пробельными, то функция пересчитывает длину строки и удаляет пробелы до расчета выравнивания. Если строка состоит только из проблеов, то функция завершится ошибкой.

Функция ExtTextOut ожидает элемент lpDx для каждого байта двухбайтового символа, а функция GetCharacterPlacement связывает каждый элемент массива lpDx с глифом. Для устранения этого противоречия при совместном использовании функций, используйте функцию GetGlyphIndices или расширьте массив lpDx, записав значение нуль во второй байт каждой пары байт, описывающих двухбайтный символ.

Если логическая ширина меньше чем ширина лидирующего символа во входной строке, поле GCP_RESULTS.nMaxFit будет содержать неверное значение. В этом случае, вызовите функцию GetCharacterPlacement для индексов глифов и массива lpDx. Затем используйте массив lpDx для вычисления размеров на основе ширины каждого символа, при этом поле nMaxFit будет содержать количество символов, ширина глифов которых меньше ширины лидирующего символа.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll
ANSI и Unicode наименования | GetCharacterPlacementA и GetCharacterPlacementW


GetCharWidth

Возвращает ширину каждого символа в группе следующих друг за другом символов для текущего шрифта.

Данная функция предоставляется только для совместимости с 16-разрядными версиями Windows. Приложения должны вместо неё использовать функцию GetCharWidth32, которая возвращает более точные значения.

Прототип

BOOL GetCharWidth(

_In_ HDC hdc,

_In_ UINT iFirstChar,

_In_ UINT iLastChar,

_Out_ LPINT lpBuffer

);

Параметры

hdc [in]

Описатель контекста устройства.

iFirstChar [in]

Первый символ последовательности символов.

iLastChar [in]

Последний символ последовательности символов. Данный символ не должен предшествовать символу iFirstChar.

lpBuffer [out]

Указатель на буфер, в который будут записаны значения ширины символов, в логических единицах.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Получаем контекст устройства

HDC hdc;

hdc = GetDC(NULL);

//Получаем ширину символов

char str[20];

int a[4];

if(GetCharWidth(hdc, 'A', 'D', a)){

sprintf(str, "%d %d %d %d", a[0], a[1], a[2], a[3]);

}else

sprintf(str, "%s", "Ошибка");

//Выводим строку на экран

MessageBox(NULL, str, "", MB_OK);

//Освобождаем контекст устройства

ReleaseDC(NULL, hdc);

return 0;

}

В данном примере на экран выводятся значения ширины 4 символов: 'A', 'B', 'C' и 'D'. Данные значения представляются в виде строки: "8 10 9 10" (у вас значения могут быть другими).

Примечание

Функция GetCharWidth не может использоваться для шрифтов TrueType. Для этих шрифтов, используйте функцию GetCharABCWidths.

Граничные символы интервала входят в интервал. Это значит, что в выходной буфер будут также записаны значения ширины символов iFirstChar и iLastChar.

Если запрошенный символ не определен в текущем шрифте, то в качестве его ширины используется ширина символа по умолчанию.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll
ANSI и Unicode наименования | GetCharWidthA и GetCharWidthW


GetCharWidth32

Возвращает ширину, следующих друг за другом символов, для текущего шрифта.

Прототип

BOOL GetCharWidth32(

_In_ HDC hdc,

_In_ UINT iFirstChar,

_In_ UINT iLastChar,

_Out_ LPINT lpBuffer

);

Параметры

hdc [in]

Описатель контекста устройства.

iFirstChar [in]

Первый символ последовательности символов.

iLastChar [in]

Последний символ последовательности символов. Данный символ не должен предшествовать символу iFirstChar.

lpBuffer [out]

Указатель на буфер, в который будут записаны значения ширины символов, в логических единицах.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Получаем контекст устройства

HDC hdc;

hdc = GetDC(NULL);

//Получаем ширину символов

char str[20];

int a[4];

if(GetCharWidth32(hdc, 'A', 'D', a)){

sprintf(str, "%d %d %d %d", a[0], a[1], a[2], a[3]);

}else

sprintf(str, "%s", "Ioeaea");

//Выводим строку на экран

MessageBox(NULL, str, "", MB_OK);

//Освобождаем контекст устройства

ReleaseDC(NULL, hdc);

return 0;

}

В данном примере на экран выводятся значения ширины 4 символов: 'A', 'B', 'C' и 'D'. Данные значения представляются в виде строки: "8 10 9 10" (у вас значения могут быть другими).

Примечание

Функция GetCharWidth32 не может использоваться для шрифтов TrueType. Для этих шрифтов, используйте функцию GetCharABCWidths.

Граничные символы интервала входят в интервал. Это значит, что в выходной буфер будут также записаны значения ширины символов iFirstChar и iLastChar.

Если запрошенный символ не определен в текущем шрифте, то в качестве его ширины используется ширина символа по умолчанию.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll
ANSI и Unicode наименования | GetCharWidth32A и GetCharWidth32W


GetCharWidthFloat

Возвращает дробную ширину каждого символа в группе следующих друг за другом символов для текущего шрифта.

Прототип

BOOL GetCharWidthFloat(

_In_ HDC hdc,

_In_ UINT iFirstChar,

_In_ UINT iLastChar,

_Out_ PFLOAT pxBuffer

);

Параметры

hdc [in]

Описатель контекста устройства.

iFirstChar [in]

Кодовая точка (code point) первого символа группы последовательных символов.

iLastChar [in]

Кодовая точка последнего символа группы последовательных символов.

pxBuffer [out]

Указатель на буфер, в который заносятся размеры символов, в логических единицах.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

float w[4];

char str[20];

if(GetCharWidthFloat(GetDC(NULL), 'A', 'D', w))

sprintf(str, "%f", w[0]);

else

sprintf(str, "%s", "Ошибка");

MessageBox(NULL, str, "", 0);

return 0;

}

В данном примере рассчитывается ширина 4 символов 'A', 'B', 'C' и 'D'. На экран выводится ширина символа 'A'.

Примечание

Возвращаемое значение представлено в 32-разрядном формате представления вещественных чисел IEEE. (ширина символа измеряется вдоль бащовой линии)

Если параметр iFirstChar задает букву "a", а параметр ILastChar букву "z", то функция вернет размеры всех символов нижнего регистра.

Если символ не определен в текущем шрифте, то для него будет возвращена ширина символа по умолчанию.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll
ANSI и Unicode наименования | GetCharWidthFloatA и GetCharWidthFloatW


GetCharWidthI

Возвращает шрину каждого символа в группе следующих друг за другом символов для текущего шрифта. Возвращаемая ширина измеряется в логических единицах.

Прототип

BOOL GetCharWidthI(

_In_ HDC hdc,

_In_ UINT giFirst,

_In_ UINT cgi,

_In_ LPWORD pgi,

_Out_ LPINT lpBuffer

);

Параметры

hdc [in]

Описатель контекста устройства.

giFirst [in]

Первый символ в последовательности символов.

cgi [in]

Количество символов.

pgi [in]

Указатель на массив символов. Если значение этого параметра равно NULL, то вместо него используется параметр giFirst.

lpBuffer [out]

Указатель на буфер, в который заносится ширина каждого символа.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Получаем контекст устройства

HDC hdc;

hdc = GetDC(NULL);

//Символы, ширину которых мы будем определять

WORD chars[4] = {'A', 'D', 'F', 'R'};

//Получаем ширину каждого символа

int widths[4];

char str[40];

if(GetCharWidthI(hdc, 0, 4, chars, widths))

sprintf(str, "A = %d; D = %d; F = %d; R = %d", widths[0], widths[1], widths[2], widths[3]);

else

sprintf(str, "%s", "Ошибка");

//Освобождаем контекст устройства

ReleaseDC(NULL, hdc);

//Выводим сообщение пользователю

MessageBox(NULL, str, "", MB_OK);

return 0;

}

В данном примере расчитывается ширина символов 'A', 'D', 'F' и 'R'. Полученные значения представляются в виде строки, которая выводится на экран. Например, "A = 8; D = 10; F = 8; R = 10" (у вас значения могут быть другими).

Примечание

Если значение параметра pgi равно NULL, то функция GetCharWidthI обрабатывает группу последовательных символов. Параметр cgi задает количество обрабатываемых символов. Если же значение параметра pgi отлично от NULL, то функция обрабатывает массив символов. Параметр cgi задает количество элементов массива.

Для символов не определенных в текущем шрифте в качестве их ширины используется ширина символа по умолчанию.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


GetFontData

Возвращает метрические данные шрифта семейства TrueType.

Прототип

DWORD GetFontData(

_In_ HDC hdc,

_In_ DWORD dwTable,

_In_ DWORD dwOffset,

_Out_ LPVOID lpvBuffer,

_In_ DWORD cbData

);

Параметры

hdc [in]

Описатель контекста устройства.

dwTable [in]

Наименование метрической таблицы шрифта, из которой возвращаются данные шрифта. Данный параметр может задавать одну из метрических таблиц, описанной в спецификации файлов шрифтов TrueType. Данная спецификация опубликована компанией Microsoft Corporation. Если значение этого параметра равно нулю, то возвращается информация с начала файла из коллекции файлов шрифтов TrueType или с начала данных текущего выбранного шрифта для коллекции файлов шрифтов. Для получения информации с начала файла из коллекции файлов шрифтов, установите в параметре dwTable значение 'ttcf' (0x66637474).

dwOffset [in]

Смещение позиции, с которой функция должна начать возвращать информацию, от начала метрической таблицы шрифта. Если значение этого параметра равно нулю, то информация возвращается с начала таблицы, заданной в параметре dwTable. Если значение параметра dwOffset больше или равно размеру таблицы, произойдет ошибка.

lpvBuffer [out]

Указатель на буфер, в который заносится информация о шрифте. Если значение этого параметра равно NULL, функция возвращает необходимый размер буфера для информации о шрифте.

cbData [in]

Размер возвращаемой информации, в байтах. Если значение этого параметра равно нулю, функция возвращает размер данных, указанных в параметре dwTable.

Возвращаемое значение

Количество вовзращенных функцией байт.

Возвращаемое значение в случае ошибки

Значение GDI_ERROR.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Создаем контекст устройства, совместимый с контекстом устройства экрана

HDC hdc;

hdc = CreateCompatibleDC(GetDC(NULL));

//Создаем TrueType шрифт

HFONT hfont;

hfont = CreateFont(24, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, RUSSIAN_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "TrueType");

//Выбираем созданный шрифт в контексте устройства

SelectObject(hdc, hfont);

//Удаляем шрифт

DeleteObject(hfont);

//Получаем необходимый размер буфера

DWORD size;

size = GetFontData(hdc, 0, 0, NULL, 0);

//Подготавливаем буфер

unsigned char *lpBuffer;

lpBuffer = (unsigned char*) malloc(size);

//Заполняем буфер

size = GetFontData(hdc, 0, 0, lpBuffer, size);

//Освобождаем буфер

free(lpBuffer);

//Удляем контекст устройства

DeleteDC(hdc);

//Выводим количество полученных данных

char s[10];

sprintf(s, "%d", size);

MessageBox(NULL, s, "", 0);

return 0;

}

В данном примере функция GetFontData вызывается дважды: первый раз для определения необходимого размера буфера под данные, второй раз для заполнения этого буфера. Сам буфер на экран не выводится из-за своего большого размера. Вместо него выводится размер. У меня он составил 889512 байт (у вас значение может быть другим).

Примечание

Данная функция предназначена для возвращения информации о шрифте TrueType непосредственно из файла шрифта приложениями, манипулирующими шрифтами.

Приложение может иногда использовать эту функцию для сохранения шрифта TrueType в документе. Перед этим приложение определяет: может ли шрифт быть встроенным. Для этого оно проверяет значение поля otmfsType структуры OUTLINETEXTMETRIC. Если бит 1 значения поля otmfsType взведен, то встраивание для шрифта не допустимо. Если бит сброшен, то шрифт может быть встроен. Если бит 2 установлен, то встраивание допустимо в режиме только для чтения. Если встраивание разрешено, приложение может получить весь файл шрифта, задав значение нуль в параметрах dwTable, dwOffset и cbData.

Если приложение попытается использовать эту функцию для получения информации о шрифте, не являющемся TrueType шрифтом, произойдет ошибка.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


GetFontLanguageInfo

Возвращает информацию о текущем выбранном шрифте для заданного контекста устройства. Приложения обычно используют эту информацию совместно с функцией GetCharacterPlacement для подгтовки строки символов к её отображению.

Прототип

DWORD GetFontLanguageInfo(

_In_ HDC hdc

);

Параметры

hdc [in]

Описатель контекста устройства.

Возвращаемое значение

Характеристики текущего выбранного шрифта. Функция возвращает значение нуль для "обычного" шрифта, который может быть интерпретирован как простой латинский шрифт. Для более сложных шрифтов функция возвращает одно из значений, перечисленных здесь, или их комбинацию.

Возвращаемое значение в случае ошибки

Значение GCP_ERROR.

Пример использования

Ниже приводится пример использования функции.

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Получаем контекст устройства

HDC hdc;

hdc = GetDC(NULL);

int res;

//Получаем инфрмацию о шрифте

res = GetFontLanguageInfo(hdc);

ReleaseDC(NULL, hdc);

char s[10];

if(res == GCP_ERROR)

sprintf(s, "%s", "Ошибка");

else

sprintf(s, "%X", res);

MessageBox(NULL, s, "", 0);

return 0;

}

В данном примере на экран выводится значение нуль (простой шрифт).

Примечание

Возвращенное функцией значение с наложенной маской FLI_MASK может быть передано в функцию GetCharacterPlacement.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


GetFontUnicodeRanges

Возвращает информацию о том, какие символы Unicode поддерживаются шрифтом. Данная информация возвращается в виде структуры GLYPHSET.

Прототип

DWORD GetFontUnicodeRanges(

_In_ HDC hdc,

_Out_ LPGLYPHSET lpgs

);

Параметры

hdc [in]

Описатель контекста устройства.

lpgs [out]

Указатель на структуру GLYPHSET, в которую будет занесена информация о наборе глифов. Если значение этого параметра равно NULL, то функция вернет необходимый для сохранения информации размер структуры GLYPHSET.

Возвращаемое значение

Количество байт, записанных в структуру GLYPHSET. Если значение параметра lpgs равно NULL, функция возвращает размер структуры GLYPHSET, необходимый для сохранения информации.

Возвращаемое значение в случае ошибки

Значение нуль. Дополнительная информация об ошибке недоступна.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Получаем контекст устройства

HDC hdc;

hdc = GetDC(NULL);

//Получаем размер сруктуры GLYPHSET

DWORD size;

size = GetFontUnicodeRanges(hdc, NULL);

//Подготавливаем буфер под структуру

void *pv;

pv = malloc(size);

//Заполняем структуру GLYPHSET

size = GetFontUnicodeRanges(hdc, pv);

//Получаем количество интервалов и выводим его на экран

LPGLYPHSET lpg;

lpg = (LPGLYPHSET)pv;

char s[10];

sprintf(s, "%d", lpg->cRanges);

free(pv);

MessageBox(NULL, s, "", 0);

return 0;

}

В данном примере мы дважды вызываем функцию GetFontUnicodeRanges: первый раз для определения необходимого размера структуры GLYPHSET, второй раз для заполнения этой структуры. На экран выводится количество поддерживаемых интервалов. На моем компьютере оно составило 25 (у вас значение может быть иным).

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


GetGlyphIndices

Преобразует строку в массив индексов глифов (glyph indices). Функция может использоваться для определения того существует ли глиф в данном шрифте.

Прототип

DWORD GetGlyphIndices(

_In_ HDC hdc,

_In_ LPCTSTR lpstr,

_In_ int c,

_Out_ LPWORD pgi,

_In_ DWORD fl

);

Параметры

hdc [in]

Описатель контекста устройства.

lpstr [in]

Указатель на конвертируемую строку.

c [in]

Длина строки lpstr и размер (в словах) буфера pgi.

pgi [out]

Указатель на буфер. Данный буфер должен иметь размер c слов. В случае успеха в него будет записан массив индексов глифов, соответствующих символам строки.

fl [in]

Задает - как должны обрабатываться не поддерживаемые глифы. Данный может принимать значение, указанное ниже.

GGI_MARK_NONEXISTING_GLYPHS - не поддерживаемые глифы помечаются значением 0xFFFF.

Возвращаемое значение

Количество сконвертированных байт (ANSI версия) или слов (Unicode версия).

Возвращаемое значение в случае ошибки

Значение GDI_ERROR.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

#define SIZE_BUFFER 5

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

char s[SIZE_BUFFER] = "abc32";

WORD w[SIZE_BUFFER];

char str[20];

if(GetGlyphIndices(GetDC(NULL), s, SIZE_BUFFER, w, GGI_MARK_NONEXISTING_GLYPHS) != GDI_ERROR)

sprintf(str, "0x%X", w[0]);

else

sprintf(str, "%s", "Ioeaea");

MessageBox(NULL, str, "", 0);

return 0;

}

В данном примере конвертируется строка "abc32" и, в случае успеха, на экран выводится код глифа первого символа строки.

Примечание

Данная функция предполагает, что каждый символ в строке lpstr представляется в виде одного глифа. Это полезно для некоторых низкоуровневных целей (таких как манипулирование файлами шрифтов). Однако приложения высокого уровня, которым нужно отображать строки в глифы обычно используют функции Uniscribe (https://msdn.microsoft.com/en-us/library/windows/desktop/dd374091(v=vs.85).aspx).

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll
ANSI и Unicode наименования | GetGlyphIndicesA и GetGlyphIndicesW


GetGlyphOutline

Возвращает контур или битовую карту символа для шрифта TrueType, выбранного в заданном контексте устройства.

Прототип

DWORD GetGlyphOutline(

_In_ HDC hdc,

_In_ UINT uChar,

_In_ UINT uFormat,

_Out_ LPGLYPHMETRICS lpgm,

_In_ DWORD cbBuffer,

_Out_ LPVOID lpvBuffer,

_In_ const MAT2 *lpmat2

);

Параметры

hdc [in]

Описатель контекста устройства.

uChar [in]

Символ, для которого запрашивается информация.

uFormat [in]

Формат запрашиваемых данных. Данный параметр содержит одно из значений, перечисленных здесь или их комбинацию.

Учтите, что для значений GGO_GRAYn_BITMAP, функция вернет битовую карту глифа, которая будет содержать n^2+1 (n в квадрате плюс один) уровней серого.

lpgm [out]

Указатель на структуру GLYPHMETRICS, описывающую положение глифа в символьной ячейке.

cbBuffer[in]

Размер, в байтах, буфера (*lpvBuffer), в который функкция копирует информацию о контуре символа. Если значение этого параметра равно нулю, то функция вернет необходимый размер буфера.

lpvBuffer [out]

Указатель на буфер, в который ункция запишет информацию о контуре символа. Если значение этого параметра равно NULL, функция вернет необходимый размер буфера.

lpmat2 [in]

Указатель на структуру MAT2, задающую трансформационную матрицу для символа.

Возвращаемое значение

Если задан флаг GGO_BITMAP, GGO_GRAY2_BITMAP, GGO_GRAY4_BITMAP, GGO_GRAY8_BITMAP или GGO_NATIVE, то значение больше нуля. Если указан один из этих флагов, а размер буфера или указатель на него равен нулю, то функция вернет необходимый размер буфера в байтах.

Возвращаемое значение в случае ошибки

Значение GDI_ERROR.

Пример использования

Ниже приводится пример использования данной фукции.

#include <windows.h>

#include <stdio.h>

#define _CHAR_ 'A'

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Создаем контекст устройства, совместимый с контекстом устройства экрана

HDC hdc;

hdc = CreateCompatibleDC(GetDC(NULL));

//Создаем TrueType шрифт

HFONT hfont;

hfont = CreateFont(24, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, RUSSIAN_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "TrueType");

//Выбираем созданный шрифт в контексте устройства

SelectObject(hdc, hfont);

//Удаляем шрифт

DeleteObject(hfont);

//Определяем необходимый размер буфера

unsigned int size;

GLYPHMETRICS glm;

MAT2 m2;

size = GetGlyphOutline(hdc, _CHAR_, GGO_BITMAP, &glm, 0, NULL, &m2);

//Подготавливаем буфер

void *lpBuffer;

lpBuffer = malloc(size);

//Получаем битовую карту

DWORD res;

res = GetGlyphOutline(hdc, _CHAR_, GGO_BITMAP, &glm, size, lpBuffer, &m2);

//Освобождаем буфер

free(lpBuffer);

//Выводим результат работы функции

char str[10];

if(res != GDI_ERROR)

sprintf(str, "%s", "Успех");

else

sprintf(str, "%s", "Ошибка");

MessageBox(NULL, str, "", MB_OK);

//Удаляем контекст устройства

DeleteDC(hdc);

return 0;

}

В данном примере мы дважды вызываем функцию GetGlyphOutline: первый раз для получения необходимого размера буфера, второй раз - для его заполнения. На экран выводится результат работы этой функции: успех или ошибка. Информация получается для символа 'A'.

Примечание

Контур глифа, возвращаемый фукцией GetGlyphOutline, является контуром глифа адаптированного сеткой (grid-fitted glyph). Адаптированный сеткой глиф - это глиф, который может быть модифицирован так, что его растровое изображение будет максимально подобно (conform) оригинальному глифу. Если приложению нужен немодифицируемый кунтур глифа, оно может запросить контур глифа для символа шрифта, размер которого равен единице em шрифта (font's em unit). Значение единицы em шрифта хранится в поле otmEMSquare структуры OUTLINETEXTMETRIC.

Битовая карта глифа, возвращаемая функцией GetGlyphOutline при заданном флаге GGO_BITMAP, выровнена по границе двойного слова (DWORD), ориентирована на строки (row-oriented) и является двуцветной. Если задан флаг GGO_GRAY2_BITMAP, битовая карта выровнена по границе двойного слова, а значения ориентированного на строки массива байт находятся в интервале от 0 до 4. Если задан флаг GGO_GRAY4_BITMAP, возвращаемая битовая карта выровнена по границе двойного слова, а значения ориентированного на строки массива байт находятся в интервале от 0 до 16. Если задан флаг GGO_GRAY8_BITMAP, возвращаемая битовая карта выровнена по границе двойного слова, а значения ориентированного на строки массива байт находятся в интервале от 0 до 64.

"Родной" (native) буфер, возвращаемый функцией GetGlyphOutline при заланном флаге GGO_NATIVE, описывает контур глифа. Контур глифа представлен в виде одного или нескольких контуров, описываемых структурой TTPOLYGONHEADER, вслед за которой располагается одна или несколько кривых. Каждая кривая описывается структурой TTPOLYCURVE, вслед закоторой располагается несколько точек, описываемых структурами POINTFX. Каждая структура POINTFX задает абсолютные (не относительные) положения. Стартовая точка контура указана в поле pfxStart структуры TTPOLYGONHEADER. Стартовая точка кажой кривой является последней точкой предшествующей ей кривой или стартовой точкой всего контура. Количество точек указано в поле cpfx структуры TTPOLYCURVE. Размер кажого контура в буфере, в байтах, указан в поле cb структуры TTPOLYGONHEADER. Дополнительное описание кривых упаковано (packed) в буфер располагающийся после предшествующих кривых, а дополнительные контуры упакованы в буфер, располагающийся после предыдущих контуров. Буфер содержит столько контуров сколько умещается (fit) в буфер, возвращаемый функцией GetGlyphOutline.

Структура GLYPHMETRICS задает ширину символьной ячейки и положение глифа внутри этой ячейки. Начало символьной ячейки располагается по левому краю ячейки на базовой линии шрифта. Положение начала глифа задается относительно начала символьной ячейки. Высота символьной ячейки, базовая линия, и другие метрики, глобальные для шрифта хранятся в структуре OUTLINETEXTMETRIC.

Приложение может изменить символы, возвращенные в битовой карте или "родном" формате путем указания в параметре lpMatrix трансформационной матрицы размером 2 на 2. Например, глиф может быть изменен посредством сдвига (shear), вращения, масштабирования, или любой комбинацией из этих операций посредством умножения матриц.

Дополнительная информация о контурах глифов приведена в технических спецификациях шрифтов TrueType и OpenType.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll
ANSI и Unicode наименования | GetGlyphOutlineA и GetGlyphOutlineW


GetKerningPairs

Возвращает кернинговые пары в текущем выбранном шрифте для заданного контекста устройства.

Прототип

DWORD GetKerningPairs(

_In_ HDC hdc,

_In_ DWORD nNumPairs,

_Out_ LPKERNINGPAIR lpkrnpair

);

Параметры

hdc [in]

Описатель контекста устройства.

nNumPairs [in]

Количество пар в массиве lpkrnpair. Если шрифт содержит больше кернинговых пар, чем указано в параметре nNumPairs, функция вернет ошибку.

lpkrnpair [out]

Указатель на массив структур KERNINGPAIR, в который записываются кернинговые пары. Массив должен содержать не менее nNumPairs элементов. Если значение параметра lpkrnpair равно NULL, функция вернет количество кернинговых пар в шрифте.

Возвращаемое значение

Количество кернинговых пар.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

HDC hdc;

hdc = GetDC(NULL);

int count;

count = GetKerningPairsW(hdc, 0, NULL);

char s[10];

sprintf(s, "%d", count);

MessageBox(NULL, s, "", MB_OK);

return 0;

}

В данном примере мы пытаемся получить количество кернинговых пар, имеющихся в шрифте. Как бы я ни экспериментировал с этой функцией, я всегда получал значение нуль. К сожалению у нас нет возможности определить что это: ошибка, или в шрифте нет ни одной кернинговой пары.

Примечание

В комментариях к статье msdn с описанием этой функции утверждается, что ANSI версия этой функций может приводить к появлению ложных кернинговых пар. Там же рекомендуется использовать только Unicode версию функции (мы используем её в примере выше).

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll
ANSI и Unicode наименования | GetKerningPairsA и GetKerningPairsW


GetOutlineTextMetrics

Возвращает метрики текста для шрифта TrueType.

Прототип

UINT GetOutlineTextMetrics(

_In_ HDC hdc,

_In_ UINT cbData,

_Out_opt_ LPOUTLINETEXTMETRIC lpOTM

);

Параметры

hdc [in]

Описатель контекста устройства.

cbData [in]

Размер буфера, в который записываются текстовые метрики, в байтах.

lpOTM [out, opt]

Указатель на структуру OUTLINETEXTMETRIC. Если значение данного параметра равно NULL, то функция вернет требуемый размер буфера для размещения в нем запрошенной информации.

Возвращаемое значение

Ненулевое значение, или требуемый размер буфера.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Создаем контекст устройства, совместимый с контекстом устройства экрана

HDC hdc;

hdc = CreateCompatibleDC(GetDC(NULL));

//Создаем TrueType шрифт

HFONT hfont;

hfont = CreateFont(24, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, RUSSIAN_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "TrueType");

//Выбираем созданный шрифт в контексте устройства

SelectObject(hdc, hfont);

//Удаляем шрифт

DeleteObject(hfont);

//Определяем требуемый размер буфера под метрики

int size;

size = GetOutlineTextMetrics(hdc, 0, NULL);

//Подготавливаем буфер под метрики

char* lpBuffer;

lpBuffer = (char*) malloc(size);

//Получаем сами метрики

char str[100];

if(GetOutlineTextMetrics(hdc, size, lpBuffer)){

char* lpstr;

lpstr = (char*)(lpBuffer + (int)((OUTLINETEXTMETRIC*)lpBuffer)->otmpFullName);

sprintf(str, "%s", lpstr);

}else

sprintf(str, "%s", "Ошибка");

MessageBox(NULL, str, "", MB_OK);

//Удаляем буфер

free(lpBuffer);

//Удаляем шрифт

DeleteObject(hfont);

//Удаляем контекст устройства

DeleteDC(hdc);

return 0;

}

В данном примере мы дважды вызываем функцию GetOutlineTextMetrics: первый раз для определения необходимого размера буфера, второй раз для получения самих метрик.

Предварительные операции нужны для установки шрифта TrueType в контексте устройства. Для того, чтобы не менять контекст устройства экрана, мы с помощью функции CreateCompatibleDC создаем контекст устройства, совместимый с контекстом устройства экрана, и уже в нем меняем шрифт. Для создания шрифта используется функция CreateFont.

В случае успеха на экран выводится строка "Monotype:Arial Regular (Microsoft)". У вас строка может отличаться.

Примечание

Структура OUTLINETEXTMETRIC содержит практически всю информацию о шрифте TrueType (включая структуру TEXTMETRIC). Размеры, хранящейся в этой структуре заданы в логических единицах. Это значит, что они зависят от текущего режима отображения (maping mode).

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll
ANSI и Unicode наименования | GetOutlineTextMetricsA и GetOutlineTextMetricsW


GetRasterizerCaps

Вовзращает флаги, определяющие установлены ли в системе шрифты TrueType.

Прототип

BOOL GetRasterizerCaps(

_Out_ LPRASTERIZER_STATUS lprs,

_In_ UINT cb

);

Параметры

lprs [out]

Указатель на структуру RASTERIZER_STATUS, в которую заносится информация о растеризаторе (rasterizer).

cb [in]

Количество байт, скопированных в структуру lprs.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

RASTERIZER_STATUS rs;

char str[20];

if(GetRasterizerCaps(&rs, sizeof(RASTERIZER_STATUS)))

sprintf(str, "%s", "Успех");

else

sprintf(str, "%s", "Ошибка");

MessageBox(NULL, str, "", MB_OK);

return 0;

}

В данном примере возвращается "ошибка". Как бы я не экспериментировал с этой функцией, я всегда получал ошибку. К сожалению, функция не предоставляет возможности получения причины ошибки. Поиск примеров в интернете ничего не дал. Во всех найденных мною примерах функция используется так, как показано в примере. При этом по уверению их авторов: у них все работает.

Примечание

Данная функция позволяет приложениям и драйверам принтеров определить установлены ли в системе шрифты TrueType.

Если в поле wFlags структуры RASTERIZER_STATUS устанвлен флаг TT_AVAILABLE, то в системе установлен как минимум один шрифт TrueType. Если установлен флаг TT_ENABLED, то в системе доступен шрифт TrueType.

Фактическое количество скопированных байт равно наименьшему значению параметра cb и длины структуры RASTERIZER_STATUS.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


GetTabbedTextExtent

Вычисляет ширину и высоту строки символов. Если строка содержит один или несколько символов табуляции, ширина строки основывается на заданных остановках табуляции (tab stops). Для вычисления размеров строки функция использует текущий выбранный шрифт.

Прототип

DWORD GetTabbedTextExtent(

_In_ HDC hDC,

_In_ LPCTSTR lpString,

_In_ int nCount,

_In_ int nTabPositions,

_In_ const LPINT lpnTabStopPositions

);

Параметры

hDC [in]

Описатель контекста устройства.

lpString [in]

Указатель на строку символов.

nCount [in]

Длина строки. Для ANSI строк длина равна размеру строки в байтах, для Unicode строки - размеру строки в словах. Учтите, что в однобайтовых кодовых страницах (SBCS) каждому символу соответствует один байт, тогда как большинству символов в двухбайтовых кодовых страницах (DBCS) соответствует два байта. Большинству символов Unicode (входящих в состав базовой многоязыковой плоскости (Basic Multilingual Plane - BMP)) соответствует одно слово (WORD) тогда как суррогатам (surrogates) Unicode соответствует два слова.

nTabPositions [in]

Количество остановок табуляции в массиве lpnTabStopPositions.

lpnTabStopPositions [in]

Указатель на массив, содержащий положения остановок табуляции (tab-stop positions), в единицах устройства. Остановки табуляции должны быть отсортированы в порядке возрастания; наименьшее значение должно быть первым элементом массива.

Возвращаемое значение

Размеры строки в логических единицах, Высота строки хранится в старшем слове, а ширина - в младшем слове.

Возвращаемое значение в случае ошибки

Значение нуль. Функция завершается ошибкой при некорректном описателе контекста устройства, или если значение параметра nTabPositions меньше нуля.

Пример использования

Пример использования приведен здесь.

Примечание

Текущий регион отсечения никак не влияет на ширину и высоту строки, возвращаемые функцией.

Так как некоторые устройства располагают символы не в регулярном массиве ячеек (то есть они кернируют (kern) символы), сумма размеров символов в строке может отличаться от размера строки.

Если значение параметра nTabPositions равно нулю, а параметра lpnTabStopPositions NULL, то символы табуляции в строке расширяются до восьмикратного среднего размера символа (average character width).

Если значение параметра nTabPositions равно 1, остановки табуляции в строке разделяются расстоянием, заданным в первом элементе массива lpnTabStopPositions.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | GetTabbedTextExtentA и GetTabbedTextExtentW


GetTextAlign

Возвращает значение настройки выравнивания текста для заданного контекста устройства.

Прототип

UINT GetTextAlign(

_In_ HDC hdc

);

Параметры

hdc [in]

Описатель контекста устройства.

Возвращаемое значение

Набор флагов выравнивания текста. Допустимые флаги выравнивания перечислены здесь.

Если текущий шрифт поддерживает вертикальную базщовую линию (как, например, кандзи), вместо флагов TA_BASELINE и TA_CENTER используются флаги, перечисленные ниже.

VTA_BASELINE - базовая точка располагается на базовой линии текста.

VTA_CENTER - базовая точка выравнивается по центру ограничивающего прямоугольника. Выравнивание осуществляется по вертикали.

Возвращаемое значение в случае ошибки

Значение GDI_ERROR.

Пример использования

Пример использования приводится ниже. В данном примере получается настройка выравнивания текста для контекста устройства экрана.

#include <windows.h>

#include <stdio.h>

//Прототип функции GetTextAlign

typedef UINT (*GETTEXTALIGN)(HDC);

GETTEXTALIGN pTA;

int main()

{

//Находим адрес функции GetTextAlign

HINSTANCE hgdi;

hgdi = LoadLibrary("gdi32.dll");

pTA = (GETTEXTALIGN)GetProcAddress(hgdi,"GetTextAlign");

//Получаем текущее выравнивание

UINT talign = 100;

talign = pTA(GetDC(NULL));

//Выводим текущее выравнивание

printf("%X\n",talign);

getchar();

return 0;

}

В результате работы этой программы на экран булдет выведено число нуль. Данное значение соответствует флагам TA_NOUPDATECP, TA_LEFT и TA_TOP.

Примечание

Ограничивающий прямоугольник - это прямоугольник, ограничивающий все ячейки символов текстовой строки. Его размеры могут быть получены с помощью функции GetTextExtentPoint32.

Флаги выравнивания текста задают то, как функции TextOut и ExtTextOut выравнивают строку текста относительно базовой точки, переданной в функцию TextOut или ExtTextOut.

Флаги необязательно являются отдельными взведенными битами и могут быть равны нулю. Состояние флагов должно проверяться группами зависимых флагов. Данные группы перечислены ниже.

· TA_LEFT, TA_RIGHT и TA_CENTER
· TA_BOTTOM, TA_TOP и TA_BASELINE
· TA_NOUPDATECP и TA_UPDATECP

Если текущий шрифт имеет вертикальную базовую линию, то группы флагов выравнивания для него перечислены ниже.

· TA_LEFT, TA_RIGHT и VTA_BASELINE
· TA_BOTTOM, TA_TOP и VTA_CENTER
· TA_NOUPDATECP и TA_UPDATECP

Для проверки состояния конкретного флага используйте следующую последовательность действий.

1. Примените битовую операцию ИЛИ над требуемым флагом и связанными с ним флагами.
2. Примените битовую операцию И над результатоя предыдущей операции и значением, возвращенным функцией GetTextAlign.
3. Проверьте равенство полученного значения и требуемого флага.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


GetTextCharacterExtra

Возвращает текущее межсимвольное расстояние для заданного контекста устройства.

Прототип

int GetTextCharacterExtra(

_In_ HDC hdc

);

Параметры

hdc [in]

Описатель контекста устройства.

Возвращаемое значение

Текущее межсимвольное расстояние, в логических единицах.

Возвращаемое значение в случае ошибки

Значение 0x8000000.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

char str[20];

int width;

width = GetTextCharacterExtra(GetDC(NULL));

sprintf(str, "%d", width);

MessageBox(NULL, str, "", 0);

return 0;

}

В данном примере на экран выводится текущее межсимвольное расстояние. В частности на экран выводится значение нуль (у вас значение может быть иным).

Примечание

Межсимвольное расстояние задает дополнительное расстояние, в логических единицах, вдоль базовой линии, которое функции TextOut и ExtTextOut добавляют к каждому символу при отображении строки текста. Это расстояние используется для увеличения длины строки.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


GetTextColor

Возвращает текущий цвет текста в заданном контексте устройства.

Прототип

COLORREF GetTextColor(

_In_ HDC hdc

);

Параметры

hdc [in]

Описатель контекста устройства.

Возвращаемое значение

Цвет текста в виде значения типа COLORREF.

Возвращаемое значение в случае ошибки

Значение CLR_INVALID. Дополнительная информация об ошибке недоступна.

Пример использования

Ниже приводится пример испльзования этой функции.

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Получаем цвет текста

COLORREF color;

color = GetTextColor(GetDC(NULL));

//Выводим его на экран

char s[50];

snprintf(s, 50, "%X", color);

MessageBox(NULL, s, "", MB_OK);

return 0;

}

Примечание

Цвет текста задает цвет символов, отрисовываемых функциями TextOut и ExtTextOut.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


GetTextExtentExPoint

Возвращает количество символов в заданной сроке, которые поместятся в заданном интервале и заполняет массив размеров текста для каждого такого символа. (размер текста - это расстояние между началом интервала и символом, помещаемым в интервал). Данная информация полезна при расчете переноса слов.

Прототип

BOOL GetTextExtentExPoint(

_In_ HDC hdc,

_In_ LPCTSTR lpszStr,

_In_ int cchString,

_In_ int nMaxExtent,

_Out_ LPINT lpnFit,

_Out_ LPINT alpDx,

_Out_ LPSIZE lpSize

);

Параметры

hdc [in]

Описатель контекста устройства.

lpszStr [in]

Указатель на завершающуюся NULL-символом строку, для которой возвращаются размеры.

cchString [in]

Количество символов в строке lpszStr. Для ANSI версии это значение соответсвует длине строки в байтах, для Unicode версии - в словах (WORDs). Учтите, что для ANSI версии, символы в однобайтовой кодовой странице имеют один байт на символ, тогда как большинству символов в двухбайтных кодовых страницах соответствует два байта; для Unicode версии функции, большинству символов Unicode, входящих в состав базовой многоязычной плоскости (Basic Multilingual Plane - BMP), соответствует слово (WORD), тогда как суррогатам (surrogates) соответствует два слова.

nMaxExtent [in]

Максимально допустимая ширина, в логических единицах, форматированной строки.

lpnFit [out]

Указатель на целочисленное значение, в которое заносится максимальное количество символов, помещающихся в интервал, заданный параметром nMaxExtent. Если значение параметра lpnFit равно NULL, то значение параметра nMaxExtent игнорируется.

alpDx [out]

Указатель на массив целочисленных значений, в который заносятся частичные размеры строки. Каждый элемент массива содержит расстояние, в логических единицах, между началом строки и символом, умещающимся в интервал, заданный параметром nMaxExtent. Данный массив должен иметь как минимум cchString элементов, так как внутри функции используется весь массив. Функция заполняет массив корректными значениями для количества символов, сохраняемого в параметре lpnFit. Значения, сохраненные в остальной части массива должны игнорироваться. Если значение параметра alpDx равно NULL, то функция не вычисляет частичные размеры строки.

Для сложных скриптов (complex scripts), в которых последовательность символов может быть представлена несколькими глифами, значения в массиве alpDx соответствуют кодовым точкам (code points). Количество значений сохранено в параметре lpnFit. И вновь, вы должны игнорировать значения, записанные в остальной части массива alpDx.

lpSize [out]

Указатель на структуру SIZE, в которую заносятся размеры строки, в логических единицах. Значение данного параметра не может быть равно NULL.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

//Размер строки

#define STRLEN 12

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Получаем размеры строки

char s[STRLEN] = "Привет, мир!";

int dx[STRLEN];

SIZE size = {0, 0};

int count = 0;

GetTextExtentExPoint(GetDC(NULL), s, STRLEN, 100, &count, dx, &size);

//Выводим массив частичных размеров

char str[100]= "";

if(count)

sprintf(str, "%d", dx[0]);

int i;

for(i=1;i<count;i++)

sprintf(str, "%s; %d", str, dx[i]);

MessageBox(NULL, str, "", 0);

return 0;

}

В данном примере получаются размеры строки "Привет, мир!". Пользователю на экран выводится содержимое массива alpDx.

Примечание

Если значения параметров lpnFit и alpDx одновременно равны NULL, то вызов функции GetTextExtentExPoint эквивалентен вызову функции GetTextExtentPoint.

Для ANSI версии функции количество элементов массива lpDx равно количеству байт в строке lpString. Целочисленные значения, соответствующие двум байтам символа двухбайтной кодовой страницы, описывают размер всего составного символа.

Учтите, что значения массива alpDx функции GetTextExtentExPoint не аналогичны значениям массива lpDx функции ExtTextOut. Для использования значений alpDx в качестве lpDx вы должны их предварительно обработать.

При расчете размеров строки функция полагает, что текст отображается горизонтально, то есть угол наклона текста равен нулю. Это справедливо для горизонтального и вертикального размеров текста. Даже если вы используете шрифт, имеющий ненулевой наклон, данная функция при расчете размеров строки не использует угол. Приложения должны сами пересчитывать размеры. Однако, когда установлен графический режим GM_ADVANCED, а угол ориентации символов равен 90 градусам относительно ориентации печати, возвращаемые функцией значения не соответствуют этому правилу. Когда для переданной строки ориентация символов совпадает с ориентацией печати, функция возвращает размеры строки в структуре SIZE так: {cx: 116, cy: 18}. Если же для строки, ориентация печати и ориентация символов различаются на 90 градусов, функция заполнит структуру SIZE так: {cx: 18, cy: 116}.

Функция GetTextExtentExPoint возвращает размер для каждого последующего символа строки. Когда они будут приведены к логическим единицам, вы получите результат отличный от результата работы функции GetCharWidth, которая возвращает ширину каждого отдельного символа, выраженную в логических единицах.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll
ANSI и Unicode наименования | GetTextExtentExPointA и GetTextExtentExPointW


GetTextExtentExPointI

Возвращает количество символов заданной строки, которые уместятся в заданном интервале и заполняет массив размеров символов. (Размер текста - это расстояние между началом интервала (space) и символом размещаемом в этом интервале.) Данная информация используется для расчета переносов слов.

Прототип

BOOL GetTextExtentExPointI(

_In_ HDC hdc,

_In_ LPWORD pgiIn,

_In_ int cgi,

_In_ int nMaxExtent,

_Out_ LPINT lpnFit,

_Out_ LPINT alpDx,

_Out_ LPSIZE lpSize

);

Параметры

hdc [in]

Описатель контекста устройства.

pgiln [in]

Указатель на массив глифов, для которых возвращаются размеры.

cgi [in]

Количество глифов в массиве pgiln.

nMaxExtent [in]

Максимально допустимая ширина, в логических единицах, форматируемой строки.

lpnFit [out]

Указатель на целочисленную переменную, в которую будет занесено максимальное количество символов, умещающихся в интервале, заданном параметром nMaxExtent. Если значение параметра lpnFit равно NULL, то параметр nMaxExtent игнорируется.

alpDx [out]

Указатель на массив целочисленных значений, в который заносятся частичные размеры глифов. Каждый элемент этого массива содерждит расстояние, в логических единицах, между началом массива глифов и глифом, умещающимся в интервал, заданный параметром nMaxExtent. Хотя, этот массив должен иметь столько же элементов скользо глифов задано параметром cgi, функция заполнит его только для глифов, умещающихся в интервал. Количество таких глифов заносится в параметр lpnFit. Если значение параметра lpnFit равно NULL, функция не вычисляет частичные расстояния глифов.

lpSize [out]

Указатель на структуру SIZE, в которую заносятся размеры массива глифов, в логических единицах. Значение данного параметра не может равняться NULL.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

#define COUNT 11

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

WORD d[COUNT] = {'П', 'р', 'и', 'в', 'е', 'т', ' ', 'М', 'и', 'р', '!'};

SIZE size = {0, 0};

int Fit = 0;

int DX[COUNT];

GetTextExtentExPointI(GetDC(NULL), d, COUNT, 100, &Fit, DX, &size);

char str[50];

sprintf(str, "Уместится %d символов", Fit);

MessageBox(NULL, str, "", MB_OK);

return 0;

}

В данном примере мы определяем сколько символов уместится в интервал 100 логических единиц. Оказывается только 7 (у вас результат может быть другим) символов.

Примечание

Если значения параметров lpnFit и alpDx одновременно равны NULL, то вызов функции GetTextExtentExpoint эквивалентен вызову функции GetTextExtentPointI.

При расчете размеров строки функция полагает, что текст отображается горизонтально, то есть угол наклона текста равен нулю. Это справедливо для горизонтального и вертикального размеров текста. Даже если вы используете шрифт, имеющий ненулевой наклон, данная функция при расчете размеров строки не использует угол. Приложения должны сами пересчитывать размеры. Однако, когда установлен графический режим GM_ADVANCED, а угол ориентации символов равен 90 градусам относительно ориентации печати, возвращаемые функцией значения не соответствуют этому правилу. Когда для переданной строки ориентация символов совпадает с ориентацией печати, функция возвращает размеры строки в структуре SIZE так: {cx: 116, cy: 18}. Если же для строки, ориентация печати и ориентация символов различаются на 90 градусов, функция заполнит структуру SIZE так: {cx: 18, cy: 116}.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


GetTextExtentPoint

Вычисляет ширину и высоту заданной строки текста.

Данная функция предоставляется для совместимости с 16-разрядными верясиями Windows. Приложения должны использовать функцию GetTextExtentPoint32.

Прототип

BOOL GetTextExtentPoint(

_In_ HDC hdc,

_In_ LPCTSTR lpString,

_In_ int cbString,

_Out_ LPSIZE lpSize

);

Параметры

hdc [in]

Описатель контекста устройства.

lpString [in]

Указатель на текстовую строку. Строка не должна завершаться нулем, так как параметр cbString задает длину строки.

cbString [in]

Длина строки lpString.

lpSize [in]

Указатель на структуру SIZE, в которую записываются размеры строки, в логических единицах.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

char s[] = "Привет, мир!";

SIZE size = {0, 0};

GetTextExtentPoint(GetDC(NULL), s, strlen(s) ,&size);

char str[20];

sprintf(str, "Ширина: %d\r\nВысота: %d", size.cx, size.cy);

MessageBox(NULL, str, "", 0);

return 0;

}

В данном примере вычисляется размер строки "Привет, мир!". В результате работы этой программы на экран выводится строка: "Ширина: 85 Высота: 16" (у вас значения могут быть другими).

Примечание

Функция GetTextExtentPoint для вычисления размеров строки использует шрифт, выбранный в контексте устройства. Ширина и высота строки, в логических единицах, вычисляются без учета отсечения. Также, данная функция предполагает, что текст располагается горизонтально, то есть угол наклона равен нулю. Это верно для горизонтального и вертикального размеров текста. Поэтому если используемый шрифт имеет ненулевой наклон, функция GetTextExtentPoint его не учитывает при расчете размеров строки. Приложение должно само конвертировать размеры при ненулевом наклоне шрифта.

Так как некоторые устройства дробят (kern) символы, то сумма ширины символов может отличаться от ширины строки.

При расчете ширины строки учитывается межсимвольное расстояние, устанавливаемое функцией SetTextCharacterExtra.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll
ANSI и Unicode наименования | GetTextExtentPointA и GetTextExtentPointW


GetTextExtentPoint32

Вычисляет ширину и высоту заданной строки текста.

Прототип

BOOL GetTextExtentPoint32(

_In_ HDC hdc,

_In_ LPCTSTR lpString,

_In_ int c,

_Out_ LPSIZE lpSize

);

Параметры

hdc [in]

Описатель контекста устройства.

lpString [in]

Указатель на буфер, содержащий текстовую строку.Строка может не заканчиваться NULL символом, так как параметр c задает длину строки.

c [in]

Длина строки lpString.

lpSize [out]

Указатель на структуру SIZE, в которую будут занесены размеры строки, в логических единицах.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

char s[] = "Привет, Мир!";

SIZE size;

char str[50];

if(GetTextExtentPoint32(GetDC(NULL), s, strlen(s), &size))

sprintf(str, "Ширина: %d\r\nВысота: %d", size.cx, size.cy);

else

sprintf(str, "%s", "Ошибка");

MessageBox(NULL, str, "", 0);

return 0;

}

В данном примере функция используется для расчета размеров строки "Привет, Мир!". В результате работы этой программы на экран выводится строка: "Ширина: 88 Высота: 16" (у вас значения могут быть другими).

Примечание

Функция GetTextExtentPoint32 для расчета размеров строки использует текущий выбранный шрифт. Ширина и высота, в логических единицах, рассчитываются без учета отсечения.

Так как некоторые устройства кернируют (kern) символы, то сумма ширины символов может отличаться от ширины строки.

Расчитанная ширина строки включает в себя межсимвольное растояние, установленное функцией SetTextCharacterExtra и выравнивание, установленное функцией SetTextJustification. Это справедливо и при отображении строки на экране и при печати. Тем не менее, если установлен массив lpDx, передаваемый в функцию ExtTextOut, то функция GetTextExtentPoint32 не учитывает межсимвольные расстояния и выравнивание. Одновременно с этим, для EMF (расширенный формат метафайлов), при печати всегда учитываются межсимвольные расстояния и выравнивание.

При работе с текстом, отображаемым на экране, во время расчета ширины строки учитываются межсимвольные расстояния, установенные функцией SetTextCharacterExtra и выравнивание, установленное функцией SetTextJustification. Однако, если установлен массив lpDx, передаваемый в функцию ExtTextOut, то функция GetTextExtentPoint32 не учитывает межсимвольные расстояния и выравнивание. Одновременно с этим, при печати файлов EMF:

· при печати игнорируются межсимвольные расстояния, а функция GetTextExtentPoint32 их учитывает;
· при печати учитывается выравнивание, а функция GetTextExtentPoint32 его игнорирует.

При расчете размеров строки функция полагает, что текст отображается горизонтально, то есть угол наклона текста равен нулю. Это справедливо для горизонтального и вертикального размеров текста. Даже если вы используете шрифт, имеющий ненулевой наклон, данная функция при расчете размеров строки не использует угол. Приложения должны сами пересчитывать размеры. Однако, когда установлен графический режим GM_ADVANCED, а угол ориентации символов равен 90 градусам относительно ориентации печати, возвращаемые функцией значения не соответствуют этому правилу. Когда для переданной строки ориентация символов совпадает с ориентацией печати, функция возвращает размеры строки в структуре SIZE так: {cx: 116, cy: 18}. Если же для строки, ориентация печати и ориентация символов различаются на 90 градусов, функция заполнит структуру SIZE так: {cx: 18, cy: 116}.

Функция GetTextExtentPoint32 при расчете высоты строки не учитывает символы "\n" (новая строка) и "\r\n" (возврат каретки и новая строка).

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll
ANSI и Unicode наименования | GetTextExtentPoint32A и GetTextExtentPoint32W


GetTextExtentPointI

Вычисляет ширину и высоту заданного массива глифов.

Прототип

BOOL GetTextExtentPointI(

_In_ HDC hdc,

_In_ LPWORD pgiIn,

_In_ int cgi,

_Out_ LPSIZE lpSize

);

Параметры

hdc [in]

Описатель контекста устройства.

pgiln [in]

Указатель на массив глифов.

cgi [in]

Количество глифов.

lpSize [out]

Указатель на структуру SIZE, в которую возвращаются размеры строки, в логических единицах.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

#define COUNT 11

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

WORD d[COUNT] = {'П', 'р', 'и', 'в', 'е', 'т', ' ', 'М', 'и', 'р', '!'};

SIZE size = {0, 0};

GetTextExtentPointI(GetDC(NULL), d , COUNT, &size);

char str[50];

sprintf(str, "Ширина: %d\r\nВысота: %d", size.cx, size.cy);

MessageBox(NULL, str, "", MB_OK);

return 0;

}

В данном примере вычисляется размер строки "Привет, мир!". На экран выводятся следюущие размеры: "Ширина: 134 Высота: 16" (у вас значения могут быть другими).

Примечание

Функция GetTextExtentPointI для вычисления размера массива глифов использует текущий выбранный шрифт. Ширина и высота, в логических единицах, вычисляется без учета отсечения (clipping).

При расчете размеров строки функция полагает, что текст отображается горизонтально, то есть угол наклона текста равен нулю. Это справедливо для горизонтального и вертикального размеров текста. Даже если вы используете шрифт, имеющий ненулевой наклон, данная функция при расчете размеров строки не использует угол. Приложения должны сами пересчитывать размеры. Однако, когда установлен графический режим GM_ADVANCED, а угол ориентации символов равен 90 градусам относительно ориентации печати, возвращаемые функцией значения не соответствуют этому правилу. Когда для переданной строки ориентация символов совпадает с ориентацией печати, функция возвращает размеры строки в структуре SIZE так: {cx: 116, cy: 18}. Если же для строки, ориентация печати и ориентация символов различаются на 90 градусов, функция заполнит структуру SIZE так: {cx: 18, cy: 116}.

Так как некоторые устройства кернируют (kern) символы, то сумма ширины символов может отличаться от ширины строки.

При расчете ширины строки также учитываются межсимвольное расстояние, устанавливаемое функцией SetTextCharacterExtra.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


GetTextFace

Возаращает наименование начертания символов (typeface name) для шрифта выбранного в заданном контексте устройства.

Прототип

int GetTextFace(

_In_ HDC hdc,

_In_ int nCount,

_Out_ LPTSTR lpFaceName

);

Параметры

hdc [in]

Описатель контекста устройства.

nCount [in]

Длина буфера lpFaceName. Для ANSI версии функции она равна рпазмеру буфера в байтах, для Unicode версии - размеру буфера в словах (WORD). Учтите, что символам однобайтовой кодовой страницы (SBCS) соответствует один байт, тогда как большинству символов двухбайтной кодовой страницы соотвествует два байта; большинству символов Unicode (образующих базовую многоязыковую плоскость (Basic Multilingual Plane - BMP)) соответствует одно слово (WORD), а суррогатам (surrogates) Unicode два слова.

lpFaceName [out]

Указатель на буфер, в который заносится наименование начертания символов. Если значение этого параметра равно NULL, функция вернет количество символов в наименовании, включая завершающий NULL символ.

Возвращаемое значение

Количество символов, скопированных в буфер.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

//Получаем длину наименования

size_t size = 0;

size = GetTextFace(GetDC(NULL), 0, NULL);

//Подготавливаем буфер под строку

char *s;

s = (char*)malloc(size);

//Получаем само наименование

GetTextFace(GetDC(NULL), size, s);

//Выводим наименование

MessageBox(NULL, s, "", MB_OK);

free(s);

return 0;

}

В данном примере мы дважды вызываем функцию GetTextFace: первый раз для определения длины наименования, а второй раз для получения самого наименования, которое потом и выводится на экран.

Примечание

Наименование начертания копируется в виде завершающейся NULL-символом строки.

Если длина наименования больше количества символов, заданного параметром nCount, то наименование обрезается.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll
ANSI и Unicode наименования | GetTextFaceA и GetTextFaceW


GetTextMetrics

Заполняет буфер метриками текущего выбранного шрифта.

Прототип

BOOL GetTextMetrics(

_In_ HDC hdc,

_Out_ LPTEXTMETRIC lptm

);

Параметры

hdc [in]

Описатель контекста устройства.

lptm [out]

Указатель на структуру TEXTMETRIC, в которую заносятся метрики текста.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

TEXTMETRIC tm;

char str[20];

if(GetTextMetrics(GetDC(NULL), &tm))

sprintf(str, "%d", tm.tmAveCharWidth);

else

sprintf(str, "%s", "Ошибка");

MessageBox(NULL, str, "", 0);

return 0;

}

В данном примере на экран выводится средняя ширина символов. У меня она составила 7 единиц (у вас значение может быть иным).

Примечание

Для определения того принадлежит ли шрифт семейству TrueType шрифтов, выберите его в контексте устройства, вызовите функцию GetTextMetrics и проверьте флаг TMPF_TRUETYPE в поле TEXTMETRIC.tmPitchAndFamily. Учтите, что функция GetDC возвращает не инициализированный контекст устройства, в котором выбран шрифт "System" (растровый шрифт); поэтому вы должны выбирать шрифт в контексте устройства.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll
ANSI и Unicode наименования | GetTextMetricsA и GetTextMetricsW


PolyTextOut

Отрисовывает несколько строк используя шрифт и цвета текста выбранные в заданном контексте устройства.

Прототип

BOOL PolyTextOut(

_In_ HDC hdc,

_In_ const POLYTEXT *pptxt,

_In_ int cStrings

);

Параметры

hdc [in]

Описатель контекста устройства.

pptxt [in]

Указатель на массив структур POLYTEXT, описывающих отрисовываемые строки. Массив содержит по одной структуре для каждой строки.

cStrings [in]

Количество структур POLYTEXT в массиве pptxt.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Каждая структура POLYTEXT содержит координаты точки привязки (reference point), которую система использует для выравнивания строки текста. Приложение может задать как использовать точку привязки с помощью функции SetTextAlign. Текущая настройка выравнивания текста для контекста устройства может быть получена с помощью функции GetTextAlign.

Для вывода одной строки текста приложения должны использовать функцию ExtTextOut.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll
ANSI и Unicode наименования | PolyTextOutA и PolyTextOutW


RemoveFontMemResourceEx

Удаляет шрифты, добавленные из образа памяти.

Прототип

BOOL RemoveFontMemResourceEx(

_In_ HANDLE fh

);

Параметры

fh [in]

Описатель ресурса шрифта. Данный описатель возвращается функцией AddFontMemResourceEx.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль. Дополнительная информация об ошибке недоступна.

Пример использования

Пример использования приведен здесь.

Примечание

Данная функция удаляет шрифт, добавленный функцией AddFontMemResourceEx. Данная функция удаляет только шрифт, заданный параметром fh.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


RemoveFontResource

Удаляет шрифты, хранящиеся в заданном файле из системной таблицы шрифтов.

Если шрифт был добавлен с помощью функции AddFontResourceEx, то для его удаления должна использоваться функция RemoveFontResourceEx.

Прототип

BOOL RemoveFontResource(

_In_ LPCTSTR lpFileName

);

Параметры

lpFileName [in]

Указатель на завершающуюся NULL символом строку, содержащую наименование файла шрифта.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Если приложение добавляет или удаляет шрифты из системной таблицы шрифтов, рекомендутся чтобы оно уведомляло об этом другие окна. Для этого оно должно разослать сообщение WM_FONTCHANGE всем окнам верхнего уровня. Для рассылки сообщения приложение должно использовать функцию SendMessage, в которой параметр hwnd содержит значение HWND_BROADCAST.

Если существуют ссылки на шрифт, то ассоциированный с ним ресурс остается загруженным даже если нет использующего его контекста устройства. Кроме того, шрифты перечисленные в реестре (HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\ CurrentVersion\Fonts) и установленные в каталог отличный от %windir%\fonts\, могут быть загружены в другом активном сеансе (включая сеанс 0).

Когда вы пытаетесь заменить существующий файл шрифта, на который имеется внешняя ссылка, вы получите ошибку, свидетельствующую о том, что шрифт не может быть удален, так как он используется даже после того, как вы вызвали функцию RemoveFontResource. Если вашему приложению необходимо заменить шрифт, уменьшите до нуля количество ссылок на шрифт. Для этого вызывайте функцию RemoveFontResource в цикле так, как показано в прводимом ниже коде. Если после этого вы все равно получаете ошибку, то означает, что файл шрифта загружен в другом сеансе. Убедитесь в том, что шрифт не перечисляется в реестре и перезагрузите систему для того, чтобы убедиться в том, что шрифт не загружен в других сеансах.

Учтите. Приложение, использующее оригинальный файл шрифта по-прежнему будет использовать оригинальный файл и не сможет использовать новый шрифт до тех пор, пока не перезагрузит шрифты. Для перезагрузки шрифта используйте функцию AddFontResource. Мы рекомендуем вызывать функцию AddFontResource столько же раз, сколько успешно вызывается функция RemoveFontResource. Это показано в примере ниже.

int i = 0;

while( RemoveFontResource( FontFile ) )

{

i++;

}

// Заменяем файл шрифта

while( i-- )

{

AddFontResource( FontFile );

}

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll
ANSI и Unicode наименования | RemoveFontResourceA и RemoveFontResourceW


RemoveFontResourceEx

Удаляет шрифты, заданные в указанном файле из системной таблицы шрифтов.

Прототип

BOOL RemoveFontResourceEx(

_In_ LPCTSTR lpFileName,

_In_ DWORD fl,

_In_ PVOID pdv

);

Параметры

lpFileName [in]

Указатель на завершающуюся NULL символом строку, содержащую наименование файла.

fl [in]

Характеристики удаляемого из системы шрифта. Для удаления шрифта данные флаги должны совпадать с флагами переданными в функцию AddFontResourceEx при его установки.

pdv [in]

Зарезервировано. Должно быть равно нулю.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль. Дополнительная информация об ошибке недоступна.

Пример использования

Пример использования приведен здесь.

Примечание

Функция удалит шрифт только если указанные флаги шрифта совпадают с флагами, переданными в функцию AddFontResourceEx.

Когда вы пытаетесь заменить существующий файл шрифта, на который имеется внешняя ссылка, вы получите ошибку, свидетельствующую о том, что шрифт не может быть удален, так как он используется даже после того, как вы вызвали функцию RemoveFontResourceEx. Если вашему приложению необходимо заменить шрифт, уменьшите до нуля количество ссылок на шрифт. Для этого вызывайте функцию RemoveFontResourceEx в цикле так, как показано в прводимом ниже коде. Если после этого вы все равно получаете ошибку, то означает, что файл шрифта загружен в другом сеансе. Убедитесь в том, что шрифт не перечисляется в реестре и перезагрузите систему для того, чтобы убедиться в том, что шрифт не загружен в других сеансах.

Учтите. Приложение, использующее оригинальный файл шрифта по-прежнему будет использовать оригинальный файл и не сможет использовать новый шрифт до тех пор, пока не перезагрузит шрифты. Для перезагрузки шрифта используйте функцию AddFontResourceEx. Мы рекомендуем вызывать функцию AddFontResourceEx столько же раз, сколько успешно вызывается функция RemoveFontResourceEx. Это показано в примере ниже.

int i = 0;

while( RemoveFontResourceEx( FontFile, FR_PRIVATE, 0 ) )

{

i++;

}

// Заменяем файл шрифта

while( i-- )

{

AddFontResourceEx( FontFile, FR_PRIVATE, 0 );

}

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll
ANSI и Unicode наименования | RemoveFontResourceExA и RemoveFontResourceExW


SetMapperFlags

Изменяет алгоритм отображения логических шрифтов в физические.

Прототип

DWORD SetMapperFlags(

_In_ HDC hdc,

_In_ DWORD dwFlag

);

Параметры

hdc [in]

Описатель контекста устройства, содержащего изменяемый флаг отображения шрифтов.

dwFlag [in]

Определяет: должен ли механизм отображения шрифтов добиваться соответствия соотношения сторон шрифта и соотношения сторон устройства. Если младший бит взведен, то механизм выбирает только подходящие шрифты.

Возвращаемое значение

Предыдущее значение изменяемого флага.

Возвращаемое значение в случае ошибки

Значение GDI_ERROR.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

char str[10];

if(SetMapperFlags(GetDC(NULL),0) != GDI_ERROR)

sprintf(str, "%s", "Успех");

else

sprintf(str, "%s", "Ошибка");

MessageBox(NULL, str, "", MB_OK);

return 0;

}

Примечание

Если флаг dwFlag взведен, а подходящих шрифтов нет, система выберет новое соотношение сторон и вернет шрифт, соответствующий выбранному соотношению сторон.

Все прочие биты параметра dwFlag должны равняться нулю.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


SetTextAlign

Устанавливает флаги выравнивания текста в заданном контексте устройства.

Прототип

UINT SetTextAlign(

_In_ HDC hdc,

_In_ UINT fMode

);

Параметры

hdc [in]

Описатель контекста устройства.

fMode [in]

Выравнивание текста. Данный параметр содержит одно из значений, перечисленных здесь, или их комбинацию. Из флагов, задающих выравнивание по горизонтали может быть выбран только один флаг. Аналогично, только один флаг может быть выбран из флагов задающих выравнивание по вертикали. И один флаг из флагов, задающих порядок изменения текущего положения.

Если текущий шрифт имеет вертикальную базовую линию (как, например, кандзи) вместо флагов TA_BASELINE и TA_CENTER должны использоваться флаги, перечисленные ниже.

VTA_BASELINE - базовая точка располагается на базовой линии текста.

VTA_CENTER - базовая точка выравнивается по центру ограничивающего прямоугольника. Выравнивание осуществляется по вертикали.

По умолчанию установлены флаги TA_LEFT, TA_TOP и TA_NOUPDATECP.

Возвращаемое значение

Предыдущее значение настройки выравнивания текста.

Возвращаемое значение в случае ошибки

Значение GDI_ERROR.

Пример использования

Ниже приводится пример использования этой функции.

#include <windows.h>

#include <stdio.h>

//Прототип функции GetTextAlign

typedef UINT (*SETTEXTALIGN)(HDC, UINT);

SETTEXTALIGN pSTA;

int main()

{

//Находим адрес функции SetTextAlign

HINSTANCE hgdi;

hgdi = LoadLibrary("gdi32.dll");

pSTA = (SETTEXTALIGN)GetProcAddress(hgdi,"SetTextAlign");

//Устанавливаем выравнивание текста

pSTA(GetDC(NULL), TA_LEFT | TA_TOP);

getchar();

return 0;

}

Примечание

Функции TextOut и ExtTextOut используют флаги выравнивания для позиционирования текстовой строки на экране или другом устройстве. Данные флаги задают взаимосвязь между базовой точкой (reference point) и прямоугольником, ограничивающим текст. Базовая точка - это текущее положение или точка, передаваемая в функцию вывода текста.

Ограничивающий текст прямоугольник формируется ячейками символов (character cells) в текстовой строке.

Ниже приводится рекомендуемый способ получения текста выровненного по левому краю.

SetTextAlign (hdc, GetTextAlign(hdc) & (~TA_CENTER))

Ниже приводится другой вариант решения той же задачи.

SetTextAlign (hdc,TA_LEFT | <other flags>)

Вы также можете использовать вариант SetTextAlign (hdc, TA_LEFT). Но при нем теряются настройки выравнивания по вертикали и режим чтения (справа налево или сева направо).

Вы не дожны использовать функцию SetTextAlign с флагом TA_UPDATECP если строка выводится функцией ScriptStringOut. Так как в этом случае текст будет выведен некорректно. Если же вам необходимо использовать флаг TA_UPDATECP, вы можете сбросить этот флаг, вывести строку, а потом вновь установить его.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


SetTextCharacterExtra

Устанавливает межсимвольное расстояние. Данное расстояние добавляется к каждому символу, включая разрывные символы, когда система отрисовывает строку текста.

Прототип

int SetTextCharacterExtra(

_In_ HDC hdc,

_In_ int nCharExtra

);

Параметры

hdc [in]

Описатель контекста устройства.

nCharExtra [in]

Устанавливаемое дополнительное расстояние, в логических единицах, добавляемое к каждому символу. Если текущий режим отображения отличен от MM_TEXT, то значение параметра nCharExtra пересчитывается (transformed) и округляется до ближайшего пикселя.

Возвращаемое значение

Предыдущее значение межсимвольного расстояния.

Возвращаемое значение в случае ошибки

Значение 0x80000000.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

char str[20];

if(SetTextCharacterExtra(GetDC(NULL), 3) != 0x80000000)

sprintf(str, "%s", "Успех");

else

sprintf(str, "%s", "Ошибка");

MessageBox(NULL, str, "", 0);

return 0;

}

В данном примере устанавливатся межсимвольное расстояние равное 3 логическим единицам.

Примечание

Данная функция поддерживается для совместимости с существующими приложениями. Новым приложениям нежелательно использовать эту функцию, так как её использование несовместимо со сложными скриптами (скриптами, которым требуется формирование текста, примером таких скриптов являются арабские скрипты).

Рекомендуется вместо функции SetTextCharacterExtra и TextOut использовать функцию ExtTextOut с заполненным массивом lpDx, в котором указываются ширины.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


SetTextColor

Устанавливает цвет текста для заданного контекста устройства.

Прототип

COLORREF SetTextColor(

_In_ HDC hdc,

_In_ COLORREF crColor

);

Параметры

hdc [in]

Описатель контекста устрйоства.

crColor [in]

Цвет текста.

Возвращаемое значение

Предыдущий цвет текста в виде значения типа COLORREF.

Возвращаемое значение в случае ошибки

Значение CLR_INVALID.

Пример использования

Пример использования приведен здесь.

Примечание

Цвет текста используется для отрисовки каждого символа функциями TextOut и ExtTextOut. Цвет текста также используется при конвертировании растровых изображений из цветного режима в двуцветный и наоборот.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


SetTextJustification

Устанавливает расстояние, которое система должна добавить к разрывным символам в текстовой строке. Данное расстояние добавляется, когда приложение вызывает функцию TextOut или ExtTextOut.

Прототип

BOOL SetTextJustification(

_In_ HDC hdc,

_In_ int nBreakExtra,

_In_ int nBreakCount

);

Параметры

hdc [in]

Описатель контекста устройства.

nBreakExtra [in]

Суммарное расстояние, в логических единицах, добавляемое к строке текста. Если текущий редим отображения отличен от MM_TEXT, то значение параметра nBreakExtra пересчитывается и округляется до целого числа пикселей.

nBreakCount [in]

Количество разрывных символов в строке.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Ниже приводится пример использования данной функции.

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nFunsterStil)

{

char str[20];

if(SetTextJustification(GetDC(NULL), 10, 2))

sprintf(str, "%s", "Успех");

else

sprintf(str, "%s", "Ошибка");

MessageBox(NULL, str, "", 0);

return 0;

}

Примечание

К разрывным символам обычно относят символ пробела (ASCII 32), но в шрифте к ним могут относится и некоторые другие символы. Для получения разрывного символа шрифта может быть использована функция GetTextMetrics.

Функция TextOut равномерно распределяет дополнительное расстояние между всеми разрывными символами строки.

Функция GetTextExtentPoint32 всегда используется совместно с функцией SetTextJustification. Иногда функция GetTextExtentPoint32 учитывает выравнивание при расчете ширины строки, а иногда - нет. Более подробную информац ию смотрите в описании функции GetTextExtentPoint32. Данная ширина должна быть известна для определения значения параметра nBreakExtra.

Функция SetTextJustification может быть использована для выравнивания текста, состоящего из нескольких строк с разными шрифтами. В этом случае каждая строка должна выравниваться отдельно.

Так как во время выравнивания могут произойти ошибки округления, система сохраняет остаток от округления, являющийся текущим значением ошибки. Когда выравнивание для строки выполняется несколько раз, функция GetTextExtentPoint автоматически использует это остаточное значение при последующем расчете размера строки, позволяя тем самым функции TextOut учесть эту ошибку. После выравнивания строки данная ошибка должна быть очищена для предотвращения её включения в следующую выравниваемую строку. Для очистки ошибки вызовите функцию SetTextJustification с параметром nBreakExtra равным нулю.

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll


TabbedTextOut

Выводит строку символов в заданном месте, расширяя символы табуляции, входящие в её состав на основе позиций табуляций, указанных в массиве остановок табуляции (tab-stop positions). Текст выводится с использованием текущего выбранного шрифта, цвета фона и цвета текста.

Прототип

LONG TabbedTextOut(

_In_ HDC hDC,

_In_ int X,

_In_ int Y,

_In_ LPCTSTR lpString,

_In_ int nCount,

_In_ int nTabPositions,

_In_ const LPINT lpnTabStopPositions,

_In_ int nTabOrigin

);

Параметры

hDC [in]

Описатель контекста устройства.

X [in]

Горизонтальная координата начальной точки строки, в логических единицах.

Y[in]

Вертикальная координата начальной точки строки, в логических единицах.

lpString [in]

Указатель на отрисовываемую строку символов. Строка не должна завершаться нулем, так как параметр nCount задает длину строки.

nCount [in]

Длина строки lpString.

nTabPositions [in]

Количество значений в массиве остановок по табуляции.

lpnTabStopPositions [in]

Указатель на массив, содержащий положения остановок по табуляции (tab-stop positions), в логических единицах. Остановки по табуляции должны быть отсортированы в порядке возрастания. Наименьшее значение должно храниться в первом элементе массива.

nTabOrigin [in]

Горизонтальная координата, от которой отсчитываются остановки по табуляции, в логических единицах.

Возвращаемое значение

Размеры строки в логических единицах. Значение высоты хранится в старшем слове, ширина - в младшем слове.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Если значение параметра nTabPositions равно нулю, а параметра lpnTabStopPositions NULL, то символы табуляции в строке расширяются до восьмикратного среднего размера символа (average character width).

Если значение параметра nTabPositions равно 1, остановки табуляции в строке разделяются расстоянием, заданным в первом элементе массива lpnTabStopPositions.

Если массив lpnTabStopPositions содержит более одного элемента, остановка по табуляции устанавливается для каждого элемента массива в соответствии с их количеством в параметре nTabPositions.

Параметр nTabOrigin позволяет приложениям вызывать функцию TabbedTextOut несколько раз для каждой строки (line). Если приложение вызывает функцию TabbedTextOut несколько раз с одним и тем же значением параметра nTabOrigin, функция расширит все символы табуляции относительно позиции заданной в параметре nTabOrigin.

По умолчанию, текущее положение (current position) не используется или обновляется функцией TabbedTextOut. Если приложению нужно обновить текущее положение при вызове функции TabbedTextOut, оно может вызвать функцию SetTextAlign со значением параметра wFlags равным TA_UPDATECP. Когда этот флаг установлен, система игнорирует значения парамметров X и Y при последующем вызове функции TabbedTextOut, используя вместо них текущее положение.

Учтите, что в Windows Vista и в более новых версиях Windows функция TabbedTextOut игнорирует выравнивание текста при его отрисовке.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | TabbedTextOutA и TabbedTextOutW


TextOut

Отрисовывает символьную строку в заданном месте с использованием выбранного шрифта, цвета фона и текста.

Прототип

BOOL TextOut(

_In_ HDC hdc,

_In_ int nXStart,

_In_ int nYStart,

_In_ LPCTSTR lpString,

_In_ int cchString

);

Параметры

hdc [in]

Описатель контекста устройства.

nXStart [in]

Горизонтальная координата базовой точки, которую система использует для выравнивания текста. Координата задается в логических единицах.

nYStart [in]

Вертикальная координата базовой точки, которую система использует для выравнивания текста. Координата задается в логических единицах.

lpString [in]

Указатель на отрисовываемую строку. Данная строка не должна заканчиваться NULL-символом, так как её длина задается параметром cchString.

cchString [in]

Длина строки lpString в символах.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль.

Пример использования

Пример использования приведен здесь.

Примечание

Интерпретация базовой точки зависит от текущего режима выравнивания текста. Приложение может получить этот режим с помощью функции GetTextAlign. Для изменения режима выравнивания используется функция SetTextAlign. Допустимые флаги выравнивания перечислены здесь. Из флагов, задающих выравнивание по горизонтали может быть выбран только один флаг. Аналогично, только один флаг может быть выбран из флагов задающих выравнивание по вертикали. И один флаг из флагов, задающих порядок изменения текущего положения.

По умолчанию, текущее положение не используется и не обновляется функцией. Тем не менее, приложение может вызвать функцию SetTextAlign с флагом TA_UPDATECP, заставив тем самым систему использовать текущее положение и обновлять его при каждом вызове функции TextOut для данного контекста устройства. Если данный флаг установлен система игнорирует значения параметров nXStart и nYStart в последующих вызовах функции TextOut,

Когда вызов функции TextOut осуществляется после вызова BeginPath, но до вызова EndPath, система создает путь для текста TrueType, включающего каждый символ плюс его знакоместо. Создаваемый регион является знакоместом, а не текстом. Вы можете получить этот регион, заключив контур текста TrueType. Для этого установите прозрачный режим фона до размещения функции TextOut в скобках пути (path bracket). Данную операцию демонстрирует код, приведенный ниже.

// Получаем прямоугольник клиентской области окна

GetClientRect(hwnd, &r);

// ПРАВКА: устанавливая прозрачный режим фона

//регион является текстом

// SetBkMode(hdc, TRANSPARENT);

// Открываем скобку пути

BeginPath(hdc);

// Отправляем текст во внешний мир

TCHAR text[ ] = "Defenestration can be hazardous";

TextOut(hdc,r.left,r.top,text, ARRAYSIZE(text));

//Закрываем скобку пути

EndPath(hdc);

// Извлекаем из этого пути регион

SelectClipPath(hdc, RGN_AND);

// Данная функция делает тоже самое, что и функция SelectClipPath()

// SelectClipRgn(hdc, PathToRegion(hdc));

// Заполняем регион

FillRect(hdc, &r, GetStockObject(GRAY_BRUSH));

Заголовочный файл | wingdi.h (подключен в windows.h)
Экспортирующая библиотека | gdi32.dll
ANSI и Unicode наименования | TextOutA и TextOutW


CheckDlgButton

Изменяет состояние выбора для элемента управления кнопки.

Прототип

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


GetDlgCtrlID

Возвращает идентификатор заданного элемента управления.

Прототип

int WINAPI GetDlgCtrlID(

_In_ HWND hwndCtl

);

Параметры

hwndCtl [in]

Описатель окна элемента управления.

Возвращаемое значение

Идентификатор элемента управления.

Возвращаемое значение в случае ошибки

Значение нуль. Ошибка, может произойти, например, из-за неверного значения параметра hwndCtl. Для получения дополнительной информации об ошибке, используйте функцию GetLastError.

Пример использования

В примере ниже функция GetDlgCtrlID используется для получения идентификатора элемента управления. Хотя этот идентификатор известен и хранится в константе ID_TEXT (на основе него получается описатель окна элемента управления), мы идем окольным путем:

· с помощью функции GetDlgItem получаем описатель окна элемента управления;
· с помощью функции GetDlgCtrlID получаем идентификатор элемента управления;
· полученный таким образом идентификатор используется в функции SetDlgItemText для вывода заголовка.

Ниже приводится полный исходный текст примера.

#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)

{

HWND hText;

int cText;

switch(uMsg){

case WM_INITDIALOG:

//Получаем описатель элемента управления

hText = GetDlgItem(hwnd, ID_TEXT);

//Получаем идентификатор элемента управления

cText = GetDlgCtrlID(hText);

//Устанавливаем текст в элементе управления

SetDlgItemText(hwnd, cText, "Hello, World");

break;

case WM_CLOSE:

//Закрываем диалоговое окно

EndDialog(hwnd,0);

}

return 0;

}

Ниже приводится содержимое файла ресурса, в котором задается шаблон создаваемого диалогового окна и иконка.

#include "Resource.h"

#include <windows.h>

ID_ICON ICON "MyIcon.ico"

ID_DIALOG DIALOGEX 0,0,130,130

STYLE WS_CAPTION | WS_VISIBLE | WS_SYSMENU | DS_CENTER | WS_MINIMIZEBOX

CAPTION "DialogBoxParam"

BEGIN

CTEXT "",ID_TEXT, 25,60,80,12, WS_VISIBLE

END

Ниже приводится содержимое заголовочного файла Resource.h, в котором задаются идентификаторы ресурсов.

#define ID_ICON 0x10

#define ID_TEXT 0x01

#define ID_DIALOG 0x1000

Примечание

Функция GetDlgCtrlID в качестве единственного параметра принимает описатель дочернего окна, являющегося элементом управления диалогового окна. Приложения устанавливают идентификатор дочернего окна при его создании. Идентификатор указывается в параметре hmenu функции CreateWindow или CreateWindowEx.

Хотя функция GetDlgCtrlID может вернуть значение, если параметр hwndCtl задает окно верхнего уровня, нужно помнить, что окна верхнего уровня не имеют идентификаторов. Поэтому возвращаемое функцией значение всегда неверно.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll


GetDlgItem

Возвращает описатель элемента управления диалогового окна.

Прототип

HWND WINAPI GetDlgItem(

_In_opt_ HWND hDlg,

_In_ int nIDDlgItem

);

Параметры

hDlg[in, opt]

Описатель диалогового окна, которому принадлежит элемент управления.

nIDDlgItem [in]

Идентификатор элемента управления.

Возвращаемое значение

Описатель окна элемента управления.

Возвращаемое значение в случае ошибки

Значение NULL. Обычно причиной ошибки является неверный описатель диалогового окна или несуществующий элемент управления. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

В примере ниже функция GetDlgItem используется для получения описателя окна элемента управления. Данный описатель, затем, используется в функции SetWindowText.для изменения заголовка элемента управления.

Ниже приводится полный исходный текст примера.

#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)

{

HWND hText;

switch(uMsg){

case WM_INITDIALOG:

//Получаем описатель элемента управления

hText = GetDlgItem(hwnd, ID_TEXT);

//Устанавливаем текст заголовка

SetWindowText(hText, "Hello, World");

break;

case WM_CLOSE:

//Закрываем диалоговое окно

EndDialog(hwnd,0);

}

return 0;

}

Ниже приводится содержимое файла ресурсов, в котором хранится шаблон диалогового окна.

#include "Resource.h"

#include <windows.h>

ID_DIALOG DIALOGEX 0,0,130,130

STYLE WS_CAPTION | WS_VISIBLE | WS_SYSMENU | DS_CENTER | WS_MINIMIZEBOX

CAPTION "DialogBoxParam"

BEGIN

CTEXT "",ID_TEXT, 25,60,80,12, WS_VISIBLE

END

Ниже приводится содержимое заголовочного файла Resource.h, в котором задается идентификатор шаблона диалогового окна и элемента управления.

#define ID_TEXT 0x01

#define ID_DIALOG 0x1000

Примечание

Вы можете использовать эту функцию для любой пары "родитель - потомок" окон, не только для диалоговых окон. Для этого необходимо, чтобы параметр hDlg задавал родительское окно, а дочернее окно имело уникальный идентификатор (заданный в параметре hMenu функции CreateWindow или CreateWindowEx). Если все условия выполнены, функция GetDlgItem вернет корректный описатель дочернего окна.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll


GetDlgItemInt

Конвертирует текст заголовка элемента управления диалогового окна в целое число.

Прототип

UINT WINAPI GetDlgItemInt(

_In_ HWND hDlg,

_In_ int nIDDlgItem,

_Out_opt_ BOOL *lpTranslated,

_In_ BOOL bSigned

);

Параметры

hDlg [in]

Описатель диалогового окна, которому принадлежит элемент управления.

nIDDlgItem [in]

Идентификатор элемента управления, заголовок которого будет конвертироваться.

lpTranslated [out, opt]

Указатель на переменную, в которую будет записан признак успеха операции (TRUE - операция успешно выполнена, FALSE - произошла ошибка).

Если значение параметра равно NULL, то функция не возвращает информацию об успешности выполнения операции.

bSigned [in]

Определяет, должна ли функция проверять первый символ заголовка на то, является ли он знаком минуса и, если это так, вернуть знаковое число (TRUE - должна, FALSE - не должна).

Возвращаемое значение

В случае успеха, переменная lpTranslated будет указывать на значение TRUE. В этом случае функция возвращает результат конвертирования строки в целое число.

Возвращаемое значение в случае ошибки

В случае ошибки, переменная lpTranslated будет указывать на значение FALSE. В этом случае функция вернет значение нуль. Однако, так как значение нуль может быть получено и при корректной работе функции, возвращаемое функцией значение не может выступать в качестве надежного критерия наличия ошибки.

Если значение параметра lpTranslated равно NULL, то функция не возвращает признака ошибки.

Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Если значение параметра bSigned равно TRUE и в начале строки стоит знак минус (-), функция GetDlgItemInt транслирует текст в знаковое целое число. Одновременно с этим функция создает беззнаковое целое число. Для получения корректного результата в случае работы с отрицательными числами, выполните приведение возвращенного функцией значения к типу int.

Функция GetDlgItemInt получает текст заголовка элемента управления с помощью сообщения WM_GETTEXT. Функция транслирует полученный текст путем отбрасывания пробелов в начале строки и конвертированием десятичных цифр. Функция останавливает трансляцию когда она обнаруживает конец строки или встречает символ, не являющийся цифрой.

Функция GetDlgItemInt возвращает значение нуль, если транслируемое значение больше чем INT_MAX (для знаковых чисел) или UINT_MAX (для беззнаковых чисел).

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll


GetDlgItemText

Возвращает заголовок или текст, ассоциированный с элементом управления диалогового окна.

Прототип

UINT WINAPI GetDlgItemText(

_In_ HWND hDlg,

_In_ int nIDDlgItem,

_Out_ LPTSTR lpString,

_In_ int nMaxCount

);

Параметры

hDlg[in]

Описатель диалогового окна, содержащего элемент управления.

nIDDlgItem [in]

Идентификатор элемента управления, заголовок которого мы запрашиваем.

lpString [out]

Указатель на буфер, в который заносится запрашиваемый текст.

nMaxCount [in]

Максимальная длина, в символах, строки, копируемой в буфер lpString. Если длина строки, включая завершающий NULL символ, превышает значение nMaxCount, то она обрезается.

Возвращаемое значение

Количество символов, скопированных в буфер, не включая завершающего NULL символа.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Если строка не умещается в буфер, то она обрезается таким образом, чтобы буфер содержал усеченную строку с завершающим NULL символом.

Для получения текста заголовка функция отправляет элементу управления сообщение WM_GETTEXT.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | GetDlgItemTextA и GetDlgItemTextW


GetNextDlgGroupItem

Возвращает описатель первого элемента управления в группе, предшествующего (или следующего за) заданному элементу управления диалогового окна.

Прототип

HWND WINAPI GetNextDlgGroupItem(

_In_ HWND hDlg,

_In_opt_ HWND hCtl,

_In_ BOOL bPrevious

);

Параметры

hDlg [in]

Описатель диалогового окна.

hCtl [in, opt]

Описатель элемента управления, использующего в качестве начальной точки поиска. Если значение этого парамметра равно NULL, то функция использует поседний (или первый) элемент управления диалогового окна в качестве начальной точки поиска.

bPrevious [in]

Задает направление поиска в группе. Если значение этого параметра равно TRUE, то функция ищет предыдущий элемент управления в группе. Если же значение параметра равно FALSE, то функция ищет следующий элемент управления в группе.

Возвращаемое значение

Описатель предыдущего (или следующего) элемента упавления в группе элементов управления.

Возвращаемое значение в случае ошибки

Значение NULL. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Функция GetNextDlgGroupItem ведет поиск в направлении (или протовиположно ему), соответствующим порядку создания элементов управления в шаблоне диалогового окна. Первый элемент управления в группе должен иметь стиль WS_GROUP; все остальные элементы в группе должны быть созданы после первого элемента и не должны иметь стиль WS_GROUP.

При нахождении предыдущего элемента управления, функция возвращает описатель первого найденного ей элемента управления, который является видимым и не заблокированным. Если элемент управления hCtl имеет стиль WS_GROUP, функция временно изменяет направление поиска, чтобы найти первый элемент управления, имеющий стиль WS_GROUP, затем продолжает поиск в первоначальном направлении, возвращая описатель первого обнаруженного ею элемента управления, который является видимым и не заблокированным, или возвращает значение hCtl, если такой элемент управления не найден.

При нахождении следующего элемента управления, функция возвращает описатель первого обнаруженного ею элемента управления, который является видимым и не заблокированным, но не имеет стиля WS_GROUP. Если функция находит элемент управления, имеющий стиль WS_GROUP, функция изменяет направление поиска, находит первый элемент управления, имеющий стиль WS_GROUP и возвращает его описатель, если он видим и не заблокирован. В противном случае, функция возобновляет поиск в первоначальном направлении и возвращает значение обнаруженного ею первого элемента управления, который является видимым и не заблокированным, или же возвращает значение hCtl, если такой элемент управления не найден.

Если во время поиска следующего элемента управления функция встречает окно со стилем WS_EX_CONTROLPARENT, система будет рекурсивно искать потомков окна.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll


GetNextDlgTabItem

Возвращает описатель первого элемента управления, имеющего стиль WS_TABSTOP, предшествующего (или следующего за) заданному элементу управления.

Прототип

HWND WINAPI GetNextDlgTabItem(

_In_ HWND hDlg,

_In_opt_ HWND hCtl,

_In_ BOOL bPrevious

);

Параметры

hDlg [in]

Описатель диалогового окна, в котором ведется поиск.

hCtl [in, opt]

Описатель элемента управления, использующегося в качесве начальной точки поиска. Если значение этого параметра равно NULL, то функция завершается ошибкой (комментарии к статье в msdn это опровергают).

bPrevious [in]

Задает направление поиска в диалоговом окне. Если значение этого параметра равно TRUE, то функция ищет предыдущий элемент управления в диалоговом окне. Если же значение этого параметра равно FALSE, то функция ищет следующий элемент управления.

Возвращаемое значение

Описатель окна предыдущего (или следующего) элемента управления, у которого установлен стиль WS_TABSTOP.

Возвращаемое значение в случае ошибки

Значение NULL. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Функция GetNextDlgTabItem ведет поиск элементов управления в порядке (или противоположном ему), соответствующем порядку, в котором создавались элементы управления. Функция возвращает первый элемент управления, который является видимым, не заблокированным и имеет стиль WS_TABSTOP. Если такого элемента управления нет, то функция возвращает значение hCtl.

Если во время поиска встречается окно, имеющее стиль WS_EX_CONTROLPARENT, то система осуществляет рекурсивный поиск среди потомков этого окна.

Заголовочный файл | 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 заданному элементу управления кнопки.

Согласно msdn данная функция появилась в Windows Vista, но как показывают мои эксперименты, она существует и в более ранних версиях Windows.

Заголовочный файл | winuser.h (включен в windows.h)
Экспортирующая библиотека | user32.dll


SetDlgItemInt

Устанавливает в качестве заголовка элемента управления строку, содержащую заданное целое число.

Прототип

BOOL WINAPI SetDlgItemInt(

_In_ HWND hDlg,

_In_ int nIDDlgItem,

_In_ UINT uValue,

_In_ BOOL bSigned

);

Параметры

hDlg[in]

Описатель диалогового окна, которому принадлежит элемент управления.

nIDDlgItem [in]

Идентификатор элемента управления, заголовок которого мы меняем.

uValue[in]

Целочисленное значение, используемое для создания строки.

bSigned [in]

Указывает, следует ли значение uValue интерпретировать как знаковое, или как беззнаковое целое. Если значение параметра bSigned равно TRUE, то uValue интерпретируется как знаковое целое. Если значение bSigned равно TRUE и uValue меньше нуля, то перед первой цифрой в строке ставится знак минуса. Если значение параметра bSigned равно FALSE, то uValue интерпретируется как беззнаковое.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Для установки нового заголовка функция отправляет элементу управления сообщение WM_SETTEXT.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll


SetDlgItemText

 Top Previous

Устанавливает заголовок или текст элемента управления диалогового окна.

Прототип

BOOL WINAPI SetDlgItemText(

_In_ HWND hDlg,

_In_ int nIDDlgItem,

_In_ LPCTSTR lpString

);

Параметры

hDlg [in]

Описатель диалогового окна, которому принадлежит элемент управления.

nIDDlgItem [in]

Идентификатор элемента управления.

lpString [in]

Указатель на буфер с копируемым текстом.

Возвращаемое значение

Ненулевое значение.

Возвращаемое значение в случае ошибки

Значение нуль. Для получения дополнительной информации об ошибке используйте функцию GetLastError.

Пример использования

Пример использования приведен здесь.

Примечание

Для изменения заголовка функция отправляет элементу управления сообщение WM_SETTEXT.

Заголовочный файл | winuser.h (подключен в windows.h)
Экспортирующая библиотека | user32.dll
ANSI и Unicode наименования | SetDlgItemTextA и SetDlgItemTextW


Флажок 2

 Top

Данный пример аналогичен примеру. Но с двумя важными отличиями: 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))


Состояния объектов (STATE_SYSTEM_*)

 Top

STATE_SYSTEM_ALERT_HIGH

Не поддерживается.

Указывает, что имеется важная информация, которая должна быть немедленно сообщена пользователю. Например, при низком уровне заряда батареи индикатор уровня заряда генерирует сигнал предупреждения. В результате этого утилита слепого доступа (blind access tool) немедленно сообщает об этом пользователю, а программа масштабирования экрана настроит экран так, чтобы индикатор батареи находился в поле видимости пользователя. Данное состояния также подходит для операций, которые должны быть завершены прежде чем пользователь сможет продолжить работу.

STATE_SYSTEM_ALERT_MEDIUM

Не поддерживается.

Указывает, что имеется важная