|
|
||||
Tips > |
|||||
WndProc でインテリマウス(ホイールマウス) |
更新 : 2010/04/13 |
||||
|
|
||
解説: インテリマウス(ホイールマウス)は使い慣れると非常に便利です。 残念なことに、古い C++Builder ではフォームなどに表示されたスクロールバーをインテリマウスで操作できません。 通常、インテリマウス未対応のウィンドウでスクロールを有効にするには、フックや DLL などの仕組みが必要になります(WH_MOUSE_LL なら DLL 不要)。 C++Builder のフォームでは、WndProc メソッドを処理すれば、それほど面倒もなくインテリマウスを使えるようになります。 ここでは、WndProc メソッドを使って、インテリマウス未対応フォームのスクロールバーを動かしてみます。 使用例: フォームに表示されたスクロールバーをインテリマウスで動かしています。 準備として、Button を Top = 500 に配置して、Form の Height を 25 程度にしておいてください。 アプリケーションを起動して、インテリマウスのホイールを動かしてみてください。 フォームのスクロールバーが上下するはずです。 コードとしては、"Unit1.h" の private に WndProc を宣言しておきます。 WndProc メソッドは、フォームに送られる Windows メッセージを最初に受け取るので、メッセージを直接処理する場合、オーバーライド(スーパークラスのメソッドをサブクラスで再定義)すればよいです(Windows メッセージハンドラを変更できる)。 "Unit1.cpp" でメッセージ WM_MOUSEWHEEL が来たときに WParam の上位ワードからスクロールバーのツマミ位置を取得しています。 WParam の上位ワードはホイールが回転した距離を示し、正の値は上、負の値は下へ回されたことを意味しますので、その回転を見極め、適当な値で VertScrollBar の Position を変えています。 //------------------------------------------------------------------- // WndProc をオーバーライドして、WM_MOUSEWHEEL を捕まえる void __fastcall TForm1::WndProc(Messages::TMessage &Message) { if (Message.Msg == WM_MOUSEWHEEL) { // WParam の上位ワードからツマミ位置を取得 int pos = (short)HIWORD(Message.WParam); int scrolllines = 16; if (pos > 0) //上回転 VertScrollBar->Position = VertScrollBar->Position - scrolllines; else //下回転 VertScrollBar->Position = VertScrollBar->Position + scrolllines; return; } // 上で処理しない通常メッセージは元の WndProc で処理 TForm::WndProc(Message); } //------------------------------------------------------------------- |