Извлечение атрибутов графического объекта и выбор новых графических объектов


Прикладная программа может извлечь атрибуты пера, кисти, палитры, шрифта или точечного рисунка при помощи вызова функции GetCurrentObject и GetObject. Функция GetCurrentObject возвращает дескриптор, идентифицирующий объект, в настоящий момент выбранный в контекст устройства (DC); функция GetObject возвращает структуру, которая описывает атрибуты объекта.

Пример ниже показывает, как приложение может извлечь  текущие атрибуты кисти и использовать извлеченные данные, чтобы выявить, необходимо ли выбирать новую кисть.

    HDC hdc;                     // дескриптор DC дисплея
    HBRUSH hbrushNew, hbrushOld; // дескрипторы кисти
    HBRUSH hbrush;               // дескриптор кисти
    LOGBRUSH lb;                 // структура логической кисти
 
    // Извлекаем дескриптор, идентифицирующий текущую кисть. 
 
    hbrush = GetCurrentObject(hdc, OBJ_BRUSH); 
 
    // Извлекаем структуру LOGBRUSH, которая содержит
    // текущие атрибуты кисти. 
 
    GetObject(hbrush, sizeof(LOGBRUSH), &lb); 
 
    // Если текущая кисть - не сплошная черная кисть, 
    // заменим её сплошной черной стандартной кистью. 
 
    if ((lb.lbStyle != BS_SOLID) 
           || (lb.lbColor != 0x000000)) 
    { 
        hbrushNew = GetStockObject(BLACK_BRUSH); 
        hbrushOld = SelectObject(hdc, hbrushNew); 
    } 
 
    // Исполним операции закрашивания белой кистью. 
 
 
    // После завершения последней операции закрашивания новой кистью,  
    // приложение должно выбрать опять первоначальную кисть 
    // в контекст устройства и удалить новую кисть. В этом примере,
    // параметр hbrushNew содержит дескриптор стандартного объекта. 
    // Это не необходимо (но и не вредно), чтобы вызвать DeleteObject 
    // для стандартного объекта. Если параметр hbrushNew содержал  
    // дескриптор кисти, созданный такой функцией  как 
    // CreateBrushIndirect, оно должно немедленно вызвать DeleteObject.
    
    SelectObject(hdc, hbrushOld); 
    DeleteObject(hbrushNew); 

 

Обратите внимание! на то, что приложение сохраняет первоначальный дескриптор кисти при вызове функции SelectObject с самого начала. Этот дескриптор сохраняется так, чтобы первоначальная кисть могла выбираться обратно в контекст устройства (DC) после того, как новой кистью будет закончена последняя операция закрашивания. После того, как первоначальная кисть выбирается снова в контекст устройства, новая кисть удаляется, освобождая память в динамической памяти графического интерфейса устройства (GDI).

 

Назад в оглавление темы
На главную страницу темы

Hosted by uCoz