1

私はテクスチャブリットとその上にあるgdi描画を組み合わせようとしています(

    void draw()
    {
     StretchDIBits(hdc, 0, 0, CLIENT_X, CLIENT_Y, 0, 0, BUF_X, BUF_Y, buffer, &bmi,    DIB_RGB_COLORS, SRCCOPY);
     TextOut(hdc, 10, 10, "Hello World", 11);
    }

hdcは、セットアップ時にGetDCによって一度だけ実行されますが、おそらく問題ありません。上記のように、私は1秒間に100回アイドルループで実行し、OnPainメッセージからも実行します。TextOutの結果が点滅するだけなので、これはうまく機能していません。残りはすべて問題ありません。この点滅を削除して安定したTextOutの結果を取得する方法について、誰かにアドバイスを教えてもらえますか?多くのtnx

4

2 に答える 2

3

まばたきを避けるために「ダブルバッファ」が必要です。

メモリDCを作成し、このメモリDCでCreateCompatibleDC作成された適切なサイズのビットマップを選択しCreateCompatibleBitmap、ペイントします。

写真の準備ができたらBitBlt、ウィンドウDCに表示します。

于 2012-11-17T19:27:46.877 に答える
1

これは当然です。DCにDIBを描画します。そしてすぐに、その境界の長方形がで使用されているものと重なるように(おそらく)配置されたテキストを描画しますStretchDIBits

簡単に言えば、あなたは何かを描き、次に同じ場所に何か他のものを描きます。これが点滅します。他に何を期待しましたか?

点滅を避けるために、いわゆるダブルバッファリングを使用する必要があります。これの意味は:

  1. 適切なサイズのビットマップを作成します。
  2. DC(いわゆるメモリDC)を作成します
  3. このビットマップを選択します。
  4. このDC(最初に取得したものではない)にDIBを描画します。
  5. テキストを描きます。
  6. 最後に、を使用BitBltして画像をビットマップから最初のDCに転送します。
  7. 物事をクリーンアップすることを忘れないでください:DeleteObjectDIBDeleteDC用、メモリDC用。

オプションで、何かを描画する必要があるたびにビットマップを作成する代わりに、ビットマップを保持することができます。パフォーマンスの観点からは優れています。実行StretchXXXXが重いことに加えて、ビットマップから画面に描画する方が、DIBを描画するよりもはるかに高速です(ビデオカードが2Dアクセラレーションをサポートしていると仮定)。

于 2012-11-17T19:33:34.383 に答える