WindowsMobileのTodayプラグイン作成で嵌ったPNG透過描画関連。
・PNGを使えば透過情報を使える。 ・SHLoadImageFileはPNGを読み込める。 ・AlphaBlendで透過付き描画が出来る。 よし、簡単じゃん。 と思ったら甘かった。 トラップは ・SHLoadImageFileはPNGを読み込めるが、デバイスにあわせる仕様のため16ビットになってしまう。 ・AlphaBlendで必要とするのはアルファチャンネル付き32ビットビットマップ。 よってそのままじゃうまくいかない。 まあSHLoadDIBitmapって手もあるのかもしれないが、PNGのが作りやすし。
というわけでネットの海を探し回った結果。 めるもでらさんの所でやはり同じ問題にぶつかった記事を発見。 ちょっと変形してSHLoadImageFileと入れ替え可能な関数を作成。
HBITMAP IFLoadImageFile(const TCHAR *pszPath) { // interface 取得 IImagingFactory* pImageFactory= NULL; CoCreateInstance(CLSID_ImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_IImagingFactory, (LPVOID*)&pImageFactory);
// ファイル読み込み IImage* pImage= NULL; pImageFactory->CreateImageFromFile(pszPath, &pImage);
ImageInfo imgInfo; pImage->GetImageInfo(&imgInfo);
// ビットマップの作成 bool bAlpha = (imgInfo.PixelFormat & PIXFMTFLAG_ALPHA)? TRUE: FALSE; HDC hBmpDC = CreateCompatibleDC(NULL); HBITMAP hBmp = CreateBitmap(imgInfo.Width, imgInfo.Height, 1, (bAlpha)? 32 :24, NULL); SelectObject(hBmpDC, hBmp); RECT rcBitMap = { 0, 0, imgInfo.Width, imgInfo.Height}; pImage->Draw(hBmpDC, &rcBitMap, NULL);
// 解放 pImage->Release(); pImageFactory->Release(); DeleteDC(hBmpDC);
return hBmp; }
|