限制绘制事件处理程序

本文关键字:程序 事件处理 绘制 | 更新日期: 2023-09-27 18:17:31

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

我当前的代码是这样的

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

其中矩形是我想让用户绘制的位置

限制绘制事件处理程序

在引发paintEvent之前使用Graphics.SetClip(clipRectangle)方法,并在其之后调用ResetClip。如果你需要一个非矩形区域作为剪辑,你可以使用图形。剪辑财产。

你的代码变成:

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。所以你有风险