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

+0

サイズ変更時に、ペイントイベントが発生しないためです。だからあなたはResizeRedrawで強制する必要があり、残りは強制的なものではなく、自分の小さな方法で改善を助ける。以前はフォームのちらつきは、パネルではなくフォームのスタイルを設定していたためです。それは楽しい世界、手動の絵画世界です! – ThePower

1

は(InitializeComponents後の)新に以下を追加します。

this.SetStyle(ControlStyles.ResizeRedraw, true); 

これは、サイズ変更に絵を確保することです。

(AllPaintingInWmPaint、UserPaint ...)試してみることができる追加のスタイルはほとんどありませんが、設定する必要があるかどうかは、特定のケースと正確に何をしたいかによって決まります。すべてのペインティングがPaintイベントであなたによって行われた場合、私はそれらを設定します。私はあなた自身のパネルを作成することをお勧め

+0

ヨシップを。私がこれを追加すると、フォームのサイズ変更を始めるときにフォーム全体が非常にちらつくように見える... – Ian

+0

パネルのためだけに追加する必要があります。 – ThePower