読者です 読者をやめる 読者になる 読者になる

CBitmap

MFC Sample

CBitmapは、ビットマップを扱うクラス・・・。

CBitmap クラス

これを使って、ビットマップの読み込みや描画などができる・・・。

今回は、巨大なボタンが押されたら、巨大なビットマップをボタンに表示させる・・・。

MFCアプリケーションでこれまでと同様にCBitmapプロジェクトを作成・・・。

f:id:BG1:20160125142625p:plain

resフォルダの下に、icon1.icoに加えて、bitmap1.bmpを用意・・・。

f:id:BG1:20160125142800p:plain

Iconリソースに加えて、 Bitmapリソースもインポート・・・。

f:id:BG1:20160125142939p:plain

bitmap1.bmpを選択・・・。

ビットマップリソースとしてのIDは、IDB_BITMAP1・・・。

f:id:BG1:20160125143349p:plain

ダイアログを大きくして、

f:id:BG1:20160125143430p:plain

ボタンも大きく配置・・・。

f:id:BG1:20160125143519p:plain

プロパティのBitmapをTrueに・・・。

CBitmap.rcを見ると、

BS_BITMAPが付いている・・・。
これでビットマップを表示できる・・・。

CBitmapDlg.hにCBitmapオブジェクトのメンバを用意・・・。

あとは、Button1(IDC_BUTTON1)を押された時のハンドラに、

m_cBitmap.LoadBitmapでbitmap1.bmp(IDB_BITMAP1)をロード・・・。
GetDlgItemでIDC_BUTTON1のポインタを取得し、pButton1に格納したら、
pButton1->SetBitmap(m_cBitmap)でボタンIDC_BUTTON1にビットマップIDB_BITMAP1をセット・・・。

CButton::SetBitmap

CButton::SetBitmapの引数型はHBITMAPなのに、CBitmapオブジェクトを渡せるのは不思議に思うかもしれない・・・。
実は、CBitmapには、

CBitmap::operator HBITMAP

HBITMAP演算子というものがあり、CBitmapオブジェクトからHBITMAP型ハンドルへのキャストのようにハンドルが取得できるのである・・・。

f:id:BG1:20160125151116p:plain

起動して、最初はこうなっている・・・。
ボタンを押すと、

f:id:BG1:20160125151133p:plain

bitmap1.bmpが表示された・・・。

ちなみにm_cBitmapは、DeleteObjectしなくとも、デストラクタでDeleteObjectされるのを一応確認している・・・。
(使い方によっては、DeleteObjectが明示的に必要らしいが情報が錯綜している・・・。LoadBitmapだけなら、大丈夫みたい・・・。)

Sample/CBitmap.h at master · bg1bgst333/Sample · GitHub
Sample/CBitmap.cpp at master · bg1bgst333/Sample · GitHub
Sample/CBitmapDlg.h at master · bg1bgst333/Sample · GitHub
Sample/CBitmapDlg.cpp at master · bg1bgst333/Sample · GitHub
Sample/resource.h at master · bg1bgst333/Sample · GitHub
Sample/CBitmap.rc at master · bg1bgst333/Sample · GitHub
Sample/stdafx.h at master · bg1bgst333/Sample · GitHub
Sample/stdafx.cpp at master · bg1bgst333/Sample · GitHub