2

Cairo を使用して、古い Windows 95 MFC コードを C++11 に変換するプロジェクトに取り組んでいます。私は MFC に詳しくないので、元のプログラムで描画するためのさまざまな座標空間について混乱しており、これらの機能を説明する情報や例を見つけるのは困難です。

だからここに私が見ているものがあります。コードでは、ある時点で、CreateCompatibleDC を使用して作成されている新しい CDC デバイス コンテキストがあるようです。続いて、ビットマップ オブジェクトが作成されます。このビットマップは、SelectObject 関数を使用して新しいデバイス コンテキストに設定されます。私が収集できることから、これは DDB デバイス依存のビットマップです。

例えば:

    bmp_dc = new CDC();
    bmp_dc->CreateCompatibleDC(NULL);

    int num_bits_per_pixel = bmp_dc->GetDeviceCaps(NUMBITSPIXEL);
    int num_planes = bmp_dc->GetDeviceCaps(NUMPLANES);
    c_bmp = new CBitmap();
    c_bmp->CreateBitmap(width, height,num_planes,num_bits_per_pixel,NULL);

    bmp_dc->SelectObject(c_bmp);

この新しいデバイス コンテキストは、それを使用して描画操作を実行する多くのクラスに渡されます (bmp_dc->MoveTo()、LineTo、Ellipse など)。私の質問は、そのデバイス コンテキストを使用するこれらすべての描画操作は、表示画面ではなくビットマップに直接描画されるのでしょうか? また、ビットマップの左上隅を原点として描画するのでしょうか?

後で発生する BitBlt 関数呼び出しが多数あることに気付きました。表示画面の座標を使用して、実際の表示画面にビットマップを描画していると思います。しかし、私は本当に確信が持てず、明確化を望んでいました。ありがとう!

4

1 に答える 1

2

完璧に理解できたようですね!

このコードはCreateCompatibleDC、物理ディスプレイと同じ形式のメモリ DC を作成するために使用します (引数として NULL を渡します。これは、dektop DC を使用することを意味します)。次に、ビットマップに描画するには、あなたが言ったように、を使用してビットマップをメモリ DC に選択する必要がありますSelectObject

次に、DCへの描画は、実際にはメモリDCの「内部」のビットマップに描画されます。

最後に、BitBltビットマップの内容を (メモリ DC から) ディスプレイ デバイスに表示できます。これは、表示中のちらつきを避けるためのダブルバッファ描画の古典的な実装です。

描画コマンドはすべて同じ座標系を使用します。左上が原点 (0,0) です。

これに矛盾する何かが起こっていますか?もしそうなら、おそらくもう少しコードを投稿できます。

于 2013-05-09T19:20:08.567 に答える