Эта функция возвращает дескриптор объекта, связанного с контекстом hdc. Если в качестве параметра uObjectType передать одну из констант - 0BJ__PEN, 0BJJ3RUSH, 0BJ_PAL, 0BJ_F0NT или OBJ_BITMAP, то функция возвратит соответствующий дескриптор. При задании константы OBJBITMAP дескриптор битовой карты возвращается только в том случае, если hdc является контекстом памяти, который будет рассмотрен позже. После того как получен дескриптор объекта, можно при помощи функции GetObjectC ) получить значения задаваемых атрибутов изображения.

Операционная система или средства GDI могут блокировать уничтожение тех объектов, которые записаны в контекст устройства и участвуют в процессе формирования изображения. И действительно, в системах Windows 9х невозможно уничтожить перо, кисть или другой объект, пока он занесен в контекст устройства. Обращение к функции Sel ectObject ( ) перед освобождением контекста производится не ради возврата в него стандартного объекта, а для того, чтобы сработал последующий вызов функции Del eteObject ( ). Стоит рассмотреть фрагмент кода, приведенный в листинге 15.1, в котором создается перо и выводится на экран линия.

Листинг 15.1

HPEN hPen - CreatePen(PS_S0LID.8.RGB(200. 0.0)):
HDC hdc - GetDC(hWnd);
HPEN OldPen - SelectObject(hdc. hPen);
int Res * DeleteObject(hPen);

продолжение хР*

Запрос параметров контекста

Листинг 15.1 {продолжение)

LineTo(lOO.lOO); //Перо не уничтожено, a b выводится красная линия

//толщиной 8 пикселов.

ReleaseDC(hWnd.hdc);

Следует обратить особое внимание на вызов функции Del eteObject (hPen). Этот оператор не уничтожит созданное перо, но, согласно справочной системе, функция должна сообщить об этом, возвратив нулевое значение. Во время тестирования функция возвращала единицу как при успешном выполнении, так и при отказе в удалении пера. Таким образом, значение переменной Res не позволяет проверить успешность удаления объекта контекста.

Если освободить контекст, не удаляя из него пера, то блокировка удаления связанных с контекстом объектов снимается. В этом случае вызов Del eteOb ject (hdc. hPen) уничтожит перо. Понятно также, что для уничтожения объекта, занесенного одновременно в несколько открытых контекстов, его нужно предварительно удалить из всех контекстов.


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