MFCはボタンの配置やダイアログの表示が目に見えるため、完成形の具体的なイメージがはっきりわかるのはいい点だと思ったが、使い方がめんどくさいです(画像表示などはC#だとめちゃくちゃ簡単です)。
特に、画像関係はかなり面倒だと作業してみて思った。
やったこと自体はかなり簡単なのだが、実際にできるまでが大変だった。
スポンサードサーチ
C++ MFCで単純な画像表示

画像表示のボタンを押すと、枠に合わせて画像が表示されるプログラムです。
表示している画像はアイカツ格言のあおい姐さんで、形式はPNG。
調べると、BMPの表示方法は多く出てきたが、他の形式に対してのページがあまりなかったので、PNGでの画像表示に挑戦してみました。
私が試した方法だと、PNG以外にJPEG、GIFの表示は可能だと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | CDC *pDC = m_pict.GetDC(); int width, height = 0; CString filePath; CImage* img = new CImage(); //画像ファイルのパスを指定します。今回は単純な表示目的なので同階層に画像を用意した filePath = L"aikatu.png"; //画像を読み込みます img->Load(filePath); //画像の縦幅、横幅を取得します width= img->GetWidth(); height= img->GetHeight(); //画像の描画を行います img->Draw(*pDC, 0, 0, width, height, 0, 0, width, height); |
ダブルバッファリングを使った画像表示
上のコードでは表示するだけでいまいちなので、もう少しまともに使えそうなコードも書いてみました。
どうして普通に表示するだけではダメなのかというと、ちらつき防止の処理のためです。
通常、画像の拡大や縮小、移動を行う場合、すでに表示されている画像を消し、新たに画像を描画することになります。
しかし、この方法ではすでに表示されている画像を消す→背景だけが表示されている→新たに画像を表示という流れになり背景だけを表示する時間が存在するためちらついて見えてしまいます。
ここでは、一度仮想領域に画像を描画、その仮想領域を表示させたい領域に張り付けて画像表示させる、ダブルバッファリングという方法を用いています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | CDC* pDC = m_pict.GetDC(); int width, height; CImage* img = new CImage(); CString filePath; //仮想のデバイスコンテキスト CDC virtualDC; //仮想のデバイスコンテキストに設定するビットマップを用意します CBitmap virtualBmp; //画像ファイルのパスを指定します。今回は単純な表示目的なので同階層に画像を用意した filePath = L"aikatu.png"; //画像を読み込みます img->Load(filePath); //画像の縦幅、横幅を取得します width= img->GetWidth(); height= img->GetHeight(); //仮想のデバイスコンテキスト作成します virtualDC.CreateCompatibleDC(pDC); //用意したデバイスコンテキスト用ビットマップ作成します virtualBmp.CreateCompatibleBitmap(pDC, 300,300); //デバイスコンテキストにビットマップ設定します virtualDC.SelectObject(&virtualBmp); //仮想デバイスコンテキストに画像を描画します img->Draw(virtualDC, 0, 0, width, height, 0,0, width, height); //画像が描画された仮想デバイスコンテキストを表示させたいところに貼り付けます BitBlt(*pDC, 0, 0, width, height, virtualDC.GetSafeHdc(), 0, 0, SRCCOPY); //使用した仮想デバイスコンテキストのビットマップを廃棄します。(廃棄のタイミングはやりたいことの内容によって変わると思います。) virtualBmp.DeleteObject(); |