UpdateLayeredWindow()で透明にならない – プログラミング – Home

通知
すべてクリア

UpdateLayeredWindow()で透明にならない


KJ
 KJ
(@KJ)
ゲスト
結合: 21年前
投稿: 52
Topic starter  

また、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


引用解決済
トピックタグ
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 5年前
投稿: 828
 

GDI+はあんま詳しくないですが・・・
 Gdiplus::Bitmap* image = Gdiplus::Bitmap::FromFile(filename,TRUE);
とすると、どうなりますか。

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


返信引用
KJ
 KJ
(@KJ)
ゲスト
結合: 21年前
投稿: 52
Topic starter  

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

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

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

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました