我有一个带有绘图处理程序的滚动条用户控件,我想知道是否有办法限制用户可以在滚动条上绘制的位置。例如,我只是不会在拇指滚动背景上绘制而在其他任何地方。
我目前的代码是这样的。
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是我希望允许用户绘制的位置。
答案 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
。所以你处于危险之中。