2017-05-19 11 views
-1

この問題に関するいくつかの質問がありましたが、私はすべてのソリューションを試しましたが、私の場合はそれほど効果がありませんでした。 私のコードは動作しています。このimageは、[描画]ボタンをクリックしたときの動作を示しています。 私はその図面をズームする必要があります。オートキャド機能 "ズーム/エクステント"のようなものをコーディングすることは可能ですか?ペイントイベントの描画線のサイズ変更

Pen myPen = new Pen(Color.Black); 
int centerpointx, centerpointy; 
private void pictureBoxDraw_Paint(object sender, PaintEventArgs e) 
    { 
     centerpointx = pictureBoxDraw.Size.Width/2; 
     centerpointy = pictureBoxDraw.Size.Height/2; 

     myPen.Width = 2; 
     if (binary > 0) 
     { 
      var sizecrestgeo = 40; 
      var distancearraycrestgeo = new float[sizecrestgeo]; 
      var elevationarraycrestgeo = new float[sizecrestgeo]; 
      for (int i = 0; i < sizecrestgeo; i++) 
      { 
       distancearraycrestgeo[i] = float.Parse(dataGridViewCrestGeo.Rows[i].Cells[0].Value.ToString()); 
       elevationarraycrestgeo[i] = float.Parse(dataGridViewCrestGeo.Rows[i].Cells[1].Value.ToString())*-1; 

      } 
      for (int i=0; i < sizecrestgeo-1; i++) 
      { 
      e.Graphics.DrawLine(myPen, distancearraycrestgeo[i]+centerpointx, elevationarraycrestgeo[i]+centerpointy, distancearraycrestgeo[i + 1]+centerpointx, elevationarraycrestgeo[i + 1]+centerpointy); 
      } 
     } 
     else 
     { 
     } 
    } 

    private void buttonDraw_Click_1(object sender, EventArgs e) 
    { 
     if (Hd > 0.0001) 
     { 
      binary = 1; 
      pictureBoxDraw.Invalidate(); 
     } 
     else 
     { 
      MessageBox.Show("No data to draw, perform analysis first."); 
     } 

    } 

    private void buttoncleardraw_Click(object sender, EventArgs e) 
    { 
     binary = 0; 
     pictureBoxDraw.Invalidate(); 
    } 
} 
+1

Graphicsオブジェクトをスケールすることができます。 [ここ](http://stackoverflow.com/questions/32204274/panel-drawing-zoom-in-c-sharp/32204516#32204516)と[ここ](http://stackoverflow.com/questions/32204274/)を参照してください。 panel-drawing-zoom-in-c-sharp/32204516?s = 4 | 0.8505#32204516)を使用します。 – TaW

+0

ペンの幅さえもスケーリングされているので、ペイントでは1pxより小さいサイズを使用することをお勧めします。彼らはまだ最小1pxで描かれます。 – TaW

+0

@TaW役立つ例と警告、ありがとうございます。 [img1](https://i.hizliresim.com/V0q6oV.png)[img2](https://i.hizliresim.com/1LQDmp.png)実際これは私が欲しいものではありません。私はユーザーがこれを制御しないように、私は何とか描画の中心にする必要があります。 –

答えて

0

Graphics.ScaleTransform()あなたがズームすることができる方法です。あなたのペイントイベントハンドラ内でこのようなものを使用してみてください:

e.Graphics.ScaleTransform(2.0F, 2.0F); 
0

これは、すべてのパズルのピースを知って、それほど難しいことではありません。

のは、明らかに1から始めましょう:

  • あなたはGraphicsオブジェクトがScaleTransformズームグラフィックスを作成するために拡張することができます。

これは、ペンの幅、フォントのサイズ、描画する画像(HatchBrushのハッチングではありません)を含みます。

あなたはまた、図面を中央に置いておくことについて尋ねました。これは明白な概念ではありません。の図面面は何ですか?

(ちょうど回転のような)ズームあなたは常にズームの中心点知っておく必要があります(または回転を。)デフォルトでは、これが起源(0,0)です。私はPanelの中心を選んだ。他の点を選択することができます。

グラフィックスビューポートの原点をTranslateTransformでこの点に移動することができます。

これをすべて達成すれば、ほぼ確実にのスクロールが許可されます。次の2つのオプション持ってそうするには

:あなたはAutoScroll = trueを持って制御、通常Panel、内部のキャンバスコントロールAutoScroll = falseを保つことができる

  • を。次にキャンバスコントロールを常に大きくして図面を保持してください。

  • また、キャンバスコントロールの場合はAutoScrollをオンにすることができます。また、十分に大きな値をAutoScrollMinSizeに設定することもできます。現在のスクロール位置を翻訳に追加すると、翻訳も完了します。アクションで、このソリューションを見てみましょう:

enter image description here

これはPaintイベントのコードです:

Size sz = panel3.ClientSize; 
Point center = new Point(sz.Width/2, sz.Height/2); 
Graphics g = e.Graphics; 

// center point for testing only! 
g.DrawEllipse(Pens.Orange, center.X - 3, center.Y - 3, 6, 6); 

// you determine the value of the zooming! 
float zoom = (trackBar1.Value+1)/3f; 

// move the scrolled center to the origon 
g.TranslateTransform(center.X + panel3.AutoScrollPosition.X, 
         center.Y + panel3.AutoScrollPosition.Y); 
// scale the graphics 
g.ScaleTransform(zoom, zoom); 

// draw some stuff.. 
using(Pen pen = new Pen(Color.Yellow, 0.1f)) 
for (int i = -100; i < 100; i+= 10) 
     g.DrawEllipse(Pens.Yellow, i-22,i-22,44,44); 

いくつかの注意事項:

  • 私はオレンジ色の円を描きますこの点を示す中心に不変
  • 私の座標は負の値から正の値へと変化するので、これはうまくいくことがわかります。
  • 小さなペンの幅で描きます。その結果、ペンが1ピクセルを超えると、図面の幅が変わるだけです。しかし、描くものは常に1ピクセル幅で描画されます。
  • 私は最初に翻訳してからスケールしますので、スケールされた部分を計算する必要はありません。しかし、それはちらつきを避けるためにPanelために必要なpanel3.Invalidate();

のみ設定が

panel3.AutoScroll = true; 
panel3.AutoScrollMinSize = new Size(500, 500); // use the size you want to allow! 

です:

  • TrackBarさんScrollイベントでのみ行がPaintイベントをトリガすることですDoubleBufferedサブクラスを使用することを強く推奨します。

    class DrawPanel : Panel 
    { 
        public DrawPanel()  { DoubleBuffered = true; } 
    } 
    
  • 関連する問題