2015-08-25 3 views
3

У меня есть форма, содержащая панель, и на этой панели я рисую фигуры, такие как прямоугольники и круги, мне нужно масштабировать эти фигуры, я видел пару вариантов, но большинство из них использует PictureBox. Должен ли я использовать Bitmap, создавая область панели как растровое изображение и меняя коэффициент масштабирования? помогло бы мне и дальше, если я хочу иметь панорамирование и не рисовать изображения не в соответствии с размером панели.Панель рисования увеличить в C#

Вот снимок моего кода

private void panel1_Paint(object sender, PaintEventArgs e) 
    { 
     Graphics g = panel1.CreateGraphics(); 
     SolidBrush myBrush = new SolidBrush(Color.Black); 
     Pen p = new Pen(Color.Black); 
     int RecScale = 1; 
     foreach (CircuitData.ResistorRow resistorRow in ResistorData.Resistor) 
     { 
      RectangleF rec = new RectangleF((float)(resistorRow.CenterX - resistorRow.Length/2), (float)(resistorRow.CenterY - resistorRow.Width/ 2), (float)resistorRow.Length, (float)resistorRow.Width); 
      float orientation = 360 - (float)resistorRow.Orientation; 
      PointF center = new PointF((float)resistorRow.CenterX, (float)resistorRow.CenterY); 
      PointF[] points = CreatePolygon(rec, center, orientation); 
      if (!Double.IsNaN(resistorRow.HiX) && !Double.IsNaN(resistorRow.HiY)) 
      { 
       g.FillEllipse(myBrush, (float)resistorRow.HiX - 5 , (float)resistorRow.HiY - 5, 10, 10); 
       g.DrawLine(p, new PointF((float)resistorRow.HiX, (float)resistorRow.HiY), center); 
      } 
      g.FillPolygon(myBrush, points); 
     } 
    } 

Может быть предоставлен образец кода. Большое спасибо

Jp

+0

Если вы хотите, чтобы вы могли масштабировать объект Graphics. Но сначала отремонтируйте сломанный код в событии рисования !!! Exchange 'Graphics g = panel1.CreateGraphics();' for 'Graphics g = e.Graphics; ' – TaW

ответ

4

Вот способ SCAL е рисунок на scaling the Graphics объекта:

private void panel1_Paint(object sender, PaintEventArgs e) 
{ 
    Graphics g = e.Graphics; 
    g.ScaleTransform(zoom, zoom); 

    // some demo drawing: 
    Rectangle rect = panel1.ClientRectangle; 
    g.DrawEllipse(Pens.Firebrick, rect); 
    using (Pen pen = new Pen(Color.DarkBlue, 4f)) g.DrawLine(pen, 22, 22, 88, 88); 

} 

Здесь мы храним уровень масштабирования:

float zoom = 1f; 

Здесь мы устанавливаем его и обновить панель:

private void trackBar1_Scroll(object sender, EventArgs e) 
{ 
    // for zooming between, say 5% - 500% 
    // let the value go from 50-50000, and initialize to 100 ! 
    zoom = trackBar1.Value/100f; 
    panel1.Invalidate(); 
} 

два примера скриншоты:

enter image description hereenter image description here

Обратите внимание на то, насколько хорошо это масштабирует ширину пера. Включение сглаживания было бы хорошей идеей ..: g.SmoothingMode = SmoothingMode.AntiAlias;

+0

Много спасибо TAW –

+0

Можно ли поместить полосу прокрутки для просмотра увеличенного содержимого? – Abhishek

+0

Извините, но я не понимаю. Попросите объяснить! – TaW

0

Поскольку вы рисуете с нуля, не может вам изменить размер вы чертеж базы на коэффициент масштабирования?

Вы можете умножить размеры чертежа на коэффициент масштабирования. Если предположить, что коэффициент масштабирования будет:

  • 0,5 для 50% увеличения (что бы уменьшить размер рисунка)
  • 1,0 на 100% (Реальный размер)
  • 1,5 на 150% (больший размер), вы могли бы известково ширина так:
 
object.Width = originalWidth * zoomFactor; 
+0

Говоря по ширине объекта, это объект Graphic g в моем случае кода или в каждой фигуре, которую я рисую. –

+0

Каждый объект. Фактически вам нужно будет сделать это с каждым измерением объекта. – Marlon

Смежные вопросы