Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lutsik_Yu_A_Obektno_orientir_programmir_na_yaz.pdf
Скачиваний:
63
Добавлен:
11.05.2015
Размер:
4.33 Mб
Скачать

wndclass.lpszClassName = szAppName;

После того как инициализированы все поля, регистрируется класс окна − вызов функции RegisterClassEx. Единственный параметр функции − указатель на структуру WNDCLASSEX:

RegisterClassEx (&wndclass);

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

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

функции в качестве параметров:

 

 

 

 

Р

hwnd = CreateWindow (szAppName, //имя класса окна

" HelloWin ",

 

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

WS_OVERLAPPEDWINDOW, //стиль окна

У

CW_USEDEFAULT,

 

//начальное положение по x

 

 

 

 

 

Г

 

CW_USEDEFAULT,

 

//начальное положение Ипо y

CW_USEDEFAULT,

 

//начальный размер по x

 

CW_USEDEFAULT,

 

//начальный размер по y

 

NULL,

 

//описатель родительского окна

NULL,

 

 

са

 

 

 

//опи тель меню окна

 

hInstance,

 

//описательБэкземпляра программы

NULL);

к

 

 

 

//п р метры создания

 

е

 

 

 

Параметр szAppName сод ржит строку «HelloWin», являющуюся именем

только что зарегистрированного

ласса окна.

Таким образом, этот параметр

связывает окно с классом окна.

 

 

 

 

 

Созданное окно являе ся обычным перекрывающимся окном с заголов-

ком, системным меню слева на строке заголовка, иконками для сворачивания,

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

 

и

 

стандартный ст ль WSтOVERLAPPEDWINDOW и помечен комментарием

«стиль окна». Комментариемо

«заголовок окна» отмечен текст, который появит-

ся в строке заго овка.

 

 

б

 

 

Параметры с комментариями «начальное положение по и «начальное

и

 

положениелпо задают начальные координаты верхнего левого угла окна от-

нос тельно левого верхнего угла экрана. Идентификатор CW_USEDEFAULT,

Б

 

 

сообщает Windows, что для перекрывающегося окна будет использовано зада- ваемое по умолчанию начальное положение. (CW_USEDEFAULT равно 0x80000000.) По умолчанию Windows располагает следующие друг за другом перекрывающиеся окна, равномерно отступая по горизонтали и вертикали от верхнего левого угла экрана. Примерно так же задают ширину и высоту окна параметры с комментариями «начальный размер по и «начальный размер по y». Следующие 2 идентификатора CW_USEDEFAULT означают, что Windows должна использовать задаваемый по умолчанию размер окна.

Параметр с комментарием «описатель родительского окна» устанавлива- ется в NULL, поскольку у создаваемого в примере окна отсутствует родитель-

255

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

Вызов CreateWindow возвращает описатель созданного окна. Этот опи- сатель хранится в переменной hwnd, которая имеет тип HWND. У каждого окна в Windows имеется описатель. Многие функции Windows в качестве па- раметра требуют hwnd, благодаря этому Windows знает, к какому окну при-

менить функцию.

 

 

 

Чтобы созданное функцией CreateWindow окно отобразить на экранеРмо-

нитора, необходимы еще два вызова функций. Первый из них

У

 

И

ShowWindow (hwnd, iCmdShow);

Г

Первый параметр − описатель созданного функцией CreateWindow окна. Второй − значение iCmdShow, передаваемое в качестве параметра функции WinMain. Он задает начальный вид окна на экране. Если iCmdShow имеет зна-

 

 

 

 

 

 

а

чение SW_SHOWNORMAL, на экран выводится обычное окно, фон рабочей

области закрашивается кистью, заданной в кл ссе окнаБ. Если iCmdShow имеет

 

 

 

 

 

к

значение SW_SHOWMINNOACTIVE, то о но не выводится, а на панели задач

появляются его имя и иконка.

 

 

 

 

Далее вызов второй функции

 

 

UpdateWindow (hwnd);

 

 

 

 

вызывает перерисовку рабочей облас еи. Для этого в оконную процедуру посы-

лается сообщение WM_PAINT.

тбщений

 

 

 

 

тки

 

 

11.12. Цикл обрабо

с

 

 

Окно выведено на экрано. Далее необходимо подготовить программу для

получения информац

от пользователя через клавиатуру и мышь. При вводе

 

б

 

 

 

 

 

информации Windows преобразует ее в «сообщение», которое помещается в

и

 

 

 

 

 

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

сообщен й, выполняя

лок команд, называемый «цикл обработки сообщений»:

Б

 

 

 

 

 

 

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

 

{ TranslateMessage (&msg); DispatchMessage (&msg);

}

return msg .wParam;

Переменная msg − это структура типа MSG, определяемая в заголовочных файлах Windows :

typedef struct tagMSG

{ HWND

hwnd;

UINT

message;

256

 

WPARAM wParam;

LPARAM lParam; DWORD time; POINT pt;

} MSG;

Тип данных POINT − это тип данных другой структуры: typedef struct tagPOINT

{ LONG x; LONG y; } POINT;

Вызов функции GetMessage, с которого начинается цикл обработки сооб-

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

 

 

 

 

Р

Windows указатель на структуру msg типа MSG. Второй, третий и четвертый

параметры, NULL или 0, показывают, что программа получает все сообщения

 

 

 

И

от всех окон, созданных этой программой. Windows заполняет поля структуры

 

 

У

 

 

Г

 

 

сообщений информацией об очередном сообщении из очереди сообщений. По-

ля этой структуры следующие:

Б

 

 

 

 

 

 

 

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

 

к

 

нием функции CreateWindow, пос ольку у нашей программы имеется только

одно окно;

е

. Это число, которое идентифици-

- message − идентификатор сообщенияа

рует сообщение. Для каждого сообщ ния имеется соответствующий ему иден- тификатор, который задается в заголовочных файлах Windows и начинается с префикса WM;

- wParam 32-разрядный параметр сообщения, смысл и значение кото-

рого зависят от с бе с ей сообщения;

-

 

т

lParam − друг й 32-разрядный параметр, зависящий от сообщения;

-

time времянно, к гда сообщение было помещено в очередь сообщений;

-

pt − коорд аты курсора мыши в момент помещения сообщения в оче-

 

ин

 

редь соо щений.

 

Еслиполеmessage сообщения, извлеченного из очереди сообщений, рав-

но лю ому значению, кроме WM_QUIT, то функция GetMessage возвращает

 

б

ненулевое значение. Сообщение WM_QUIT заставляет программу прервать

циклиобработки сообщений. На этом программа заканчивается, возвращая чис-

ло wParam структуры msg.

Б

Инструкция

 

TranslateMessage (&msg);

передает структуру msg обратно в Windows для преобразования какого-либо сооб- щения с клавиатуры. Инструкция:

DispatchMessage (&msg);

также передает структуру msg обратно в Windows. Windows отправляет сооб- 257

щение для его обработки соответствующей оконной процедуре таким обра- зом, Windows вызывает оконную процедуру. После того, как WndProc обрабо- тает сообщение, оно возвращается в Windows, которая все еще обслуживает вы- зов функции DispatchMessage. Когда Windows возвращает управление в про- грамму HELLOWIN к следующему за вызовом DispatchMessage коду, цикл об- работки сообщений в очередной раз возобновляет работу, вызывая GetMessage.

11.13. Оконная процедура

В программе для Windows может содержаться более одной оконной про-

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

структуры MSG. Первый параметр hwnd − описатель получающегоИсообщение окна. Второй параметр − число (точнее 32-разрядное беззнаковое целое или

LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM

Р

wParam, LPARAM lParam)

У

 

Четыре параметра оконной процедуры идентичны первым четырем полям

Г

 

UINT), которое идентифицирует сообщение. Два последних параметра (wParam типа WPARAM и lParam LPARAM) представляют дополнительную информа-

цию о сообщении. Они называются «параметр

сообщения». Конкретное

значение этих параметров определяется типом сообщенияБ.

 

 

к

 

11.14. Обработка сообщений

 

ами

 

Каждому получаемому окном сообщ нию соответстует номер, содержа-

т

 

 

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

ции switch и case для определения

еого, какое сообщение получила оконная

процедура и то, как его обрабаоыва ь. При обработке оконной процедурой со-

общения, она должна возврати ь 0. Все сообщения, не обрабатываемые окон- ной процедурой, должнынипередава ься функции Windows, которая называется

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

СообщениебWM PAINT. Это сообщение крайне важно для программи- рования подниWindows. Оно сообщает программе, что часть или вся рабочая об- ласть окна едействительна и ее следует перерисовать.

ПриБпервом создании окна недействительна вся рабочая зона, поскольку программа еще чего в окне не нарисовала. Сообщение WM_PAINT (которое обычно посылается, когда программа вызывает UpdateWindow в WinMain) за- ставляет оконную процедуру что-то нарисовать в рабочей области. После этого оконная процедура должна быть готова в любое время обработать дополни- тельные сообщения WM_PAINT и перерисовать недействительную область ок- на. Оконная процедура получает сообщение WM_PAINT при возникновении одной из следующих ситуаций:

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

258

-при изменении размера окна (если в стиле класса окна установлены би-

ты CS_HREDRAW и CS_HVREDRAW);

-при использовании функций прокрутки ScrollWindow или ScrollDC;

-при использовании функций InvalidateRect или InvalidateRgn.

Обработка сообщения WM_PAINT почти всегда начинается с вызова

функции BeginPaint:

hdc = BeginPaint (hwnd, &ps);

и заканчивается вызовом функции EndPaint: EndPaint (hwnd, &ps);

В обеих функциях первый параметр − это описатель окна программы, а второй − это указатель на структуру типа PAINTSTRUCT, в которой содержится ин-

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

Р

typedef struct tagPAINTSTRUCT

 

 

 

{

HDC

hdc;

 

 

И

 

BOOL

fErase;

 

 

 

RECT

rcPaint;

 

У

 

 

BOOL

fRestore;

 

 

 

Г

 

 

 

BOOL

fIncUpdate;

 

 

 

BYTE

 

 

 

 

rgbReserved[32];

 

 

 

} PAINTSTRUCT;

 

Б

когда программа вызывает

Windows заполняет

поля этой структуры,

BeginPaint. Можно использовать толь о первых три поля структуры. Остальные

используются Windows.

а

к

 

Поле hdc − это описа ль конт кста устройства. Часто в поле fErase уста-

новлен флаг TRUE, означающийе, что Windows обновит фон недействительного

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

hbrBackground струк уры WNDCLASSEX. Многие программы для Windows ис-

пользуют белую к сть:

 

 

 

 

т

 

wndclass.hbrBackgroundо

= (HBRUSH) GetStockObject (WHITE_BRUSH);

 

 

и

 

 

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

 

б

 

 

 

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

и

 

 

 

буется лилстирать фон. Если этот параметр равен FALSE, Windows не будет

ст рать фон и поле fErase также будет равно FALSE.

Б

Поле rcPaint − это структура типа RECT. В ней имеются четыре поля: left,

 

top, right и bottom. Поле rcPaint определяет границы недействительного прямо- угольника. Значения заданы в пикселах относительно левого верхнего угла ра- бочей области.

Чтобы при обработке сообщения WM_PAINT рисовать вне прямоуголь- ника rcPaint, можно сделать вызов:

InvalidateRect (hWnd, NULL, TRUE);

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

259

При обработке вызова BeginPaint, Windows обновляет фон рабочей облас- ти, делает всю рабочую область действительной (не требующей перерисовки) и возвращает описатель контекста устройства. Описатель контекста устройства необходим для вывода в рабочую область окна текста и графики. Используя описатель контекста устройства, возвращаемого функцией BeginPaint, нельзя рисовать вне рабочей области. Функция EndPaint освобождает описатель кон- текста устройства, после чего его значение нельзя использовать. Процесс обра-

ботки сообщения WM_PAINT выглядит следующим образом:

 

 

case WM_PAINT:

 

 

 

 

 

 

Р

hdc=BeginPaint(hwnd, &ps);

 

 

 

 

 

[использование функций GDI]

 

 

 

 

 

EndPaint(hwnd, &ps);

 

 

 

 

 

return 0;

 

 

 

 

 

 

Если оконная процедура не обрабатывает сообщения WM_PAINT, они должны

передаваться в DefWindowProc. Функция DefWindowProc по очередиИвызывает

BeginPaint и EndPaint и, таким образом, рабочая область устанавливается в дей-

ствительное состояние. Но нельзя делать следующее:

 

У

 

Г

 

case WM_PAINT:

 

 

 

 

 

return 0;

// ОШИБКА!!!

 

 

 

 

В этом случае Windows не сделает область действительнойБ.

 

 

После того, как WndProc вызвала BeginPaint,

вызывает GetClientRect:

GetClientRect (hwnd, &rect);

 

 

она

 

 

 

GetClientRect помещает в эти четыре поля стру туры rect размер рабочей облас-

 

 

 

к

 

 

 

ти окна. Поля left и top всегда ус анавливаются в 0. В полях right и bottom уста-

навливается ширина и высота рабочей области в пикселах.

 

 

 

 

е

 

 

 

DrawText (hdc, "Hello, Windows ", -1, &rect, DT_SINGLELINE | DT_CENTER |

DT_VCENTER);

 

 

 

 

 

 

DrawText рисует текст. Трет й параметрт

установлен в -1, чтобы показать, что

строка текста заканч ваетсяонулевым символом. Последний параметр − это на-

WM_PAINT. Новый размер окна WndProc получает, при вызове функции GetClientRect, и снова рисует текст в центре окна.

бор флагов, значения которых заданы в заголовочных файлах Windows, и пока-

 

 

и

зывающих, что текст с едует выводить в одну строку, по центру относительно

горизонтали

вертика и внутри прямоугольной области, размер которой за-

 

 

ли

дан четвертым параметром.

Когда рабочая область становится недействительной (как это происходит

при измене

 

размеров окна), WndProc получает новое сообщение

нии

 

Б

 

 

Сообщение WM_DESTROY. Это сообщение показывает, что Windows

находится в процессе ликвидации окна в ответ на полученную от пользователя команду. Пользователь вызывает поступление этого сообщения, если щелкнет на кнопке Close, или выберет Close из системного меню программы, или на- жмет <Alt+F4>. Программа стандартно реагирует на это сообщение, вызывая:

PostQuitMessage(0);

260

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