我的应用程序弹出一个表单作为主窗体的子窗口。在表格上是
使用面板的用户控件,其中呈现图形。执行时
从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
答案 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);
}
}