ホーム < ゲームつくろー! < Programming TIPs編

その10 目指せ究極のカスタムボタン!:サンプルプログラム



 Programming TIPs編その10「目指せ究極のカスタムボタン!」で説明した内容を踏まえたサンプルプログラムです。実行すると下のような輪状のボタン出現します。真ん中のボタンも輪のボタンも、それぞれの形で押す事が出来ます。


サンプルスクリーンショット。外側の円ボタンと内側のボタンは独立に押せます。

○ コンパイルの方法

 必要ファイルはこちらからダウンロードできます。

 新規のプロジェクトを立ち上げて、解凍したヘッダーと実装ファイルをプロジェクトに追加して下さい。また絵のファイルは相対パスで読み込んでいるためプロジェクト直下に置いて下さい。
(コンパイルが旨く出来ない場合はご連絡下さい)


○ クラスの使い方

 このサンプルプログラムは幾つかのクラスとmain.cppで構成されています。クラスについて以下に説明します。

クラス 機能
CustomComponent ボタンやエディットボックスなどのいわゆる「コンポーネント」をカスタム化して、独自のプロシージャにメッセージを配信します。またコンポーネントの削除も担当しています。Windows標準のコンポーネントをカスタマイズしたい場合には、このクラスを派生させる事になります。
CustomButton カスタムボタンクラスです。CustomComponentを継承しています。通常状態、押し下げ状態の絵を要求するメソッドなどが追加され、ボタン専用のクラスとして振舞います。独自のプロシージャがオーバーライドされています。このプロシージャにメッセージを送信するのがCustomComponent::globalProcの役目です。
AutoRegion ビットマップファイル、もしくはHBITMAPから複雑なリージョンハンドルを生成してくれるクラスです。白黒のビットマップ(24bit以上)が一応対象になっています。真っ黒(0x00000000)の部分がリージョンになります。

 独自のカスタムコンポーネントを作成したい場合はCustomComponentクラスを継承したクラスを作成します。最低限必要なのはlocalProc仮想関数のオーバーライドです。どう実装するかのサンプルはCustomButton::localProcが役に立つと思います。CustomButtonクラスのコンストラクタなどは他のコンポーネントでも同様の記述になるはずです。

 ちなみに、デフォルトのコンポーネントも扱えます(派生クラスで通常のコンポーネントを作るだけ)。その場合、そのクラスはサブクラス化に特化している事になります。デフォルト・カスタムいずれにせよ、悩ましいプロシージャの呪縛からは解放されますので、大変便利です(^-^)。


○ このサンプルの注目点

 カスタムボタンオブジェクトが親に作用しているのは、初期化時とWM_DESTROYメッセージでビットマップハンドルを解放している部分だけです。ボタンの動作や描画自体はボタン自身が行っています。もちろんこのボタンは親ウィンドウに対してMW_COMMANDを投げかけます。IDは今回は自動で振るように仕込みましたが、CustomComponentのコンストラクタをちょっと改造するだけで独自のIDを割り振るようにもできるでしょう。そうすれば振る舞いや使い方がデフォルトボタンにより近付きます。

 ボタンの大きさは読み込む絵の大きさから自動的に判断されます。ボタンの位置を変える事は可能ですが、大きさを動的に変更する事は現段階で出来ません(リージョンの変更がちょっと面倒なため)。ボタン同士の明・暗黙のコピーも禁止しています。


 サンプルについてご質問のある方は掲示板へご連絡下さい。