2017-07-13 37 views
3

プログラムの「WorkArea」として大きなパネルを持つ単純なプログラム(これまでのもの)を構築しました。グリッド上にグリッドを描画し、グリッド上の最も近いポイントにカーソルをスナップする機能を持っています。パネルの現在の位置を表示するウィンドウの下部にステータスバーがあります。しかし、どこにスクロールしたかにかかわらず(縦棒が上と横に対して25%で10%であるとしよう)、実際のウィンドウに関してカーソル位置が表示されます。スクロールバーを使ったパネル上のカーソル位置の取得

私はこれを処理ONMOUSEMOVEイベント持っている:私はそうで、カーソルのポイントを与え、正しい場所にそれを描画し、期待どおりに動作

private void WorkArea_MouseMove(object sender, MouseEventArgs e) 
{ 
    GridCursor = grid.GetSnapToPosition(new Point(e.X, e.Y)); 
    toolStripStatusLabel1.Text = grid.GetSnapToPosition(new Point(e.X, e.Y)).ToString(); 
    Refresh(); 
} 

を。しかし、私がスクロールしても、私は同じ読みが得られます。縦と横のスクロールバーの半分をスクロールして、カーソルを左上隅に置き、0,5を読み取ることができます。これは、5000,5000のようなものにする必要があります(パネル10kで10k) 。

スクロールバーに関してパネル内の絶対位置を取得するにはどうすればよいですか?

+0

「WorkArea」はPanelです。 'GridCursor'、' grid'、 'GetSnapToPosition'とは何ですか? 'AutoScroll'はオンですか? – TaW

答えて

1

private void panel1_MouseMove(object sender, MouseEventArgs e) 
{ 
     Point scrolledPoint = new Point(e.X - panel1.AutoScrollPosition.X, 
             e.Y - panel1.AutoScrollPosition.Y); 

     .. 
} 

AutoScrollPositionの値が負である..:制御 離れてその開始位置(0,0)からスクロールした場合に取得

XとY座標の値が負です。この プロパティを設定するときは、常に正のXとYの値を割り当てて、 スクロール位置を開始位置に対して相対的に設定する必要があります。たとえば、 に水平スクロールバーがあり、xとyを200に設定した場合は、 を200ピクセル右にスクロールします。 xとyを100に設定すると、 スクロールは、 を開始位置から100ピクセル離れた位置に設定しているため、左に100ピクセル移動して表示されます。最初のケースでは、 AutoScrollPositionは{-200、0}を返します。 2番目のケースでは、 {-100,0}を返します。

+0

それはトリックをした、ありがとう! – Zulukas

0

リサイズ:

Control.PointToClientは、あなたがコントロール自体を基準にしたマウス位置を変換することができます方法。

Point point = grid.PointToClient(new Point(e.X, e.Y)) 

WPF:Mouse.GetPositionを使用して

あなたが特定のコントロールにマウスの位置を取得することができます:あなたはスクロール位置での位置をオフセットする必要がある

Point position = Mouse.GetPosition(grid); 
+0

その外観からは、WPFのみです。 WinFormsでこれを行う方法はありますか?私は "Cursor.Current"の効果を見ましたが、このオブジェクトの使い方に関する情報は見つけられませんでした(ちょうどPointオブジェクトを取得しようとしています)。 – Zulukas

+0

ああ、あなたのwinformsタグが見つかりませんでした別の解決策。 – Chrille

関連する問題