C#的Invalidate不调用paint方法(C# Invalidate is not calli

2019-09-19 05:43发布

我有overrided到在屏幕上画出一个椭圆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函数(MessageBox中未显示)。

还有什么能这样做的可能的原因?

编辑:我忘了提,对孩子的形式(如添加使用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然后加入为主要形式的控制。

Answer 1:

呼叫UpdateInvalidateInvalidate重画,只有当它具有焦点,它可能没有被焦点,因为它被添加为形式TabControl孩子。

从MSDN文档 :

调用Invalidate方法不会强制同步漆; 强制同步油漆, 调用调用Invalidate方法后的更新方法 。 当调用此方法时不带参数,整个客户区被添加到更新区域。



Answer 2:

调用Invalidate上的控件将导致无效的部分或全部的它,说明它需要更新“某个时候”,但不会导致立即发生的更新。 调用Update会导致已无效立即重绘控制的任何部分。 调用Refresh将结合上述效果。 当系统处于空闲状态,它会要求其具有任何无效区域控制流程的更新。

Invalidate方法是在许多改变应该出现在什么控制的方法按顺序执行的情况下非常有用。 而不必重新绘制每次改变它的方法后的控制下,一个可具有改变控制无效那些需要再拉深部分的方法。 一旦所有可能改变控制方法已经完成,可以再使用Update重绘控制(如果有的话)已经失效的那些部分。 如果重绘控制将采取1/100秒,而一个需要在它执行50个操作,延迟和巩固的更新可能会让这似乎是实时更新的,并且其中一个需要半秒控制之间的区别。



Answer 3:

最主要的原因, OnPaint可能不会被称为是如果你的ControlStyle不包括UserPaint 。 我本来期望,如果你没有设置你提到这一点,所以我假设你没有。 在这种情况下,加入到呼叫SetStyle在构造函数。



文章来源: C# Invalidate is not calling paint method