自定义窗口交互控件 :缩放平移

一: 基本控件的布局

1.首先,我们先新建一个UserControl自定义控件,拖拽一个Panel容器至界面窗口,Dock停靠模式选择Fill,即我们将画面填满容器.

2.然后,再拖拽一个PictureBox至上一步的Panel容器内部,同样的Dock停靠模式选择Fill.

3.选择一张好看的图给PictrueBox的image属性赋值.全都做好后,如下图所示啦

 二: 交互事件原理及编写

原理:整体框架是通过对picturebox的位置和大小变换实现图像的平移及缩放操作.而panel作为父窗体起着控制移动和缩放显示范围的作用.

首先来了解一下平移,平移无非是Picturebox的top和left属性的更改,怎样确定x及y轴的平移量的问题.从Picturebox原本的位置移动到鼠标的位置e.X,e.Y(Cursor.Position.X,Cursor.Position.Y);由于鼠标坐标是相对于屏幕计算的,不能直接将鼠标位置赋给Picturebox.我们通过记录鼠标左键按下的位置与之后鼠标移动时的位置差来获取这个平移量,然后将其附加到Picturbox实现控件的平移.

而缩放,采用倍率缩放的模式(scale=0.2),即Picturebox的Widht和Height属性直接加上放大或缩小倍率之后的值实现缩放操作,此时注意Left和top属性也要跟着变动,不然放大中心就不是鼠标位置了,鼠标滚轮前滚e.Delta值为正,鼠标滚轮后滚e.Delta值为负,乘以e.Delta的符号来决定是放大了还是缩小了

废话不多说,上菜:

public System.Drawing.Point mouseDownPoint;//存储鼠标焦点的全局变量
        public bool isSelected = false;//平移状态
        private void Form1_Load(object sender, EventArgs e)
        {
            pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;
            pictureBox1.Dock = DockStyle.None;
            //这个事件是鼠标滑轮滚动的触发事件,可以在Designer.cs中注册。
            this.pictureBox1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseWheel);
            this.pictureBox1.MouseDown += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseDown);
            this.pictureBox1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseMove);
            this.pictureBox1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseUp);
        }
        /// <summary>
        /// 滚轮缩放
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void pictureBox1_MouseWheel(object sender, MouseEventArgs e)
        {
            
            double scale = 0.2;
            int width = pictureBox1.Width;
            int height = pictureBox1.Height;
            int left = PointToClient(Cursor.Position).X - pictureBox1.Left;
            int top = PointToClient(Cursor.Position).Y - pictureBox1.Top;
            int sign = Math.Sign(e.Delta);
            
            pictureBox1.Width += (int)(sign * scale * width);
            pictureBox1.Height += (int)(sign * scale * height);
            this.pictureBox1.Left -= (int)(sign * scale * left);
            this.pictureBox1.Top -= (int)(sign * scale * top);
            
        }
        //在MouseDown处获知鼠标是否按下,并记录下此时的鼠标坐标值;
        private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                mouseDownPoint.X = Cursor.Position.X;  //注:全局变量mouseDownPoint前面已定义为Point类型  
                mouseDownPoint.Y = Cursor.Position.Y;
                isSelected = true;
            }
        }

        //在MouseUp处获知鼠标是否松开,终止拖动操作;
        private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        {
            isSelected = false;

        }
        /// <summary>
        /// 判断鼠标是否在父窗口内移动
        /// </summary>
        /// <returns></returns>
        private bool IsMouseInPanel()
        {
            
            if (this.panel_Picture.Left < PointToClient(Cursor.Position).X
                    && PointToClient(Cursor.Position).X < this.panel_Picture.Left
                    + this.panel_Picture.Width && this.panel_Picture.Top
                    < PointToClient(Cursor.Position).Y && PointToClient(Cursor.Position).Y
                    < this.panel_Picture.Top + this.panel_Picture.Height)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        //图片平移,在MouseMove处添加拖动函数操作
        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            if (isSelected && IsMouseInPanel())//确定已经激发MouseDown事件,和鼠标在picturebox的范围内
            {
                this.pictureBox1.Left = this.pictureBox1.Left + (Cursor.Position.X - mouseDownPoint.X);
                this.pictureBox1.Top = this.pictureBox1.Top + (Cursor.Position.Y - mouseDownPoint.Y);
                mouseDownPoint.X = Cursor.Position.X;
                mouseDownPoint.Y = Cursor.Position.Y;
            }
        }
        /// <summary>
        /// 双击还原
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void panel_Picture_DoubleClick(object sender, EventArgs e)
        {
            this.pictureBox1.Left = 0;
            this.pictureBox1.Top = 0;
            this.pictureBox1.Width = panel_Picture.Width;
            this.pictureBox1.Height = panel_Picture.Height;
        }

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
LabVIEW是一款图形化编程环境,用于开发控制、测量和数据采集应用程序。在LabVIEW中,波形图是一种常用的数据可视化工具,可以用于显示和分析实时或离线采集的数据。 要自定义使用LabVIEW波形图,可以按照以下步骤进行操作: 1. 创建波形图:在LabVIEW中,可以通过拖拽和放置控件的方式创建波形图。在Front Panel窗口中,选择Waveform & Chart选项卡,然后从控件面板中拖拽Waveform Graph控件到Front Panel窗口。 2. 配置波形图属性:选中波形图控件,可以在Properties窗口中配置其属性。例如,可以设置波形图的标题、坐标轴标签、颜色、线型等。 3. 输入数据:将要显示的数据输入到波形图中。可以通过连接传感器、设备或者导入文件等方式获取数据,并将其传递给波形图控件。 4. 更新波形图:根据需要,可以实时更新波形图显示的数据。可以使用循环结构或者事件驱动的方式来更新数据,并通过调用相应的函数来刷新波形图。 5. 添加交互功能:可以为波形图添加交互功能,以便用户可以进行缩放平移、标记等操作。可以使用LabVIEW提供的工具和函数来实现这些功能。 6. 数据分析和处理:波形图不仅可以显示数据,还可以进行数据分析和处理。LabVIEW提供了丰富的函数库,可以进行滤波、傅里叶变换、统计分析等操作,以便对波形数据进行进一步的处理和分析。 以上是关于LabVIEW波形图自定义使用的简要介绍,希望对你有帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

James.TCG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值