
- •Оглавление
- •1 Простейшее Win32 приложение
- •2 Функция WinMain
- •3 Оконный класс
- •4 Стили класса, стили окна
- •5 Создание экземпляра оконного класса
- •6 Динамические изменения свойств оконного класса
- •7 Обработка сообщений
- •8 Программирование клавиатуры
- •9 Коды oem, ansii, asci, виртуальные коды клавиш
- •10 Символьные сообщения
- •11 Обработка сообщений от мыши
- •12 Программирование таймера
- •13 Диалоговые окна
- •14 Структура шаблона диалога
- •14(А) Ресурсы диалога
- •15 Функции создания диалога
- •16 Взаимодействие между элементами управления
- •17 Сообщения, SendMessage, SendDlgItemMessage
- •18 Обработка сообщений от элементов диалога
- •19 Элемент «Слайдер» (Румянцев - Азбука программирования в Win32 api, c.148)
- •20 Элемент ProgressBar (Румянцев - Азбука программирования в Win32 api, c.156)
- •21 Bios (общие сведения)
- •22 Файлы (общие сведения)
- •23 Создание файла (Win32 api)
- •24 Операции с файлом (Win32 api)
- •25 Организация файлов
- •26 Файловые системы (общие сведения)
- •Создание файла.
- •Удаление файла.
- •28 Структура логического диска под fat12 (wfat)
- •29 Каталоги в fat12
- •30 Алгоритм определения расположения файлов на диске
- •31 Ф.С. Fat32 (отличительные особенности)
- •32 Изменение элементов системных объектов при выполнении copy
- •33 Ntfs (общие сведения)
- •34 Запись файла в mft
- •35 Метафайлы
- •36 Атрибуты записи файла
- •37 Изменение системных данных при выполнении copy
- •38 Изменение системных данных при выполнении del
- •39 Изменение системных данных при выполнении move
- •40 Процессы. Потоки. Общие сведения
- •41 Модель процесса
- •42 Контекст процесса
- •43 Дескриптор процесса
- •44 Создание процесса (общие сведения)
- •45 Окончание процесса (общие сведения)
- •46 Состояния процесса
- •47 Уровни планирования процессов
- •48 Диспетчеризация процессов
- •49 Класс приоритета процесса
- •50 Создание процесса (Win32 api)
- •51 Win32 Api. Управление процессами
- •52 Win32 Api. Окончание процесса
- •53 Среда процесса
- •54 Командная строка процесса
- •55 Наследование дочерними процессами ресурсов родителя
- •56 Список процессов
- •57 Время выполнения процесса
5 Создание экземпляра оконного класса
После того как класс окна определен и зарегистрирован, приложение может создавать окна этого класса с использованием функции API CreateWindow().
HWND CreateWindow(
LPCTSTR lpClassName, // имя класса окна
LPCTSTR lpWindowName, // заголовок окна
DWORD dwStyle, // стиль окна
int x, // горизонтальная позиция окна
int y, // вертикальная позиция окна
int nWidth, // ширина окна
int nHeight, // высота окна
HWND hWndParent, // дескриптор родительского окна
HMENU hMenu, // дескриптор главного меню
HINSTANCE hInstance, // дескриптор приложения, создающего окно
LPVOID lpParam // указатель на дополнительную информацию
);
Функция возвращает дескриптор созданного окна либо NULL, если создать окно не удалось.
Многие параметры могут принимать значения по умолчанию или NULL. Если окно не имеет родительского окна, то параметр hWndParent должен быть равен NULL.
6 Динамические изменения свойств оконного класса
Дополнительная память в структуре класса окна
При регистрации класса окна вы можете в поле cbClsExtra структуры WNDCLASS указать размер дополнительной области памяти, которая будет зарезервирована в структуре данных, описывающей класс окна. В эту область можно записать данные, предназначенные для использования всеми окнами, создаваемыми на базе класса.
Для работы с этой дополнительной памятью предназначены функции SetClassLong, GetClassLong.
Функция SetClassLong заменяет указанное 32-разрядное (long) значение при заданном смещении в дополнительной памяти класса или в структуре WNDCLASSEX на класс, которому указанное окно принадлежит.
Обратите внимание! на то, что эта функция была заменена функцией SetClassLongPtr. Чтобы написать код, который является совместимым и с 32-разрядными, и с 64-разрядными версиями Microsoft ® Windows ®, используйте SetClassLongPtr. |
Синтаксис
DWORD SetClassLong( HWND hWnd, int nIndex, LONG dwNewLong ); |
Параметры
hWnd
[in] Дескриптор окна и, косвенно, класс которому окно принадлежит.
nIndex
[in] Устанавливает заменяемое 32-разрядное значение. Чтобы установить 32-разрядное значение в дополнительную память класса, задайте положительное, отсчитываемое от нуля смещение байта устанавливаемого значения. Допустимые значения находятся в диапазоне от нуля до числа байтов дополнительной памяти класса, минус четыре; например, если бы Вы определили 12 или больше байтов дополнительной памяти класса, значение 8 будет индексом третьего 32-разрядноого целого числа. Чтобы установить любое другое значение из структуры WNDCLASSEX, установите одно из ниже перечисленных значений.
Значение |
Предназначение |
GCL_CBCLSEXTRA |
Устанавливает размер дополнительной памяти, связанной с классом, в байтах. |
GCL_CBWNDEXTRA |
Устанавливает размер дополнительной памяти окна, связанной с каждым окном в классе, в байтах. Установка этого значения не изменяет число дополнительных байт, назначенных ранее. За информацией о том, как получить доступ к этой памяти, обратитесь к функции GetWindowLong. |
GCL_HBRBACKGROUND |
Заменяет дескриптор кисти фона, связанной с классом. |
GCL_HCURSOR |
Заменяет дескриптор курсора, связанного с классом. |
GCL_HICON |
Заменяет дескриптор значка, связанного с классом. |
GCL_HICONSM |
Заменяет дескриптор маленького значка, связанного с классом. |
GCL_HMODULE |
Заменяет дескриптор модуля, который зарегистрировал класс. |
GCL_MENUNAME |
Заменяет адрес строки с именем меню. Строка идентифицирует ресурс меню, связанный с классом. |
GCL_STYLE |
Заменяет данные о битах стиля класса окна. |
GCL_WNDPROC |
Заменяет адрес оконной процедуры связанной с классом . |
dwNewLong
[in] Задает значение замены.
Возвращаемое значение
Если функция завершается успешно, возвращаемое значение - предыдущее значение определенного 32-разрядного целого числа. Если значение(величина) не было предварительно установлено, возвращаемое значение равняется нулю.
Если функция завершается ошибкой, возвращаемое значение равняется нулю. Чтобы получить дополнительную информацию об ошибке, вызовите GetLastError.
Замечания
Если Вы используете функцию SetClassLong и индекс GCL_WNDPROC, чтобы заменить оконную процедуру, оконная процедура должна соответствовать руководящим принципам, указанным в описании функции повторного вызова WindowProc.
Вызов SetClassLong индексом с GCL_WNDPROC создает подкласс класса окна, который воздействует на на все окна, созданные классом впоследствии. Приложение может системный класс поделить на подклассы, но оно не должно делить на подклассы класс окна, созданный другим процессом.
Резервируйте дополнительную память класса, определяя ненулевое значение в члене cbClsExtra структуры WNDCLASSEX, используемой с функцией RegisterClassEx.
Используйте функцию SetClassLong осторожно. Например, можно изменить цвет фона класса, используя SetClassLong, но это изменение немедленно не перекрашивает все окна, принадлежащие классу.
Функция GetClassLong извлекает заданное 32-разрядное (long) значение из структуры WNDCLASSEX, связанной с указанным окном.
Синтаксис
DWORD GetClassLong( HWND hWnd, int nIndex ); |
Параметры
hWnd
[in] Дескриптор окна и, косвенно, класс которому окно принадлежит.
nIndex
[in] Устанавливает извлекаемое 32-разрядное значение. Чтобы извлечь 32-разрядное значение из дополнительной памяти класса, задайте положительное, отсчитываемое от нуля смещение байта извлекаемого значения. Допустимые значения находятся в диапазоне от нуля до числа байтов дополнительной памяти класса, минус четыре; например, если бы Вы определили 12 или больше байтов дополнительной памяти класса, значение 8 будет индексом третьего 32-разрядноого целого числа. Чтобы извлечь любое другое значение из структуры WNDCLASSEX, установите одно из ниже перечисленных значений.
Значение |
Предназначение |
GCW_ATOM |
Извлекает данные о значении АТОМА, которое уникально идентифицирует класс окна. Это - один и тот же атом, что и при возвращении значения функцией RegisterClassEx. |
GCL_CBCLSEXTRA |
Извлекает размер дополнительной памяти, связанной с классом, в байтах. |
GCL_CBWNDEXTRA |
Извлекает размер дополнительной памяти окна, связанной с каждым окном в классе, в байтах. За информацией о том, как получить доступ к этой памяти, обратитесь к описанию функции GetWindowLong. |
GCL_HBRBACKGROUND |
Извлекает дескриптор кисти фона, связанной с классом. |
GCL_HCURSOR |
Извлекает дескриптор курсора, связанного с классом. |
GCL_HICON |
Извлекает дескриптор значка, связанного с классом. |
GCL_HICONSM |
Извлекает дескриптор маленького значка, связанного с классом. |
GCL_HMODULE |
Извлекает дескриптор модуля, который зарегистрировал класс. |
GCL_MENUNAME |
Извлекает адрес строки с именем меню. Строка идентифицирует ресурс меню, связанный с классом. |
GCL_STYLE |
Извлекает данные о битах стиля класса окна. |
GCL_WNDPROC |
Извлекает адрес оконной процедуры, или дескриптора, обозначающего адрес оконной процедуры. Вы должны использовать функцию CallWindowProc, чтобы вызвать оконную процедуру. |
Возвращаемое значение
Если функция завершается успешно, возвращаемое значение - затребованное 32-разрядная величина.
Если функция завершается ошибкой, возвращаемое значение равняется нулю. Чтобы получить дополнительную информацию об ошибке, вызовите GetLastError.
Замечания
Резервируйте дополнительную память класса, определяя ненулевое значение в члене cbClsExtra структуры WNDCLASSEX, используемой с функцией RegisterClassEx.
В процессе работы приложения узнать либо установить фон можно функциями:
COLORREF GetBkColor(
HDC hdc
);
Единственный параметр функции определяет окно, фон которого определяется. Возвращаемое значение есть 32-битное представление цвета фона.
COLORREF SetBkColor(
HDC hdc, // handle to DC
COLORREF crColor // background color value
);
Параметр hdc определяет контекст (логический объект системы Windows, который связан с физическим устройством и заменяет его в функциях вывода), а crColor новый цвет фона.
Во время работы приложение положение и размер окна можно изменить с помощью процедуры MoveWindow:
BOOL MoveWindow(
HWND hWnd,
int X,
int Y,
int nWidth,
int nHeight,
BOOL bRepaint
);
Она принимает дескриптор окна, новые координаты левого верхнего угла окна, новую ширину и высоту и состояние флага перерисовки.
Процедура SetWindowPos помимо вышеназванных действий может изменять Z – положение окна:
BOOL SetWindowPos(
HWND hWnd,
HWND hWndInsertAfter,
int X,
int Y,
int cx,
int cy,
UINT uFlags
);