gpt4 book ai didi

c# - DateTimePicker 用户控件上的动态文本颜色 - WinForms

转载 作者:行者123 更新时间:2023-11-30 12:28:50 24 4
gpt4 key购买 nike

我正在创建一个基于 DateTimePicker 的 Windows 用户控件。控件设置为仅显示时间,因此显示如下:

DateTimePicker time only

我有一个公共(public)属性 TimeIsValid:

public bool TimeIsValid
{
get { return _timeIsValid; }
set
{
_timeIsValid = value;
Refresh();
}
}

当它设置为 false 时,我希望文本变成红色。所以我用以下代码覆盖了 OnPaint:

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

e.Graphics.DrawString(Text, Font,
_timeIsValid ? new SolidBrush(Color.Black) : new SolidBrush(Color.Red),
ClientRectangle);

}

这什么也没做。所以在构造函数中我添加了以下代码:

public DateTimePicker(IContainer container)
{
container.Add(this);
InitializeComponent();
//code below added
this.SetStyle(ControlStyles.UserPaint, true);
}

这有点管用,但会导致一些令人担忧的结果,即

  • 控件即使处于选中状态也不会显示为选中状态。
  • 点击上/下控件会更改控件的基础值,但并不总是会更改可见值。
  • 当通过另一个控件更改其值时,该控件未正确重绘,但将鼠标移到该控件上似乎会强制重绘。

例如,看看这个怪异......

Partially repainted control

我错过了什么?

最佳答案

尝试继承它是一个糟糕的控件,但可以尝试一些事情:

添加双缓冲区:

this.SetStyle(ControlStyles.UserPaint | 
ControlStyles.OptimizedDoubleBuffer, true);

如果控件具有焦点,则清除背景并绘制高亮显示:

protected override void OnPaint(PaintEventArgs e) {
e.Graphics.Clear(Color.White);
Color textColor = Color.Red;
if (this.Focused) {
textColor = SystemColors.HighlightText;
e.Graphics.FillRectangle(SystemBrushes.Highlight,
new Rectangle(4, 4, this.ClientSize.Width - SystemInformation.VerticalScrollBarWidth - 8, this.ClientSize.Height - 8));
}
TextRenderer.DrawText(e.Graphics, Text, Font, ClientRectangle, textColor, Color.Empty, TextFormatFlags.VerticalCenter);
base.OnPaint(e);
}

并在值改变时使控件失效:

protected override void OnValueChanged(EventArgs eventargs) {
base.OnValueChanged(eventargs);
this.Invalidate();
}

关于c# - DateTimePicker 用户控件上的动态文本颜色 - WinForms,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20518914/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com