限制绘制事件处理程序

时间:2014-08-11 13:32:39

标签: c# events user-controls handler paint

我有一个带有绘图处理程序的滚动条用户控件,我想知道是否有办法限制用户可以在滚动条上绘制的位置。例如,我只是不会在拇指滚动背景上绘制而在其他任何地方。

我目前的代码是这样的。

public event PaintEventHandler paintEvent = null;
protected override void OnPaint(PaintEventArgs e)
{          
      //---------------other code------------------  
    if (this.paintEvent != null)
        this.paintEvent(this, new PaintEventArgs(e.Graphics, new Rectangle(1, UpArrowImage.Height, this.Width - 2, (this.Height - DownArrowImage.Height - UpArrowImage.Height))));   
     //----------------other code------------------
}

Rectangle是我希望允许用户绘制的位置。

1 个答案:

答案 0 :(得分:1)

在引发paintEvent之前使用Graphics.SetClip(clipRectangle)方法并在其后面调用ResetClip。如果您需要非矩形区域作为剪辑,则可以使用Graphics.Clip属性。

您的代码变为:

protected override void OnPaint(PaintEventArgs e)
{
    var tempEvent = this.paintEvent;//To avoid race
    if (tempEvent != null)
    {
        e.Graphics.SetClip(clipRectangle);
        try
        {
            tempEvent(this, new PaintEventArgs(e.Graphics, new Rectangle(1, UpArrowImage.Height, this.Width - 2, (this.Height - DownArrowImage.Height - UpArrowImage.Height))));   
        }
        finally
        {
            e.Graphics.ResetClip();
        }
    }    
}

通过这种方式,如果用户超出指定的clipRectangle,它将被剪裁而不是被绘制。

尽管如此,如果用户很聪明,他可以通过自己的电话拨打ResetClip。所以你处于危险之中。