2009-08-25 56 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