Использование GDI + для рисования различных цветов:
brush = new SolidBrush(color);
graphics.FillRectangle(brush, x, y, width, height);
Вы заметите, что непрозрачный цвет не отображается правильно на стекле:
Как рисовать сплошные цвета на стекле?
Вы также заметите, что полностью непрозрачный цвет обрабатывается по-разному в зависимости от цвета:
- непрозрачный черный: полностью прозрачный
- непрозрачный цвет: частично прозрачный
- непрозрачный белый: полностью непрозрачный
Может ли кто-нибудь указать мне на документацию на компоновщике рабочего стола, которая объясняет, как обрабатываются разные цвета?
Обновление 3
Вы также заметите, что FillRectangle
ведет себя иначе, чем FillEllipse
:
-
FillEllipse
с непрозрачным цветом рисует непрозрачный цвет -
FillRectangle
с непрозрачным цветом рисует частично (или полностью) прозрачно
Пояснение для нечувствительного поведения, пожалуйста.
Обновление 4
Alwayslearning предложил изменить режим компоновки. Из MSDN:
Перечисление CompositingMode
Перечисление CompositingMode определяет, как отображаемые цвета объединяются с цветами фона. Это перечисление используется
Graphics::GetCompositingMode
и 'Graphics:: SetCompositingMode ' класса Графика.CompositingModeSourceOver
Указывает, что при отображении цвета он смешивается с цветом фона. Смесь определяется альфа-компонентом отображаемого цвета.
CompositingModeSourceCopy
Указывает, что при отображении цвета он перезаписывает цвет фона. Этот режим нельзя использовать вместе с TextRenderingHintClearTypeGridFit.
Из описания CompositingModeSourceCopy
звучит так, что это не тот вариант, который я хочу. Из ограничений, которые он налагает, это похоже на вариант, который я хочу. И с составом, либо с прозрачностью отключено, не вариант, который я хочу, поскольку он выполняет SourceCopy, а не SourceBlend:
К счастью, это не зло, которое я должен созерцать, потому что это не решает мою актуальную проблему. После создания моего объекта graphics
я попытался изменить режим компоновки:
graphics = new Graphics(hDC);
graphics.SetCompositingMode(CompositingModeSourceCopy); //CompositingModeSourceCopy = 1
Результат не влияет на выход:
Примечания
- Win32 native
- не .NET(например, native)
- не Winforms (т.е. native)
- GDI + (т.е. native)