● メッセージボックスを拡張する ●

ダウンロード (18KB)

メッセージボックスを色々といじって拡張できるようにしてみた。汎用的に作ってみたものの、色々と微妙な箇所があるかも。

動作環境はとりあえず Windows XP(SP3) と、限定させていただきます。一応XPスタイルでも、レイアウトが崩れることなく表示されました。
Windowsのフォントやフォントサイズなどを変更している場合は、レイアウトが乱れるかもしれません。

[出来たこと]
(1)メッセージボックスをウィンドウの中央に表示する
(2)ボタン文言を変更する
(3)ボタンを好きなだけ表示させる(サンプルは最大9個まで)

ここで特筆すべきは(3)についてであろう。かな〜り強引なことをやっている。ボタン追加を実現してはいるものの、プログラム的に正しい作りなのかはちと自信なし。配慮が足りてない実装が色々とあるかもしれない。とりあえず以下が簡易仕様である。

・vbYesNoCancel などのボタンが指定されていても、強制的に vbOKOnly に書き換える。
・[OK]ボタンのみのメッセージボックスを拡張の対象とする。
・メッセージボックス表示のタイミングで以下の事を行う。
  (1)[OK]ボタンを非表示にする
  (2)ユーザー定義されたボタンのサイズ、表示位置を算出する
  (3)ユーザー定義されたボタンを作成する
  (4)メッセージボックスのウィンドウプロシージャを作成し、ボタン押下をハンドリング
・押下されたボタンを特定できたら、非表示にした[OK]ボタンを押して、メッセージボックスを閉じる
・押されたボタンのIDを返却する

メッセージボックスのタイトルバーの右側に[X]ボタンがある。これはキャンセル機能を持たせたかったから、敢えて表示している。これを非表示にしたいのであれば、ボタン属性値に vbYesNo を指定して [はい][いいえ] の両ボタンを持つメッセージボックスを拡張の対象とすればよい。これが面倒な場合の代替手段としては、メッセージボックスのウィンドウプロシージャで[X]押下イベントを無効にすることが挙げられるかな。

上記プログラムの改造をする場合はご注意を。マウスイベントをフックし、さらにその先でメッセージボックスのウィンドウプロシージャによる処理を行っている。変なことをするとたちまち無限ループ、もしくはフリーズに見舞われ、タスクマネージャから強制終了する羽目になる。私は何十回(ひょっとしたら百回)以上、それを経験した。本当に疲れました。まあでも、楽しかったから問題なし!!

#ちなみに今は午前5時11分なんだぜ…!? 眠いはずでありますな。ということで、おやすみなさい。


戻る