2016-04-14 50 views
1

Truss sınıfımın bir örneğinin görselini oluşturmak için bir resim kutusu kullanıyorum. Görsel olayı, boya olayındaki resim kutusuna doğrudan çizerek yapıyorum. yöntem ben makas görüntü daha Picturebox doldurmak ölçeğe istiyoruz dışındaÖlçekleme Picturebox görüntüyü hiç değiştirmiyor

enter image description here

bekliyorum sonucunu verir bu

private void pictureBox1_Paint(object sender, PaintEventArgs e) 
{ 
    if (isDraw) 
    { 
     //Preparing to draw 
     Graphics g = e.Graphics; 
     g.SmoothingMode = SmoothingMode.AntiAlias; 
     g.InterpolationMode = InterpolationMode.Bicubic; 
     RunEntry entry = this.passedHistory.SelectedItem as RunEntry; 
     AnsFile objToDraw = entry.FileRead; 
     Pen pen = new Pen(Color.Black); 

     //Getting size of bitmap 
     int maxWidth = 0, maxHeight = 0; 
     foreach (AnsJoint joint in objToDraw.AnsJoints) 
     { 
      if (joint.Location.X.Length > maxWidth) 
      { 
       maxWidth = (int)joint.Location.X.Length; 
      } 
      if (joint.Location.Y.Length > maxHeight) 
      { 
       maxHeight = (int)joint.Location.Y.Length; 
      } 
     } 

     //Drawing joints 
     foreach (AnsJoint joint in objToDraw.AnsJoints) 
     { 
      PointF jointPoint = this.ToCartesian(new PointF((float)joint.Location.X.Length - 4f, (float)joint.Location.Y.Length + 10f), maxHeight); 
      e.Graphics.DrawString(joint.JointID.ToString(), new Font(FontFamily.GenericMonospace, 6f, FontStyle.Regular, GraphicsUnit.Point, 1, false), Brushes.Black, jointPoint); 
     } 

     //Draw the panels and links 
     foreach (AnsMember member in objToDraw.AnsMembers) 
     { 
      List<AnsPanel> panels = member.Panels; //Drawing the panels 

      foreach (AnsPanel pan in panels) 
      { 
       pen.Color = Color.Red; 
       PointF p1 = this.ToCartesian(new PointF((float)pan.I.Location.X.Length, (float)pan.I.Location.Y.Length), maxHeight); 
       PointF p2 = this.ToCartesian(new PointF((float)pan.J.Location.X.Length, (float)pan.J.Location.Y.Length), maxHeight); 

       g.DrawEllipse(pen, p1.X - 2.5f, p1.Y - 2.5f, 5, 5); 
       g.DrawEllipse(pen, p2.X - 2.5f, p2.Y - 2.5f, 5, 5); 

       g.DrawEllipse(pen, p1.X - 3, p1.Y - 3.3f, 5, 5); 
       g.DrawEllipse(pen, p2.X - 3, p2.Y - 3.3f, 5, 5); 
       pen.Color = Color.Black; 
       g.DrawLine(pen, p1, p2); 
      } 
      List<AnsLink> links = member.Links; //Drawing the links 
      foreach (AnsLink link in links) 
      { 
       PointF p1 = this.ToCartesian(new PointF((float)link.I.Location.X.Length, (float)link.I.Location.Y.Length), maxHeight); 
       PointF p2 = this.ToCartesian(new PointF((float)link.J.Location.X.Length, (float)link.J.Location.Y.Length), maxHeight); 
       g.FillEllipse(Brushes.Green, p1.X - 1.5f, p1.Y - 1.5f, 3, 3); 
       g.FillEllipse(Brushes.Green, p2.X - 1.5f, p2.Y - 1.5f, 3, 3); 
       g.DrawLine(pen, p1, p2); 
      } 
     } 
     g.ScaleTransform(.5f, .5f); 
     pictureBox1.Tag = entry.FileName; 
    } 
} 

benziyor. ScaleTransform çağrısını boya olay yönteminin sonuna ekledim, ancak resmin, çağrı ile veya çağrı olmadan aynı boyutta olması gibi bir etkisi yok gibi görünüyor. Picturebox'ta çizdiğim şeyi resimdeki büyüklüğüne nasıl ölçekleyebilirim?

+2

ben ScaleTransform hiç kullanmadım, ama bu sorunun cevabı o çizim çağrılmadan önce ayarlanması gerekir düşündürmektedir: Böyle istenen ölçek faktörünü hesaplayabilirsiniz http://stackoverflow.com/questions/22615138/apply-scaletransform-to-graphics-gdi (Ayrıca, grafiğinizin grafikleri ölçekleyeceği gibi değil, aşağı doğru görünür.) – adv12

+0

Bu düzeltildi! Yeterince basit. Cevap olarak ekle ve kabul edeceğim –

cevap

1

Çiziminizi yapmadan önce ScaleTransform numaralı telefonu arayın.

// place this code after the calculation of maxWidth and maxHeight 
// but before the drawing code 
PictureBox p = (PictureBox)sender; 
float scaleFactor = Math.Min(
    ((float)p.Width)/maxWidth, 
    ((float)p.Height)/maxHeight 
); 

g.ScaleTransform(scaleFactor, scaleFactor);