ButtonRenderer在16位中使用与Button不同的背景颜色

时间:2012-08-23 16:26:38

标签: .net winforms button colors

在自定义控件中,从Button派生,ButtonRenderer.DrawButton()在各种状态下绘制一个按钮。

当Windows中的显示设置被设置为32位的颜色深度时,一切都很好,但是一次设置为16位,颜色与常规的WinForms按钮不匹配,它突出在我的UI中,我并不是真的想要。

我使用像这样的最小示例代码复制了这个。

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);

        Rectangle rect = new Rectangle(10, 10, 250, 120);
        ButtonRenderer.DrawButton(e.Graphics, rect, PushButtonState.Normal);

        rect = new Rectangle(300, 300, 250, 120);
        ControlPaint.DrawButton(e.Graphics, rect, ButtonState.Normal);
    }

给出了这个......

Rendered Buttons

我相信你们都会注意到DrawButton方法绘制的两个“按钮”的颜色比标准按钮稍微浅一些,而Form背景(我没有改变并保留为默认值“控制”)... 如果你足够放大,你可以看到它是正确的背景颜色和另一种更亮的颜色的交替像素......

我发现此问题是因为我们的用户正在使用远程桌面(RDP)连接到我们的应用程序。将远程桌面设置强制为32位可以解决问题,但我认为它会对性能产生影响,而且我们的一些用户在相对较慢的宽带链路上工作在海外...所以强制执行32位是我宁愿避免的选项。 通过将显示设置设置为16位颜色,它也会发生在PC前面。

你有任何想法吗?是ButtonRenderer和ControlPaint类的某种错误,还是有办法解决这个问题? (我正在使用.Net 4.0)。

1 个答案:

答案 0 :(得分:1)

ControlPaint.DrawButton是Win32 DrawFrameControl的包装器。

渲染到位图,然后将位图绘制到Graphics显示上下文。颜色抖动/近似发生在该位图层。我没时间进行实验,但是......

如果您只是自己调用DrawFrameControl,那么一切正常:

[DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
public static extern bool DrawFrameControl(IntPtr hDC, ref RECT rect, int type, int state);

[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
    public int left;
    public int top;
    public int right;
    public int bottom;

    public RECT(Rectangle r)
    {
        this.left = r.Left;
        this.top = r.Top;
        this.right = r.Right;
        this.bottom = r.Bottom;
    }
}

protected override void OnPaint(PaintEventArgs e)
{
    if (Application.RenderWithVisualStyles)
         ButtonRenderer.DrawButton(.....)
    else
    {
         var rect = new RECT(new Rectangle(10, 110, 100, 100));
         DrawFrameControl(e.Graphics.GetHdc(), ref rect, 4, 0x10 | (int)ButtonState.Normal);
    }

    base.OnPaint(e);
}

编辑:添加了对主题的可选调用