◀ANSI版開発トップへ
  • 4302 タブのホイール切り替え対応
    • 4306 Re:タブのホイール切り替え対応
      • 4307 Re2:タブのホイール切り替え対応
        • 4308 Re3:タブのホイール切り替え対応
          • 4313 Re4:タブのホイール切り替え対応
  • [4302] タブのホイール切り替え対応 John 2006年03月18日 00:21

    2ちゃんねるのサクラエディタふぁんくらぶスレッドに投げておいたコードですが
    こちらにも書き込んでおきます。
    Win98以降なら有効だと思います(当方の環境は2Kなので2Kでは確認済みです)。

    CTabWnd.h
    LRESULT OnTabMouseWheel( WPARAM wParam );/*!< タブ部 WM_MOUSEWHEEL 処理 */

    CTabWnd.cpp
    #ifndefWM_MOUSEWHEEL
    #define WM_MOUSEWHEEL 0x020A
    #endif

    CTabWnd::TabWndDispatchEventに追記
    case WM_MOUSEWHEEL:
    return OnTabMouseWheel( wParam );
    break;

    /*! タブ部 WM_MOUSEWHEEL 処理 */
    LRESULT CTabWnd::OnTabMouseWheel( WPARAM wParam )
    {
    int nDelta = (short)HIWORD(wParam);
    HWND hWnd = FindWindow("TextEditorWindow", NULL);
    if (nDelta>0){
    //前のウィンドウ
    ::SendMessage( hWnd, WM_COMMAND, F_PREVWINDOW , 0 );
    return 0L;
    } else if (nDelta<0){
    //次のウィンドウ
    ::SendMessage( hWnd, WM_COMMAND, F_NEXTWINDOW , 0 );
    return 0L;
    }
    return 1L;
    }
    • [4306] Re:タブのホイール切り替え対応 ryoji 2006年03月18日 16:19

      試してみましたが、自分の環境(XP, 2000とも)ではだめでした... orz

      MSDN 調べてみたら WM_MOUSEWHEEL はフォーカスのあるウィンドウに送られてくるもののようですね。
      サクラエディタは通常、TextEditorWindow にフォーカスがあるのでタブ上でホイールしてもタブには WM_MOUSEWHEEL は来ないみたいです。
      Spy++ で見たらやっぱり TextEditorWindow に WM_MOUSEWHEEL が来ています。

      これだけで動くとすれば、何かマウス用の特別なドライバ/ユーティリティがインストールされてるとか、でしょうか...
      このコード追加をしないでタブ上でホイールさせた場合、
      1. 何もおきない
      2. 編集画面がスクロールする
      のどちらになりますか?
      私の環境では 2 です。

      あと、この機能を入れるとすればオプションにしたほうがいいかもと思います。
      編集ウィンドウをスクロールしようとして誤爆するのを嫌う人もいそうですから。
      • [4307] Re2:タブのホイール切り替え対応 John 2006年03月19日 01:11

        ▼ ryojiさん
        > これだけで動くとすれば、何かマウス用の特別なドライバ/ユーティリティがインストールされてるとか、でしょうか...
        申し訳ありません。
        WheelPlus(http://toshi.pobox.ne.jp/)を常駐させた状態で
        検証しておりました。
        常駐停止させると効きませんね、これ・・・
        改善が必要ですね。

        > このコード追加をしないでタブ上でホイールさせた場合、
        > 1. 何もおきない
        > 2. 編集画面がスクロールする
        > のどちらになりますか?
        > 私の環境では 2 です。
        同じく 2 になります。

        > あと、この機能を入れるとすればオプションにしたほうがいいかもと思います。
        > 編集ウィンドウをスクロールしようとして誤爆するのを嫌う人もいそうですから。
        そういう人もいるのですね。
        失念しておりました。
        • [4308] Re3:タブのホイール切り替え対応 ryoji 2006年03月19日 02:30

          ▼ Johnさん
          > > あと、この機能を入れるとすればオプションにしたほうがいいかもと思います。
          > > 編集ウィンドウをスクロールしようとして誤爆するのを嫌う人もいそうですから。
          > そういう人もいるのですね。
          > 失念しておりました。
          現状のサクラエディタでは WheelPlus のようなツール無しだと、マウスカーソルがスクリーン上のどこにあっても編集画面がスクロールするようになってます。デスクトップ上の何も無いところでも。
          ウィンドウ分割しているときはキャレットがあるほうの編集ウィンドウがスクロールします。
          なので、タブ上でだけスポット的にタブ切り替えが動くとすると違和感を覚える人は結構いるかもです。
          ブラウザみたいに必ずマウスカーソル下にあるウィンドウがスクロールする(ウィンドウ外ならスクロールしない)仕様なら割と気にする人は少なくなるかもしれませんが。
          • [4313] Re4:タブのホイール切り替え対応 John 2006年03月20日 02:12

            ツール無しで切り替え出来るようにしてみました。
            オプション化はしてません。
            CEditView.cpp
            /* マウスホイールのメッセージ処理 */
            LRESULT CEditView::OnMOUSEWHEEL( WPARAM wParam, LPARAM lParam )
            の
            // MYTRACE( "CEditView::DispatchEvent() WM_MOUSEWHEEL fwKeys=%xh zDelta=%d xPos=%d yPos=%d \n", fwKeys, zDelta, xPos, yPos );
            の前に挿入して下さい。

            RECT rc;

            HWND hWnd = FindWindow( "TextEditorWindow" , NULL );
            HWND hTabWnd = FindWindowEx( hWnd, NULL, "CTabWnd" , NULL );
            if( hTabWnd != 0){
            if( 0 != ::GetWindowRect( hTabWnd, &rc )){
            if( rc.left <= xPos && xPos <= rc.right){
            if( rc.top <=yPos && yPos <= rc.bottom){
            if (zDelta>0){
            //前のウィンドウ
            ::SendMessage( hWnd, WM_COMMAND, F_PREVWINDOW , 0 );
            return 0L;
            } else if (zDelta<0){
            //次のウィンドウ
            ::SendMessage( hWnd, WM_COMMAND, F_NEXTWINDOW , 0 );
            return 0L;
            }
            }
            }
            }
            }