当前位置: 首页 > news >正文

DevC++ easyx实现视口编辑,在超过屏幕大小的地图上画点,与解决刮刮乐bug效果中理解C语言指针的意义

继上篇文案,

DevC++ easyx实现地图拖动,超过屏幕大小的巨大地图的局部显示在屏幕的方法——用悬浮窗的原理来的实现一个视口-CSDN博客

实现了大地图拖动,但是当时野心不止,就想着一气能搓啥就继续搓啥,看着地图移动都搓出来了,像素点也画上了,能不能就着直接编辑地图,给超过屏幕大小的地图画画。

上节文案从拖动复制粘贴实现悬浮窗,通过img3进行缓存覆盖前的位置的样子,在下次粘贴之前先用img3粘贴到原来位置恢复,在重新采样给img3,然后粘贴img2.两种图片的复制粘贴。

一个是恢复图片的复制粘贴,一个是图像的不断粘贴,念着念着,就自然而然,看到了大地图,复制粘贴,不就能实现大地图的修改了吗?

于是这样才继续就着复制粘贴的思路,小地图绘制完,贴回到大地图去,然后再从大地图复制,再粘贴回来,就刚刚好。

其实代码就是之前的DevC++ easyx实现地图拖动,超过屏幕大小的巨大地图的局部显示在屏幕的方法——用悬浮窗的原理来的实现一个视口-CSDN博客

的最后一个代码块 ,

而且就是这上一篇文案的刮刮乐效果的bug原理也是这个:bug根源在于函数参数

void check(struct ExMessage m,struct pircle *save,IMAGE ak,struct showplace *show) 

IMAG  ak的参数

IMAG ak指的是ak图片调用之后,图片会自动备份,相当于复制了一个,原件不受影响。

这个用法就是所谓的形参,只是说明用的是数据来源备份。数据来源不受更改。

这样原来的大地图就压根没有被修改。

但是刮刮乐效果呢?打印了ak图像,去对比像素,然后按下去鼠标不松,发现ak上没有打印图像,松开鼠标,才有轨迹粘贴进去,试了试几次,发现总是视口的图片粘贴到ak上面。想起来之前实现复制粘贴,肯定不能原样复制,不然画面不会动,就没有拖动效果。这样肯定采样的位置变化了,假设新旧采样位置都之差一个像素的宽度。然后假设一个像素,复制粘贴有位置差距,然后描述一遍:是取样的时候,先取样ak平面上偏移一个像素的位置,粘贴到视口上,然后重新调用ak,这样ak是一个全是蓝色背景的,然后又把视口的图片粘贴到ak上,这样总是有新的备份产生,总是在新的备份中切除一个像素,然后切除剩下的像素重新粘贴到新的备份当中。就出现了。

原来是采样才是真正实现刮刮乐的效果的原因,采样总是会多出来一个像素的蓝色边,这样视口里相应就是蓝色像素覆盖边缘的黄色像素。然后把这个多出来蓝色像素的图片粘到原来位置,这样就无中生有了新的蓝色像素,实现刮刮乐效果。

鼠标左键点击,不移动鼠标,不会打印,但是只要松开,才会打印。显然这样就是从视口复制粘贴到底图,那样bug就来自从底图到视口的这仅有的两个可能范围里的这唯一一种情况了。

bug或刮刮乐效果代码,其实就是传入的是ak图片的备份。ak永远都是蓝色。

#include<stdio.h>
#include<conio.h>
#include<graphics.h>
#include<windows.h>
struct pircle {IMAGE img2;IMAGE img3;const int orilx=0,orily=0;int nowlx=0,nowly=0;const int a=300,h=300;
//	原有图片的左上角坐标int m1x=0,m1y=0;int  putflag=0;int  drawflag=0;} save;struct showplace {int x=100;int y=100;const int a=300;const int h=300;} show;
void gameplace(IMAGE *ak) {SetWorkingImage(ak);setbkcolor(BLUE);cleardevice();setlinecolor(BLACK);rectangle(0,0,1499,1499);line(0, 0, 800, 1400);}void check(struct ExMessage m,struct pircle *save,IMAGE ak,struct showplace *show) {printf("putflag = %d\n",save->putflag);printf("%d %d\n",m.x,m.y);printf("%d %d\n",save->nowlx,save->nowly);if(save->putflag==true) {SetWorkingImage();getimage(&save->img3,show->x,show->y,show->a,show->h);BeginBatchDraw();SetWorkingImage(&ak);putimage(save->nowlx,save->nowly,&save->img3);save->nowlx=save->nowlx-(m.x-save->m1x);save->nowly=save->nowly-(m.y-save->m1y);save->m1x=m.x;save->m1y=m.y;getimage(&save->img2,save->nowlx,save->nowly,save->a,save->h);//		putimage(save->nowlx,save->nowly,&save->img2);SetWorkingImage();putimage(show->x,show->y,&save->img2);putimage(500,500,&ak) ;//		在默认桌面程序的界面上打印ak底图效果 EndBatchDraw();//			一次绘图出来,没有屏闪了}switch(m.message) {case WM_LBUTTONDOWN:if(m.x>show->x&&m.x<show->x+show->a&&m.y>show->y&&m.y<show->y+show->h&&m.ctrl) {save->putflag=true;
//					启动批复制粘贴SetWorkingImage(&ak);getimage(&save->img2,save->nowlx,save->nowly,save->a,save->h);
//				save->img2=ak;save->m1x=m.x;save->m1y=m.y;SetWorkingImage();}break;case WM_LBUTTONUP:save->putflag=0;break;}}void draw(struct ExMessage m,struct pircle *save,struct showplace *show,IMAGE *ak) {//	printf("draw = %d\n",save->drawflag);
//		SetWorkingImage(ak);if(save->drawflag==true) {
//		save.drawflag=1;putpixel(m.x,m.y,RGB(255,155,4));}switch(m.message) {case WM_LBUTTONDOWN:if(m.x>show->x&&m.x<show->x+show->a&&m.y>show->y&&m.y<show->y+show->h) {
//printf("m.x = %d\tm.y = %d\t%d\t%d\n",m.x,m.y,save->m1x,save->m1y);save->drawflag=true;//				printf("drawflag = %d\n",save->drawflag);}break;case WM_LBUTTONUP:save->drawflag=false;
//			printf("%d\n",save->drawflag);break;}}int main() {// 初始化绘图窗口initgraph(1640, 1480);IMAGE ak(1500,1500);IMAGE b(300,300);gameplace(&ak);getimage(&b,0,0,300,300);SetWorkingImage();putimage(0,0,&ak);putimage(100,100,&b);setlinecolor(BLACK);rectangle(show.x,show.y,show.x+show.a,show.y+show.h);ExMessage m;while(1) {m=getmessage(EX_MOUSE);check(m,&save,ak,&show);draw(m,&save,&show,&ak);}_getch();closegraph();
}

代码对应序号15.5解决画不上去....文件里的代码

ctrl+鼠标左键视口实现拖动,

可以看到另一部分也有个相同的图片,这个右下角的图片就是img3的内容。相当于除了复制粘贴原来地方,还在500,500的位置再次复制粘贴图像。

对比代码蓝色的参数,可以知道传入的ak多了一个符号*,实现了ak的操作,而不再是ak复印件的操作。

当然由于ak图片大小太大,实际上传入的*ak是ak的引用凭证,这样通过引用凭证到ak所实际存储的地方。而原来的ak的样本,实际上就是通过直接复制ak的数据。

检测方法也好说,其实就是把ak图片的大小改大,大概10000*10000像素,应该就有100mb了,这样在运行两个代码,看看是不是一个比另一个1多出100mb的内存。然后再改改图片大小20000*10000,20000*20000,看看是不是对应又多了一倍,还多了一倍。

然后就是改参数属性,从IMAG ak 到IMAG *ak的故事了。

直接替换完事。

 完整代码,解决刮刮乐效果,而且成功绘制到原来的ak图片上了。

#include<stdio.h>
#include<conio.h>
#include<graphics.h>
#include<windows.h>
struct pircle {IMAGE img2;
//	old IMAGE img3;const int orilx=0,orily=0;int nowlx=0,nowly=0;const int a=400,h=400;
//	原有图片的左上角坐标int m1x=0,m1y=0;int  putflag=0;int  drawflag=0;} save;struct showplace {int x=100;int y=100;const int a=400;const int h=400;
} show;void gameplace(IMAGE *ak) {SetWorkingImage(ak);setbkcolor(BLUE);cleardevice();setlinecolor(BLACK);rectangle(0,0,1499,1499);line(0, 0, 800, 1400);}void check(struct ExMessage m,struct pircle *save,IMAGE *ak,struct showplace *show) {printf("putflag = %d\n",save->putflag);printf("%d %d\n",m.x,m.y);printf("%d %d\n",save->nowlx,save->nowly);if(save->putflag==true) {BeginBatchDraw();SetWorkingImage();getimage(&save->img3,show->x,show->y,show->a,show->h);SetWorkingImage(ak);
//			SetWorkingImage(&ak);putimage(save->nowlx,save->nowly,&save->img3);save->nowlx=save->nowlx-(m.x-save->m1x);save->nowly=save->nowly-(m.y-save->m1y);save->m1x=m.x;save->m1y=m.y;getimage(&save->img2,save->nowlx,save->nowly,save->a,save->h);//		putimage(save->nowlx,save->nowly,&save->img2);SetWorkingImage();putimage(show->x,show->y,&save->img2);putimage(500,500,&save->img3);EndBatchDraw();//			一次绘图出来,没有屏闪了}switch(m.message) {case WM_LBUTTONDOWN:if(m.x>show->x&&m.x<show->x+show->a&&m.y>show->y&&m.y<show->y+show->h&&m.ctrl) {save->putflag=true;
//					启动批复制粘贴SetWorkingImage(ak);getimage(&save->img2,save->nowlx,save->nowly,save->a,save->h);
//				save->img2=ak;save->m1x=m.x;save->m1y=m.y;SetWorkingImage();}break;case WM_LBUTTONUP:save->putflag=0;break;}}void draw(struct ExMessage m,struct pircle *save,struct showplace *show,IMAGE *ak) {//	printf("draw = %d\n",save->drawflag);
//		SetWorkingImage(ak);if(save->drawflag==true) {
//		save.drawflag=1;putpixel(m.x,m.y,RGB(255,155,4));}switch(m.message) {case WM_LBUTTONDOWN:if(m.x>show->x&&m.x<show->x+show->a&&m.y>show->y&&m.y<show->y+show->h) {
//printf("m.x = %d\tm.y = %d\t%d\t%d\n",m.x,m.y,save->m1x,save->m1y);save->drawflag=true;//				printf("drawflag = %d\n",save->drawflag);}break;case WM_LBUTTONUP:save->drawflag=false;
//			printf("%d\n",save->drawflag);break;}}int main() {// 初始化绘图窗口initgraph(840, 880);IMAGE ak(1500,1500);IMAGE b(300,300);gameplace(&ak);getimage(&b,0,0,400,400);SetWorkingImage();putimage(0,0,&ak);putimage(100,100,&b);setlinecolor(BLACK);rectangle(show.x,show.y,show.x+show.a,show.y+show.h);ExMessage m;while(1) {m=getmessage(EX_MOUSE);check(m,&save,&ak,&show);draw(m,&save,&show,&ak);}_getch();closegraph();
}

相关文章:

DevC++ easyx实现视口编辑,在超过屏幕大小的地图上画点,与解决刮刮乐bug效果中理解C语言指针的意义

继上篇文案&#xff0c; DevC easyx实现地图拖动&#xff0c;超过屏幕大小的巨大地图的局部显示在屏幕的方法——用悬浮窗的原理来的实现一个视口-CSDN博客 实现了大地图拖动&#xff0c;但是当时野心不止&#xff0c;就想着一气能搓啥就继续搓啥&#xff0c;看着地图移动都搓…...

Kali Linux—借助 SET+MSF 进行网络钓鱼、生成木马、获主机shell、权限提升、远程监控、钓鱼邮件等完整渗透测试(一)

社会工程学—世界头号黑客凯文米特尼克在《欺骗的艺术》中曾提到&#xff0c;这是一种通过对受害者心理弱点、本能反应、好奇心、信任、贪婪等心理陷阱进行诸如欺骗、伤害等危害手段。 SET最常用的攻击方法有&#xff1a;用恶意附件对目标进行 E-mail 钓鱼攻击、Java Applet攻…...

时间与时间戳转换及android和ios对时间识别的区别

注意&#xff1a; "2021-05-01 12:53:59.55" 时间对象在 ios 中会出现 NaN-NaN1-NaN 需要将对象格式化为&#xff1a;"2021/05/01 12:53:59.55" 可同时兼容 android 和 ios。 //将某时间转时间戳 /* var time new Date("2021-05-01 12:53:59.55&qu…...

飞天使-k8s知识点7-kubernetes升级

文章目录 验证新版本有没有问题需要安装的版本微微 1.20.6.0kubeadm upgrade plan 验证新版本有没有问题 查看可用版本的包 现有的状态 查看版本 yum list kubeadm --showduplicates |grep 1.20 yum list kubelet --showduplicates |grep 1.20 yum list kubectl --showduplic…...

【Unity游戏制作】游戏模型导入之前需要注意的三个基本点

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…...

三列布局 css

实现如下图的三列布局&#xff1a; .box {width:1400px;margin:0 auto;padding-bottom:40px;> .left {float:left;width:180px;margin-top:100px;text-align:center;}> .center {float:left;margin-top:100px;margin-left:130px;item-box {float:left;text-align:left;…...

Android开发之生命周期(App、Activity)

在Android开发中&#xff0c;应用程序&#xff08;App&#xff09;和活动&#xff08;Activity&#xff09;的生命周期是非常重要的概念。它们各自都有一系列的生命周期方法&#xff0c;这些方法会在特定的时刻被系统自动调用&#xff0c;以便于开发者对应用或活动进行相应的操…...

利用html2Canvas将表格下载为html

给到我的需求是点击按钮时请求后端接口&#xff0c;根据后端返回的数据&#xff0c;生成表格,并将表格的内容直接下载为html,如下图。 平常做的下载都是后端返回二进制流&#xff0c;这次前端做下载那就必须把页面先画出来&#xff0c;因为下载下来的表格在页面上是不显示的&a…...

《Git快速入门》Git分支

1.master、origin、origin/master 区别 首先搞懂git分支的一些名称区别&#xff1a; master &#xff1a; Git 的默认分支名字。它并不是一个特殊分支、跟其它分支完全没有区别。 之所以几乎每一个仓库都有 master 分支&#xff0c;是因为 git init 命令默认创建它&#xff0c…...

HarmonyOS应用性能与功耗云测试

性能测试 性能测试主要验证HarmonyOS应用在华为真机设备上运行的性能问题&#xff0c;包括启动时长、界面显示、CPU占用和内存占用。具体性能测试项的详细说明请参考性能测试标准。 性能测试支持Phone和TV设备&#xff0c;包格式包括Hap/App。 前提条件 已注册华为开发者帐号&a…...

【AI】人工智能本地环境集成安装

目录 1、基础安装 1.1 GPU安装 1.1.1 GPU版本支持 1.1.2 下载CUDA 1.1.3安装CUDA 1.1.4配置环境变量 1.1.5检测CUDA是否安装成功 1.2 CUDNN安装 1.2.1 下载CUDNN 1.2.2 添加配置 1.2.3验证结果 2、pytorch安装...

主流级显卡的新选择,Sparkle(撼与科技)Intel Arc A750兽人体验分享

▼前言 对于玩家而言&#xff0c;英特尔独显的出现不仅打破了NVIDIA与AMD双雄天下的局面&#xff0c;而且旗下的Arc A系列显卡还拥有不俗的做工性能以及颇具优势的价格&#xff0c;无论是升级或者是装新机都非常合适。如果要在Arc A系列当中选一个性能不俗&#xff0c;能够满足…...

BI 商业数据分析能够给企业带来什么改变?

时下&#xff0c;随着中国企业数据整合应用的意识不断提高&#xff0c;BI 商业数据分析的应用驶入飞速发展的“快车道”。BI 商业智能利用数据分析技术与业务场景联系起来&#xff0c;通过一系列思维方法、指标体系及工具模型来支持市场分析、产品优化、客户洞察&#xff0c;从…...

模式识别与机器学习-特征选择和提取

模式识别与机器学习-特征选择和提取 特征选择一些距离测度公式独立特征的选择准则一般特征的散布矩阵准则 离散K-L变换 谨以此博客作为复习期间的记录。 常见分类问题的流程&#xff0c;数据预处理和特征选择提取时机器学习环节中最重要的两个流程。这两个环节直接决定了最终性…...

嵌入式——RTC闹钟Alarm

开发流程 配置RTC时钟设置RTC闹钟配置RTC闹钟中断实现中断函数RTC闹钟初始化 // 闹钟外部中断 exti_flag_clear(EXTI_17); exti_init(EXTI_17,EXTI_INTERRUPT,EXTI_TRIG_RISING);// 重置闹钟 rtc_alarm_disable(RTC_ALARM0);rtc_alarm_struct ras; ras.alarm_mask = RTC_ALARM…...

【linux】线程控制

线程控制 1.创建线程2.线程终止3.线程等待4.线程分离5.对线程的简单封装 喜欢的点赞&#xff0c;收藏&#xff0c;关注一下把&#xff01; 进程概念上篇文章已经讲完了&#xff0c;下面我们就来说说线程控制。 我们使用的接口是pthread线程库&#xff0c;也叫做原生线程库给我…...

Swift学习笔记第三节:Set类型

1、代码 import Foundationvar set1: Set<Int> [1, 2, 3, 4, 3] print("定义1: \(set1)") var set2 Set(1...4) print("定义2: \(set2)") print("长度: \(set2.count)") print("是否为空: \(set2.isEmpty)") set1.insert(99)…...

【前端】安装指定版本的nodejs

先安装curl sudo apt install curl以下是 Nodejs 18.x的安装&#xff0c;一行代码搞定 &&\ 的意思是前面的命令执行无误后&#xff0c;再执行后面代码 curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - &&\ sudo apt-get install -y node…...

多商户小程序开源商城源码 打造微信商城新零售网店

一款易于二次开发的商城小程序&#xff0c;使用php、thinkphp6、vue、element-ui和uniapp技术栈进行开发。 该商城小程序内置多商户商城和分销商城&#xff0c;包括小程序商城、H5商城、公众号商城、PC商城和App&#xff0c; 支持多种分销模式、拼团、砍价、秒杀、优惠券、活…...

云仓酒庄的品牌雷盛红酒LEESON分享干红是纯葡萄酿造的吗?

干红是一种葡萄酒的简称&#xff0c;全称是干型红葡萄酒。葡萄酒按含残糖量分为干型、半干型、半甜型和甜型。无论什么型的酒&#xff0c;只要是葡萄酒&#xff0c;那就是葡萄酿造的。 云仓酒庄的品牌雷盛红酒LEESON分享干红是葡萄酒的一种&#xff0c;而葡萄酒却不止干红一种…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...