CImageとビットマップ配列

PFU Happy Hacking Keyboard Lite2 日本語配列かな印字なし USBキーボード ブラック PD-KB220B/U

PFU Happy Hacking Keyboard Lite2 日本語配列かな印字なし USBキーボード ブラック PD-KB220B/U

プログラムを作ろう!  MS VISUAL C++ 2010 入門 (MSDNプログラミングシリーズ)

プログラムを作ろう! MS VISUAL C++ 2010 入門 (MSDNプログラミングシリーズ)

日経ソフトウエア 2010年 09月号 [雑誌]

日経ソフトウエア 2010年 09月号 [雑誌]

久々にMFCなどを触ることになった。たまにはいいもんだなどと思いながらCImageからビットマップ生配列をGetBits関数で取得しようとしたときにまたハマッた。どういうわけかCImage::GetBitsから取得できる配列は変わった配列になっているようだ。少しだけ調べてみたがちょっとわかってない。ただこれはすぐ回避できる。具体的には以下のように、CImageからHBITMAPを取得し、そこからGetBitmapBitsでビットマップ配列を得る。

   // ・・・
    
   HBITMAP hbm = (HBITMAP)c_image;
   GetBitmapBits( hbm, size, buff );
 
 // ・・・

さすがMFC。あいかわらずウザイことこの上ない。CImage::GetBitsで得られるこの配列は何のために他の処理と親和性のない形で返ってくるのか?理解できん

あぁ、あとリソース管理もMFC特有のウザさがある。CImageをローカルスコープで使うときは以下のようにして準備->描画->後始末をしないと怒られる。MFCってこういうもんだったよなぁ・・

                CImage final;
		final.Create( 640, 480, 24 );
		HDC hdc = final.GetDC(); // ここでHDCをとって・・・
		if( !wipes.empty() )
		{
			for( size_t i = 0; i < rendering_order.size(); i++ )
			{
				CImage &tmp = images[ rendering_order[i] ];
				{
					tmp.StretchBlt( hdc, 0+i*30, 0+i*30, 100, 100, SRCCOPY );
				}
			}
			final.Save( L"C:\\final.bmp" );
        }
        final.ReleaseDC(); // このタイミングと・・・
		final.Destroy(); // このタイミングで解放と破棄。

上のようなタイミングでCImageを使うときは、最後の解放と破棄処理がシビア。そしてWebに答えがないと普通にわからないw MFCのアホ仕様ご馳走様です。HDCをGetDCでとるかとらないかでReleaseDCの必要性は変わってくるのかな?もう面倒 


冒頭でたまにはいいもんだ・・などと書いたが軽く撤回する。これで一晩かかるかもと冷や汗かいたよ・・・