1

マウスホイールを使用してピクチャーボックスを拡大しようとしています。次の変数を使用します。

public static int offsetX = 0;
public static int offsetY = 0;
public static double scale = .05;

一連のポリゴンを画像ボックスに描画します。ただし、左下隅が0を参照するようにしたかったので、すべてを-yでフォームに描画します。描画されたポイントは上記の変数の影響を受けていますが、実際のポイントは同じままです。

void pictureBox1_MouseWheel(object sender, MouseEventArgs e)
{
    if (e.Delta > 0)
        scale += .025;
    else
        scale -= .025;

    pictureBox1.Invalidate();
}

マウスホイールを前方に動かすと、スケール変数が大きくなり、ボックスが更新されます。ピクチャーボックスのペイントメソッドで次のコードを使用して再ペイントされます。

     Graphics g = e.Graphics;
     foreach (Member m in activeTruss.members)
     {

        if (m.Visible == true)
        {
           Point[] pointArray = new Point[m.poly.Points.Count()];
           int index = 0;

           foreach (System.Windows.Point p in m.poly.Points)
           {

              pointArray[index].X = (int)((p.X + offsetX) * scale);
              pointArray[index].Y = (int)-((p.Y + offsetY) * scale);
              index++;
           }

           SolidBrush myBrush = new SolidBrush(m.color);
           g.FillPolygon(myBrush, pointArray);
        }
     }

正しい量をズームしますが、オフセットが同じままであるため、左上隅に向かってズームしているように見えます。ズームアウトする場合は、逆になります。マウスの下のポイントに直接ズームするために、マウスホイールを回すときにオフセットを編集するにはどうすればよいですか?

4

1 に答える 1

0

ズームを中央に合わせたい場合

double offsetX = scale/2
double offsetY = scale/2

アップデート

反転した画像に関する2番目の部分に答えるには、画像のx、yとx、yの画面座標を区別していないようです。通常、画面座標は画面の上部から始まるため、左上が 0,0 ですが、絵を描くときは、絵の 0,0 が左下にあるため、-y を使用します。あなたがしたいことは、フリップなしで 0,0 から 0,MAXY への描画を開始することです。この実装の詳細については、コードが大いに役立つでしょう :)

于 2012-05-30T00:54:57.850 に答える