Тип 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;