VB2012:我正在创建一个按钮控件并继承.NET按钮。从这里开始基础https://blogs.msdn.microsoft.com/jfoscoding/2005/11/10/building-a-splitbutton/由于我重新绘制了按钮,我必须在禁用时引入一些代码来更改按钮文本。
因此,根据过去的经验,我立即使用SystemColors.GrayText
。但是将它与普通的.NET按钮进行比较,禁用时的颜色似乎有些偏差。在进行实验后,非常接近的是SystemColors.ControlDark
。我无法在任何地方找到这个记录。我这样做是无比的吗?
答案 0 :(得分:0)
在编写了一个非常笨重的像素偷窥程序后,似乎前景色为160,160,160,背景色为204,204,204。 Windows ClearType字体平滑使事情变得有点困难,生活从来都不简单呃?
所以你需要设置类似这样的颜色
Me.ForeColor = Color.FromArgb(160, 160, 160)
Me.BackColor = Color.FromArgb(204, 204, 204)
或者至少那是他们在我的Windows 10电脑上的标准主题。
答案 1 :(得分:0)
对于这样的事情,Reference Source是你的朋友。如果您通过调用,您将看到System.Windows.Forms.Button
类最终调用ButtonBaseAdapter.DrawText
方法来执行按钮上文本的实际绘制。调用堆栈如下所示:
System.Windows.Forms.ButtonBase.OnPaint
System.Windows.Forms.ButtonBase.PaintControl
PaintControl
方法调用Adapter.Paint
。 Adapter
是一个返回当前按钮绘图适配器的属性。它返回的适配器取决于样式(即平面,弹出,标准)。如果它是标准样式按钮,则会调用返回Button.CreateStandardAdapter
的{{1}}方法,以便ButtonStandardAdapter
方法使用该方法。 PaintControl
方法是由它的基类实现的,所以它是被调用的方法。ButtonStandardAdapter.Paint
System.Windows.Forms.ButtonInternal.ButtonBaseAdapter.Paint
System.Windows.Forms.ButtonInternal.ButtonStandardAdapter.PaintUp
System.Windows.Forms.ButtonInternal.ButtonStandardAdapter.PaintWorker
System.Windows.Forms.ButtonInternal.ButtonBaseAdapter.PaintField
在System.Windows.Forms.ButtonInternal.ButtonBaseAdapter.DrawText
方法中,您会看到它会像这样绘制禁用的文字:
DrawText
首先,它使用if (disabledText3D && !Control.Enabled) {
r.Offset(1, 1);
using (SolidBrush brush = new SolidBrush(colors.highlight)) {
g.DrawString(Control.Text, Control.Font, brush, r, stringFormat);
r.Offset(-1, -1);
brush.Color = colors.buttonShadow;
g.DrawString(Control.Text, Control.Font, brush, r, stringFormat);
}
}
绘制偏移(1, 1)
的文本,然后再次绘制它,但这次使用colors.highlight
偏移(-1, -1)
。 colors.buttonShadow
变量是对colors
对象的引用。如果您按照代码操作,则会看到ColorData
方法正在创建ColorData
。它返回的颜色取决于某些系统设置,例如正常模式和高对比度模式。但是,对于标准情况,它看起来像它返回的颜色是:
System.Windows.Forms.ButtonInternal.ButtonBaseAdapter.ColorOptions.Calculate