半完成ライブラリ「ToolBox」

1.はじめに 半完成ライブラリは、ソースをカスタマイズして使用する事を前提として いる。バイナリレベルで汎用化しようとすると、汎用化の為に色々と煩雑な処 理や冗長なエラーチェック等々、1度もCPUが通らないコードが多く含まれる 事となり、そーゆーのイヤなのよ。だからと言って1から全部作るのも面倒っ てワケで、手元に各種半完成ライブラリがそろって来た。 とゆー事で、会社でもWindowsプログラマ1年生の諸氏がこれらを使ったり しているのだが、元々趣味で書いたコードでもあるし広く公開してみようと思 う。その中でワリとこぢんまりとまとまっているToolBoxを今回公開した。 2.サンプルアプリケーションのビルド アーカイブを展開したフォルダ内のToolBox.*ファイルをSampleフォルダに コピーして、Microsoft VisualC++6.0でGX555.dswプロジェクトを開いてビルド すべし。使い方はこのサンプルから感じ取ってもらいたい。 3.皆で改善してくれ! ToolBoxのボタンがDisable状態の時の表示が、かなりショボイんで、どーに かして欲しい。楽で軽くて小さい良い処理は無いか? 4.著作権や免責 そんなモン知らない。勝手にすれば良い。ただし、このアーカイブ内のファイ ルを使用したりしなかったりして発生した問題に対しNNKは何の責任も負わない よ。一次配布サイト(http://www.tt.rim.or.jp/~nonaka)です。これ以外で配 布されたモノは配布した人がそれぞれアレしてね。(アレって何だよ!) 5.マニュアル 5.1 初期化 5.1.1 InitToolbox() 書式:BOOL InitToolBox( HINSTANCE hInst ); 引数:HINSTANCE hInst; WinMain()で得られるプログラムのインスタ ンスハンドル 戻値:初期化の成功/失敗をBOOL値でTRUE/FALSEで返す。 説明:プログラムの頭(WinMainの直後くらいで)で1回呼んどく事。 5.2 生成と消滅 5.2.1 CreateToolBox() 書式:HWND CreateToolBox( LPCSTR lpszTitle, HWND hParent, HINSTANCE hInst ); 引数:LPCSTR lpszTitle; ToolBoxウィンドウのキャプション HWND hParent; 親ウィンドウのハンドル HINSTANCE hInst; 親ウインドウのインスタンスハンドル 戻値:ToolBoxのウィンドウハンドルを返す。失敗ならNULL。 説明:ToolBoxウィンドウを作る。オリジナルソースはウィンドウサイズが80× 160固定になっているから、それを引数で渡すようにカスタマイズするの は、もっとも多いパターンだろう。ウィンドウスタイルの追加も同じく。 5.2.2 DeleteToolBox() 書式:void DeleteToolBox( HWND hWnd ); 引数:HWND hWnd; Delete対象のToolBoxのウィンドウハンドル 戻値:なし 説明:ToolBoxを使わなくなったら捨てましょう。 5.3 メソッド 5.3.1 ToolBox_SetImage() 書式:void ToolBox_SetImage( HWND hWnd, LPCTSTR pszImage ); 引数:HWND hWnd; ToolBoxのウィンドウハンドル LPCSTR pszImage; ボタンに貼りつけるビットマップイメージの リソース名 戻値:なし 説明:pszImageはCreateToolBox()で指定したインスタンスハンドルで取得できる ビットマップイメージリソースである事。MAKEINTRESOURCE()マクロを使っ て指定する事もできる。どんな感じにビットマップイメージを作成するか はサンプルを参照してもらいたい(sampleフォルダのbitmap1.bmp)。 (こんな感じだ) 5.3.2 ToolBox_AddButton() 書式:BOOL ToolBox_AddButton( HWND hWnd, UINT uMsg, LPRECT pRC, int nIdBmp, int nIdGrp ); 引数:HWND hWnd; ToolBoxのウィンドウハンドル UINT hMsg; hWndに送るWM_COMMANDメッセージのコマンド LPRECT pRC; ボタンの位置と大きさ int nIdBmp; ToolBox_SetImage()でセットしたビットマップ の左から何番目のイメージを使用するか int nIdGrp; ボタングループのIDで、0はどのグループにも 属さない事を意味する(プッシュボタン扱いに なる) ToolBoxの性格上そのボタンはトグル動作する 事を期待する事が多いが、グループIDはそのト グルするボタン群をひとまとまりに管理するID である 意味不明っぽい?ソースを読め 戻値:追加できたらTRUE、そうじゃなきゃFALSEを返す。 説明:hMsgの型がUINTなのは、製作開始直後の勘違いをそのまま引きずっているだ けで、本来WORD型が望ましい。 また、WM_COMMADメッセージのnotification codeは通常は0でSendMessage() する。送る対象はToolBoxの親ウィンドウ。 SendMessage()の各引数そのまま送れるようにカスタマイズすると面白いかも ね。 同じ値のuMsgは複数登録できない。 5.3.3 ToolBox_SelectButton() 書式:BOOL ToolBox_SelectButton( HWND hWnd, UINT uMsg, BOOL bSendMessage ); 引数:HWND hWnd; ToolBoxのウィンドウハンドル UINT hMsg; 送りたいWM_COMMANDのコマンドID BOOL bSendMessage; 同じにSendMessage()を実行するならTRUEを指定 戻値:成功したらTRUE,そうじゃなきゃFALSE 説明:プログラム起動時にデフォルトで指定選択されているボタンを指定する等、用 途は無限に広がる感じ。 bSendMessageがTRUEの場合はボタンを選択状態にするとともに、マウスでボタ ンをクリックした時と同じようにToolBox_AddButton()で指定されたWM_COMMAND メッセージをSendMessage()する。 グループIDが0のボタンに対してはToolBox_SelectButton()できない。やりた いならソースをカスタマイズしてくれ。 5.3.4 ToolBox_EnableButton() 書式:BOOL ToolBox_EnableButton( HWND hWnd, UINT uMsg, BOOL bEnable ); 引数:HWND hWnd; ToolBoxのウィンドウハンドル UINT hMsg; 送りたいWM_COMMANDのコマンドID BOOL bEnable; ボタンを有効にすするならTRUEを指定、無効にす るならFALSEを指定 戻値:以前の状態を返すが、失敗した時もFALSEを返すので、元々FALSEだった時は困 る。 説明:bEnableをFALSEにすると結局そのボタンは押せなくなるワケよ。 6.その他注意 ToolBoxウィンドウがローカルで管理する情報は、ウィンドウデータのGWL_USERDATA に持っているので書き換えないように。GWL_USERDATA使いたかったらクラス情報登録 で別に領域を確保してローカルデータはそっちを使うように変更してくれ。 使ってるAPIの関係上、Windows95かWindowsNT4.0以降じゃないと使えない。具体的に は、LoadImage()APIだ。それ以前のWindowsで使うならLoadBitmap()APIに変更する事。 ただし、次はDrawFrameControl()APIの関係でWindowsNT3.51以降じゃないと使えない。 DrawFrameControl()を自分で作るのは面倒だが、ボタンの機能くらいなら簡単じゃない か? っていうか、そもそも16bitWindowsやWindowsCEの事は考えていないのでヨロシク。 7.NNKの連絡先 何か用があるなら以下まで。 nonaka@tt.rim.or.jp