我的表单中有 2 个按钮。两者都有背景图像,平面样式为“平面”。
单击TAB键时,当焦点位于按钮上时,我会看到内部的纯色矩形,而不是纯色边框,我希望在按钮中有虚线边框。
单击按钮时,某些活动正在进行并且按钮被禁用。禁用时,按钮文本颜色变为灰色。我不希望它改变文本颜色。我相信这是Windows标准行为,但是选择按钮时如何不更改文本颜色?
我找不到任何属性来设置这些点。我应该怎么做才能实现目标。非常感谢任何帮助。
我还创建了一个自定义按钮,但无法摆脱上述问题。
我的自定义按钮的绘制方法:
public partial class MyButton : Button {
protected override void OnPaint(PaintEventArgs pevent)
{
base.OnPaint(pevent);
// Set custom fore color
base.ForeColor = Color.FromArgb(0, 255, 254, 255);
// set the same forecolor even if the button is disabled
if (base.Enabled == false)
{
base.ForeColor = Color.FromArgb(0, 255, 254, 255);
}
} //OnPaint method ends
} // class ends
(1) 和 (2) 的更新解决方案在 onpaint() 中添加了以下内容:
private void init()
{
base.ForeColor = Color.FromArgb(0, 255, 254, 255);
base.FlatAppearance.BorderColor = Color.FromArgb(0, 255, 255, 254); // Transparent border
}
protected override void OnPaint(PaintEventArgs pevent)
{
base.OnPaint(pevent);
if (base.ContainsFocus)
{
// Draw inner dotted rectangle when button is on focus
Pen pen = new Pen(Color.Gray, 3);
Point p = base.Location;
pen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
Rectangle rectangle = new Rectangle(4, 4, Size.Width - 8, Size.Height - 8);
ControlPaint.DrawFocusRectangle(pevent.Graphics, rectangle);
}
// Draw the string to screen
SizeF sf = pevent.Graphics.MeasureString(displayText, this.Font, this.Width);
Point ThePoint = new Point();
ThePoint.X = (int)((this.Width / 2) - (sf.Width / 2));
ThePoint.Y = (int)((this.Height / 2) - (sf.Height / 2));
//pevent.Graphics.DrawString(displayText, Font, new SolidBrush(this.ForeColor), ThePoint);
//pevent.Graphics.DrawString(displayText, Font, new SolidBrush(Color.FromArgb(0, 255, 254, 255)), ThePoint);
pevent.Graphics.DrawString(displayText, Font, new SolidBrush(Color.Black), ThePoint);
//this.Text = "";
}//OnPaint ends
// Avoids the inner solid rectangle shown on focus
protected override bool ShowFocusCues
{
get
{
return false;
}
}
这成功地在我的按钮中绘制了一条虚线,指示焦点。为了摆脱默认的实线,我重写了 ShowFocusCues()。
这帮助我完全解决了 1。但是对于第 2 点,没有得到 100% 的结果。我在 MyButton 类中创建了一个属性“displayText”。在 OnPaint() 中,如果我将 ForeColor、Color.FromARGB 给 SolidBrush,它不会显示任何文本。但是如果我通过 Color.Black,那么它会接受它并以黑色显示文本。为什么它不接受前景色或自定义颜色而只接受默认颜色?对于这个简单的任务,我在哪里仍然出错。我通过在表单中实现 button_paint 进行了同样的尝试,但我看到了相同的结果。
知道我哪里还有错吗???