gpt4 book ai didi

c# - 自定义组合框边框闪烁

转载 作者:太空狗 更新时间:2023-10-29 21:39:32 33 4
gpt4 key购买 nike

我为一些 c# WinForms 表单字段使用了较暗的样式。组合框特别类似于此:

enter image description here

我正在使用这个堆栈答案中的这段代码:Combobox borderstyle

不幸的是,我遇到了边框闪烁的问题。当我在组合框上进行鼠标输入或鼠标悬停时,它会快速闪烁并带有白色边框。

有没有办法解决这个问题?我已经尝试使用 DoubleBuffer,但它并没有缓解问题。

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Runtime.InteropServices;

namespace FlattenCombo
{
public class FlattenCombo : ComboBox
{
private Brush BorderBrush = new SolidBrush(SystemColors.WindowFrame);
private Brush ArrowBrush = new SolidBrush(SystemColors.ControlText);
private Brush DropButtonBrush = new SolidBrush(SystemColors.Control);

private Color _ButtonColor = SystemColors.Control;
public Color ButtonColor
{
get { return _ButtonColor; }
set
{
_ButtonColor = value;
DropButtonBrush = new SolidBrush(this.ButtonColor);
this.Invalidate();
}
}

private Color _borderColor = Color.Black;
private ButtonBorderStyle _borderStyle = ButtonBorderStyle.Solid;
//private static int WM_PAINT = 0x000F;

[Category("Appearance")]
public Color BorderColor
{
get { return _borderColor; }
set
{
_borderColor = value;
this.Invalidate(); // causes control to be redrawn
}
}

[Category("Appearance")]
public ButtonBorderStyle BorderStyle
{
get { return _borderStyle; }
set
{
_borderStyle = value;
this.Invalidate();
}
}

protected override void WndProc(ref Message m)
{
base.WndProc(ref m);



/*if (m.Msg == WM_PAINT)
{
Graphics g = Graphics.FromHwnd(Handle);
Rectangle bounds = new Rectangle(0, 0, Width, Height);
ControlPaint.DrawBorder(g, bounds, _borderColor, _borderStyle);
}*/

switch (m.Msg)
{
case 0xf:
//Paint the background. Only the borders
//will show up because the edit
//box will be overlayed
//Graphics g = Graphics.FromHwnd(Handle);
Graphics g = this.CreateGraphics();
Rectangle bounds = new Rectangle(0, 0, Width, Height);
ControlPaint.DrawBorder(g, bounds, _borderColor, _borderStyle);

//Pen p = new Pen(Color.White, 2);
//g.FillRectangle(BorderBrush, this.ClientRectangle);

//Draw the background of the dropdown button
Rectangle rect = new Rectangle(this.Width - 18, 0, 18, this.Height);
g.FillRectangle(DropButtonBrush, rect);

//Create the path for the arrow
System.Drawing.Drawing2D.GraphicsPath pth = new System.Drawing.Drawing2D.GraphicsPath();
PointF TopLeft = new PointF(this.Width - 13, (this.Height - 5) / 2);
PointF TopRight = new PointF(this.Width - 6, (this.Height - 5) / 2);
PointF Bottom = new PointF(this.Width - 9, (this.Height + 2) / 2);
pth.AddLine(TopLeft, TopRight);
pth.AddLine(TopRight, Bottom);

g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

//Determine the arrow's color.
if (this.DroppedDown)
{
ArrowBrush = new SolidBrush(SystemColors.HighlightText);
}
else
{
ArrowBrush = new SolidBrush(SystemColors.ControlText);
}

//Draw the arrow
g.FillPath(ArrowBrush, pth);

g.Dispose();

break;
}
}

//Override mouse and focus events to draw
//proper borders. Basically, set the color and Invalidate(),
//In general, Invalidate causes a control to redraw itself.
//#region "Mouse and focus Overrides"
protected override void OnMouseEnter(System.EventArgs e)
{
base.OnMouseEnter(e);
//BorderBrush = new SolidBrush(SystemColors.Highlight);
//EnableDoubleBuffering();
this.Invalidate();
}

protected override void OnMouseLeave(System.EventArgs e)
{
base.OnMouseLeave(e);
/*if (this.Focused)
return;*/
BorderBrush = new SolidBrush(SystemColors.WindowFrame);
//EnableDoubleBuffering();
this.Invalidate();
}

protected override void OnLostFocus(System.EventArgs e)
{
base.OnLostFocus(e);
//BorderBrush = new SolidBrush(SystemColors.Window);
//EnableDoubleBuffering();
this.Invalidate();
}

protected override void OnGotFocus(System.EventArgs e)
{
base.OnGotFocus(e);
BorderBrush = new SolidBrush(SystemColors.WindowFrame);
//EnableDoubleBuffering();
this.Invalidate();
}

protected override void OnMouseHover(System.EventArgs e)
{
base.OnMouseHover(e);
BorderBrush = new SolidBrush(SystemColors.WindowFrame);
//EnableDoubleBuffering();
this.Invalidate();
}
//#endregion
}
}

最佳答案

精简版:将此添加到您的Form 以大大减少闪烁。我已经尝试使用 7-8 个您修改过的 flattenCombo,结果差别很大。

protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED
return cp;
}
}

长版:How to fix the flickering in User controls .很棒的帖子,还解释了其他技巧。

关于c# - 自定义组合框边框闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20894585/

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