Aero:如何在玻璃上绘制实心(不透明)颜色?

Ian*_*oyd 31 aero dwm aero-glass

使用GDI +绘制各种颜色:

brush = new SolidBrush(color);
graphics.FillRectangle(brush, x, y, width, height);
Run Code Online (Sandbox Code Playgroud)

您会注意到在玻璃上没有显示不透明的颜色: 替代文字

我如何在玻璃上画出纯色?


您还会注意到完全不透明的颜色会根据颜色的不同而有所不同:

  • 不透明的黑色:完全透明
  • 不透明的颜色:部分透明
  • 不透明的白色:完全不透明

替代文字

有人能指出我在桌面合成器上的文档,解释了如何处理不同的颜色?


更新3

您还会注意到FillRectangle行为与以下不同FillEllipse:

  • FillEllipse 不透明的颜色会产生不透明的颜色
  • FillRectangle 不透明的颜色部分(或完全)透明

替代文字

请解释非感性行为.

更新4

Alwayslearning建议我改变合成模式.来自MSDN:

CompositingMode枚举

CompositingMode枚举指定如何呈现的颜色与背景颜色组合.此枚举由使用Graphics::GetCompositingMode"图形:: SetCompositingMode"的方法图形类.

CompositingModeSourceOver
Run Code Online (Sandbox Code Playgroud)

指定在渲染颜色时,它与背景颜色混合.混合由要渲染的颜色的alpha分量确定.

CompositingModeSourceCopy
Run Code Online (Sandbox Code Playgroud)

指定在渲染颜色时,它会覆盖背景颜色.此模式不能与TextRenderingHintClearTypeGridFit一起使用.

从描述来看CompositingModeSourceCopy,听起来这不是我想要的选择.从它所施加的限制来看,它听起来像我想要的选项.并且通过禁用合成或透明度,它不是我想要的选项,因为它执行SourceCopy而不是SourceBlend:

替代文字

幸运的是,这不是一个我必须考虑的邪恶,因为它不能解决我的实际问题.构建我的graphics对象后,我尝试更改合成模式:

graphics = new Graphics(hDC);
graphics.SetCompositingMode(CompositingModeSourceCopy); //CompositingModeSourceCopy = 1
Run Code Online (Sandbox Code Playgroud)

结果对输出没有影响:

替代文字

笔记

  • Win32原生
  • 不是.NET(原生)
  • 不是Winforms(原生)
  • GDI +(原生)

也可以看看

Alw*_*ing 1

似乎对我来说工作正常。由于缺乏完整的代码示例,我假设您的合成模式是错误的。

public void RenderGdiPlus()
{
    List<string> colors = new List<string>(new string[] { "000000", "ff0000", "00ff00", "0000ff", "ffffff" });
    List<string> alphas = new List<string>(new string[] { "00", "01", "40", "80", "c0", "fe", "ff" });
    Bitmap bmp = new Bitmap(200, 300, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

    Graphics graphics = Graphics.FromImage(bmp);
    graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
    graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.None;
    graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;

    graphics.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
    graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
    SolidBrush backBrush = new SolidBrush(Color.FromArgb(254, 131, 208, 129));
    graphics.FillRectangle(backBrush, 0, 0, 300, 300);

    graphics.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceOver;
    Pen pen = new Pen(Color.Gray);
    for (int row = 0; row < alphas.Count; row++)
    {
        string alpha = alphas[row];
        for (int column=0; column<colors.Count; column++)
        {
            string color = "#" + alpha + colors[column];
            SolidBrush brush = new SolidBrush(ColorTranslator.FromHtml(color));
            graphics.DrawRectangle(pen, 40*column, 40*row, 32, 32);
            graphics.FillRectangle(brush, 1+40*column, 1+40*row, 31, 31);
        }
    }

    Graphics gr2 = Graphics.FromHwnd(this.Handle);
    gr2.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
    gr2.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
    gr2.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.None;
    gr2.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;
    gr2.DrawImage(bmp, 0, 0);
}
Run Code Online (Sandbox Code Playgroud)