2009-08-25 55 views
3

我有一些奇怪的绘画文物,我希望有人可以帮我牵制。手工绘画问题

基本上我有一个左停靠的面板,应该有一个渐变的背景,一直没有正常工作。我已经改变了颜色调试

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(); 
} 

这样做的整体效果是我没有得到任何一个不错的纯色,或者一个漂亮的渐变填充,当我调整。

回答

3

我会建议创建自己的面板,从面板派生并将其放置在构造函数如下:

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

够公平的。奇迹般有效。我仍然不明白为什么最初的问题表现出来呢? – Ian 2009-08-25 11:07:29

+0

这是因为当你调整大小时,绘画事件不会被解雇。所以你需要用ResizeRedraw来强制它,其余的不是强制性的,而是用自己的小方法来帮助改进。之前表单的闪烁是因为您为表单设置了样式而不是面板。这是一个有趣的世界,手工绘画世界! – ThePower 2009-08-25 11:29:22

1

添加以下新(后InitializeComponents):

this.SetStyle(ControlStyles.ResizeRedraw, true); 

这是为了确保在调整大小的绘画。

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

+0

约瑟普。如果我添加这个,那么当我开始调整事物大小时,整个窗体似乎变得非常闪烁...... – Ian 2009-08-25 10:36:27

+0

您需要为面板添加它们。 – ThePower 2009-08-25 10:48:09