また、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
GDI+はあんま詳しくないですが・・・
Gdiplus::Bitmap* image = Gdiplus::Bitmap::FromFile(filename,TRUE);
とすると、どうなりますか。
あと、CClientDCには自分のHWNDを渡したほうが吉かも。
> Gdiplus::Bitmap* image = Gdiplus::Bitmap::FromFile(filename,TRUE);
> あと、CClientDCには自分のHWNDを渡したほうが吉かも。
両方やってみましたが、ダメでした。
動いたり動かなかったりするあたり、どっかのパラメータが不定になっている気がするん
ですが・・・
GDI+を使わないという選択肢もあるのですが、通常のC++だけでJPGやPNGを読み込もうと
すると、GDI+くらいしか楽な手がないのです。
現状の対策は、GDI+でロードした後、BMPで保存してLoadImage()してます。