antenn-a
company profile

MFC航海日記 十四日目(オーナードロウボタン)

File Eater for Windowsの開発も無事(?)終了し、ここら辺でひとまず休憩を取ろうと思う。休憩と言っても別に何もしないと言うわけではなく、次回作の案が固まるまで色々な事に挑戦していきたいと思っている。
そこで、今回はオーナードロウボタンに挑戦してみようと思う。今までオーナードロウボタンを何度か作成してきたが、その方法はいずれも原始的な方法を採っていた。その方法とは、
1.ボタンを作る。
2.ボタンのデバイスコンテキストを取得する。
3.現在ボタンが押されているかどうかのフラグを立てる。
4.押されているときのビットマップイメージと押されていないときのビットマップイメージを用意する。
5.フラグに従ってボタンにビットマップを「 BitBlt 」する。
6.ボタンの押下イベントを取得してフラグを変更しつつ、ビットマップイメージを変更する。
ビットマップイメージ

prev

Visual C++でオーナードロウボタンを作成しようと思ったとき、一つ気になることがあった。それは、リソースエディタでボタンイメージを作成するときに「 ビットマップ 」なる選択肢があることだった。と、いうことはボタンに直接ビットマップを張り付けることが可能だということだ。そこで、CButtonのヘルプを見てみると、

以上のような方法でオーナードロウボタンを作成してきた。
SetBitmap ボタンに表示するビットマップを指定します。

と書いてある。
こんな便利な関数があるではないか!!これを使わない手はない!
OnInitDialog関数中に以下のようなコードを追加してSetBitmap関数を呼び出した。

prev

HBITMAP   hBitmap; //ビットマップイメージへのハンドル
HINSTANCE hInst; //インスタンスハンドル
hInst = (HINSTANCE)GetWindowLong( m_Btn, GWL_HINSTANCE );
//インスタンスハンドルの取得(ほぼお決まりの文法である)
hBitmap = LoadBitmap( hInst, "IDB_BITMAP1" );
//ビットマップイメージのロード
m_Btn.SetBitmap( hBitmap );  //ボタンへの関連づけ
ビットマップイメージ
問題になったのは、LoadBitmp関数の第二引数が「char*」だということである。ふつうにビットマップを作成したのでは「int」になってしまうので、リソースエディタでビットマップを作成する際に IDをダブルコーテーションでくくる必要がある。右図の様にすれば問題ない。
他にもっとうまい方法があるはずなのだが今回はこのような方法での実現方法を日記に書き留めておく。これができれば、自分自身でツールバーを作成することもできるし、あらゆる事をよりVisualに魅せることが可能になると思う。
今回のサンプルコードはここからダウンロードできる


antenn-a

prev next


antenn-a