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

时间:2011-01-07 15:47:06

标签: c# .net gdi+

是什么原因引起的?其他控件显示得很好......

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

customcontrol放在TableLayoutPanel中。

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

编辑:澄清: 假设您有一个窗口大小的控件,顶部有一个小模式对话框。当您移动对话框窗口时,它就像您使用控件上的窗口绘制(边框在控件上绘制)。控件不像其他控件那样在同一表单上重新绘制,即montcalendar或其他自定义控件。我似乎无法找到原因?

绘图工件的细节:

alt text

1 个答案:

答案 0 :(得分:2)

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


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

仅使用e.ClipRectangle优化绘图。就像在裁剪矩形之外跳过昂贵的绘图细节一样。它本来是一个小的,Windows已经非常擅长自动裁剪。