更改ComboBox边框颜色 - SelectedIndex更改时闪烁

Cle*_*ven 3 .net c# combobox winforms

我只是想知道在Windows窗体中我是否可以在组合框的边框周围创建一条红线?就像一缕红色然后又一次只是为了表明它已被改变.抓住用户的眼睛或其他东西.我将提供屏幕来表示我想要的东西.

如果有可能,请告诉我在哪里可以查找它以获取一些信息.

无边界 在此输入图像描述 边境闪现变化 在此输入图像描述 一两秒后边界再次消失 在此输入图像描述

Rez*_*aei 6

组合框改变的任何时候,我想闪烁边框以表明它已经改变.

主要想法是使用计时器并绘制边框一段时间.您可以使用不同的解决方案绘制边框.例如,您可以(1)绘制边框上ComboBox(2)您可以在绘制边界ParentComboBox.

在我提出的答案中,我创建了一个MyComboBox并添加了一个FlashHotBorder可以调用flash边框的方法.我还添加了一个HotBorderColor可用于设置边框颜色的属性.

ComboBox的闪烁边框

要绘制边框,ComboBox您可以处理WM_Paint消息ComboBox并绘制边框以进行控制.然后要闪烁边框,您需要使用计时器并打开并关闭边框一段时间:

在此输入图像描述

MyComboBox代码

我已经创建了一个FlashHotBorder可以在SelectedIndexChanged事件中调用的方法.此外,如果您想在所选索引更改时始终闪烁边框,则可以调用它OnSelectedIndexChanged.我更喜欢在事件处理程序中调用它.这是实施:

using System.Drawing;
using System.Windows.Forms;
public class MyComboBox : ComboBox
{
    int flash = 0;
    private const int WM_PAINT = 0xF;
    private int buttonWidth = SystemInformation.HorizontalScrollBarArrowWidth;
    public Color HotBorderColor { get; set; }
    private bool DrawBorder { get; set; }
    Timer timer;
    public MyComboBox()
    {
        this.HotBorderColor = Color.Red;
        timer = new Timer() { Interval = 100 };
        timer.Tick += new System.EventHandler(timer_Tick);
    }
    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);
        if (m.Msg == WM_PAINT && this.DrawBorder)
            using (var g = Graphics.FromHwnd(this.Handle))
            using (var p = new Pen(this.HotBorderColor))
                g.DrawRectangle(p, 0, 0, this.Width - 1, this.Height - 1);
    }
    public void FlashHotBorder()
    {
        flash = 0;
        timer.Start();
    }
    void timer_Tick(object sender, System.EventArgs e)
    {
        if (flash < 10)
        {
            flash++;
            this.DrawBorder = !this.DrawBorder;
            this.Invalidate();
        }
        else
        {
            timer.Stop();
            flash = 0;
            DrawBorder = false;
        }
    }
    protected override void Dispose(bool disposing)
    {
        if (disposing) { timer.Dispose(); }
        base.Dispose(disposing);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后就可以使用此事件处理程序来处理SelectedIndexChanged要闪存的eeach组合事件:

private void myComboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    var combo = sender as FlatCombo;
    if (combo != null)
        combo.FlashHotBorder();
}
Run Code Online (Sandbox Code Playgroud)