c#绘图实现缩放功能 缩放坐标轴和绘制内容

缩放我这里绑定的是鼠标的滚轮事件,这个事件可能在控件的属性中找不到,需要自己定义方法,并在designer.cs文件中使控件订阅此事件

private void DrawControl_MouseWheel(object sender, MouseEventArgs e){

}

然后开始编写缩放事件

private void DrawControl_MouseWheel(object sender, MouseEventArgs e)
{
    zoomDelta = e.Delta; //鼠标滚动的增量值,正值表示向上滚动,负值表示向下滚动
    float zoomFactor = 0.1f; // 缩放比例
                         // 获取鼠标当前位置
    float mouseX = e.X;
    float mouseY = e.Y;

    // 计算缩放前的鼠标位置的逻辑坐标
    float originalMouseX = (mouseX - zoomMatrix.Elements[4]) / zoomMatrix.Elements[0];
    float originalMouseY = (mouseY - zoomMatrix.Elements[5]) / zoomMatrix.Elements[3];

    // 将缩放中心设置为鼠标当前位置
    zoomMatrix.Translate(-originalMouseX, -originalMouseY);

    // 根据鼠标滚动的增量值,确定缩放
    if (zoomDelta > 0)
    {
        zoomMatrix.Scale(1 + zoomFactor, 1 + zoomFactor); // 放大
    }
    else
    {
        zoomMatrix.Scale(1 - zoomFactor, 1 - zoomFactor); // 缩小
    }

    // 计算缩放后的鼠标位置的逻辑坐标
    float newMouseX = (mouseX - zoomMatrix.Elements[4]) / zoomMatrix.Elements[0];
    float newMouseY = (mouseY - zoomMatrix.Elements[5]) / zoomMatrix.Elements[3];

    // 计算原点移动的偏移量
    float offsetX = newMouseX - originalMouseX;
    float offsetY = newMouseY - originalMouseY;

    // 平移操作,使原点移动
    zoomMatrix.Translate(offsetX, offsetY);
    // 记录缩放后的鼠标位置
    lastMousePos = e.Location;
    // 重绘
    this.Invalidate();
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现带角度的矩形缩放功能,可以按照以下步骤进行: 1. 定义一个类来表示带角度的矩形,该类应包含矩形的位置、大小和角度等信息。 2. 在矩形的周围绘制一些调整大小的手柄,使用户可以使用鼠标拖拽来调整矩形的大小。 3. 当用户拖拽调整大小的手柄时,根据手柄的位置和移动距离来计算矩形的新位置和大小,并重新绘制矩形。 4. 为了实现缩放时的平移效果,可以在拖拽调整大小的手柄时,根据手柄的位置和移动距离来计算缩放中心点,并将矩形的位置相应地调整。 5. 如果矩形的角度不为0,则需要在调整大小的同时调整矩形的角度,使得矩形始终保持水平。 具体实现过程如下: ```csharp // 定义带角度的矩形类 public class RotatedRectangle { public PointF Location { get; set; } // 矩形左上角的坐标 public SizeF Size { get; set; } // 矩形的大小 public float Angle { get; set; } // 矩形的角度 // 构造函数 public RotatedRectangle(PointF location, SizeF size, float angle) { Location = location; Size = size; Angle = angle; } // 绘制矩形 public void Draw(Graphics g) { // 计算矩形的四个角落点的坐标 PointF[] points = new PointF[4]; points[0] = new PointF(Location.X, Location.Y); points[1] = new PointF(Location.X + Size.Width, Location.Y); points[2] = new PointF(Location.X + Size.Width, Location.Y + Size.Height); points[3] = new PointF(Location.X, Location.Y + Size.Height); // 计算矩形的中心点坐标 PointF center = new PointF(Location.X + Size.Width / 2, Location.Y + Size.Height / 2); // 旋转矩形 Matrix matrix = new Matrix(); matrix.RotateAt(Angle, center); g.Transform = matrix; // 绘制矩形 g.DrawPolygon(Pens.Red, points); // 恢复绘图状态 g.ResetTransform(); // 绘制调整大小的手柄 g.DrawEllipse(Pens.Blue, Location.X - 5, Location.Y - 5, 10, 10); // 左上角 g.DrawEllipse(Pens.Blue, Location.X + Size.Width - 5, Location.Y - 5, 10, 10); // 右上角 g.DrawEllipse(Pens.Blue, Location.X + Size.Width - 5, Location.Y + Size.Height - 5, 10, 10); // 右下角 g.DrawEllipse(Pens.Blue, Location.X - 5, Location.Y + Size.Height - 5, 10, 10); // 左下角 } // 调整矩形大小 public void Resize(PointF handle, PointF mouse) { // 计算缩放中心点 PointF center = new PointF(Location.X + Size.Width / 2, Location.Y + Size.Height / 2); if (handle.X < center.X && handle.Y < center.Y) { center = new PointF(Location.X + Size.Width, Location.Y + Size.Height); } else if (handle.X < center.X && handle.Y > center.Y) { center = new PointF(Location.X + Size.Width, Location.Y); } else if (handle.X > center.X && handle.Y > center.Y) { center = new PointF(Location.X, Location.Y); } // 计算鼠标移动距离 float dx = mouse.X - handle.X; float dy = mouse.Y - handle.Y; // 计算新的矩形位置和大小 float angle = Angle * (float)Math.PI / 180; float sin = (float)Math.Sin(angle); float cos = (float)Math.Cos(angle); float cx = center.X * cos - center.Y * sin; float cy = center.X * sin + center.Y * cos; float left = cx - (Size.Width / 2) * cos - (Size.Height / 2) * sin; float top = cy - (Size.Height / 2) * cos + (Size.Width / 2) * sin; float width = Size.Width + dx * cos + dy * sin; float height = Size.Height - dx * sin + dy * cos; // 更新矩形的位置和大小 Location = new PointF(left, top); Size = new SizeF(width, height); } } ``` 然后在窗体的`Paint`事件中绘制矩形,并在鼠标的`MouseDown`、`MouseMove`和`MouseUp`事件中实现矩形的调整大小: ```csharp public partial class Form1 : Form { private RotatedRectangle rectangle; // 带角度的矩形 private PointF resizeHandle; // 调整大小的手柄 private bool resizing; // 是否正在调整大小 public Form1() { InitializeComponent(); // 创建带角度的矩形 rectangle = new RotatedRectangle(new PointF(100, 100), new SizeF(200, 100), 30); } private void Form1_Paint(object sender, PaintEventArgs e) { // 绘制带角度的矩形 rectangle.Draw(e.Graphics); } private void Form1_MouseDown(object sender, MouseEventArgs e) { // 判断是否在调整大小的手柄上按下鼠标 if (e.Button == MouseButtons.Left) { PointF[] handles = new PointF[] { new PointF(rectangle.Location.X - 5, rectangle.Location.Y - 5), // 左上角 new PointF(rectangle.Location.X + rectangle.Size.Width - 5, rectangle.Location.Y - 5), // 右上角 new PointF(rectangle.Location.X + rectangle.Size.Width - 5, rectangle.Location.Y + rectangle.Size.Height - 5), // 右下角 new PointF(rectangle.Location.X - 5, rectangle.Location.Y + rectangle.Size.Height - 5) // 左下角 }; foreach (PointF handle in handles) { if (e.X >= handle.X && e.X <= handle.X + 10 && e.Y >= handle.Y && e.Y <= handle.Y + 10) { resizeHandle = handle; resizing = true; break; } } } } private void Form1_MouseMove(object sender, MouseEventArgs e) { // 调整大小 if (resizing) { rectangle.Resize(resizeHandle, e.Location); this.Invalidate(); } } private void Form1_MouseUp(object sender, MouseEventArgs e) { // 停止调整大小 if (e.Button == MouseButtons.Left) { resizing = false; } } } ``` 这样就实现了带角度的矩形缩放功能

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值