Aero: Как рисовать твердые (непрозрачные) цвета на стекле?

Использование GDI + для рисования различных цветов:

brush = new SolidBrush(color);
graphics.FillRectangle(brush, x, y, width, height);

Вы заметите, что непрозрачный цвет не отображается должным образом на стекле: alt text

Как нарисовать сплошные цвета на стекле?


Вы также заметите, что полностью непрозрачный цвет обрабатывается по-разному в зависимости от того, какой он цвет:

  • непрозрачный черный: полностью прозрачный
  • непрозрачный цвет: частично прозрачный
  • непрозрачный белый: полностью непрозрачный

alt text

Кто-нибудь может указать мне на документацию по композитору для настольных ПК, в которой объясняется, как обрабатываются разные цвета?


Обновление 3

Вы также заметите, что FillRectangle ведет себя иначе, чем FillEllipse :

  • FillEllipse с непрозрачным цветом рисует непрозрачный цвет
  • FillRectangle с непрозрачным цветом рисует частично (или полностью) прозрачным

alt text

Пояснение за бессмысленное поведение, пожалуйста.

Обновление 4

Alwayslearning предложило мне изменить режим наложения. С MSDN :

Перечисление CompositingMode

Перечисление CompositingMode определяет, как визуализированные цвета сочетаются с цветами фона. Это перечисление используется методами Graphics :: GetCompositingMode и 'Graphics :: SetCompositingMode' класса Graphics .

 CompositingModeSourceOver

Указывает, что при визуализации цвет смешивается с цветом фона. Смешивание определяется альфа-компонентом визуализируемого цвета.

 CompositingModeSourceCopy

Указывает, что при визуализации цвета он перезаписывает цвет фона. Этот режим нельзя использовать вместе с TextRenderingHintClearTypeGridFit.

Судя по описанию CompositingModeSourceCopy , это не тот вариант, который мне нужен. Судя по налагаемым ограничениям, это похоже на вариант, который мне нужен. И с отключенной композицией или прозрачностью не вариант, который мне нужен, поскольку он выполняет SourceCopy , а не SourceBlend :

alt text

К счастью, это не так. зло, которое я должен созерцать, потому что оно не решает мою настоящую проблему. После создания моего объекта graphics я попытался изменить режим наложения:

graphics = new Graphics(hDC);
graphics.SetCompositingMode(CompositingModeSourceCopy); //CompositingModeSourceCopy = 1

Результат не повлиял на вывод:

alt text

Примечания

  • Win32 native
  • not .NET ( т.е. native)
  • not Winforms ( т.е. native)
  • GDI + ( ie native)

См. Также

31
задан Community 23 May 2017 в 10:30
поделиться