ディスクから画像をロードするために使用するコードは次のとおりです。
// BMP, GIF, JPEG, PNG, TIFF, Exif, WMF, and EMF
HBITMAP mLoadImg(WCHAR *szFilename)
{
HBITMAP result=NULL;
Gdiplus::Bitmap* bitmap = new Gdiplus::Bitmap(szFilename,false);
bitmap->GetHBITMAP(NULL, &result);
delete bitmap;
return result;
}
編集:
いくつかの基本的な機能を除いて、GDI+ を自分で使用しないでください。画像を使用するときはいつでも、可能な限り最小で最速のコードが必要です.GDIはこの仕事をうまくやってくれます.
そして、クラス変数のあいまいさを (できれば) 回避するために、透明なピクセルを含む画像を表示するクラスから切り取ったコードを次に示します。これにはクラス定義が含まれています。
void CStaticImg::displayImage()
{
RECT myRect;
BITMAP bm;
HDC screenDC, memDC;
HBITMAP oldBmp;
BLENDFUNCTION bf;
GetObject(mBmp, sizeof(bm), &bm);
bf.BlendOp = AC_SRC_OVER;
bf.BlendFlags = 0;
bf.SourceConstantAlpha = 0xff;
bf.AlphaFormat = AC_SRC_ALPHA;
screenDC = GetDC(mHwnd);
GetClientRect(mHwnd, &myRect);
if (mBmp == NULL)
FillRect(screenDC, &myRect, WHITE_BRUSH);
else
{
memDC = CreateCompatibleDC(screenDC);
oldBmp = (HBITMAP)SelectObject(memDC, mBmp);
AlphaBlend (screenDC, 0, 0, myRect.right,myRect.bottom, memDC, 0, 0, bm.bmWidth,bm.bmHeight, bf);
SelectObject(memDC, oldBmp);
DeleteDC(memDC);
ReleaseDC(mHwnd, screenDC);
}
}
class CStaticImg
{
public:
CStaticImg();
~CStaticImg();
void setImg(HBITMAP img);
HBITMAP getImgCopy();
void attach(HWND tgt);
void detach();
void setBkMode(bool transparent);
protected:
HWND mHwnd;
HBITMAP mBmp;
WNDPROC mOldWndProc;
void displayImage();
virtual LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
bool isBkgTransparent;
private:
// virtual LRESULT onPaint();
LRESULT onCreate();
static CStaticImg *GetObjectFromWindow(HWND hWnd);
static LRESULT CALLBACK stWinMsgHandler(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
};