2

Windows Mobile(Compact Framework 2.0)用のアプリを開発しています。PictureBoxを備えたWinFormsがあります。

PictureBoxの画像を移動したいのですが、方法がわからないので、PictureBoxの穴を移動することにしました。

それを行うために、私はこのイベントを使用します:

private void imagenMapa_MouseMove(object sender, MouseEventArgs e)
{
      imagenMapa.Left = e.X;
      imagenMapa.Top = e.Y;
      this.Refresh();
}

しかし、PictureBoxを動かすと、点滅してどこにでも移動します。

私が間違っているのは何ですか?

4

6 に答える 6

6

e.Xとはe.Y、画像ボックスに相対的です (たとえば、マウスが画像ボックスの左上にある場合、それは 0,0 です)。

imagenMapa.Leftとの値は、フォーム (またはコントロールに含まれるもの)imagenMapa.Topに相対的です。imagenMapa

これら 2 つのシステムの値を変換せずに混合しようとすると、ジャンプが発生します (ご覧のとおり)。

おそらく、マウスの位置を、画像ボックスを含むもので使用されるのと同じ座標系に変換した方がよいでしょう。

を使用imagenMapa.PointToScreenして、マウス座標を画面座標で取得 (またはCursor.Position位置を直接取得)yourForm.PointToClientし、フォーム座標で取得することができます。

Paint必要に応じて、コントロールのイベントをオーバーライド/処理し、自分で画像を描画することで、「コントロール内で画像を移動する」ことができることに注意してください。これを行った場合、ピクチャボックスの座標にすべてを保持できますgraphicsObject.DrawImage

于 2009-02-20T17:57:37.953 に答える
6

実際のコード (.NET Framework 3.5 以降が必要です。Compact Framework で利用できるかどうかは不明です)...

// Global Variables
private int _xPos;
private int _yPos;
private bool _dragging;

// Register mouse events
pictureBox.MouseUp += (sender, args) =>
{
    var c = sender as PictureBox;
    if (null == c) return;
    _dragging = false;
};

pictureBox.MouseDown += (sender, args) =>
{
    if (args.Button != MouseButtons.Left) return;
    _dragging = true;
    _xPos = args.X;
    _yPos = args.Y;
};

pictureBox.MouseMove += (sender, args) =>
{
    var c = sender as PictureBox;
    if (!_dragging || null == c) return;
    c.Top = args.Y + c.Top - _yPos;
    c.Left = args.X + c.Left - _xPos;
};
于 2013-02-01T06:49:04.847 に答える
1

eX & eY は、pictureBox の座標空間にあり、imagenMapa.Left & imagenMapa.Top は、フォームの座標空間にあります。:-)

于 2009-02-20T17:58:12.133 に答える
1

数学を受け入れよう!

control.Left = control.Left - (_lastMousePos.X - currentMousePos.X);
control.Top = control.Top - (_lastMousePos.Y - currentMousePos.Y);

簡単な説明: マウスの位置から違いを取得し、移動するオブジェクトに適用します。

例: 古いマウスの X 位置が 382 で、新しい位置が 385 の場合、差は -3 です。コントロールの現在の X 位置が 10 の場合、10 - (-3) = 13

理由: これは何にでも機能し、常に座標を前後に変換するよりもはるかに安価です。

于 2012-05-19T00:06:21.183 に答える