ホーム
|
アプリケーション | Tips | ダウンロード | プログラム
| コラム

CBアプリ工房


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);
}
//-------------------------------------------------------------------



[ ホーム | ページトップ | ブック | リンク | サイトマップ ]
Copyright(c) 2003 Shibu All rights reserved.