Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование в Windows API. Учебное пособие

.pdf
Скачиваний:
1
Добавлен:
12.08.2026
Размер:
752 Кб
Скачать

Теперь зададим общий порядок действий для создания простого приложения под ОС Windows.

Точкой входа приложения Windows является функция WinMain (аналог main в консольном приложении), в которой требуется:

1. Описать класс окна. В классе окна задаются общие свойства окна. Приложение может содержать несколько окон одного класса. Например

WNDCLASSEX win1;

Основные поля класса окна:

//перерисовка окна при изменении

//его ширины или высоты

win1.style = CS_HREDRAW | CS_VREDRAW;

win1.lpfnWndProc = &fun1;

//оконная функция

win1.hIcon

// адрес пиктограммы изображения

win1.hCursor

 

// адрес курсора мыши

win1.hbrBackground

// адрес кисти для фона

win1.lpszMenuName

// адрес падающего меню

2. Зарегистрировать класс окна

Функция RegisterClassEx непосредственно выполняет задание окна и возвращает уникальный идентификатор зарегистрированного класса.

3. Создать и отобразить окно

Предварительно надо определить размер экрана в пикселях с помощью функции GetSystemMetrics:

11

int GetSystemMetrics(

int nIndex // затребованное значение

);

// SM_CXSCREEN - ширина экрана

 

// SM_CYSCREEN - высота экрана

Затем для создания окна вызывается функция CreateWindow. Дескриптор окна, возвращенный функцией CreateWindow, передается как параметр в функцию ShowWindow, которая организует вывод созданного окна на экран.

4.Организовать цикл обработки сообщений ОС Windows

Входе выполнения этого цикла текущие сообщения пересылаются оконной функции приложения, в которой они обрабатываются. Цикл заканчивается при получении сообщения WM_QUIT (выход из приложения).

while ( GetMessage(&msg, NULL, 0, 0) !=0 ) DispatchMessage(&msg);

Ниже приведён пример простого приложения под Windows. Программа реагирует на нажатие правой клавиши мыши и клавиатуры информационным окном сообщения.

12

/*************************************************/

/* Пример простого приложения для Windows */ /*************************************************/

//заголовочные файлы, содержащие определения типов

//данных,макросов и прототипов функций Windows API #include <windows.h>

#include <tchar.h>

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

LPCTSTR g_szWindowClassName = _T("WindowClass"); /************************************************/

/*

WindowProc

*/

/*

==========

*/

/*

оконная функция

*/

/*

hWnd - дескриптор окна

*/

/*

nMsg - код сообщения

*/

/*

wParam, lParam - дополнительные параметры,

*/

/* назначение и содержимое которых зависит от

*/

/*

конкретного сообщения

*/

/************************************************/ LRESULT CALLBACK WindowProc (HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)

{

switch (nMsg)

{

// Обработка правой клавиши мыши case WM_RBUTTONDOWN:

MessageBox (NULL,

_T("Нажата правая клавиша мыши"),

_T("Сообщение") , MB_OK);

break;

// Обработка нажатия на клавиатуру case WM_KEYDOWN:

MessageBox (NULL, _T("Клавиатура!"), _T("Сообщение"), MB_OK);

break;

// передаётся перед разрушением окна case WM_DESTROY:

//передача сообщения WM_QUIT в системную

//очередь сообщений для выхода из

//цикла обработки сообщений

PostQuitMessage (0); return 0;

13

//сообщения, не требующие обработки,

//передаются стандартной оконной функции

default:

return DefWindowProc (hWnd, nMsg, wParam,

lParam);

}

return 0;

} //WindowProc /*************************************************/

/*

 

 

_tWinMain

*/

/*

 

 

=========

*/

/*

Функция - точка входа Windows-приложения

*/

/*

(аналог функции

main() для приложений DOS)

*/

/*

hApp – адрес данного экземпляра приложения

*/

/*

hPrevApp

- NULL для Win32

*/

/*

szCmdLine

- адрес командной строки

*/

/*

nCmdShow

- код

рекомендуемого режима

*/

/*

 

отображения главного окна

*/

/*************************************************/ int WINAPI _tWinMain (HINSTANCE hApp, HINSTANCE

hPrevApp, LPTSTR szCmdLine, int nCmdShow)

{

//структура данных тек. сообщения

MSG msg;

//инициализация структуры описания класса окон

WNDCLASSEX wc;

ZeroMemory (& wc, sizeof (WNDCLASSEX));

//размер структуры

wc.cbSize = sizeof (WNDCLASSEX);

//дескриптор экземпляра приложения wc.hInstance = hApp;

//стили класса окна

wc.style = CS_VREDRAW | CS_HREDRAW;

//адрес оконной функции wc.lpfnWndProc = & WindowProc;

//стандартный курсор - стрелка wc.hCursor = LoadCursor (NULL, IDC_ARROW);

//кисть, используемая для закраски фона окна wc.hbrBackground = static_cast <HBRUSH>

(GetStockObject (GRAY_BRUSH)); // имя класса окна

wc.lpszClassName = g_szWindowClassName;

14

// регистрация класса окна

if (RegisterClassEx (& wc) == NULL) return 0;

//определение размеров экрана в пикселях int scrw2 = GetSystemMetrics(SM_CXSCREEN)/ 2,

scrh2 = GetSystemMetrics(SM_CYSCREEN)/ 2;

//создание окна

HWND hWnd = CreateWindow(

 

g_szWindowClassName,

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

_T("Простое приложение"),

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

WS_OVERLAPPEDWINDOW ,

// стиль окна

scrw2 - 400, scrh2 - 300,

// лев.верхний угол

800, 600,

// ширина и высота

NULL, NULL, hApp, NULL);

 

if (hWnd == NULL) return 0;

 

//отображение окна

ShowWindow (hWnd, SW_SHOW);

//обновление содержимого окна

UpdateWindow (hWnd);

//цикл ожидания и обработки сообщений while (GetMessage (& msg, NULL, 0, 0) != 0)

//пересылка сообщения оконной функции

DispatchMessage (& msg);

//отмена регистрации класса окна

UnregisterClass (g_szWindowClassName, hApp);

//возвращение кода завершения

return msg.wParam;

}//WinMain

15

3. Функции и структуры API, необходимые для построения Windows-приложения

3.1 Функция WinMain

Точкой входа любого приложения Windows, использующего набор символов ANSI и стандартную библиотеку CRT (C run-time), является функция WinMain, которая должна быть определена с макросом соглашения вызова WINAPI или APIENTRY (что соответствует

__stdcall):

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow);

hInstance

Дескриптор текущего экземпляра приложения hPrevInstance

Дескриптор предыдущего экземпляра приложения (NULL для приложений Win32)

lpCmdLine

Адрес командной строки, исключая имя исполняемого модуля приложения

nCmdShow

Код режима отображения главного окна

Данная функция вызывается из блока инициализации CRT после запуска приложения.

16

3.2 Оконная функция

Оконная функция имеет следующий формат:

LRESULT CALLBACK имя_функции (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

hwnd

Дескриптор окна.

uMsg

Код сообщения. wParam

Дополнительное значение, зависит от типа сообщения uMsg.

lParam

Дополнительное значение, зависит от типа сообщения uMsg.

Оконная функция обычного пользовательского окна может возвращать произвольное значение, она вызывается некоторыми функциями API (например, DispatchMessage, UpdateWindow), а также может быть вызвана самим приложением. Должна быть определена с соглашением вызова CALLBACK (соответствует __stdcall). С помощью механизма сообщений ОС передаёт окну большое количество информации, причём функция окна вызывается каждый раз для очередного сообщения. Оконная функция также может вызываться неявно рекурсивно, что требует особенной аккуратности при программировании.

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

Активные сообщения позволяют гибко настраивать поведение и внешний вид окна (например, WM_MOVING,

WM_SIZING и WM_GETMINMAXINFO предназначены для мониторинга и настройки размеров и положения окна параллельно с действиями пользователя; WM_CREATE

17

позволяет удалить уже созданное функцией CreateWindow окно до его отображения; обработка сообщения WM_CLOSE позволяет запретить закрытие окна, когда пользователь нажал кнопку закрытия в заголовке окна). Пассивные сообщения предназначены только для оповещения окна о происшедшем событии (например, WM_MOUSEMOVE оповещает о перемещении мыши, WM_DESTROY передаётся перед разрушением окна).

Сообщения, для которых обработка не предусмотрена, должны быть переданы специальным

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

Обработку сообщений внутри оконной функции можно выполнять различными способами. Наиболее простым и эффективным является использование оператора switch по коду сообщения. В простых приложениях можно использовать такую конструкцию: switch (message) {

case WM_CREATE:

{

//КОД ОБРАБОТКИ WM_CREATE

}break;

case WM_PAINT:

{

//КОД ОБРАБОТКИ WM_PAINT

}break;

case WM_DESTROY:

{

//КОД ОБРАБОТКИ WM_DESTROY

}break;

default:

return DefWindowProc(hwnd, message, wParam, lParam); }

18

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

switch (message)

{

case WM_CREATE:

return MainOnCreate(hwnd, wParam, lParam); case WM_PAINT:

return MainOnPaint(hwnd, wParam, lParam); case WM_DESTROY:

return MainOnDestroy(hwnd, wParam, lParam); default:

return DefWindowProc(hwnd, message, wParam, lParam);

}

3.3 Функция RegisterClassEx

Функция RegisterClassEx выполняет регистрацию класса, определяемого структурой WNDCLASSEX:

ATOM RegisterClassEx (CONST WNDCLASSEX *lpwcx);

lpwcx

Адрес структуры WNDCLASSEX, содержащей параметры класса.

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

при успешном завершении: уникальный идентификатор зарегистрированного класса;

при ошибке: ноль.

19

Поля структуры WNDCLASSEX:

cbSize

Размер структуры в байтах.

style

Набор стилей класса, определяющий некоторые общие свойства окон (таблица 3.1).

lpfnWndProc

Адрес оконной функции, связанной с окнами данного класса.

cbClsExtra

Количество дополнительных байтов (обнуленных), выделяемых со структурой определения класса.

cbWndExtra

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

hInstance

Адрес экземпляра приложения, которое содержит оконную функцию данного класса.

hIcon

Дескриптор пиктограммы. hCursor

Дескриптор курсора. hbrBackground

Дескриптор кисти для закраски фона окна или одна из констант набора системных цветов (таблица 3.2), ее увеличивают на 1 и приводят к типу HBRUSH.

lpszMenuName

Адрес строки имени ресурса меню. lpszClassName

Адрес строки названия класса. hIconSm

Дескриптор малой пиктограммы, связанной с классом окна.

20

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