当鼠标悬停在该特定区域上时,如何为列表中的一个矩形填充不同的颜色?

Posted

技术标签:

【中文标题】当鼠标悬停在该特定区域上时,如何为列表中的一个矩形填充不同的颜色?【英文标题】:How to fill different color for one of my rectangle from my list when the mouse is hover on that particular area? 【发布时间】:2015-11-18 13:36:31 【问题描述】:

如果鼠标悬停在矩形区域上,我有矩形列表,我想更改鼠标坐标所在矩形的颜色。我已经这样做了,但是颜色变化不够快。下面的方法选择它是哪个矩形。

    void OnMouseMoveOnTheRectangles(MouseEventArgs e)
    
        RectangleF[] allRectangles = new RectangleF[aListDrawings.Count];
        aListDrawings.CopyTo(allRectangles);

        if (allRectangles.Length == 0)
            return;
        RectangleF currentSelected = RectangleF.Empty;

        foreach (RectangleF rec in allRectangles)
        
            RectangleF current = GetOffsetRectangle(rec);

            if (current.Contains(e.Location))
            
                _currentActive = current;
                break;
            

        

    

这是我的 RedDraw 函数,你可以调用它

    protected virtual void DrawSelection(PaintEventArgs e, RectangleF[] sRegion, 
        SolidBrush _brush)
    
        if (sRegion.Length == 0)
            return;
        e.Graphics.SetClip(this.GetInsideViewPort(true));
        RectangleF[] offsetRectangles = new RectangleF[sRegion.Length]; 
        int x = 0;
        foreach (RectangleF r in sRegion)
                        
            offsetRectangles[x] = this.GetOffsetRectangle(r);

            x++;
        
        using (Brush brush = _brush)
        
            e.Graphics.FillRectangles(brush, offsetRectangles);
        

        //This is where i color i tried to change the color for that particular rectangle
        if (_currentActive != RectangleF.Empty)
        
            e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(0x90, Color.Red)),
                    _currentActive);
        


        using (Pen pen = new Pen(this.SelectionColor))
        
            e.Graphics.DrawRectangles(pen, offsetRectangles);
        

        e.Graphics.ResetClip();
    

【问题讨论】:

“不够快”如何显示?闪烁?你有多少个长方形?你用什么类型的控件来绘制它们?你使用双缓冲控件吗?您是否通过 MouseMove 中的 Invalidate 从 Paint 中调用重绘?是否检查是否有必要,即当前矩形是否已更改? 旁注:_currentActive 永远不会重置为空矩形。 我没有看到任何代码会在鼠标移动时启动重绘。请提供可靠地重现您的问题的a good, minimal, complete code example。 @taw 速度不可预测。它不闪烁。我可能有多个它是动态的。该控件是基于 Control 类的自定义控件。我不使用双缓冲。是的,我从油漆中调用重绘,但不是通过 mousmove 上的 Invalidate。如果我单击或移动太多,或者我最小化和最大化,当前矩形会发生变化 所以重绘滞后于您的鼠标移动? - 是的,我从油漆中调用重绘,但不是通过 mousmove 上的 Invalidate 来调用那么您何时以及如何触发油漆? 【参考方案1】:

就像@TaW 所说的那样,Invalidate 函数可以解决问题。它将在适当的时间触发 Paint 事件,并且您的图形将被更新。找到无效的任何控制元素都有它。因此,您可以使用画布控件下的 invalidate 方法。

【讨论】:

以上是关于当鼠标悬停在该特定区域上时,如何为列表中的一个矩形填充不同的颜色?的主要内容,如果未能解决你的问题,请参考以下文章

当鼠标悬停在控件的指定区域时如何更改鼠标光标?使用 c#

图像轮播中的双“活动”类

svg中线性渐变颜色的悬停事件

QML:鼠标区域重叠的问题

将鼠标悬停在 li 上时如何更改所有字体颜色

将鼠标悬停在菜单上时,将焦点从下拉列表设置到窗口