MFC案例:用鼠标移动窗口图像的实验
当使用基于对话框的MFC项目窗口显示图像时,如窗口的尺寸小于图像的尺寸,在不做缩放的情况下按照原图尺寸在窗口显示,那么只能看到图像的局部,这时我们希望可以通过鼠标移动图像进而显示其它部分。今天就进行这个实验,编译环境是VS2022。
思路:显示图像的过程就是将图像的某一部分复制到屏幕的过程。若是在鼠标左键按下、抬起及鼠标移动的消息处理函数中,通过获得图像的某一部分并发送到屏幕上,则可达到上述目的。
具体步骤如下:
一、建立一个基于对话框的MFC项目(具体步骤略)
项目名称:showPicTest,其余均按缺省设置,具体步骤略。
进入对话框界面,将自动生成的控件全部删除。
二、在桌面上放一张jpg图片,我这里使用的是:C:\Users\Administrator\Desktop\2222.jpg。
三、在showPicTestDlg.h中,以public方式声明声明一些变量,其名称及功能见下面的代码及注释:
CImage img; //用于载入要显示的图片文件CImage对象BOOL isFirst = 1; //显示标志 1--图像第一次显示 0--其它情况int startX, startY; //鼠标左键按下时的位置int imgWidth, imgHeight; //原始图像(会载入到img中)的宽、高int totalDisX = 0, totalDisY = 0; //鼠标多次拖动的位移值int DCwidth, DCheight;//客户区宽度
四、在CshowPicTestDlg::OnInitDialog()函数TODO:行下面添加一些代码,这些代码的作用是载入图片文件,获得图像的宽高;同事获得客户区的宽高,我们将以客户区的大小为标准获取图像某一部分发送给屏幕,如此图像不会被拉伸变形。具体代码如下:
// TODO: 在此添加额外的初始化代码img.Load(L"C:\\Users\\Administrator\\Desktop\\2222.jpg"); //载入图像文件imgWidth =img.GetWidth();// 返回当前图像的宽度(以像素为单位)imgHeight = img.GetHeight();// 返回当前图像的高度CRect DCrect; //矩形对象(用于接收对话框客户区数据)GetClientRect(DCrect); //获得窗口客户区坐标、宽高等数据DCwidth = DCrect.Width();//客户区宽度DCheight = DCrect.Height();//客户区高度
五、打开对话框界面,右键对话框->单击属性框中的消息按钮->选择WM_MOSEMOVE消息->单击后边add,这样在showPicTestDlg.cpp中会添加CshowPicTestDlg::OnMouseMove函数,在这个函数的TODO:行下面添加一些代码,这些代码的作用是在鼠标第一次移动时,立即将图像显示在窗口上,这些代码只执行一次。
if (isFirst == 1) {CDC* pDC; //声明设备上下文指针pDC = GetDC(); //获得当前设备上下文指针(指屏幕)img.Draw(pDC->m_hDC, 0, 0); //显示图片,pDC->m_hDC通过指针获得对象pDC->DeleteDC(); //清理设备上下文指针isFirst = 0; //仅执行一次}
六、按照第五步的做法,给鼠标左键按下WB_LBUTTONDOWN消息添加处理函数CshowPicTestDlg::OnLButtonDown(),在这个函数中添加代码,目的是获得鼠标按下时的位置坐标。添加的代码具体如下:
startX = point.x; //鼠标左键按下时x坐标startY = point.y; //鼠标左键按下时y坐标
七、还是按照第五步的做法,给鼠标左键抬起WB_LBUTTONUP消息添加处理函数CshowPicTestDlg::OnLButtonUp(),接着在这个函数的TODO:行下面添加代码,这些代码的作用是通过计算历次鼠标按下后至抬起所产生的总位移(由于移动有方向所以是位移二不是距离),来判断显示图像的哪一部分。添加的代码如下:
//计算鼠标本次按下至抬起的x、y方向位移int moveDisX = startX-point.x; int moveDisY = startY-point.y;//限制每次的位移量最大步超过150个像素if (moveDisX > 150)moveDisX = 150; if (moveDisX < -150)moveDisX = -150;if (moveDisY > 150)moveDisY = 150;if (moveDisY <- 150)moveDisY = -150;//计算合计位移量totalDisX = totalDisX +moveDisX; totalDisY = totalDisY + moveDisY;//限制合计位移量不得超出图像大小范围if (totalDisX > imgWidth-DCwidth)totalDisX = imgWidth-DCwidth;if (totalDisY > imgHeight-DCheight)totalDisY = imgHeight-DCheight;if (totalDisX < 0)totalDisX = 0;if (totalDisY < 0)totalDisY = 0;if (isFirst == 0) {CDC* pDC; //声明设备上下文指针pDC = GetDC(); //获得当前设备上下文指针img.Draw(pDC->m_hDC, 0, 0, DCwidth, DCheight, totalDisX, totalDisY, DCwidth, DCheight);//pDC->m_hDC通过设备上下文指针的到设备上下文对象名//参1至参5 窗口左上角坐标及窗口宽高//参6至参9 欲显示的部分图像起始坐标及宽高pDC->DeleteDC();//清理设备上下文}
八、至此,实验的编程部分到此结束。试运行,无论鼠标按下后向水平、垂直、斜向运动一小段距离后抬起,显示图片都会发生相应的移动,实验目的基本上能达成。存在的问题是操作速度不能太快,快了图片可能向相反方向运动,另外移动不是连续的。
应该有更好的算法能解决这些问题,请高手朋友赐教!
附:运行效果截图
1.开始显示的图像左上角部分
2.移动后显示图像的中间部分
相关文章:
MFC案例:用鼠标移动窗口图像的实验
当使用基于对话框的MFC项目窗口显示图像时,如窗口的尺寸小于图像的尺寸,在不做缩放的情况下按照原图尺寸在窗口显示,那么只能看到图像的局部,这时我们希望可以通过鼠标移动图像进而显示其它部分。今天就进行这个实验,编…...
Linux基础IO(五)之用户缓冲区
文章目录 缓冲区FILE初步实现缓冲区 缓冲区 FILE 因为IO相关函数与系统调用接口对应,并且库函数封装系统调用, 所以本质上,访问文件都是通过fd访问的。 所以C库当中的FILE结构体内部,必定封装了fd。 编写代码and查看现象&…...
【Scrapy】Scrapy教程12——中间件
中间件这部分算是一个高阶的Scrapy内容,即便不了解这部分也可以使用Scrapy,但是一些特殊情况使用中间件就比较方便处理了,比如修改请求和响应等。 通过之前的工作原理图中,我们了解到Scrapy中有两个中间件,分别是下载器中间件和爬虫中间件,本节将一一讲解如何激活、编写自…...
C++学习之ORACLE①
目录 1.ORACLE数据库简介 2..ORACLE数据库安装 3..ORACLE体系结构 4..ORACLE基本概念 5..ORACLE基本元素 6..ORACLE数据库启动和关闭 7.SQLPLUS登录ORACLE数据库相关操作 8.SQLPLUS的基本操作 9.oracle中上课使用的方案 10.SQL语言分类 11.SQL中的select语句语法和注…...
vue---按钮防抖和节流----项目问题
一般来说前端都需要做按钮防抖避免一个时间被重复触发,首先可能会出现bug,消耗服务器性能,用户体验也不是很好。 1.防抖 解决方法:main.js文件自定义指令 Vue.directive("preventReClick", {inserted(el, binding) {…...
【LunarVim】解决which-key 自定义键位注册不成功问题
问题描述 LunarVim将which-key设置放在一个keymaps.lua中,然后config.lua调用reload “user.keymaps”,键位没用注册成功,而直接写在config.lua中,就注册成功 这暴露了LunarVim 插件和配置加载顺序的一些细节坑,下面解…...
湖北趣豆智能科技有限公司浅析XR技术对传统游戏的影响
在科技飞速发展的当下,XR(扩展现实)技术正以前所未有的态势重塑游戏行业格局。湖北趣豆智能科技有限公司凭借在XR技术与游乐设备融合领域的创新实践,对XR技术给传统游戏带来的影响有着深刻见解。 沉浸体验升级,重塑游戏…...
[操作系统] 进程间通信:system V共享内存
文章目录 内存共享示意图共享内存的管理代码shmget 函数原理先创建共享内存如何保证两个不同的进程拿到的是一块共享内存 shmctl 函数IPC_RMID参数 shmat函数无同步机制同步机制是什么模拟演示非同步效果如何提供保护机制 shmdt再谈描述共享内存的数据结构struct shmid_dsstruc…...
科技快讯 | 阿里云百炼MCP服务上线;英伟达官宣:CUDA 工具链将全面原生支持 Python
李飞飞团队最新AI报告:中美模型性能差距近乎持平 4月8日,斯坦福大学以人为本人工智能研究所发布《2025年人工智能指数报告》。报告显示,2023年AI性能显著提升,AI应用加速,投资增长,中美AI模型差距缩小。报告…...
踩雷,前端一直卡在获取token中
问题:一直卡在var token SecureStorage.Default.GetAsync("auth_token").Result; public VideoService(){_httpClient new HttpClient();var token SecureStorage.Default.GetAsync("auth_token");} 这是一个典型的同步等待异步操作导致的死…...
MATLAB双目标定
前言: 现在有许多双目摄像头在出厂时以及标定好,用户拿到手后可以直接使用,但也有些双目摄像头在出厂时并没有标定。因而这个时候就需要自己进行标定。本文主要介绍基于matlab工具箱的自动标定方式来对双目相机进行标定。 1、MATLAB工具箱标…...
4.10学习总结
完成两道算法题(感觉对贪心的思路很难去想到如何解) 完成stream流的学习,开始学习方法引用...
QML自定义组件
自定义组件是 QML 开发中的核心概念,它允许您创建可重用的 UI 元素和逻辑单元。以下是创建和使用自定义组件的完整方法。 1. 基本自定义组件创建 创建单独组件文件 (推荐方式) qml // MyButton.qml(单独一个qml文件)import QtQuick 2.15R…...
多模态大语言模型arxiv论文略读(十)
Towards End-to-End Embodied Decision Making via Multi-modal Large Language Model: Explorations with GPT4-Vision and Beyond ➡️ 论文标题:Towards End-to-End Embodied Decision Making via Multi-modal Large Language Model: Explorations with GPT4-Vi…...
关于 Spring Boot + Vue 前后端开发的打包、测试、监控、预先编译和容器部署 的详细说明,涵盖从开发到生产部署的全流程
以下是关于 Spring Boot Vue 前后端开发的打包、测试、监控、预先编译和容器部署 的详细说明,涵盖从开发到生产部署的全流程: 1. 打包 1.1 后端(Spring Boot) 打包方式 使用 Maven 或 Gradle 打包成可执行的 JAR/WAR 文件&…...
【Raqote】 1.1 路径填充ShaderMaskBlitter 结构体(blitter.rs)
ShaderMaskBlitter 结构体实现了 Blitter trait,用于带遮罩的着色器渲染。 结构体定义 pub struct ShaderMaskBlitter<a> {pub x: i32, // 目标区域的起始x坐标pub y: i32, // 目标区域的起始y坐标pub shader: &a dyn Shader, //…...
如何用 esProc 实现 Oracle 和 MySQL 的混合运算
逻辑数仓可以实现多源混算,但需要配置视图、预处理数据,结构太沉重。duckdb 是轻量级的方案,但没有内置 Oracle 的 connector,自己开发难度又太高。同为轻量级方案,esProc 支持 JDBC 公共接口,可以实现任何…...
zabbix和prometheus选择那个监控呢
文章目录 Zabbix 介绍概述架构组成特点适用场景 Prometheus 介绍概述架构组成特点适用场景 Zabbix vs Prometheus 对比架构与组件Zabbix 架构Prometheus 架构 监控要点与最佳实践告警与可视化ZabbixPrometheus Alertmanager Grafana 伸缩与高可用ZabbixPrometheus 运维成本与…...
SQL 查询中使用 IN 导致性能问题的解决方法
当 SQL 查询中使用 IN 子句导致查询长时间运行或挂起时,通常是由于以下几个原因造成的: 常见原因 IN 列表中的值过多 - 当 IN 子句包含大量值时(如数千或更多),数据库需要处理大量比较操作 缺乏合适的索引 - 被查询的…...
UML-饮料自助销售系统(无法找零)序列图
一、题目: 在饮料自动销售系统中,顾客选择想要的饮料。系统提示需要投入的金额,顾客从机器的前端钱币口投入钱币,钱币到达钱币记录仪,记录仪更新自己的选择。正常时记录仪通知分配器分发饮料到机器前端,但可…...
Go语言中的runtime包是用来做什么的?
在Go语言中,runtime包提供了与Go运行时系统的交互接口。以下是runtime包的主要功能和用途: 1. 运行时信息 runtime包可以获取关于Go程序运行时的信息,包括: 内存使用情况:可以查看内存分配和使用的统计信息…...
【Linux】用C++实现UDP通信:详解socket编程流程
文章目录 协议(Protocol)协议的核心要素常见协议分类 UDP协议(用户数据报协议)1. 基本定义2. 核心特性 UDP协议实现通信服务器端Comm.hppInetAddr.hppUdpServer.hppUdpServer.cc 客户端 总结 协议(Protocol)…...
代码随想录-06-二叉树-02.二叉树的递归遍历
二叉树的递归遍历 递归思路 确定递归函数的参数parameter和返回值确定终止条件确定单层递归逻辑 具体代码 CPP 前序遍历 vector<int> res; void traversal(TreeNode *root){if(!root)return;res.push_back(root->val);traversal(root->left);traversal(root-…...
一文详解ffmpeg环境搭建:Ubuntu系统ffmpeg配置nvidia硬件加速
在Ubuntu系统下安装FFmpeg有多种方式,其中最常用的是通过apt-get命令和源码编译安装。本文将分别介绍这两种方式,并提供安装过程。 一、apt-get安装 使用apt-get命令安装FFmpeg是最简单快捷的方式,只需要在终端中输入以下命令即可: # 更新软件包列表 sudo apt-get updat…...
(四)深入理解AVFoundation-播放:高度自定义视频播放器 UI
引言 在之前的博客中,我们已经介绍了如何实现一个简单的播放器,并通过监听资源和播放器的属性来提升播放体验。因此本篇博客将带你进一步自定义播放器 UI。通过构建自己的播放控制界面(如播放/暂停按钮、进度条、全屏切换等)&…...
sqli-labs靶场 less6
文章目录 sqli-labs靶场less 6 报错注入 sqli-labs靶场 每道题都从以下模板讲解,并且每个步骤都有图片,清晰明了,便于复盘。 sql注入的基本步骤 注入点注入类型 字符型:判断闭合方式 (‘、"、’、“”…...
数据库架构全解析:MyCat、MHA、ProxySQL 的原理、功能与实例
前言 : 在分布式数据库架构中,分库分表、高可用性(HA)和查询优化是核心需求。本文将深入解析三款主流工具:MyCat(分布式数据库中间件)、MHA(MySQL高可用方案)、ProxySQL…...
【hadoop】Hive数据仓库安装部署
一、MySQL的安装与配置 换源: 最下面附加部分 1、在master上直接使用yum命令在线安装MySQL数据库: sudo yum install mysql-server 途中会询问是否继续,输入Y并按回车。 2、启动MySQL服务: sudo service mysqld start 3、设…...
Unity Addressables资源生命周期自动化监控技术详解
一、Addressables资源生命周期管理痛点 1. 常见资源泄漏场景 泄漏类型典型表现检测难度隐式引用泄漏脚本持有AssetReference未释放高异步操作未处理AsyncOperationHandle未释放中循环依赖泄漏资源相互引用无法释放极高事件订阅泄漏未取消事件监听导致对象保留高 2. 传统管理…...
Linux网络编程——深入理解TCP的可靠性、滑动窗口、流量控制、拥塞控制
目录 一、前言 二、流量控制 三、TCP的滑动窗口 1、原理 2、机制 3、数据重发 Ⅰ、只是确认应答包(ACK)丢了 Ⅱ、发送数据包丢失 4、缓冲区结构 四、TCP的拥塞控制 1、慢启动 2、拥塞避免 3、快速重传 4、快速恢复 五、延迟应答 六、捎带应答 七、再谈TCP的面…...
Manifold-IJ 2022.1.21 版本解析:IntelliJ IDEA 的 Java 增强插件指南
Manifold-IJ-2022.1.21 可能是 IntelliJ IDEA 的一个插件或相关版本,特别是与 Manifold 这个增强 Java 开发体验的框架相关的组件。 很多时候没有网络环境,而又需要这个插件。 Manifold-IJ 2022.1.21下载:https://pan.quark.cn/s/ad907344c…...
linux内核
一 初识linux内核 1.1操作系统和内核简介 操作系统的精确定义并没有一个统一的标准,这里我认为操作系统是指整个系统负责完成最基本功能和系统管理的那些部分 这些部分包括内核,设备驱动程序,启动引导程序,基本的文件管理工具和…...
基于CNN-LSTM-GRU的深度Q网络(Deep Q-Network,DQN)求解移动机器人路径规划,MATLAB代码
一、深度Q网络(Deep Q-Network,DQN)介绍 1、背景与动机 深度Q网络(DQN)是深度强化学习领域的里程碑算法,由DeepMind于2013年提出。它首次在 Atari 2600 游戏上实现了超越人类的表现,解决了传统…...
C++23新特性:显式对象形参与显式对象成员函数
文章目录 一、背景与动机二、语法与基本使用三、优势与应用场景(一)简化代码(二)提升模板编程灵活性(三)与Lambda表达式结合 四、限制与注意事项五、总结 C23标准引入了一项重要的语言特性——显式对象形参…...
leetcode_242. 有效的字母异位词_java
242. 有效的字母异位词https://leetcode.cn/problems/valid-anagram/ 1、题目 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词(字母异位词是通过重新排列不同单词或短语的字母而形成的单词或短语,并使用所有原字母一次…...
【Docker基础】容器技术详解:生命周期、命令与实战案例
文章目录 一、什么是容器?二、为什么需要容器三、容器的生命周期容器状态容器OOM容器异常退出容器异常退出容器暂停 四、容器命令命令清单详细介绍 五、容器操作案例容器的状态迁移容器批量操作容器交互模式attached 模式detached 模式interactive 模式 容器 与 宿主…...
电子电气架构 --- 为配备区域计算的下一代电子/电气(E/E)架构
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…...
python基础:位置互换
n int(input()) for _ in range(n):line input().strip()line list(line)for i in range(1,len(line)1):if i%2 0:line[i-2], line[i-1] line[i-1],line[i-2] print(.join(line))以下分不同数据类型说明 Python 实现奇偶互换的方法: 字符串的奇偶位互换 若字…...
51单片机Day03---让一个LED灯闪烁
目录 1.研究原理图: 2.一些小知识(重定义的使用): (1)在单片机中,unsigned int 常用于以下场景: (2)unsigned char: 3.思路构造:…...
城电科技 | 从概念到落地:如何打造真正的智慧零碳园区?
在科技飞速发展的当下,智慧零碳园区成为了引领未来发展的重要范式。那么,究竟什么是智慧零碳园区呢? 智慧零碳园区,是借助前沿信息技术,把物联网、云计算、大数据等技术深度融入园区管理及产业运营,以此达…...
oracle常见问题处理集锦
oracle常见问题处理集锦 oracle常见问题处理集锦ORA:28000 the count is locked oracle常见问题处理集锦 ORA:28000 the count is locked ORA-28000: 账户已被锁定 这个错误表示你尝试登录的 Oracle 数据库用户账户已被锁定,常见原因包括: 多次密码输错…...
Java-JDBC入门程序、预编译SQL
一. JDBC JDBC:Java DataBase Connectivity 就是使用Java语言操作关系型数据库的一套API 本质:sun公司官方定义一套操作所有关系型数据库的规范,即接口;各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使…...
【SQL】基于多源SQL 去重方法对比 -- 精华版
【SQL】基于SQL 去重方法对比 -- 精华版 一、引言二、基于SQL去重方法完整对比1. MySQL去重方法及优劣势1.1 DISTINCT关键字1.2 GROUP BY子句1.3 UNION系列操作1.4 子查询 自关联 2. Hive去重方法及优劣势2.1 DISTINCT关键字2.2 GROUP BY子句2.3 ROW_NUMBER窗口函数2.4 …...
list的使用以及模拟实现
本章目标 1.list的使用 2.list的模拟实现 1.list的使用 在stl中list是一个链表,并且是一个双向带头循环链表,这种结构的链表是最优结构. 因为它的实现上也是一块线性空间,它的使用上是与string和vector类似的.但相对的因为底层物理结构上它并不像vector是线性连续的,它并没有…...
java继承练习
//创建父类public class Employee {private String id;private String name;private double salary;public Employee() {}public Employee(String id, String name, double salary) {this.id id;this.name name;this.salary salary;}public String getId() {return id;}pu…...
猫咪如厕检测与分类识别系统系列【一】 功能需求分析及猫咪分类特征提取
开发背景 家里养了三只猫咪,其中一只布偶猫经常出入厕所。但因为平时忙于学业,没法时刻关注牠的行为。我知道猫咪的如厕频率和时长与健康状况密切相关,频繁如厕可能是泌尿问题,停留过久也可能是便秘或不适。为了更科学地了解牠的…...
sparkcore编程算子
今天是Spark Core编程算子 Value类型算子 1. map 将处理的数据逐条进行映射转换,这里的转换可以是类型的转换,也可以是值的转换。Map算子是分区内一个数据一个数据的执行,类似于串行操作。 特点: - 主要目的将数据源中的数据进行…...
【EI会议】第三届机器人与软件工程前沿国际会议(FRSE 2025)
第三届机器人与软件工程前沿国际会议(FRSE 2025)将于2025年8月8日-10日在中国张家界召开。会议由清华大学自动化系主办,长沙理工大学、湖南科技大学、吉首大学、AC学术中心协办。 一、会议信息 大会官网:www.icfrse.org 会议时…...
机器人系统仿真--1.机器人模型URDF
添加机器人地盘...
具身机器人中AI(DEEPSEEK)与PLC、驱动器协同发展研究:突破数据困境与指令精确控制(3)
具身机器人中AI(DEEPSEEK)与PLC、驱动器协同发展研究:突破数据困境与指令精确控制(1)-CSDN博客 具身机器人中AI(DEEPSEEK)与PLC、驱动器协同发展研究:突破数据困境与指令精确控制&a…...