2

ウィンドウが階層化されていないため、クライアント領域に透明な背景が黒く描画されているアプリケーションがあります。それぞれのWM_PAINTメッセージで、メモリDCに対してBitBltを実行しています。その後、レイヤードキャンバスウィンドウに対してUpdateLayeredWindowでメモリDCを使用します。

メモリのセットアップ-DC:

HDC hdcMemory = CreateCompatibleDC(NULL);
HBITMAP bmpMemory = CreateDIBSection(hdcMemory, (BITMAPINFO*)&m_BitmapInfoHeader,
DIB_RGB_COLORS, (void **)&m_pDIBSectionBits, NULL, (DWORD)0);
SelectObject(hdcMemory, bmpMemory);

WM_PAINTでは、BitBlt関数を使用して、アプリのクライアント領域のDC情報をメモリDCにコピーします。その後、memory-DCを使用してレイヤードキャンバスウィンドウDC(CWnd)に対してUpdateLayeredWindowを実行しています。つまり、リアルタイムであり、結果は次のようになります。不規則な形状とピクセルごとの透明度に加えて、通常のアプリケーションウィンドウとレイヤードウィンドウがあります。

32ビットデスクトップの色深度ですべてが正常に機能します。16ビットに切り替えると、レイヤードキャンバスウィンドウがめちゃくちゃになります。描画が悪く見え、ウィンドウ全体がクリックできます。

アルファチャネル情報が不足しているためだと思います。

だから私は解決策をたくさんググった。この状況では、メモリDCを作成する必要があることがわかりました。

HDC hdcMemory = CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);

CreateCompatibleDC(NULL)の代わりに。互換性のあるDCは16ビットDCを提供するからです。

CreateDCを使用すると描画が向上します。ただし、ウィンドウ全体はクリックスルー可能であり、レイヤードウィンドウでは透明度が黒く描画されます。

したがって、問題はCreateDIBSectionのBitBltまたはBitmapInfoHeaderにあると思います。

  1. BitmapInfoHeader.biBitCount=32またはBitmapInfoHeader.biBitCount=16ビットのどちらを使用するかわかりません。32だと思います。biCompression->BI_RGBまたはBI_BITFIELDSはどうですか?

  2. UpdateLayeredWindowで動作するように、16ビットDCをメモリDCにBitBlt(...、SRCCOPY)した後、アルファチャネル情報をメモリDCに追加するにはどうすればよいですか?(たぶん:rgbチャネルをalphaチャネルで事前に乗算しますか?)Dunnoの方法。


16ビットデスクトップの色深度の問題に少し近づきました。

HDC hdcMemory = CreateCompatibleDC(NULL);

上記はうまくいくようです。しかし、UpdateLayeredWindow関数が生成する結果は乱雑に見えます。

だから、これは黒い色が欠けているからです!完全に黒だったすべてのピクセルが透明になります。透けてクリックすることもできます。他のすべてのピクセルは黒い部分を失い、クリックスルーするだけです。

テストを行いました。WindowsPaint.exeを開き、ウィンドウの幅と高さの表面を塗りつぶした色として黒にしました。

次に、それをレイヤードウィンドウ(黒色が欠落している)の下に置き、レイヤードウィンドウを再び元のウィンドウとして使用しました。ta-da、レイヤードウィンドウは、Paint.exeの黒いピクセルを通して輝くことと組み合わせて正常に見えます。

そのため、BitBltで期限切れになり、そのラスター操作パラメーターが再び有効になりました。しかし、運はありません。

UpdateLayeredWindowで描画する前に、BitBltを使用して黒色をDCにブレンドするにはどうすればよいですか?

4

1 に答える 1

0

ここを見てください: http://msdn.microsoft.com/en-us/library/aa453651.aspx これはラスター操作の問題であると確信しています。

于 2010-08-11T18:36:08.687 に答える