手工绘画问题

时间:2009-08-25 10:29:39

标签: c# drawing

我有一些奇怪的绘画文物,我希望有人可以帮助我确定。

基本上我有一个左对接的面板应该有一个无法正常工作的渐变背景。我已经改变了调试的颜色

screenshot 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 个答案:

答案 0 :(得分:3)

我建议您创建自己的面板,从面板派生它并将以下内容放在构造函数中:

  this.SetStyle(ControlStyles.AllPaintingInWmPaint 
              | ControlStyles.OptimizedDoubleBuffer
              | ControlStyles.ResizeRedraw 
              | ControlStyles.DoubleBuffer 
              | ControlStyles.UserPaint
              , true);

答案 1 :(得分:1)

在New中添加以下内容(在InitializeComponents之后):

this.SetStyle(ControlStyles.ResizeRedraw, true);

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

您可以尝试其他几种样式(AllPaintingInWmPaint,UserPaint ...)但是否应该设置它们取决于您的具体情况以及您想要做什么。如果您在Paint事件中完成所有绘画,我会设置它们。