组合框改变的任何时候,我想闪烁边框以表明它已经改变.
主要想法是使用计时器并绘制边框一段时间.您可以使用不同的解决方案绘制边框.例如,您可以(1)绘制边框上ComboBox
或(2)您可以在绘制边界Parent
的ComboBox
.
在我提出的答案中,我创建了一个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)