OrangeMaker_logo
memo アイコン SDK-MFC 備忘録

Windows SDKやMFCに関するメモです。
(記載内容について正しいことを保証するものではありません。MSDN等で確認してください)

CImageアラカルト

作成:2009/9/20

 mfcにはCImageという非常に便利なクラスがあります。このクラスの実装に関するちょっとしたメモです。

1)Create方法

 CImageのCreate方法は様々な方法があるが最も簡単なのは、サイズと1pxのビット数を指定する方法です。

 CImage Image;
    :::::
 BOOL ret = Image.Create(100, 50, 16);

    上記は、幅100px,高さ50pxの16bitカラーのCImageオブジェクトを作成しています。

2)CDCを取得する。

 CImageのオブジェクトからHDCの取得は、GetDC()関数で取り出します。ただmfcではCDCの方が何かと便利なので、さらにCDCに変換してやると便利です。

CDC* pDC = CDC::FromHandle(Image.GetDC());


//描画を行う。
pDC->Rectangle(0, 40, 100, 50);

Image.ReleaseDC();//必ず開放する事!
//GetDC()を行ったときは必ずReleaseDC()で開放する必要があります。
		

3)CBitmapを取得する

 CDCの場合と同様にCImageから直接取得できるのHBITMAPです。これをCBitmapに変換したほうが何かと便利です。

CBitmap* pBitmap = CBitmap::FromHandle((HBITMAP)Image);
		

4)その他

 CImageはGDI+の機能を使用していますがCImageクラス内でGDI+の開始と終了処理を行っています。終了処理は最後のCImageクラスが破棄されたときに行うのでアンロードされない可能性があるようなDLL内での使用する場合は宣言位置に注意する必要があります。アンロードが不確かな場合は明示的にnewとdeleteでオブジェクト生成&破棄を行った方が良いでしょう。

 CImageで16ビットビットマップをデフォルト作成した場合のRGBの形式はRGB555となるようです。
(MSDNのどこかに書いてました。場所は忘れました。)

 CImageから取り出したHDCに対してGD+のAPIを適用するには別途アプリケーション側でGDI+の開始と終了の処理は必要です。