在自定义控件中,从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);
}
给出了这个......
我相信你们都会注意到DrawButton方法绘制的两个“按钮”的颜色比标准按钮稍微浅一些,而Form背景(我没有改变并保留为默认值“控制”)... 如果你足够放大,你可以看到它是正确的背景颜色和另一种更亮的颜色的交替像素......
我发现此问题是因为我们的用户正在使用远程桌面(RDP)连接到我们的应用程序。将远程桌面设置强制为32位可以解决问题,但我认为它会对性能产生影响,而且我们的一些用户在相对较慢的宽带链路上工作在海外...所以强制执行32位是我宁愿避免的选项。 通过将显示设置设置为16位颜色,它也会发生在PC前面。
你有任何想法吗?是ButtonRenderer和ControlPaint类的某种错误,还是有办法解决这个问题? (我正在使用.Net 4.0)。
答案 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);
}
编辑:添加了对主题的可选调用