2011-07-21 25 views
0
protected override void OnPaint(PaintEventArgs e) 
{ 
     Win32Helper.StretchBlt(this.Handle, 0, 0, 200, 300,bitmap.GetHbitmap(), 0, 0, bitmap.Width, bitmap.Height, Win32Helper.TernaryRasterOperations.SRCCOPY); 
     this.CreateGraphics().DrawRectangle(new Pen(Color.Black), 0, 0, 100, 100);   

    base.OnPaint(e); 
} 

長方形が描かれている..しかし、ビットマップイマイチ...私はpicturebox1.Image=bitmap設定していると...任意のアイデアはどのような私が間違っているの空のようにビットマップイマイチに動作しますか? 私はコンパクトなフレームワークです。StrechBlt doesntの仕事

答えて

1

"this.Handle"とは何か分かりませんが、DCのハンドルではないかもしれません。また、ペンとグラフィックスオブジェクトを作成するたびにリソースが漏れている可能性があります。 (ガベージコレクタは最終的にそれをリリースしますが、これらのハンドルを残しておくのは良い考えではありません)。いずれにしても、StretchBltをサンクするのではなく、Graphicsオブジェクト自体を使用してイメージblitを実行できます。私はHDCを使用して波平

protected override void OnPaint(PaintEventArgs e) 
    { 
     System.Drawing.Graphics g = e.Graphics; // or call your CreateGraphics function 
     Pen p = new Pen(Color.Black); 

     g.DrawImage(bitmap, 0, 0, 200, 300); 
     g.DrawRectangle(p, 0, 0, 100, 100);   

     // cleanup 
     p.Dispose(); 
     // g.Dispose(); Call g.dispose if you allocated it and it didn't come from the PaintEventArgs parameter 

     base.OnPaint(e); 
    } 
+0

... APIのパフォーマンスdoesntの対のdrawImageを使用すると、ウィンドウのDCを使用する場合は、*かもしれない*代わりにPaintEventArgsのから1の柄PERFに若干のバンプを取得 – GorillaApe

+1

大幅なパフォーマンスの差を有しています。 HDCがGraphicsオブジェクトにバインドされているのは、更新が必要でない領域を「クリッピング」するためです。しかし、頻度やアプリのペイントルーチンに対する要求によっては、重要ではないかもしれません。 – selbie

関連する問題