缩放图片框根本不会更改图像

我正在使用图片框来创建我的桁架类实例的视觉效果。 我通过直接绘制到paint事件中的图片框来创建视觉效果。 该方法看起来像这样

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 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 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; } } 

这产生了我期待的结果

在此处输入图像描述

除了我希望桁架图像可以扩展以更多地填充图片框。 我将ScaleTransform调用添加到paint事件方法的末尾,但这似乎没有任何影响,因为图片大小相同,有或没有调用。 如何将我在图片框上绘制的内容缩放到图片框的大小?

在绘制之前调用ScaleTransform 。 您可以像这样计算所需的比例因子:

 // 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);