События MouseEnter и MouseLeave кажутся медленными - PullRequest
0 голосов
/ 12 октября 2019

Когда я пытаюсь изменить цвет фона Панели и Ярлыка, они, кажется, изменяются немного медленнее, чем друг друга.
Несмотря на то, что они оба настроены на изменение при Вводе / выходе из Панели и Ярлыка, я могузаметьте только половину секунды разницы при смене.

Кто-нибудь знает, как я могу заставить их обоих меняться в одно и то же время независимо от того, наведена ли мышь на какую-либо из них?

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;
}

Вот пример того, что он делает. Пример

Ответы [ 2 ]

0 голосов
/ 13 октября 2019

Я думаю, вы будете продолжать мерцать из-за фонового изображения / рисунка родительского контейнера, как я вижу из вашего примера . Пожалуйста, рассмотрите возможность использования элементов управления с двойной буферизацией через подклассы, чтобы уменьшить это мерцание.

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

Поскольку вы пытаетесь создать красивый графический интерфейс как таковой, могу ли я предложить создать пользовательский элемент управления, который объединяет панель и меткуи поддерживает двойную буферизацию.

Пример:

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();
    }
}

Удачи.

0 голосов
/ 13 октября 2019

Чтобы решить эту проблему, я в итоге заменил панель и метку на кнопку, ранее я не знал, что у кнопки есть свойство непрозрачности, и я прибегал к использованию панели и метки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...