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

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

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

11.3.2. Принтер

Win32 API обеспечивает один и тот же тип контекста для принтера и гра- фопостроителя, используя функцию CreateDC, сообщая ей параметры (имя драйвера принтера, имя принтера, файла или устройства вывода). После окон- чания вывода контекст должен быть удален, используя функцию DeleteDC.

11.3.3. Объект в памяти

 

И

При работе с битовыми образами изображение необходимо сначалаРпод-

готовить в памяти, а только после этого его вывести на экран. Приложение соз-

 

Г

 

дает контекст устройства, вызывая функцию CreateCompatibleDC. Первоначаль-

ное изображение в контексте устройства имеет размер один на один пиксел.

 

 

 

 

Б

Для работы с изображением приложение должно установитьУбитовый массив,

вызывая функцию SelectObject.

 

 

а

11.3.4. Информационный контекст

 

 

к

 

Win32 API поддерживает информационный контекст устройства, исполь-

 

е

 

зуемый, чтобы восстановить или получить з д нные по умолчанию параметры

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

 

т

 

 

 

функцию CreateIC. Для получения информации об объектах, заданных по умол-

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

 

 

 

 

 

о

GetObject. После завершения раб ы с информационным контекстом необхо-

димо вызвать функцию DeleteDC для удаления созданного контекста.

 

 

 

 

и

 

 

 

л

 

11.4. Архитектура, управляемая событиями

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

 

 

б

 

 

Это означает, что Windows вызывает функцию внутри программы. Параметры

этой функ

ции

 

 

 

 

описывают параметры сообщения. Эта функция, находящаяся в

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

Б

 

 

 

 

Окно создается на основе класса окна, в котором определяется оконная процедура, обрабатывающая поступающие окну сообщения. Эта процедура мо- жет находиться либо в самой программе, либо в динамически подключаемой библиотеке. Windows посылает сообщение окну путем вызова оконной проце- дуры, на основе этого сообщения окно совершает какие-то действия и затем возвращает управление Windows. Использование класса окна позволяет созда- вать множество окон на основе одного и того же класса окна и, следовательно, использовать одну и ту же оконную процедуру. Например, все кнопки во всех программах для Windows созданы на основе одного и того же класса окна. Этот класс связан с оконной процедурой (расположенной в динамически подклю-

246

CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL,
NULL,

чаемой библиотеке Windows), которая управляет процессом передачи сообще- ний всем кнопкам всех окон.

В объектно-ориентированном программировании объект инкапсулирует код и данные. Окно − это объект. Код − это оконная процедура. Данные − это информация, хранимая оконной процедурой, и информация, хранимая системой Windows для каждого окна и каждого класса окна, которые имеются в системе.

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

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

 

 

 

 

 

 

 

 

 

 

 

 

 

Р

Другие сообщения отправляются непосредственно оконной процедуре, минуя

очередь сообщений. Ниже приведен текст программы:

И

 

#include <windows.h>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

У

 

 

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

 

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

 

 

 

 

 

 

 

 

 

 

Г

 

 

 

 

 

 

PSTR szCmdLine, int iCmdShow)

 

 

 

 

 

 

 

 

 

 

Б

 

 

 

 

{ static char szAppName[] = "HelloWin" ;

 

 

 

 

 

HWND

hwnd ;

 

 

 

 

 

 

 

 

 

 

 

MSG

msg ;

 

 

 

 

а

 

 

 

 

 

WNDCLASSEX wndclass ;

 

 

 

 

 

 

 

 

 

 

 

 

wndclass.cbSize

= sizeof (wndclass) ;

 

 

 

 

 

wndclass.style

 

= CS HREDRAW | CS_VREDRAW ;

 

 

 

 

 

е

 

 

 

 

 

 

 

wndclass.lpfnWndProc

= WndProc ;

 

 

 

 

 

wndclass.cbClsExtra

 

= 0к;

 

 

 

 

 

 

 

 

т

 

 

 

 

 

 

 

 

wndclass.cbWndExtra

= 0 ;

 

 

 

 

 

 

 

wndclass.hInstance

 

= hInstance ;

 

 

 

 

 

 

 

о

 

= LoadIcon (NULL, IDI_APPLICATION) ;

 

wndclass.hIcon

 

 

 

wndclass.hCursor

= LoadCursor (NULL, IDC_ARROW) ;

 

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

 

л

 

 

 

 

 

 

 

 

 

 

 

 

wndclass.lpszMenuName = NULL ;

 

 

 

 

 

б

 

 

 

 

 

 

 

 

 

 

 

 

 

wndclass.lpszClassNameи

= szAppName ;

 

 

 

 

 

wndclass.hIconSm

 

= LoadIcon (NULL, IDI_APPLICATION) ;

и

 

 

 

 

 

 

 

 

 

 

 

 

Б

RegisterClassEx (&wndclass) ;

 

 

 

 

 

 

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

 

 

 

" HelloWin ",

 

 

 

 

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

 

 

 

 

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

 

//начальное положение по x //начальное положение по y //начальный размер по x //начальный размер по y //описатель родительского окна //описатель меню окна

247

hInstance,

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

NULL);

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

ShowWindow (hwnd, iCmdShow) ;

 

UpdateWindow (hwnd) ;

 

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

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

}

return msg.wParam ;

}

 

 

 

 

 

 

 

 

LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg,

 

{ HDC

hdc ;

 

 

WPARAM wParam, LPARAM lParam)Р

 

 

 

 

 

 

И

PAINTSTRUCT ps ;

 

 

 

 

 

RECT

rect ;

 

 

 

 

 

 

 

 

 

 

 

У

switch (iMsg)

 

 

 

 

 

{ case WM_PAINT :

 

 

 

 

 

 

 

 

Г

 

hdc = BeginPaint (hwnd, &ps) ;

 

Б

 

GetClientRect (hwnd, &rect) ;

 

 

 

 

 

 

 

 

 

 

DrawText (hdc, "Hello, Windows !", -1, &rect,

 

 

 

 

 

 

 

а

 

 

 

DT_SINGLELINE | DT CENTER | DT_VCENTER) ;

 

EndPaint (hwnd, &ps) ;

 

к

 

 

return 0 ;

 

 

 

 

 

case WM_DESTROY :

е

 

 

 

PostQuitMessage (0) ;

 

 

 

return 0 ;

 

т

 

 

 

 

}

 

 

 

 

 

 

 

 

 

 

 

 

 

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

 

}

 

о

 

 

 

 

 

Программа создаетиокно,

в центре рабочей области которого выводится

текст «HelloWin». Используя манипулятор «мышь», можно перемещать окно по эк- рану и изменять его размеры. При изменении размеров окна программа будет ав-

томатическиперемещатьб строку текста «HelloWin» в новый центр рабочей области окна. Щелкнув на кнопке развертывания окна, можно увеличить окно до размеров всего экрана, а щелкнув на кнопке свертывания окна, убрать его с экрана. Можно

вызватьБвсе эти действия из системного меню. Также можно для завершения про- граммы закрыть тремя разными способами окно: выбрав соответствующую опцию из системного меню, щелкнув на кнопке закрытия окна справа в строке заголовка, или дважды щелкнув на иконке слева в строке заголовка.

11.5. Исходный текст программы

В файле hellowin.cpp имеются две функции: WinMain и WndProc. Обе они

248

являются функциями обратного вызова (CALLBACK). WinMain − это точка входа в программу (аналог функции main языка С(С++)). WndProc − это «окон- ная процедура» для окна HelloWin. Каждое окно имеет соответствующую окон- ную процедуру. Оконная процедура − это функция, отвечающая за ввод инфор- мации и вывод ее на экран. В hellowin.cpp отсутствуют инструкции для непо- средственного вызова WndProc: WndProc вызывается только из Windows. Одна-

ко в WinMain имеется ссылка на WndProc.

 

 

 

 

 

В hellowin.cpp вызываются следующие функции Windows:

 

LoadIcon − загружает значок для использования в программе.

 

LoadCursor − загружает курсор мыши для использования в программе.

 

GetStockObject − получает графический объект (в этом случае для закра-

шивания фона окна используется кисть).

 

 

 

Р

 

RegisterClassEx − регистрирует класс окна.

У

 

CreateWindow − создает окно на основе класса окна.

 

 

ShowWindow − выводит окно на экран.

Г

И

 

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

 

GetMessage − получает сообщение из очереди сообщений.

 

TranslateMessage − преобразует некоторые сообщения, полученные с по-

мощью клавиатуры.

 

а

 

 

 

 

 

DispatchMessage − отправляет сообщениеБоконной процедуре.

 

 

 

к

 

 

 

 

 

BeginPaint − инициирует нач ло процесса рисования окна.

 

 

 

яет

 

 

 

 

 

 

GetClientRect − получает размер р бочей области окна.

 

 

DrawText − выводит на э ран стро у текста.

 

 

 

 

EndPaint − прекраща т рисование окна.

 

 

 

 

 

PostQuitMessage − вс авл сообщение «завершить» в очередь сообщений.

 

DefWindowProc − выполняет обработку сообщений по умолчанию.

 

 

нти

 

 

 

 

 

 

 

11.6. Иде ф катры, написанные прописными буквами

 

В hellowin.cppомеется несколько идентификаторов, написанных пропис-

ными буквами. Эти

дентификаторы задаются в заголовочных файлах Windows

 

б

 

 

 

 

 

 

 

и содержат двух- или трехбуквенный префикс, за которым следует символ под-

и

 

 

 

 

 

 

 

черк ваниял:

 

 

 

 

 

 

Б

CS HREDRAW

DT_VCENTER

 

WM_CREATE

CS VREDRAW

IDC_ARROW

 

WM_DESTROY

 

 

 

CW USEDEFAULT

IDI_APPLICATION

 

WM_PAINT

 

 

DT_CENTER

SND_ASYNC

 

WS_OVERLAPPEDWINDOW

 

DT_SINGLELINE

SND_FILENAME

 

 

 

 

Это просто числовые константы. Префикс показывает основную катего- рию, к которой принадлежат константы, как показано в табл. 6.

249

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