Исследование способов создания приложения с использованием программного интерфейса Windows, страница 2

LPSTR     lpszCmdParam,

int       nCmdShow )

{  WNDCLASS  WndClass;

HWND hWindow;

MSG  Msg;

WndClass.lpszClassName = szAppName;

WndClass.style         = NULL;

WndClass.lpfnWndProc   = DefWindowProc;

WndClass.cbClsExtra    = 0;

WndClass.cbWndExtra    = 0;

WndClass.hInstance     = hInst;

WndClass.hIcon         = LoadIcon ( NULL, IDI_APPLICATION );

WndClass.hCursor       = LoadCursor ( NULL, IDC_ARROW );

WndClass.hbrBackground = ( HBRUSH ) GetStockObject( WHITE_BRUSH );

WndClass.lpszMenuName  = NULL;

if ( !hPrevInstance )

if ( !RegisterClass ( &WndClass ) )

return FALSE;

hWindow = CreateWindow ( szAppName,

"Hello world!",

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, CW_USEDEFAULT,

CW_USEDEFAULT, CW_USEDEFAULT,

NULL, NULL, hInst, NULL    );

if ( hWindow == NULL )

return FALSE;

ShowWindow ( hWindow, nCmdShow );

UpdateWindow ( hWindow );

while ( GetMessage( &Msg, NULL, 0, 0 ) )

{

TranslateMessage ( &Msg );

DispatchMessage  ( &Msg );

}

return Msg.wParam;

}

Структура функции WinMain:

1. Регистрация класса окна

- заполнение структуры WNDCLASS;

- вызов функции RegisterClass.

2. Создание окна

- вызов функции CreateWindow  для  создания окна ( объекта ) на основе класса окна.

3. Отображение окна

- ShowWindow  для визуального отображения окна;

- UpdateWindow  для обновления клиентной облясти окна.

4. Запуск цикла обработки сообщений

- GetMessage  предназначена для  выборки сообщения  из очереди приложения;

- TranslateMessage предназначена для обработки  сообщений клавиатуры;

- DispatchMessage  предназначена для распределения  выбранного сообщения нужной оконной процедуре.

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

Windows представляет собой трехшаговый процесс:

- определение класса окна;

- создание окна ( объекта на основе класса );

- окно делается видимым.

Класс окна определяется заполнением структуры WNDCLASS.

Структура определена в файле windows.h  следующим образом:

typedef struct tagWNDCLASS

{

UINT    style;

WNDPROC lpfnWndProc;

int     cbClsExtra;

int     cbWndExtra;

HANDLE  hInstance;

HICON   hIcon;

HCURSOR hCursor;

HBRUSH  hbrBackground;

LPCTSTR lpszMenuName;

LPCTSTR lpszClassName;

} WNDCLASS;

Назначение полей структуры:

style         - стиль класса окна.

lpfnWndProc   - адрес функции окна.

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

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

hInstance     - идентификатор приложения, создающего класс окна.

hIcon         - идентификатор класса пиктограммы.

hCursor       - идентификатор класса курсора.

hbrBackground - идентификатор класса кисти цвета фона.

lpszMenuName  - указатель на строку, содержащую имя класса меню. 

lpszClassName - указатель на строку, содержащую имя класса окна.

Переменная Msg предназначена для временного хранения сообщений и представляет собой структуру типа MSG, описанную в файле  windows.h  следующим образом:

typedef struct tagMSG

{

HWND   hwnd;

UINT   message;

WPARAM wParam;

LPARAM lParam;

DWORD  time;

POINT  pt;

} MSG;

Назначение элементов структуры MSG:

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

message - определяет номер ( тип ) сообщения;

wParam  - определяют дополнительную информацию, связанную

lParam    с сообщением.  Конкретное  значение  зависит от номера сообщения;  

time    - определяет время постановки сообщения в очередь;

pt      - определяет положение курсора в экранных координатах в момент посылки сообщения.

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