问题是将图形绘制到用户控制

时间:2008-11-13 21:10:09

标签: visual-studio graphics user-controls release-mode

我的应用程序弹出一个表单作为主窗体的子窗口。在表格上是
使用面板的用户控件,其中呈现图形。执行时 从Visual Studio调试模式中,绘图通常按预期呈现, 想象一下简单的XY图。如果未绘制面板的图形,则添加 绘图程序的两个或三个断点通常可以解决问题。

在发布模式下在Visual Studio内执行,或在任何模式下从该执行时, 尽管用户控件的Paint方法是,但图形永远不会呈现 调用。调整表单大小会导致再次调用重绘,当然, 现在可以正确渲染图像。

任何人都可以给我一些见解,了解为什么行为有所不同 在调试模式和释放模式之间,从VS和VS外部执行, 任何为什么破发点有时会修复东西?我怎么能得到 图形始终可见。

谢谢,

瑞克

alt text http://img160.imageshack.us/my.php?image=profilebeforeresizeti4.png alt text http://img512.imageshack.us/my.php?image=profileafterresizenw2.png

2 个答案:

答案 0 :(得分:1)

没有更多信息我无法确定为什么你会看到行为的差异(我建议你看到同样的问题,因为你承认调试版本并不总是有用),但你可能会发现断点通常会“修复”绘制问题,因为切换回Visual Studio最终会使整个绘画表面无效,而不是只是一小部分。所以你调出应用程序并且它没有正确绘制,你在visual studio中找到一个断点,切换看一些变量,回到应用程序并正确绘制,因为OnPaint被调用了正确的剪切矩形来重绘整个表面(通常也会调用OnPaintBackground,见下文)。

如果是这种情况,您应该能够通过最小化和恢复应用程序在发布版本中复制它。如果“修复”了你的控件的显示,那么很可能是因为你的paint方法有问题,假设它正在绘制整个控件时可能没有。

您也可以查看PaintBackground以确保正确擦除控件的表面。您可能正在离开旧显示器,然后在其上重新绘制,而不是从“新鲜”画布开始。

根据您对正在发生的事情的描述以及重绘方式,这些是我最好的建议。我需要一些更具体的细节(油漆代码,发生的具体描述 - 未绘制的控件或仅显示零件等)以提供更准确的帮助。

答案 1 :(得分:1)

我只是给了它一个旋转,它做了我在发布模式下的预期。 。 。它用蓝色和大黄色椭圆填充面板。请发布重现问题所需的最少量示例代码。 。 。也许在下面建立MyPanel。

计时器的作用是确保我们不会经常重绘。它是一个自动终止计时器,强制重新整理整个控件。这是必需的,因为自定义绘制的内容与控件一起调整。

   public class MyPanel : Panel
    {
        Timer _resizeRedrawDelayTimer = new Timer();
        public MyPanel()
        {
            _resizeRedrawDelayTimer.Interval=50;
            _resizeRedrawDelayTimer.Tick += new EventHandler(_resizeRedrawDelayTimer_Tick);
        }

        void _resizeRedrawDelayTimer_Tick(object sender, EventArgs e)
        {
            Invalidate();
            _resizeRedrawDelayTimer.Stop();
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            // don't redraw if still resizing.
            if (!_resizeRedrawDelayTimer.Enabled)
            {
                e.Graphics.FillRectangle(Brushes.Blue, this.ClientRectangle);
                e.Graphics.FillEllipse(Brushes.Yellow, this.ClientRectangle);
            }
            base.OnPaint(e);
        }

        protected override void OnResize(EventArgs eventargs)
        {
            if (_resizeRedrawDelayTimer.Enabled)
                _resizeRedrawDelayTimer.Stop();
            // restart the timer.
            _resizeRedrawDelayTimer.Start();
            base.OnResize(eventargs);
        }
    }