Windowsコード集 上のページ

#0010 ホイールマウスを使えるようにする

NT4.0以降では WM_MOUSEWHEELでホイールメッセージが検出できるようですが、Win95等ではそれができません。
(たぶん、Win98では対応してるでしょうけど……)
という事で、ホイールマウスを対応させる方法を以下に書いておきます。

//----------------------------------------------------------------------------
// wheelmouse.h
//----------------------------------------------------------------------------
#ifndef _INC_WHEELMOUSE_H_
#define _INC_WHEELMOUSE_H_

#ifndef WM_MOUSEWHEEL
#include "zmouse.h"
#endif

class CWheelMouse{
private:
    static UINT m_wm_message;
public:
    UINT TranslateMessage(UINT msg){
        if(m_wm_message == msg)msg = WM_MOUSEWHEEL;
        return msg;}
    BOOL IsForward(WPARAM wparam){return ((short)HIWORD(wparam) < 0);}
};

#endif


//----------------------------------------------------------------------------
// wheelmouse.cpp
//----------------------------------------------------------------------------
#include "windows.h"
#include "windowsx.h"
#include "wheelmouse.h"

UINT CWheelMouse::m_wm_message = (((GetVersion() & 0x80000000) &&
     LOBYTE(LOWORD(GetVersion()) == 4)) ||
     (!(GetVersion() & 0x80000000) && LOBYTE(LOWORD(GetVersion()) == 3)))
     ? RegisterWindowMessage(MSH_MOUSEWHEEL) : 0;
クラスにして隠蔽するほど難しい物では無いですけど、この方が何かと便利です。
このクラスの使い方は以下の通り。
// クラスの生成(グローバル変数として置いてください)
CWheelMouse wmouse;

// メッセージを変換する
//
//     WindowProcコールバックもしくは、DialogProcコールバックの先頭で
//     該当メッセージを変換してやります。
//     以下は、WindowProcの例です。
//
LRESULT CALLBACK WindowProc(HWND hwnd,UINT msg,WPARAM wparam,LPARAM lparam)
{
    switch(wmouse.TranslateMessage(msg)){   // <- WM_MOUSEWHEELを検出できるように、
                                            //    メッセージを変換します
    case WM_MOUSEWHEEL:
        // ホイール通知メッセージ
        if(wmouse.IsForward(wparam)){
            /*
                ホイールを手前に動かしたとき
            */
        }else{
            /*
                ホイールを外側に動かしたとき
            */
        }
        break;

    default:
        return DefWindowProc(hwnd,msg,wparam,lparam);
    }
    return 0;
}



上のページ