3

レイヤー効果を作成するために、さまざまなオブジェクトによって描画される 1 つのウィンドウがあります (1 つのオブジェクトがコンパスを描画し、もう 1 つのオブジェクトがグリッド線を描画し、別のオブジェクトが高度計の読み取り値などを描画するヘッドアップ ディスプレイを考えてみてください)。そのため、各オブジェクトには描画先の黒いメモリ ビットマップがあります。そのオブジェクトの Draw 関数を呼び出すと、メモリ ビットマップがアプリケーション ウィンドウにブリットされます。メモリ ビットマップは最初はすべて黒で、オブジェクトはその上に描画されます。黒は透明色なのでマスキングしています。結果はオーバーレイ効果です。

そのため、blt() 関数の論理関数として OR を使用してきましたが、うまくいきました。しかし、前のレイヤーが白く塗られている場合、その上に描画するレイヤーが前のレイヤーの下にあるかのように見えることに気付きました。この効果が発生するのは白(っぽい)の色だけです。他のすべての色は正しくペイントされています (つまり、レイヤーは前のレイヤーの上にペイントされているように見えます)。誰もこの現象を見たことがありますか?

4

4 に答える 4

1

GDI を使用してからしばらく経ちましたが、BitBlt 関数について話していると思いますよね? 正確には何を ORing していますか? 私が思い出したように、BitBlt は送信元と送信先の HDC、四角形、およびいくつかのフラグを取得するだけです。

オーバーレイ効果を実現するために、ビットマップのビットを論理和していますか? OR 演算子は結合的かつ可換的であるため、これは機能しません。言い換えると、

a | b == b | a

(a | b) | c == a | (b | c)

つまり、OR の順序は結果に影響しません。オーバーレイ効果を得るには、各ビットマップを一度に 1 つずつブリットする必要があります。

これで問題が解決しない場合は、申し訳ありませんが、GDI を調べてから数年が経過しているため、質問を完全に誤解している可能性があります。

于 2009-06-08T18:45:46.510 に答える
0

なぜBitBltとORを気にするのですか?AlphaBlend()を使用するだけで、1バイトの透明度が得られます。

于 2009-06-10T12:15:55.653 に答える
0

やりたいことには 2 つのブリットが必要です。1 つはデスティネーション ビットマップの部分を (ピクセルごとの AND を使用して) マスクし、2 つ目はオーバーレイからデスティネーションへの色をピクセルごとに OR します。

これは手動で行います。オーバーレイ ビットマップからモノクロ マスクを作成する必要があります。透明部分は白、不透明部分は黒です。AND マスクとデスティネーション、OR 元のオーバーレイからのカラー データ。

screen AND mask OR overlay

また、これがフルスクリーンのものである場合は、ちらつきを避けるために、画面外のビットマップでコンポジションを行うことができます。

私自身は試したことはありませんが、Peter Ruderman の TransparentBlt を使用するという提案はおそらく良いものです。

于 2009-06-10T18:16:27.673 に答える