我正在处理一组UI元素,而ComboBox让我很难过。
我的目标是在元素周围绘制1px边框,当鼠标悬停在其上时会改变颜色。
我使用WndProc()
方法对WM_PAINT
消息作出反应并绘制边框:
protected override void WndProc(ref Message m)
{
if (m.Msg == (int)WindowsMessages.Win32Messages.WM_PAINT)
{
base.WndProc(ref m);
if (hovered || Focused)
{
//Paint frame with hovered color when being hovered over
PaintHelper.PaintFrame(this, _frameColorHovered, _frameWidth);
}
else
{
//Paint frame with standart color
PaintHelper.PaintFrame(this, _frameColor, _frameWidth);
}
}
.
.
.
}
Paint helper方法如下所示:
public static void PaintFrame(Control target, Color color, int frameWidth)
{
IntPtr dc = GetWindowDC(target.Handle);
using (Graphics g = Graphics.FromHdc(dc))
{
using (Pen p = new Pen(color, frameWidth))
g.DrawRectangle(p, frameWidth / 2, frameWidth / 2, target.Width - frameWidth, target.Height - frameWidth);
}
}
到目前为止一直很好但是当鼠标向外移动或在Elements边界内部时,边框会一直闪烁!我做了一些研究,但每个人都使用UserPaint
标志,这不是我的选择。
所以: 有没有办法消除闪烁而不用自己绘制整个控件?