手动绘画问题

3
我遇到了一些奇怪的绘图问题,希望有人能够帮我找出问题所在。
基本上,我有一个左侧停靠的面板,应该有一个渐变背景,但一直无法正常工作。我已经更改了颜色以进行调试。 截图 http://img509.imageshack.us/img509/5650/18740614.png 该面板停靠在左侧,并且有一个透明控件(因此您可以看到沿边缘留下的红色小拐角,透明控件正确地绘制了背景颜色)。
然而,当我慢慢调整面板大小时,底部会留下红色线条,我认为应该被黄色填充覆盖。我使用的代码如下:
// Construction
sidePanel.Paint += new PaintEventHandler(OnPaint);

private void OnPaint(object sender, System.Windows.Forms.PaintEventArgs e)
{
   Panel pb = sender as Panel;
   PaintControl(pb.Width, pb.Height, sender, e, true);
}

private static void PaintControl(int width, int height, object sender, PaintEventArgs e, bool sidebar)
{
    Rectangle baseRectangle = new Rectangle(0, 0, width -1, height-1);

    using (LinearGradientBrush gradientBrush = new LinearGradientBrush(baseRectangle, WizardBaseForm.StartColour, WizardBaseForm.EndColour, 90))
    {
        e.Graphics.Clear(Color.Yellow);
        e.Graphics.DrawRectangle(Pens.Red, baseRectangle);
        e.Graphics.FillRectangle(Brushes.Yellow, baseRectangle);  
    }
}

protected override void OnResize(EventArgs e)
{
   base.OnResize(e);
   this.Invalidate();
}

这导致我在调整大小时无法得到漂亮的纯色或渐变填充效果。
2个回答

3
我建议您创建自己的面板,从面板中派生出它,并将以下内容放置在构造函数中:
  this.SetStyle(ControlStyles.AllPaintingInWmPaint 
              | ControlStyles.OptimizedDoubleBuffer
              | ControlStyles.ResizeRedraw 
              | ControlStyles.DoubleBuffer 
              | ControlStyles.UserPaint
              , true);

好的。运行得很好。不过我仍然不太明白为什么原始问题会出现呢? - Ian
这是因为在调整大小时,绘制事件没有被触发。因此,您需要使用ResizeRedraw强制执行它,其余部分并不强制,但可以以自己的方式帮助改进。之前窗体闪烁的原因是因为您设置了窗体而不是面板的样式。手动绘画的世界是一个有趣的世界! - Lloyd Powell

1

在InitializeComponents之后添加以下内容:

this.SetStyle(ControlStyles.ResizeRedraw, true);

这是为了确保在调整大小时进行绘制。

还有一些其他的样式可以尝试(如AllPaintingInWmPaint、UserPaint等),但是否应该设置取决于您的特定情况和您想要做什么。如果所有绘画都是在Paint事件中由您完成的,那么我会设置它们。


如果我添加这个,当我开始调整大小时整个表单似乎会变得非常闪烁... - Ian
你只需要为面板添加它们。 - Lloyd Powell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接