Wq_wn 2023-03-27 17:41 采纳率: 90.9%
浏览 40
已结题

winform输出结果进行放大缩小


 private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            // 获取用户输入的矩形中心点、长和宽
            double centerX = Convert.ToDouble(textBox1.Text);
            double centerY = Convert.ToDouble(textBox2.Text);
            double width = Convert.ToDouble(textBox3.Text);
            double height = Convert.ToDouble(textBox4.Text);

            // 创建绘图对象
            Graphics g  = e.Graphics;
            g.Clear(Color.White);

            // 获取坐标轴原点的坐标
            double originX = pictureBox1.Width / 2.0 ;
            double originY = pictureBox1.Height / 2.0;

            // 绘制坐标轴
            Pen axisPen = new Pen(Color.Black, 2);
            g.DrawLine(axisPen, 0, (float)(pictureBox1.Height / 2.0), pictureBox1.Width, (float)(pictureBox1.Height / 2.0)); // 水平线
            g.DrawLine(axisPen, (float)(pictureBox1.Width / 2.0), pictureBox1.Height, (float)(pictureBox1.Width / 2.0), 0); // 垂直线

            // 绘制箭头
            Point[] arrow = new Point[3];
            arrow[0] = new Point(pictureBox1.Width - 10, pictureBox1.Height / 2 - 5);
            arrow[1] = new Point(pictureBox1.Width, pictureBox1.Height / 2);
            arrow[2] = new Point(pictureBox1.Width - 10, pictureBox1.Height / 2 + 5);
            g.FillPolygon(Brushes.Black, arrow); // 水平箭头
            arrow[0] = new Point(pictureBox1.Width / 2 - 5, 10);
            arrow[1] = new Point(pictureBox1.Width / 2, 0);
            arrow[2] = new Point(pictureBox1.Width / 2 + 5, 10);
            g.FillPolygon(Brushes.Black, arrow); // 垂直箭头

            // 计算矩形的四个顶点坐标
            //centerX = centerX + originX;
            //centerY = centerY + originY;
            double left = centerX - width / 2.0;
            double right = centerX + width / 2.0;
            double top = centerY - height / 2.0;
            double bottom = centerY + height / 2.0;

            // 绘制矩形
            Pen rectPen = new Pen(Color.Red, 2);
            g.DrawRectangle(rectPen, (float)(originX + left), (float)(originY - bottom), (float)width, (float)height);
        }
        private void pictureBox1_MouseWheel(object sender, MouseEventArgs e)
        {
            
            Rectangle rec = pictureBox1.DisplayRectangle;
            Point p = new Point(e.X, e.Y);
            int delta = e.Delta;
            double zoomFactor = 1.2; // 缩放因子
            if (delta < 0)
                zoomFactor = 1 / zoomFactor; // 向下滚动,缩小图像
            // 修改控件大小,缩放图像
            pictureBox1.Width = Convert.ToInt32(pictureBox1.Width * zoomFactor);
            pictureBox1.Height = Convert.ToInt32(pictureBox1.Height * zoomFactor);
            
            // 修改图像比例,缩放图像
            pictureBox1.Scale(new SizeF((float)zoomFactor, (float)zoomFactor));

            // 重新绘制图像
            pictureBox1.Invalidate();
        }

我这样可以将picturebox控件进行放大缩小,我想知道怎么才能只将绘制出的矩形进行放大缩小(类似于将坐标轴的刻度放大缩小,矩形随之改变),而不改变坐标系和控件的大小,我是初学者,求各位牛人指教一下。

  • 写回答

2条回答 默认 最新

  • Vayne16 2023-03-27 17:43
    关注

    该回答引用GPT:
    要实现只将绘制出的矩形进行放大缩小,可以在pictureBox1_MouseWheel事件中添加以下代码:

    // 获取用户输入的矩形中心点、长和宽
    double centerX = Convert.ToDouble(textBox1.Text);
    double centerY = Convert.ToDouble(textBox2.Text);
    double width = Convert.ToDouble(textBox3.Text);
    double height = Convert.ToDouble(textBox4.Text);
    
    // 计算矩形的四个顶点坐标
    double left = centerX - width / 2.0;
    double right = centerX + width / 2.0;
    double top = centerY - height / 2.0;
    double bottom = centerY + height / 2.0;
    
    // 根据鼠标滚轮滚动的距离,计算缩放因子
    double zoomFactor = 1.2; // 缩放因子
    if (delta < 0)
        zoomFactor = 1 / zoomFactor; // 向下滚动,缩小图像
    
    // 根据缩放因子,计算缩放后的矩形的四个顶点坐标
    double newLeft = left * zoomFactor;
    double newRight = right * zoomFactor;
    double newTop = top * zoomFactor;
    double newBottom = bottom * zoomFactor;
    
    // 绘制缩放后的矩形
    Pen rectPen = new Pen(Color.Red, 2);
    g.DrawRectangle(rectPen, (float)(originX + newLeft), (float)(originY - newBottom), (float)(newRight - newLeft), (float)(newBottom - newTop));
    

    如还有疑问,可留言帮助解决。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月30日
  • 已采纳回答 3月29日
  • 创建了问题 3月27日

悬赏问题

  • ¥15 java 判断某个数 区间是否存在
  • ¥15 appium控制多个雷电模拟器问题
  • ¥15 C# iMobileDevice
  • ¥15 谁会做这个啊#ensp#Boson NetSim
  • ¥15 如何编写针对TPS6503320FRGE型号的电源管理芯片的编程代码?
  • ¥15 设计简单目录管理系统,要满足以下内容
  • ¥15 关于九十度混合耦合器信号分析问题
  • ¥15 Cesm如何关闭不用的模块呢
  • ¥15 vue2两层数据导出为excle
  • ¥15 有人能帮我做一下这个项目吗