2017-01-29 9 views
0

私はユーザーコントロールを持っており、ズームを実装するのにScaleTransform()を使用しています。スクロールせずにグラフィックを拡大する

ただし、ズーム後に中央のコンテンツを中央に保持するには、スクロールする必要もあります。たとえば、ズームイン(大きめにする)すると、XとYの原点が大きくなり、ほとんどのコンテンツが右下に移動しないようにする必要があります。 (つまり、ズームインすると、コンテンツの一部が左上に表示されなくなります)

ズームに応じてX方向とY方向にどれだけスクロールするか計算した人はいませんか?例えば

e.Graphics.ScaleTransform(2.0F, 2.0F); 
e.Graphics.TranslateTransform(?, ?); 

TranslateTransform()に私の引数は、コンテンツの中央部分を中心に残るようになるでしょうか?

注:画像は表示されません。私は私のユーザーコントロールの表面にグラフィックコンテンツを描画しています。

さらに簡単な方法がありますか?

答えて

2

これはうまくいくはずです。私は簡単な方法は想像できません。ズームのセンターを決定したものとします。私は、パネルを中心に描くために選択した:

float zoom = 1f; 

private void drawPanel1_Paint(object sender, PaintEventArgs e) 
{ 
    Point c = new Point(drawPanel1.ClientSize.Width/2, drawPanel1.ClientSize.Height/2); 

    // a blue sanity check for testing 
    e.Graphics.FillEllipse(Brushes.DodgerBlue, c.X - 3, c.Y - 3, 6, 6); 

    // the offsets you were looking for: 
    float ox = c.X * (zoom - 1f); 
    float oy = c.Y * (zoom - 1f); 

    // first move and then scale 
    e.Graphics.TranslateTransform(-ox, -oy); 
    e.Graphics.ScaleTransform(zoom, zoom); 

    // now we can draw centered around our point c 
    Size sz = new Size(300, 400); 
    int count = 10; 
    int wx = sz.Width/count; 
    int wy = sz.Height/count; 

    for (int i = 0; i < count; i++) 
    { 
     Rectangle r = new Rectangle(c.X - i * wx/2 , c.Y - i * wy/2, i * wx, i * wy); 
     e.Graphics.DrawRectangle(Pens.Red, r); 
    } 
} 

enter image description here

注移動や拡大縮小のため!

+0

うん、それは私が探していたものだ。私が持っている他のスクロールコードとそれを調整する必要があります。ありがとう! –

0

私はあなたには、いくつかのdifferetインターフェイスを使用していると思いますが、私の場合には、それが(それにマウスを残しするためにマウスホイールイベントの後ドローに元の場所です)仕事を得たものです:

private void DrawPb_MouseWheel(object sender, MouseEventArgs e) 
    { 
     // e contains current mouse location and the wheel direction 
     int wheelDirection = e.Delta/Math.Abs(e.Delta); // is 'in' or 'out' (1 or -1). 
     double factor = Math.Exp(wheelDirection * Constants.ZoomFactor); // divide or multiply 
     double newX = e.X - e.X/factor; // what used to be x is now newX 
     double newY = e.Y - e.Y/factor; // same for y 
     Point offset = new Point((int)(-newX), (int)(-newY)); // the offset of the old point to it's new location 
     Graph.AddOffset(offset); // apply offset 
    } 
+0

'AddOffset'は' TranslateTransform'と同じですか? –

+0

'AddOffset'は、私が書きましたが、' offset 'として与えられた(x、y)だけグラフ上のすべての点を動かすだけです。私は 'TranslateTransform'を知らなかった、私はちょうど相対的な矯正位置に物事を維持するために行う必要がある計算を共有していた。これを中心に置くだけの場合は、あなたの描画の中心点として 'e.X'と' e.Y'を置き換えるべきです( 'newX = center.X - center.X/factor;')。 –

関連する問題