Active Caption Text Color - обнаружение изменений (в.Net)

В Vista с включенным Aero заголовок окна в обычном режиме имеет текст черного цвета (написанный на слегка светлом стекле), в то время как при максимизации заголовок белого цвета (написанный на темном стекле).

Как я могу определить текущий цвет заголовка окна?

PS Я написал программу, чтобы смотреть после SystemColors.ActiveCaptionTextColor, но он остается неизменным в двух режимах.

4 ответа

Цвет системы на самом деле не меняется. То, что вы видите, это применение темы Aero к окну. Доступны API для создания тем, позволяющие получить определенные цвета темы, но мой опыт использования их был не просто великолепен.

ОБНОВЛЕНИЕ ОТ КОММЕНТАРИЙ: взгляните на VisualStyleRenderer и метод GetColor.

Я не могу заставить VisualStyleRenderer сказать мне что-нибудь.

Вы можете выбрать между:

Потому что MaxCaption предоставляет объекты VisualStyleElement для каждого состояния строки заголовка развернутого окна.

За исключением того, что это на самом деле не работает. Если вы запрашиваете цвет текста заголовка активного развернутого окна:

VisualStyleRenderer renderer = 
   new VisualStyleRenderer(VisualStyleElement.Window.MaxCaption.Active);
Color c = renderer.GetColor(ColorProperty.TextColor);

Возвращает черный цвет для Caption и MaxCaption.

На самом деле, почти все цвета одинаковы между двумя:

http://i41.tinypic.com/3994h.jpg

Я предполагаю, что нет никакого способа сделать ваше приложение таким же, как операционная система.

Учитывая VisualStyleRenderer Исходя из предположений, стоит отметить, что по-видимому, максимизированные заголовки окон обрабатываются специально DWM Vista (диспетчером окон рабочего стола) по соображениям производительности, подробности см. в объяснении Раймонда Чена.

Теперь я не заглядывал в саму тему Aero, но на самом деле она может определять один и тот же TextColor как для обычного, так и для развернутого заголовка, последний просто не используется DWM.

Тем не менее, я бы предположил, что цвет текста заголовков в Vista действительно определяется VisualStyleElement.Window.Caption.Active для тематических нормальных окон, но бывший SystemColors.ActiveCaptionTextColor только для развернутых окон; к сожалению, вы уже поняли, что это не так.

Так, может быть, DWM просто применяет внутреннее значение по умолчанию при отображении развернутых заголовков окна? В этом случае вы не можете обнаружить изменение цвета текста заголовка "по дизайну", скорее, вам придется прибегнуть к наблюдению максимизированного состояния окна как такового и применить DWM по умолчанию локально.

Почему вы не пытаетесь прослушать событие SystemColorsChanged в вашей форме?

    SystemColorsChanged += new EventHandler(Form1_SystemColorsChanged);

    void Form1_SystemColorsChanged(object sender, EventArgs e)
    {
        //try repainting or refreshing your application
    }

Я знаю, что это не точное решение, но вы можете начать работать отсюда.

Другие вопросы по тегам