横スクロール − V8.71β9No.09401
sepia さん 17/03/30 18:31
 
ergonomic mouseでの横スクロールを確認しました。
ただ、ergonomic mouseのホイールによる横スクロールが
ちょっとチルトしただけで
一気に行末までスクロールしてしまいます。
アウトライン解析枠ではちょっとのチルトで
1/3ぐらいスクロールします。



[ ]
RE:09401 横スクロール − V8.71β9No.09403
sepia さん 17/03/30 19:28
 
spy++をアクティブにしたマウスオーバーの横スクロールでは妥当な
スクロール量になります。

[ ]
RE:09403 横スクロール − V8.71β9No.09406
秀丸担当 さん 17/03/31 12:30
 

ご確認ありがとうございます。
秀丸エディタは通常のホイールスクロールの単位120を、8桁の横スクロールにし
ています。修正では単純に120未満の場合は割った値にしています。60であれば4
桁、30であれば2桁といった感じです。
Edgeでもergonomic mouse以外のマウスで120が8桁になる具合にテキストを作っ
たとき、ergonomic mouseではちょっとの操作で8桁より多くスクロールするので、
そういうものかと思っていました。

しかし改めてSpyで見てみたら、秀丸エディタはなぜかSendとPostが入り混じっ
て通常より多めのメッセージが来ているようです。
それがなぜかは謎です。
不可解なのは[その他]→[動作環境]→[ウィンドウ]→[ステータスバー]の詳細の
リストと、[その他]→[動作環境]→[ファイル]→[エンコード1]のリストでは、
ほとんど同じ処理であるにも関わらず、Spyで見たらPostとSendが違っていまし
た。
他にもアプリや条件によってまちまちのようで、全くわからないです。

C:\Program Files\Microsoft Mouse and Keyboard Center\ApplicationSpecific.
xml
にアプリ別に既存の固有情報(HScroll Style?)があったりして、もしかした
ら条件によって自動的に変えたりする処理があったりするのではないかと想像し
ますが、わかりません。
マウスキーボードセンターではアプリごとのボタンの設定はあるようですが、ホ
イールの具合は見つけられませんでした。

メッセージに対する処理はたぶん合っていると思うので、下手にいじったらよく
ない気がします。
しいてやるとしたら、秀丸エディタでスクロールの度合いを変更する設定を作る
しかないかもしれません。

[ ]
RE:09406 横スクロール − V8.71β9No.09408
sepia さん 17/03/31 16:27
 
マウスキーボードセンターを削除すると
WM_MOUSEWHEELとWM_MOUSEHWHEELはpostで送られてきます。
秀丸の横スクロールも違和感がありません。
マウスキーボードセンタ有りのときは
アプリケーション、マウスホバー等によって
WM_MOUSEHWHEELの方は送られ方が異なっているようです。
send、sendとpost
OSによっても変わるのかもしれません。
マウスキーボードセンタに問題があるように思えてきます。
おっしゃる通り変にいじらない方がいいですね。
私としては現状で充分です。
お手数おかけしました。

[ ]
RE:09408 横スクロール − V8.71β9No.09410
sepia さん 17/03/31 22:17
 
以下参考まで。
ちょっと気になったので漁ってみました。
WM_MOUSEHWHEELの戻り値はどうもはっきりしないようです。
https://social.msdn.microsoft.com/Forums/ja-JP/115834fe-5e5b-4e17-8668-c55bbc341117?forum=csharpgeneralja

「WM_MOUSEHWHEELを処理した場合はTRUEを返す」ともありますのでそのようにしてみ
ました。
    case WM_MOUSEHWHEEL:
        何か処理。。。
 DefWindowProc(hWnd, message, wParam, lParam);
 return 1;
  又は
    case WM_MOUSEHWHEEL:
      何か処理。。。
        return 1;

送られてくるメッセージはsend+postではなくsendのみとなりました。
スクロールバーとの絡みがあるので秀丸では戻り値を
TRUEにするだけではだめかもしれませんが。

---


[ ]
RE:09410 横スクロール − V8.71β9No.09412
秀丸担当 さん 17/04/03 09:29
 

情報ありがとうございます。
戻り値の違いがあったのですね。
その線は疑ったのですが、仕様でも0のはずで、VS2017に付属のSpyはSendの
Resultが常に0になって見えるという不具合があるようで、気づきませんでした。
VS2013に付属のSpyにしたらメモ帳で戻り値が1になって見えました。
しかしこれだとマウスキーボードセンターの調整が意味がなくなるようで、常に
一定速度のようです。
でもEdgeはなぜか調整による連発を拾っているようで、違いがわからないです。

いろいろわからないですが、現状で早すぎる感じはあり、とりあえずメモ帳と同
じということが言えればいい気がするので、1を返すようにしてみます。
何かあったらトラブル対策のオプションを考えます。

[ ]
RE:09412 横スクロール − V8.71β9No.09413
sepia さん 17/04/03 23:37
 
スクロール速度は
SystemParametersInfo(SPI_GETWHEELSCROLLCHARS)で取得するみたいです。
SPI_GETWHEELSCROLLCHARSはマウスのコントロールパネルの水平スクロール値を
を返します。
マウスキーボードセンターの水平スクロール値はコントロールパネルの水平スクロー
ル値と
連動しています。
zDeltaの値を累積しWHEEL_DELTAを超えたらSPI_GETWHEELSCROLLCHARSの文字数分
スクロールするというのが正しい処理のようです。
古い資料ですが
"https://msdn.microsoft.com/en-us/library/ms997498.aspx"
によると
 「The new WM_MOUSEHWHEEL message has the same parameters as the WM_MOUSEWHE
EL message.
One difference is that TRUE must be returned when a WM_MOUSEHWHEEL message i
s handled. 」
との記述があり「戻り値はTRUE」とあります。


   case WM_MOUSEHWHEEL: {
        static int zDelta;  // 累積値
        zDelta += GET_WHEEL_DELTA_WPARAM(wParam);
        if (abs(zDelta) < WHEEL_DELTA)
            return 1;

        int nTilt = zDelta / WHEEL_DELTA;
        zDelta %= WHEEL_DELTA;
        UINT nChar;
        if (!SystemParametersInfo(SPI_GETWHEELSCROLLCHARS, 0, &nChar, 0))
            nChar = 3;
        int scrollChars = nChar * nTilt;

        //scrollCharsだけスクロールする

 return 1;
    }
    break;

[ ]
RE:09413 横スクロール − V8.71β9No.09414
sepia さん 17/04/04 07:46
 
累積カウンターを使うとなるとカウンターのクリアが厄介ですね。
メモってみました。
左右いっぱいにスクロールしたとか改行したとか、、、etc。
別にクリアしなくともscrollの始めが大きくなるだけです。
最悪の場合は(30,60,90,120) -> 90,120)です。
ですので適当なところでクリアするだけでも
(あるいはしなくとも)問題ないのかもしれません。
別の方法はWM_MOUSEHSCROLLで0.5〜1秒ぐらいのタイマーを
SetTimer()で発行し
タイムアップ時にクリアすれば処理は簡単になります。
つまり最後にチルトを辞めたときから0.5〜1秒後にクリアする。
ダブルクリックと似たような考え方です。

---

[ ]
RE:09414 横スクロール − V8.71β9No.09415
秀丸担当 さん 17/04/04 11:16
 

情報ありがとうございます。
SystemParametersInfoで水平ホイールの設定が得られるとは知りませんでした。
得られるのは垂直ホイールだけかと思っていました。
次のバージョンで修正させていただきます。

[ ]