C# winfrom缩放图片并且可以鼠标拖动

本文展示了如何使用C# WinForm创建一个窗体,该窗体允许用户通过鼠标滚轮缩放图片,并能进行自由拖动。通过处理pictureBox的MouseWheel、MouseDown、MouseUp和MouseMove事件,实现了图片的缩放和拖动功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >




窗体如下:
具体代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Reflection;

namespace Medical.PEIS.UI.BusinessUI
{
    public partial class TuPianYL : Form
    {
        Bitmap myBmp;
        Point mouseDownPoint = new Point(); //记录拖拽过程鼠标位置
        bool isMove = false;  //判断鼠标在picturebox上移动时,是否处于拖拽过程(鼠标左键是否按下)
        int zoomStep = 60;   //缩放步长
        public TuPianYL()
        {
            InitializeComponent();
        }

        #region 图片加载(第一种方式)
        public TuPianYL(string TP, bool FTP)
        {
            InitializeComponent();
            if (FTP == true)
            {
                pictureBox1.LoadAsync(TP);
            }
            else
            {
                pictureBox1.Load(TP);
            }
            myBmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            pictureBox1.Image = myBmp;
            pictureBox1.SizeMode = PictureBoxSizeMode.Zoom; //设置picturebox为缩放模式
        } 
        #endregion

        #region 图片加载(第二种方式)
        //图片上传
        private void button1_Click(object sender, EventArgs e)
        {
            string filename = "";
            OpenFileDialog dlg = new OpenFileDialog();
            dlg.Filter = "Tiff文件|*.tif|Bmp文件|*.bmp|Erdas img文件|*.img|EVNI文件|*.hdr|jpeg文件|*.jpg|raw文件|*.raw|vrt文件|*.vrt|所有文件|*.*";
            dlg.FilterIndex = 8;
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                filename = dlg.FileName;
            }
            if (filename == "")
            {
                return;
            }
            myBmp = new Bitmap(filename);
            if (myBmp == null)
            {
                MessageBox.Show("读取失败");
                return;
            }
            pictureBox1.Image = myBmp;
            pictureBox1.SizeMode = PictureBoxSizeMode.Zoom; //设置picturebox为缩放模式
            pictureBox1.Width = myBmp.Width;
            pictureBox1.Height = myBmp.Height;
        }
        #endregion

        #region 鼠标滚轮滚动功能
        private void pictureBox1_MouseWheel(object sender, MouseEventArgs e)
        {
            int x = e.Location.X;
            int y = e.Location.Y;
     
### 如何在 C# WinForms 应用程序中实现界面元素的缩放功能 为了实现在 C# WinForms 应用程序中的缩放功能,可以利用 `AutoScaleMode` 属性来控制窗体及其子控件随 DPI 或字体大小变化而自动调整尺寸。此外,还可以通过手动计算比例因子并应用到各个控件的位置和大小上达到更灵活的效果。 #### 使用 AutoScaleMode 实现简单缩放 设置窗体的 `AutoScaleMode` 属性为 `Dpi` 可以让系统根据屏幕分辨率的变化自动调整整个窗体内所有控件的比例[^1]: ```csharp public partial class MainForm : Form { public MainForm() { InitializeComponent(); this.AutoScaleMode = AutoScaleMode.Dpi; } } ``` 这种方法适用于大多数情况下希望保持原有布局结构不变的应用场景;然而对于复杂布局或者需要自定义缩放行为的情况,则需采取更加精细的方式处理。 #### 手动实现精确缩放逻辑 如果开发者有特殊需求,比如只针对特定部分进行放大缩小操作而不影响其余区域,那么就需要编写额外代码来进行细粒度管理。下面是一个简单的例子展示如何遍历所有子控件并对它们执行统一尺度变换: ```csharp private float scaleFactorX = 1f, scaleFactorY = 1f; // 设置新的缩放系数 public void SetScaleFactors(float scaleX, float scaleY) { scaleFactorX = scaleX; scaleFactorY = scaleY; foreach (Control control in GetAllControls(this)) { ScaleControl(control); } } // 获取当前窗体下所有的控件集合 private IEnumerable<Control> GetAllControls(Control parent) { var controls = new List<Control>(); foreach (Control child in parent.Controls) { controls.Add(child); controls.AddRange(GetAllControls(child)); } return controls; } // 对单个控件应用缩放 private void ScaleControl(Control ctrl) { Size newSize = new Size( Convert.ToInt32(ctrl.Width * scaleFactorX), Convert.ToInt32(ctrl.Height * scaleFactorY)); Point newPosition = new Point( Convert.ToInt32(ctrl.Left * scaleFactorX), Convert.ToInt32(ctrl.Top * scaleFactorY)); Font newFont = new Font( ctrl.Font.Name, ctrl.Font.SizeInPoints / ((float)Math.Sqrt(scaleFactorX * scaleFactorY)), ctrl.Font.Style); ctrl.Size = newSize; ctrl.Location = newPosition; ctrl.Font = newFont; } ``` 上述方法允许动态改变界面上任意组件的外观属性,并且能够很好地适应不同设备间的差异性显示效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值