Функция DeleteObject() уничтожает объект, но не заносит NULL в его дескриптор. Для проверки корректности удаления объекта можно использовать функцию int GetOb j ectTy ре (HDC hdc HGDIOBJ hgdi ob j), которая получает дескриптор объекта и возвращает его тип. Полученное нулевое значение будет свидетельствовать о том, что дескриптор не связан ни с каким объектом. Файл WinGDI.h содержит объявления 13 типов объектов, как показано в листинге 15.2.
Листинг 15.2
#define 0BJ_PEN 1 #define 0BJ_BRUSH 2 #define 0BJ_DC 3
#define 0BJ_MEMDC 10 #define OBJJNHMETAFILE 13
Зная целочисленные коды типов графических объектов, можно проверить, например, как будет действовать уничтожение битовой карты с дескриптором HBITMAP hBit, которое показано в листинге 15.3.
Листинг 15.3
HBITMAP hOldBit; i f(hBit)
{SelectObject(hdcMem.OldBit);
DeleteObject(hBit):
i f (Get Ob j ect Ту ре (hBit)- 0BJ_B ITMAP)
MessageBox(UkOkn,"Объект не уничтожен", "". NULL);
}
Сообщение об ошибке будет выведено на экран, если в переменной hOldBit не находится дескриптор HBITMAP. Если там записано значение NULL, то SelectObject() не произведет замену объектов, a Del eteObject (hBi t) не выполнит уничтожение. Проверьте самостоятельно, можно ли функцией Get Ob ject Ту ре () установить по ненулевому дескриптору HDC, освобожден или уничтожен соответствующий контекст.
В семействе Windows NT/XP блокировка объектов не предусмотрена, объект удаляется вне зависимости от того, используется он контекстом устройства или нет. Также исполняется и не приводит к возврату кода ошибки уничтожение контекста устройства, в который занесены объекты, отличные от заданных по умолчанию.
/ Контекст памяти ^ч%, и двойная буферизация Копирование участков экрана Если приложение создает два окна, то прямоугольный участок одного окна можно скопировать во второе окно при помощи функций BitBltO, StretchBltO и PlgBltO. Перед выполнением функции необходимо запросить контексты для окна, из которого будет копироваться фрагмент, и окна, которое получит копируемый участок.