[英]Change Border Color of NumericUpDown
我对 C# 很陌生,有一个问题。 我已经能够通过将它们的 FlatStyle 更改为“Flat”来更改按钮的边框 colors 等。 使用NumericUpDown
,我无法更改 FlatStyle。 我希望仍然能够使用向上和向下箭头,因此仅使用其他东西来覆盖边缘是行不通的。 这是我在代码中所做的简化版本:
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace bordertest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
BackColor = Color.Black;
numericUpDown1.BackColor = Color.Red;
}
}
}
您可以从NumericUpDown
派生,添加BorderColor
属性,覆盖OnPaint
并根据边框颜色绘制边框。
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
public class MyNumericUpDown : NumericUpDown
{
private Color borderColor = Color.Blue;
[DefaultValue(typeof(Color), "0,0,255")]
public Color BorderColor
{
get { return borderColor; }
set
{
if (borderColor != value)
{
borderColor = value;
Invalidate();
}
}
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if (BorderStyle != BorderStyle.None)
{
using (var pen = new Pen(BorderColor, 1))
e.Graphics.DrawRectangle(pen,
ClientRectangle.Left, ClientRectangle.Top,
ClientRectangle.Width - 1, ClientRectangle.Height - 1);
}
}
}
注意:作为旁注,此控件引发绘画事件,如果出于任何原因有人想要在没有 inheritance 的情况下实现相同的行为,他们可以处理绘画事件并绘制边框; 然而,作为一种通用解决方案和可重用的解决方案,派生控件更有意义。
private void numericUpDown_Paint(object sender, PaintEventArgs e)
{
var c = (NumericUpDown)sender;
ControlPaint.DrawBorder(e.Graphics, c.ClientRectangle,
Color.Red, ButtonBorderStyle.Solid);
var r = new Rectangle(1, 1, c.Width - 2, c.Height - 2);
e.Graphics.SetClip(r);
}
平面数字向上向下
我创建了一个支持BorderColor
和ButtonHighlightColor
的 FlatNumericUpDown 。 您可以下载或克隆它:
覆盖WndProc以使用标准ControlPaint呈现功能绘制 NumericUpDown(但它可以应用于许多其他控件)边框的自定义控件版本。
这允许在不费力的情况下绘制边框(实际上,没有:),并且有多个开箱即用的 styles。
BorderStyle
属性是shadowed ,以返回扩展的ButtonBorderStyle值,其中包括例如除了默认的Solid
之外的Dotted
和Dashed
样式。
在 class 中添加了一个公共的BorderColor
属性,它当然会出现在 PropertyGrid 中; 它允许更改边框的颜色。
它默认为Color.DarkGray
,类似于SystemColors.ControlDark
。
您可以使用与Reza Aghaei相同的 Attribute 样式来指定 RGB 值,而不是"DarkGray"
,如果您想要精确的话。
将此 class 添加到项目中,构建项目,在工具箱中找到自定义控件,然后像往常一样将其放在表单上(以防您不知道如何处理它:)
► 请注意,您可以对许多其他标准控件(包括通常不会引发 Paint 事件的 TextBox 控件)和您自己设计的所有自定义控件/组件使用相同的技术。
这是它的样子:
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
[DesignerCategory("Code"), ToolboxItem(true)]
public class NumericUpDownEx : NumericUpDown
{
private const int WM_PAINT = 0x000F;
private ButtonBorderStyle m_BorderStyle = ButtonBorderStyle.Solid;
private Color m_BorderColor = Color.DarkGray;
public NumericUpDownEx() { }
public new ButtonBorderStyle BorderStyle {
get => m_BorderStyle;
set {
if (m_BorderStyle != value) {
m_BorderStyle = value;
Invalidate();
}
}
}
[DefaultValue(typeof(Color), "DarkGray")]
public Color BorderColor {
get => m_BorderColor;
set {
if (m_BorderColor != value) {
m_BorderColor = value;
Invalidate();
}
}
}
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
switch (m.Msg) {
case WM_PAINT:
if (IsHandleCreated) {
using (var g = Graphics.FromHwndInternal(this.Handle)) {
ControlPaint.DrawBorder(g, ClientRectangle, m_BorderColor, m_BorderStyle);
}
m.Result = IntPtr.Zero;
}
break;
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.