- 2009-07-26 (日) 9:21
- 技術
●利用側で機能拡張できるようにする
CCatWndを使う側では,追加したメニュー項目選択時の処理や,猫ウィンドウが特に処理を行っていないメッセージに対して処理を追加したいはずなので,それができるようにしておきます.
●追加処理オブジェクトを指定させる
機能拡張のために「CCatWndを継承させる」というのでもいいのですが,今回はなんとなく
「CCatWndにコールバック関数を設定しておいて,WndProc()の中でこの関数をコールしてやる」という類の方針を取りました.
コールバック関数の型は
bool AdditionalWndProc( class CCatWnd *pCatWnd, UINT message, WPARAM wParam, LPARAM lParam );
みたいな.
実際には以下のように,関数ではなく,そういう関数をメンバにもつクラスのオブジェクトを指定する形になっていますが,意味は一緒です.
//猫ウィンドウとともに使う外部処理IF //アプリはこれを継承したクラスを作り,猫ウィンドウにセットして使う. class CCatWndManager { public: virtual ~CCatWndManager(){} public: //追加イベント処理関数. //猫ウィンドウは,内部で必要なメッセージに対応する処理を行ったあとで, //ウィンドウプロシージャ内(の最後らへん)でこの関数をコールする. //(ただし,こないメッセージもある. // WM_RBUTTONUPはポップアップに使われるので来ない. // あと,猫ウィンドウのアニメーション用タイマのイベントとかも) // //メッセージを処理したらtrueを,処理しない場合はfalseを返すこと. //(::DefWindowProc()をコールする類の処理は猫ウィンドウが行う) virtual bool AdditionalWndProc( class CCatWnd *pCatWnd, UINT message, WPARAM wParam, LPARAM lParam ){ return false; } };CCatWnd側には設定用の関数を用意します.
void SetCatManager( CCatWndManager *pCatManager );
CCatWnd側は,設定がなされていれば,WndProc()内から設定されたオブジェクトのAdditionalWndProc()を呼びます.
CCatWnd側で既定の処理があるメッセージの際にも呼ぶか?ということについては考え方次第かもしれませんが,とりあえず今は↑の注釈にあるように,
「呼ばれないメッセージもある」という,「じゃあ何のメッセージのときは呼ばれるのか」が把握できないなんとも嫌な感じに仕上げてみました.
しかしこれだと,アニメーション選択に最もふさわしいであろうタイミングである「アニメーションフレームを切り替える時」に呼ばれなくなってしまうので,CCatWndManagerに//アニメーションのフレーム切換え前にコールされる. //引数は今の(切換え前の)アニメーションのAnimIDとFrameIndex. // //trueを返すとデフォルト動作(次のフレームに進める)処理が行われる. //デフォルト動作を行わせないときはfalseを返すこと. virtual bool OnPreChangeAnimFrame( class CCatWnd *pCatWnd, unsigned int AnimID, unsigned int FrameIndex );とかいう特別な関数が追加されたりとかグダグダな感じになっています……なんだかなぁ.
●CCatWndに必要なメソッドを追加する
これでCCatWndManager(を継承したクラス)からCCatWndを操作できるので,アプリケーション独自の処理を追加できます.
ただし,今のままでは「CCatWndに対してできること」が少なすぎる(メニュー項目の追加とアニメーションの選択くらいしかない)ので満足に操作できません.CCatWndに今後publicなメソッドを増やしていく必要がありそうです.
CCatWndにウィンドウハンドルを返す関数を持たせれば,かなり自由に操作できるようになりますが,あまりにも自由すぎて「SetWindowLongでウィンドウプロシージャ置き換えたよ!」とか言われても困るので,現時点ではウィンドウハンドルは外部に教えない方針です.
とりあえず現在の最終目標は「黒猫徘徊ソフト」なので,徘徊に必要そうな機能(ウィンドウ位置を返す関数やウィンドウを移動する関数等)から順次追加されている最中です.
づづく...
- Newer: 徘徊アプリの動作骨組(1)
- Older: 猫ウィンドウクラスを作る(4)