C#关于HWindowControl实现一些便捷功能——(缩放与拖动图像)

news2024/11/25 5:03:47

C#关于HWindowControl实现一些便捷功能——(缩放与拖动图像)

  • 一、关于Hwindow窗体显示的part
  • 二、以鼠标为中心的缩放
  • 三、以鼠标拖动移动图片


一、关于Hwindow窗体显示的part

首先 HWindowControl 控件的尺寸是固定的,当我们在这个固定的尺寸中,相对原来显示的一幅完整的图像,现在只显示图像的一部分,即可达到放大效果。
即想放大时,我们便缩小 ImagePart ;想缩小时,我们便放大 ImagePart 。
例如:一幅 800600 的图像,
一开始我们将 ImagePart 设置为:左上角 (0, 0) ,右下角(800
600) ;
现在我们将其设置为 :左上角(0, 0) ,右下角(400, 300) ,
之前用整幅图像去填充 HWindowControl 控件,现在用半幅图像去填充它,显然这部分图像就会被放大。放大的倍数是 2 。
再有
现在我们将其设置为 :左上角(100, 100) ,右下角(500, 400) ,
则就相当于拖动图片向左上角移动。
而我们需要设置part需要的参数就是矩形的左上角与右下角的坐标值,或者左上角以及长宽值。

二、以鼠标为中心的缩放

现在可以缩放了,再看看如何实现以鼠标的当前位置作为中心,进行缩放?
要保证鼠标中心位置,即保证鼠标所指的图像相对位置不变即可。
在这里插入图片描述
如图,黑色框为原本图像,当
我们要放大图像时(将原图像变小再按比例填充至HWindowControl 窗口内),所以应该是变换为红色的;
我们要缩小图像时(将原图像变大再按比例压缩至HWindowControl 窗口内),所以应该是变换为蓝色的。
红色点为鼠标在HWindowControl 窗体控件中的坐标。

我们可获取原始图像显示时的part为LUPointX,LUPointY;
获取的鼠标的坐标为MouseX,MouseY;
放大比例Zoom为0.5;
则有红色矩形的左上角坐标为:

				LUPointY2 = (MouseY - (Zoom * (MouseY - LUPointY))); 
                LUPointX2 = (MouseX - (Zoom * (MouseX - LUPointX)));

此处注意图像坐标是从上向下,从左至右递增的。
又有右下角坐标:

                //Ht,Wt为原图像的右下角与左上角计算出来的长宽。
                RBPointY2 = LUPointY2 + (Ht * Zoom);
                RBPointX2 = LUPointX2 + (Wt * Zoom);

到此就可以通过part属性来设置显示区域啦。
全代码如下:

需要把下面的事件绑定到HWindowControl 的HMouseWheel上

        public void Scale(object sender, HMouseEventArgs e) 
        {
            double Zoom = 0.5;//缩放比例
            HTuple MouseX, MouseY;//鼠标位于图片窗体的坐标
            //左上角与右下角坐标
            HTuple LUPointY, LUPointX, RBPointY, RBPointX;
            HTuple LUPointY2, LUPointX2, RBPointY2, RBPointX2;
            //当前显示的界面大小
            HTuple Ht, Wt;
            HTuple WindowID = hWindowControl1.HalconWindow;

            MouseX = e.X;
            MouseY = e.Y;
            Zoom = e.Delta > 0 ? Zoom : (1 + Zoom);
            HOperatorSet.GetPart(WindowID, out LUPointY, out LUPointX, out RBPointY, out RBPointX);
            Ht = RBPointY - LUPointY;
            Wt = RBPointX - LUPointX;

            if ((Ht * Wt) < 32000 * 32000)
            {
                LUPointY2 = (MouseY - (Zoom * (MouseY - LUPointY))); 
                LUPointX2 = (MouseX - (Zoom * (MouseX - LUPointX)));
                RBPointY2 = LUPointY2 + (Ht * Zoom);
                RBPointX2 = LUPointX2 + (Wt * Zoom);
                HOperatorSet.SetPart(WindowID, LUPointY2, LUPointX2, RBPointY2, RBPointX2);
                hWindowControl.HalconWindow.ClearWindow();
                hWindowControl.HalconWindow.DispObj(hImage);
            }
        }

三、以鼠标拖动移动图片

移动比较简单,
首先我们记录下左键按下时的鼠标坐标位置(startPointX,startPointY),
当鼠标左键释放时的坐标位置(endPointX,endPointY)
可以获得x方向与y方向的插值move_c,move_r;
则可得到:
移动后左上角坐标为:(originalImageUL_c + move_c , originalImageUL_r + move_r)
移动后右下角坐标为:(originalImageDR_c + move_c , originalImageDR_r + move_r)

全代码如下:

        Point StartPoint = new Point();
        Point EndPoint = new Point();

        private void HMouseDown(object sender, HMouseEventArgs e) 
        {
            if (e.Button == MouseButtons.Left)
            {
                StartPoint.X = Convert.ToInt32(e.X);
                StartPoint.Y = Convert.ToInt32(e.Y);
                hWindowControl1.HMouseMove += HMouseMove;
            }
        }
        private void HMouseUp(object sender, HMouseEventArgs e)
        {
            hWindowControl1.HMouseMove -= HMouseMove;
        }

        private void HMouseMove(object sender, HMouseEventArgs e)
        {
            EndPoint.X = Convert.ToInt32(e.X);
            EndPoint.Y = Convert.ToInt32(e.Y);
            HWindow_MoveImage(StartPoint, EndPoint, hWindowControl1, hImage);
        }

        public void HWindow_MoveImage(Point startPoint, Point endPoint, HWindowControl hWindow, HImage hImage)
        {
            int originalImageUL_r;
            int originalImageUL_c;

            int originalImageDR_r;
            int originalImageDR_c;

            hWindow.HalconWindow.GetPart(out originalImageUL_r, out originalImageUL_c, out originalImageDR_r, out originalImageDR_c);

            int move_r = startPoint.Y - endPoint.Y;
            int move_c = startPoint.X - endPoint.X;

            hWindow.HalconWindow.SetPart(originalImageUL_r + move_r, originalImageUL_c + move_c, originalImageDR_r + move_r, originalImageDR_c + move_c);
            hWindow.HalconWindow.ClearWindow();
            hWindow.HalconWindow.DispObj(hImage);
        }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/373692.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++类和对象:构造函数和析构函数

目录 一. 类的六个默认成员函数 二. 构造函数 2.1 什么是构造函数 2.2 编译器自动生成的默认构造函数 2.3 构造函数的特性总结 三. 析构函数 3.1 什么是析构函数 3.2 编译器自动生成的析构函数 3.3 析构函数的特性总结 一. 类的六个默认成员函数 对于任意一个C类&…

零基础如何入门网络安全(黑客)

我经常会看到这一类的问题&#xff1a; 学习XXX知识没效果&#xff1b;学习XXX技能没方向&#xff1b;学习XXX没办法入门&#xff1b; 给大家一个忠告&#xff0c;如果你完全没有基础的话&#xff0c;前期最好不要盲目去找资料学习&#xff0c;因为大部分人把资料收集好之后&a…

三天吃透Java虚拟机面试八股文

本文已经收录到Github仓库&#xff0c;该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点&#xff0c;欢迎star~ Github地址&#xff1a;https://github.com/…

趣味数学题存疑待证1

原文出自&#xff1a;球面上随机 N 个点在同一个半球上的概率 要求任意N个点&#xff0c;全在同一个半球上的概率&#xff0c;我们需要构造使得分母为有限的样本集合&#xff0c;分子则为有N个点在同一半球的情况集 首先对任意N个点取其对称点使得可划分点为2N&#xff0c;在…

【数据库】第七章 数据库设计

第七章数据库设计 数据库设计概述 数据库设计的基本步骤 需求分析概念结构设计逻辑结构设计物理结构设计数据库实施数据库运行和维护 需求分析 收集需求&#xff0c;理解需求 收集各个角色的需求 概念数据库设计 建立概念模型 &#xff0c;E-R图/IDEF1x图 消除冲突&…

【JDK8新特性之日期时间API-案例实操】

一.JDK8新特性之日期时间API-案例实操 之前我们学习了Stream流、Lambda表达式以及方法引用等相关的内容&#xff0c;如果想学习的同学可以看一下之前的文章&#xff0c;接下来我们一起学习一下关于JDK8中新日期时间API的使用。 二.JDK中原始日期时间存在的问题 设计不合理&…

VC++随鼠标移动显示坐标和坐标映射模式学习

VC6&#xff0c;新建一个单文档工程&#xff1b; 把这两个加到视类头文件&#xff1b; CPoint m_ptOut; //用来保存鼠标坐标 CString strPosition; //用来保存输出的内容 视类CPP的构造函数中初始化&#xff0c; m_ptOut.x 0; m_ptOut.y 0; 用类向导为视类…

Boosting Crowd Counting via Multifaceted Attention之人群密度估计实践

这周闲来无事&#xff0c;看到一篇前不久刚发表的文章&#xff0c;是做密集人群密度估计的&#xff0c;这块我之前虽然也做过&#xff0c;但是主要是基于检测的方式实现的&#xff0c;这里提出来的方法还是比较有意思的&#xff0c;就拿来实践一下。论文在这里&#xff0c;感兴…

chatGPT模型原理

文章目录简介BertGPT 初代GPT-2GPT-3chatGPT开源ChatGPT简介 openai 的 GPT 大模型的发展历程。 Bert 2018年&#xff0c;自然语言处理 NLP 领域也步入了 LLM 时代&#xff0c;谷歌出品的 Bert 模型横空出世&#xff0c;碾压了以往的所有模型&#xff0c;直接在各种NLP的建模…

Java中的反射使用

1、获取Class对象的三种方式 1、对象调用Object类的getClass()方法&#xff08;对象.getClass()&#xff09; 2、调用类的class属性&#xff08;类名.class&#xff09; 3、调用Class类的静态方法&#xff08;Class.forName(“包名.类名”)&#xff09;常用 Student类 package…

Xcode Developer Document 开发者文档

总目录 iOS开发笔记目录 从一无所知到入门 文章目录IntroDeveloper Documentation 打开方式菜单栏点击 &#xff5c; 快捷键方式另一种打开方式Intro 2016年我在学校学Java的时候&#xff0c;要查某个Java类/方法的用法还得自己手动下载一种.chm格式的开发文档文件&#xff0c…

python爬虫常见错误

python爬虫常见错误前言python常见错误1. AttributeError: WebDriver object has no attribute find_element_by_id1. 问题描述2. 解决办法2. selenium&#xff1a;DeprecationWarning: executable_path has been deprecated, please pass in1. 问题描述2. 解决办法3. 下载了包…

4、算法MATLAB---认识矩阵

认识矩阵1、矩阵定义和基本运算1.1 赋值运算符&#xff1a;1.2 等号运算符&#xff1a;1.3 空矩阵1.4 一行一列矩阵1.5 行矩阵&#xff08;元素用空格或逗号分隔&#xff09;1.6 列矩阵&#xff08;分号表示换行&#xff09;1.7 m行n列的矩阵&#xff1a;行值用逗号间隔&#x…

SPI总线设备驱动模型

SPI总线设备驱动模型 文章目录SPI总线设备驱动模型参考资料&#xff1a;一、平台总线设备驱动模型二、 数据结构2.1 SPI控制器数据结构2.2 SPI设备数据结构2.3 SPI设备驱动三、 SPI驱动框架3.1 SPI控制器驱动程序3.2 SPI设备驱动程序致谢参考资料&#xff1a; 内核头文件&…

角角的Qt自学日记:Qt的安装

目录 2. 打开下载器&#xff0c;输入账号和密码&#xff0c;然后单击下一步&#xff1a; 3. 分别单击2个单选框&#xff0c;其它不用管&#xff0c;直接单击下一步&#xff1a; 4. 先设置一下安装目录&#xff0c;因为现在Qt基本都好几个g&#xff0c;建议找个内存够的盘。然…

尝试用程序计算Π(3.141592653......)

文章目录1. π\piπ2. 用微积分来计算π\piπ2.1 原理2.2 代码2.3 结果2.4 分析1. π\piπ π\piπ的重要性或者地位不用多说&#xff0c;有时候还是很好奇&#xff0c;精确地π\piπ值是怎么计算出来的。研究π\piπ的精确计算应该是很多数学家计算机科学家努力的方向&#xf…

【老卫搬砖】034期:HarmonyOS 3.1 Beta 1初体验,我在本地模拟器里面刷短视频

今天啊打开这个DevEco Studio的话&#xff0c;已经提示有3.1Beta1版本的一个更新啊。然后看一下它的一些特性。本文也演示了如何在本地模拟器里面运行HarmonyOS版短视频。 主要特性 新特性包括&#xff1a; Added support for Windows 11 64-bit and macOS 13.x OSs, as well…

vue中render函数的作用和参数(vue2中render函数用法)

render 函数是 Vue2.x 新增的一个函数、主要用来提升节点的性能&#xff0c;它是基于 JavaScript 计算。使用 Render 函数将 Template 里面的节点解析成虚拟的 Dom 。Vue 推荐在绝大多数情况下使用模板来创建 HTML。然而在一些场景中&#xff0c;需要 JavaScript 的完全编程能力…

RK3568平台开发系列讲解(驱动基础篇)GIC v3中断控制器

🚀返回专栏总目录 文章目录 一、什么是GIC二、GIC v3中断类型三、GIC v3基本结构3.1、Distributor3.2、CPU interface简介3.3、Redistributor简介3.4、ITS(Interrupt translation service)4、中断状态和处理流程沉淀、分享、成长,让自己和他人都能有所收获!😄 📢ARM多核…

在线文档技术-编辑器篇

这是在线文档技术的第二篇文章&#xff0c;本文将对目前市面上所有的主流编辑器和在线文档进行一次深入的剖析和研究&#xff0c;从而使大家对在线文档技术有更深入的了解&#xff0c;也让更多人能够参与其开发与设计中来。 注意&#xff1a;出于对主流文档产品的尊重&#xf…