2009-06-24 2 views
1

コードダンプすみません、これらは機能が.NETユーザーコントロールは:Sizeプロパティは

private void PNGQuantPreviewControl_Resize(object sender, EventArgs e) 
{ 
    createOffScreenBm(); 
    draw();   
} 
private void createOffScreenBm() 
{ 
    offScreenBm = new Bitmap(this.Size.Width, this.Size.Height); 
    offScreenGfx = Graphics.FromImage(offScreenBm); 
} 
private void draw() 
{ 
    // draw background 
    offScreenGfx.FillRectangle(transTexture, 0, 0, offScreenBm.Width, offScreenBm.Height); 
    // draw image preview 
    offScreenGfx.DrawImage(pngQuantPreview, getTopLeftPosition()); 
    // apply to picture box 
    this.CreateGraphics().DrawImage(offScreenBm, 0, 0); 
} 

ので、制御変化の大きさは、それが新しいを反映するためにオフスクリーンビットマップを再作成する場合、ユーザーコントロール内にあるResizeイベントに不正な値を与えますサイズを変更してイメージを再描画します。

ただし、コントロールのサイズをすばやく変更してもビットマップで埋められない場合は、右または下にギャップがあります。

私はかなりC#の新機能です。間違ったことをしているか、間違ったタイミングでサイズの値を読み込んでいる可能性があります。何か案は?

答えて

2

まず、OnPaintメソッドを上書きするか、Paintイベントを登録してそのすべてを描画する必要があります。

第2に、ダブルバッファリングのためにオフスクリーンビットマップを作成する必要はありません。この目的のために.netはすでに存在しているためです。BufferedGraphics

そして第三に、ユーザーコントロールdescedantを作成し、内部.NETダブルバッファリングを有効にするには、はるかに優れている、このような何か:このアプローチを使用して

public UserControl2 
{ 
    SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true); 
} 

あなたは、ダブルバッファリングを得るでしょう、そしてあなたが必要とするすべてはでありOnPaintメソッドでグラフィックスを描画します。このcontrol stylesについては、Msdnで詳しく読むことができます。

+0

多くのありがとうございます。私はSetStyleではなくDoubleBufferプロパティを使用しました。また、私は最初にOnPaintメソッドの一部として提供されているグラフィックスオブジェクトを使用することを認識しませんでした。 –

0

あなたのコントロールにスプリッタのようなものがありますか、またはMinSizeまたはMaxSizeが宣言されていますか?

1

あなたはOnPaintメソッドをオーバーライドし、そのメソッド内にコードを配置することを検討しましたか?これにより、理由にかかわらず、コントロールを再描画する必要があるときはいつでも描画コードが実行されます。

親コンテナのサイズ変更が完了するまで、resizeイベントは必ずしも待つ必要はありません。 resizeイベントが発生すると、新しいサイズ変更イベントをキャプチャする前にコードが終了するまで待たなければならないので、ウィンドウ/コントロールのサイズをすばやく変更しても、それをうまく維持することはできません。必ずしも最終的なコントロールの状態ではなく、イベントをキャプチャすることができました。もしそれが意味をなさないならば。

関連する問題