移动对话框时,modaldialog下的自定义控件不会重新绘制

这是什么原因? 其他控件显示正常...

    public CustomControl()
    {
        SetStyle(ControlStyles.ResizeRedraw, true);
        SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
        SetStyle(ControlStyles.UserPaint, true);
    }

customcontrol放置在TableLayoutPanel中。

...................

编辑:澄清:假设你有一个窗口大小的控件,顶部有一个小模式对话框。 当你移动对话窗口时,它就像你的绘画和控件上的窗口一样(边框被绘制在控件上)。 控件不会像其他控件一样重新绘制,例如montcalendar或其他自定义控件。 我似乎无法找到这个原因?

绘画神器小细节:


很难从片段中看出来。 标准的错误是通过Control.CreateGraphics()绘制而不是OnPaint()方法。 无法工作,Windows在发现部分控件时让OnPaint方法运行。 无论你画的是什么,都会抹去。 另一种失败模式是从一​​个控制器派生出来的,这个控制器是一个本地Window控件的包装器。 这些类型的控件不支持UserPaint,本机Windows代码必须执行该绘图。


从屏幕截图中可以清楚地看到文本是如何交错的。 这是因为OnPaint()覆盖使用e.ClipRectangle属性来确定绘制位置。 当你慢慢地在控件上拖动一个窗口时,该值总是会改变,它只会告诉你需要重新绘制哪部分控件。 它不会告诉你在哪里画。 这必须基于控件边界,通常是从(0,0)到(ClientSize.Width,ClientSize.Height)的矩形。

只有使用e.ClipRectangle才能优化绘图。 像在剪切矩形外部跳过昂贵的绘图细节。 否则是小的,Windows已经相当擅长自动裁剪。

链接地址: http://www.djcxy.com/p/50301.html

上一篇: Custom control under modaldialog not repainting when moving dialog

下一篇: GDI+ double buffering in C++