【问题标题】:Problem drawing graphics to user control将图形绘制到用户控件时出现问题
【发布时间】:2008-11-13 21:10:08
【问题描述】:
【问题讨论】:
标签:
visual-studio
graphics
user-controls
release-mode
【解决方案1】:
如果没有更多信息,我无法确定您看到行为差异的原因(我建议您看到相同的问题,因为您承认调试版本也不总是有效),但您可能会发现断点通常会“修复”绘画问题,因为切换回 Visual Studio 最终会使整个绘画表面无效,而不仅仅是一小部分。因此,您启动了应用程序并且它没有正确绘制,您在 Visual Studio 中打了一个断点,切换查看一些变量,返回到应用程序并正确绘制,因为 OnPaint 是使用正确的剪切矩形调用来重新绘制整个表面(通常也调用 OnPaintBackground,见下文)。
如果是这种情况,您应该能够通过最小化和恢复您的应用程序在发布版本中复制它。如果这“修复”了控件的显示,那么它可能是由您的绘制方法的问题引起的,假设它可能不是绘制整个控件。
您还可以查看 PaintBackground 以确保正确擦除控件的表面。您可能要离开旧显示器,然后在其上重新绘制,而不是从“新”画布开始。
根据您对正在发生的事情的描述以及重绘的方式,这些是我最好的建议。我需要一些更具体的细节(绘制代码、所发生情况的具体描述 - 控件是未绘制还是仅显示部分等)以提供更准确的帮助。
【解决方案2】:
我只是试了一下,它在发布模式下达到了我的预期。 . .它用蓝色和一个大黄色椭圆填充面板。请发布重现问题所需的最少示例代码。 . .也许在下面的 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);
}
}