HDC がアルファチャンネルを使用しているかどうかを判断する方法はありますか? Question 333559とQuestion 685684を読みましたが、それらの質問は BITMAP に関するものです。どうやら、一部の HDC にはアルファ チャネルがあり (ただし、使用しない場合があります。これを「タイプ 1」と呼びます)、他の HDC にはありません (「タイプ 2」)。私は次のことを行うことでこれを知っています:
HDC を考えると、
互換性のある DC を作成し、DIB セクションを作成します。作成した HBITMAP を互換性のある DC に選択します。
ソース HDC を互換性のある DC に BitBlt します。ここで、DIB セクションのビットを調べます。タイプ 2 HDC の場合、3 バイトごとに常に 0 のバイトがあります (255 255 255 0 など)。タイプ 1 の場合、これらのバイトは通常 255 です (250 240 230 255 など)。誤検知を避けるために、呼び出しの前にビットをすべて 0x80 に memset します。
ソース HDC で直接 GetDIBits を使用し、HBITMAP を GetCurrentObject(hdc, OBJ_BITMAP) として指定します。どちらのタイプの HDC でも、4 番目のバイトは常に 0 です。
ExtTextOut を呼び出して DC ビットマップを変更します。タイプ 2 の場合、ExtTextOut は常に 4 番目のバイトを 0 に設定します。タイプ 1 の場合、ExtTextOut は常にそれらをそのままにします。
また、API (CreateCompatibleDC()、BeginPaint() ...) によって作成されるソース HDC が常にタイプ 2 であることにも気付きました。タイプ 1 HDC は標準コントロール (メニュー テキストなど) からのものです。タイプ 1 からの HDC I CreateCompatibleDC でさえ、タイプ 2 になります。
そのため、Microsoft が開発者に同等の情報を提供していないことに不満を感じている一方で (別の例として、作成された HBITMAP の方向がわからない場合もあります)、一方で、私はまだ疑問に思っています。これらの HDC を区別する方法があります。
手伝ってくれてありがとう。