【问题标题】:MouseEnter and MouseLeave events seem slowMouseEnter 和 MouseLeave 事件似乎很慢
【发布时间】:2019-10-13 06:55:07
【问题描述】:

当我尝试更改面板和标签的背景颜色时,它们的变化似乎比彼此稍慢。
尽管它们都设置为在 Panel 和 Label 的 Enter/Leave 时更改,但我可以注意到更改时只有半秒的差异。

有谁知道我怎样才能让它们同时改变,无论鼠标是否悬停?

private void panel3_MouseEnter(object sender, EventArgs e)
{
    panel3.BackColor = Color.FromArgb(125, 170, 170, 170);
    label2.BackColor = System.Drawing.Color.Transparent;
}

private void panel3_MouseLeave(object sender, EventArgs e)
{
    panel3.BackColor = Color.FromArgb(125, 45, 45, 45);
    label2.BackColor = System.Drawing.Color.Transparent;
}

private void label2_MouseEnter(object sender, EventArgs e)
{
    panel3.BackColor = Color.FromArgb(125, 170, 170, 170);
    label2.BackColor = System.Drawing.Color.Transparent;
}

private void label2_MouseLeave(object sender, EventArgs e)
{
    panel3.BackColor = Color.FromArgb(125, 45, 45, 45);
    label2.BackColor = System.Drawing.Color.Transparent;
}

这是它正在做的一个例子。 Example

【问题讨论】:

  • 你的意思是面板背景颜色的变化和标签背景颜色的变化之间有滞后吗?究竟是什么活动?此外,您似乎永远不会将标签背面颜色更改为透明以外的其他颜色。您能否提供一个我们可以尝试的完整工作示例?
  • 删除所有label2.BackColor = System.Drawing.Color.Transparent;。将与panel3 相同的处理程序分配给label2 的MouseEnter 事件(因此您只有2 个事件处理程序:1 个由面板使用,1 个由面板和标签使用)。就是这样。

标签: c# winforms


【解决方案1】:

我认为由于父容器的背景图像/绘图,我认为您会继续闪烁,正如我从您的 Example 中看到的那样。请考虑通过子类化使用双缓冲控件来减少闪烁。

class DBPanel : Panel
{
    public DBPanel()
    {
        DoubleBuffered = true;
    }
}

当您尝试创建漂亮的 GUI 时,我建议您创建一个自定义控件,它结合了面板和标签并支持双缓冲。

示例:

class FancyLabel : Panel
{

    private bool IsMouseEntered;

    public FancyLabel()
    {
        SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.SupportsTransparentBackColor, true);
        DoubleBuffered = true;
        UpdateStyles();
        BackColor = Color.Transparent;
        ForeColor = Color.FromArgb(205, 205, 205);
    }

    protected override void OnMouseEnter(EventArgs e)
    {
        base.OnMouseEnter(e);
        IsMouseEntered = true;
        Invalidate();
    }

    protected override void OnMouseLeave(EventArgs e)
    {
        base.OnMouseLeave(e);
        IsMouseEntered = false;
        Invalidate();
    }

    [System.ComponentModel.Bindable(true)]
    [System.ComponentModel.Browsable(true)]
    public override string Text { get => base.Text; set => base.Text = value; }

    protected override void OnTextChanged(EventArgs e)
    {
        base.OnTextChanged(e);
        Invalidate();
    }

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

        Graphics G = e.Graphics;
        G.SmoothingMode = SmoothingMode.HighQuality;
        G.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;

        SolidBrush bkBrush = IsMouseEntered ? new SolidBrush(Color.FromArgb(125, 170, 170, 170)) : new SolidBrush(Color.FromArgb(125, 45, 45, 45));

        Rectangle rec = new Rectangle(0, 0, Width - 1, Height - 1);

        G.FillRectangle(bkBrush, rec);

        SolidBrush txtBrush = new SolidBrush(ForeColor);
        StringFormat sf = new StringFormat() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center };

        G.DrawString(Text, Font, txtBrush, rec, sf);

        bkBrush.Dispose();
        txtBrush.Dispose();
        sf.Dispose();
    }
}

祝你好运。

【讨论】:

  • 谢谢!我什至没有听说过自定义控件或双缓冲,所以这对我很有帮助
【解决方案2】:

为了解决这个问题,我最终将 Panel 和 Label 替换为 Button,之前我不知道 Button 具有 opacity 属性,因此使用了 Panel 和 Label。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2021-12-11
    • 1970-01-01
    相关资源
    最近更新 更多