UpdateLayeredWindow()で透明にならない

[戻る]
KJ 2009/05/13(水) 00:07:04
また、UpdateLayeredWindow()に関する質問です。

アルファなしの画像ファイルを、ULW_COLORKEYを指定して透過したいのですが、
GDI+でロードした画像ファイルだとなぜか透過しません。

同じファイルをLoadImage()でロードした場合は、問題なく透過します。
何か設定が足りないのでしょうか・・・

まれに、GDI+でロードしても透過することがあります。
VisualStudioを終了していると、うまくいく確率が高い???

また、アルファ付きの画像をULW_ALPHAでUpdateLayeredWindow()した場合は、
GDI+でも問題なくロードします。


・コード片
CClientDC destDC(NULL);
CDC srcDC;
srcDC.CreateCompatibleDC(destDC);

// 画像ロード
Gdiplus::Bitmap* image = Gdiplus::Bitmap::FromFile(filename);
CBitmap bitmap;
image->GetHBITMAP(Gdiplus::Color(), &bitmap.m_hBitmap);
HBITMAP oldBitmap = srcDC.SelectBitmap(bitmap);

// レイヤード
BLENDFUNCTION bf = {0};
bf.BlendOp = AC_SRC_OVER;
bf.SourceConstantAlpha = 255;

CPoint srcPt(0, 0);
CSize size(image->GetWidth(), image->GetHeight());
COLORREF colorKey = 0; // 黒を透過したい

::UpdateLayeredWindow(m_hWnd, destDC, NULL, &size, srcDC, &srcPt, colorKey, &bf,
ULW_COLORKEY);


・環境
XP SP3
VC++ 2008 SP1
gdiplus.dll 5.1.3102.5581

仲澤@失業者 2009/05/13(水) 10:28:51
GDI+はあんま詳しくないですが・・・
 Gdiplus::Bitmap* image = Gdiplus::Bitmap::FromFile(filename,TRUE);
とすると、どうなりますか。

あと、CClientDCには自分のHWNDを渡したほうが吉かも。

KJ 2009/05/20(水) 00:20:19
> Gdiplus::Bitmap* image = Gdiplus::Bitmap::FromFile(filename,TRUE);
> あと、CClientDCには自分のHWNDを渡したほうが吉かも。

両方やってみましたが、ダメでした。

動いたり動かなかったりするあたり、どっかのパラメータが不定になっている気がするん
ですが・・・

GDI+を使わないという選択肢もあるのですが、通常のC++だけでJPGやPNGを読み込もうと
すると、GDI+くらいしか楽な手がないのです。

現状の対策は、GDI+でロードした後、BMPで保存してLoadImage()してます。

古いスレッドには追加発言できません。