Тип HGDI0BJ, который возвращает функция SelectObject(), описывает любой объект контекста. В пятой версии Visual С++ тип HGDI0BJ был совместим по присваиванию с дескриптором любого объекта GDI, но теперь при получении результата функции Sel ectObject () необходимо применять переопределение типа. Например, перо hPen заносится в контекст hdc при помощи простого присваивания HPEN hOldPen - (HPEN) Sel ectObject (hdc, hPen). Если необходимо уничтожить созданный объект, то следует воспользоваться вызовом функции Del eteObject ((HPEN)hPen).

Впрочем, те же операции можно записать компактнее:

HPEN hOldPen - SelectPen(hdc.hPen); DeletePen(hPen);

В этом случае используются макросы, определенные в заголовочном файле windowsx.h для каждого типа объектов контекста.

Необходимо рассмотреть проект, демонстрирующий применение кисти и пера, который располагается папке GDI0. Он несколько отличается от проекта Template. Так, в файл menu.rc включена растровая картинка, которая хранится в виде ресурса с именем IDB_BITMAP1. Также заменены модули создания окна InitWnd.cpp и обновления окна OnPaint.cpp.

При регистрации оконного класса в функции InitAppC) модуля InitWnd.cpp из ресурса загружается битовая карта. Полученный дескриптор HBITMAP hbm используется при создании кисти HBRUSH hbr, как показано в листинге 12.1.

Последовательность действий при изменении контекста Листинг 12.1

HBITMAP hbm; HBRUSH hbr;

int IпitApp(HINSTANCE KodPril) {

WNDCLASSEX WC;

hbm - LoadBitmapCKodPril,MAKEINTRES0URCE(IDB_BITMAP1)); //Картинка из ресурса hbr - CreatePatternBrushC hbm ); //Создание кисти LPCTSTR Name - (LPCTSTR)"GDI00";

wc.hbrBackground- hbr; //Занесли дескриптор полученной кисти в поле

//структуры wc wc.cbSize - sizeof(WNDCLASSEX); wc.hlnstance - GetModuleHandle(NULL); wc.hCursor- LoadCursorC NULL. IDC_ARR0W );

wc.hlcon - LoadIcon(KodPril."IDMCONl"); //Пиктограммы загружаются

wc.hlconSm - LoadlconCKodPril, "IDIJCONO"); //из ресурса

wc.lpszMenuName - MAKEINTRES0URCE(IDR_MENU1);
wc.lpszClassName - Name;

⇐ Предыдущая| |Следующая ⇒