我用OnPaint方法覆盖了在屏幕上绘制椭圆。
protected override void OnPaint(PaintEventArgs e)
{
MessageBox.Show("Paint");
if (debugStarted)
{
int y = rtbLogicCode.PlaceToPoint(new Place(0, debugLine)).Y;
if (rtbLogicCode.GetVisibleState(debugLine).ToString() == "Visible")
{
e.Graphics.FillEllipse(new LinearGradientBrush(new Rectangle(0, y, 15, 15), Color.LightPink, Color.Red, 45), 0, y, 15, 15);
}
base.OnPaint(e);
}
}
private void rtbLogicCode_Scroll(object sender, ScrollEventArgs e)
{
this.Invalidate();
}
滚动事件(在Richtextbox上)被正确处理但是即使我使表单无效,它也没有调用OnPaint函数(消息框没有显示)。
可能的原因是什么?
编辑:我忘了在子窗体的初始化函数中添加(使用MDI属性添加为主窗体的控件),我设置了以下样式:
private void LogicCodeInit()
{
this.SetStyle(ControlStyles.DoubleBuffer, true);
this.SetStyle(ControlStyles.ResizeRedraw, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.UserPaint, true);
}
Edit2:我也忘了提到将子窗体添加为TabControl的控件。然后将TabControl添加为主窗体的控件。
答案 0 :(得分:11)
Update
后致电Invalidate
。 Invalidate
只有在有焦点的情况下才重新绘制表单,因为它被添加为TabControl
孩子,所以可能无法获得焦点。
调用Invalidate方法不会强制执行同步绘制;要强制执行同步绘制,在调用Invalidate方法后调用Update方法。如果在没有参数的情况下调用此方法,则会将整个客户区添加到更新区域。
答案 1 :(得分:1)
在控件上调用Invalidate
将导致部分或全部失效,表明需要“更新”某段时间,但不会立即发生更新。调用Update
将导致控件的任何已失效的部分立即重绘。调用Refresh
将结合上述效果。只要系统处于空闲状态,它就会调用具有任何无效区域的控件的进程更新。
Invalidate
方法在按顺序执行许多更改控件上应显示内容的方法的情况下非常有用。在改变控件的每个方法之后,不必重新绘制控件,可以使用更改控件的方法使那些需要重绘的部分无效。一旦完成了可能更改控件的所有方法,就可以使用Update
重绘已失效的控件(如果有)的那些部分。如果重新绘制控件需要1/100秒,并且需要对其执行50次操作,则推迟和合并更新可能会使控件看起来立即更新,并且需要半秒钟。
答案 2 :(得分:0)
如果您的OnPaint
不包含ControlStyle
,则可能无法调用UserPaint
的主要原因。如果你确实设置了我,我本以为你会提到这个,所以我假设你没有。在这种情况下,请在构造函数中添加对SetStyle
的调用。