Перечисление цветов


Вы можете выяснить, сколько цветов устройство поддерживает и чем эти цвета являются, извлекая количество цветов для устройства и перечисляя цвета сплошных перьев. Чтобы извлечь число цветов, используйте функцию GetDeviceCaps со значением NUMCOLORS. Чтобы перечислить сплошные перья, используйте функцию EnumObjects и соответствующую функцию обратного вызова, которая получает информацию о каждом пере.

Демонстрационный пример

// GetTheColors - возвращает число и коды чистого цвета
// Возвращает указатель на массив, содержащий цвета
// hdc - дескриптор контекста устройства

COLORREF *GetTheColors(HDC hdc)
{
    int cColors;
    COLORREF *aColors;

    // Получите число цветов.
    cColors = GetDeviceCaps(hdc, NUMCOLORS);

    // Назначьте пространство для массива.
    aColors = (COLORREF *)LocalAlloc(LPTR, sizeof(COLORREF) * 
        (cColors+1));

    // Сохраните количество цветов в первом элементе.
    aColors[0] = (LONG)cColors;

    // Перечислите все перья и сохраните сплошные цвета в массиве.
    EnumObjects(hdc, OBJ_PEN, (GOBJENUMPROC)MyEnumProc, (LONG)aColors);

    // Обновите количество цветов.
    aColors[0] = (LONG)cColors;

    return aColors;
}

int MyEnumProc(LPVOID lp, LPBYTE lpb)
{
    LPLOGPEN lopn;
    COLORREF *aColors;
    int iColor;

    lopn = (LPLOGPEN)lp;
    aColors = (COLORREF *)lpb;

    if (lopn->lopnStyle==PS_SOLID) 
    {
        // Проверка не слишком ли много цветов.
        if ((iColor = (int)aColors[0]) <= 0)
             return 0;
        aColors[iColor] = lopn->lopnColor;
        aColors[0]--;
    }
    return 1;
}
 

 

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

Hosted by uCoz