36009


クライアント領域のマウス座標取得方法は分かったのですが、

[code]

    this.Text = this.PointToClient(Control.MousePosition).ToString();
    
[/code]

これだと座標取得時にスクロールバーの位置を無視した状態で取得してしまうのですが、  
何か対処方法はありますでしょうか？

やはりスクロールバーの現在値と上記方法で取得したクライアント座標を用いて  
導き出すしかないでしょうか？


CC BY-SA 3.0
2017-06-30T20:12:13.970
36003
2017-07-01T04:57:12.853
2017-07-01T04:57:12.853
4236
12778
question
c#
スクロールバー付きのクライアント領域のマウス座標を取得するには？


> やはりスクロールバーの現在値と上記方法で取得したクライアント座標を用いて導き出すしかないでしょうか？

YESです。[`ScrollBar`クラス](https://msdn.microsoft.com/ja-
jp/library/system.windows.forms.scrollbar\(v=vs.110\).aspx)は独立した存在です。これは巨大なコンテンツを表示する場合に、全てを描画した上でスクロール位置だけを切り取って表示するとパフォーマンスが悪化します。そのため現在のスクロール位置を取得し必要な部分だけを描画する機能を有するためです。

その上で、今回は[`AutoScroll`プロパティ](https://msdn.microsoft.com/ja-
jp/library/system.windows.forms.scrollablecontrol.autoscroll\(v=vs.110\).aspx)を`true`に設定したものと思われます。この場合、簡易的なスクロール機能が提供されますが、それと同時に現在のスクロール位置は[`AutoScrollPosition`プロパティ](https://msdn.microsoft.com/ja-
jp/library/system.windows.forms.scrollablecontrol.autoscrollposition\(v=vs.110\).aspx)で提供されます。

> クライアント領域のマウス座標取得方法は分かった

常にマウス座標が必要となることは少なく、一般的にはマウスが移動したときの現在位置だと思います。その場合、[`MouseMove`イベント](https://msdn.microsoft.com/ja-
jp/library/system.windows.forms.control.mousemove\(v=vs.110\).aspx)を処理することをお勧めします。この場合イベント引数から[`MouseEventArgs.Location`プロパティ](https://msdn.microsoft.com/ja-
jp/library/system.windows.forms.mouseeventargs.location\(v=vs.110\).aspx)を得ることができます。`e.Location`は`PointToClient(Control.MousePosition)`とほぼ同じ値になっています。

フォームのコンストラクタにある`InitializeComponent();`行の直後に

[code]

    MouseMove += (s, e) => Text = (e.Location - new Size(AutoScrollPosition)).ToString();
    
[/code]

と記述するとイメージがつかめると思います。


CC BY-SA 3.0
2017-07-01T01:40:13.820
36009
2017-07-01T01:40:13.820
4236
36003
answer