winforms 在自定义控件中连续两次执行Mouse_Click事件不会在第二次执行时生效

ff29svar  于 2023-03-09  发布在  其他
关注(0)|答案(1)|浏览(229)

我在一个完全自定义的圆形按钮中添加了OnMouseClick。当我快速单击两次时,第二次单击事件不起作用。我想这可能是winform消息处理中的一些问题。下面是我的代码:

protected override void OnMouseClick(MouseEventArgs e)
{
    base.OnMouseClick(e);
    Point pt = e.Location;
    if (region.IsVisible(pt))
    {
        IsCheck = !IsCheck;
        if (IsCheck)
            ActivateChecked();//change the control color to red
        else
            ActivateCancel();//change the control color to green
    }
}

请帮帮我。
我尝试了双缓冲区和区域。可见的,把秒表计算运行时间。但我不是这个问题。但winform的原生按钮可以改变颜色的每一个点击。

wpcxdonn

wpcxdonn1#

据我所知,您创建了一个自定义圆形按钮,并希望它的颜色根据鼠标单击而改变,即使鼠标单击是快速连续发生的。要实现这一点,您可能希望尝试MouseDown事件,并使用BeginInvoke来发布颜色更改消息,而不阻塞队列中已经存在的鼠标事件。
为了测试,我做了 * 三 * 个颜色状态而不是两个,这样快速点击鼠标两次就会引起明确的变化,这将表明这是工作。换句话说,为了测试的目的,因为按钮开始是蓝色的,两次快速点击应循环通过红色状态并结束于绿色。(我将尝试使用“典型”实现重现您的用例,因为您还没有展示如何继承或实现您的自定义按钮。)

enum ColorState{ StateBlue, StateRed, StateGreen, }
class RoundButton : Button
{
    protected override void OnCreateControl()
    {
        base.OnCreateControl();
        BackColor = Color.CornflowerBlue;
        var region = new Region(new Rectangle(Point.Empty, ClientSize));
        Bitmap bitmap = new Bitmap(Width, Height);
        Graphics graphics = Graphics.FromImage(bitmap);
        graphics.FillEllipse(
            Brushes.LimeGreen, 
            new RectangleF(
                new PointF(4, 4), 
                new SizeF(bitmap.Width - 8, bitmap.Height - 8))
        );
        for (int x = 0; x < bitmap.Width; x++) for (int y = 0; y < bitmap.Height; y++)
            {
                Color pixel = bitmap.GetPixel(x, y);
                if (pixel.ToArgb() != Color.LimeGreen.ToArgb())
                { 
                    region.Exclude(new Rectangle(x, y, 1, 1));
                }
            }
        Region = region;
    }
    private ColorState _colorState;
    protected override void OnMouseDown(MouseEventArgs e)
    {
        base.OnMouseDown(e);
        BeginInvoke(new Action(() =>
        {
            _colorState = (ColorState)(((int)(_colorState + 1)) % 3);
            switch (_colorState)
            {
                case ColorState.StateBlue:
                    BackColor = Color.CornflowerBlue;
                    break;
                case ColorState.StateRed:
                    BackColor = Color.Red;
                    break;
                case ColorState.StateGreen:
                    BackColor = Color.Green;
                    break;
            }
        }));
    }
}

相关问题