宝安区建设网站,简约大气网站模板,深圳seo教程,网站策划运营方案继上篇文案#xff0c;
DevC easyx实现地图拖动#xff0c;超过屏幕大小的巨大地图的局部显示在屏幕的方法——用悬浮窗的原理来的实现一个视口-CSDN博客
实现了大地图拖动#xff0c;但是当时野心不止#xff0c;就想着一气能搓啥就继续搓啥#xff0c;看着地图移动都搓…继上篇文案
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永远都是蓝色。 #includestdio.h
#includeconio.h
#includegraphics.h
#includewindows.h
struct pircle {IMAGE img2;IMAGE img3;const int orilx0,orily0;int nowlx0,nowly0;const int a300,h300;
// 原有图片的左上角坐标int m1x0,m1y0;int putflag0;int drawflag0;} save;struct showplace {int x100;int y100;const int a300;const int h300;} 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-putflagtrue) {SetWorkingImage();getimage(save-img3,show-x,show-y,show-a,show-h);BeginBatchDraw();SetWorkingImage(ak);putimage(save-nowlx,save-nowly,save-img3);save-nowlxsave-nowlx-(m.x-save-m1x);save-nowlysave-nowly-(m.y-save-m1y);save-m1xm.x;save-m1ym.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.xshow-xm.xshow-xshow-am.yshow-ym.yshow-yshow-hm.ctrl) {save-putflagtrue;
// 启动批复制粘贴SetWorkingImage(ak);getimage(save-img2,save-nowlx,save-nowly,save-a,save-h);
// save-img2ak;save-m1xm.x;save-m1ym.y;SetWorkingImage();}break;case WM_LBUTTONUP:save-putflag0;break;}}void draw(struct ExMessage m,struct pircle *save,struct showplace *show,IMAGE *ak) {// printf(draw %d\n,save-drawflag);
// SetWorkingImage(ak);if(save-drawflagtrue) {
// save.drawflag1;putpixel(m.x,m.y,RGB(255,155,4));}switch(m.message) {case WM_LBUTTONDOWN:if(m.xshow-xm.xshow-xshow-am.yshow-ym.yshow-yshow-h) {
//printf(m.x %d\tm.y %d\t%d\t%d\n,m.x,m.y,save-m1x,save-m1y);save-drawflagtrue;// printf(drawflag %d\n,save-drawflag);}break;case WM_LBUTTONUP:save-drawflagfalse;
// 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.xshow.a,show.yshow.h);ExMessage m;while(1) {mgetmessage(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*1000020000*20000看看是不是对应又多了一倍还多了一倍。 然后就是改参数属性从IMAG ak 到IMAG *ak的故事了。
直接替换完事。 完整代码解决刮刮乐效果而且成功绘制到原来的ak图片上了。 #includestdio.h
#includeconio.h
#includegraphics.h
#includewindows.h
struct pircle {IMAGE img2;
// old IMAGE img3;const int orilx0,orily0;int nowlx0,nowly0;const int a400,h400;
// 原有图片的左上角坐标int m1x0,m1y0;int putflag0;int drawflag0;} save;struct showplace {int x100;int y100;const int a400;const int h400;
} 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-putflagtrue) {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-nowlxsave-nowlx-(m.x-save-m1x);save-nowlysave-nowly-(m.y-save-m1y);save-m1xm.x;save-m1ym.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.xshow-xm.xshow-xshow-am.yshow-ym.yshow-yshow-hm.ctrl) {save-putflagtrue;
// 启动批复制粘贴SetWorkingImage(ak);getimage(save-img2,save-nowlx,save-nowly,save-a,save-h);
// save-img2ak;save-m1xm.x;save-m1ym.y;SetWorkingImage();}break;case WM_LBUTTONUP:save-putflag0;break;}}void draw(struct ExMessage m,struct pircle *save,struct showplace *show,IMAGE *ak) {// printf(draw %d\n,save-drawflag);
// SetWorkingImage(ak);if(save-drawflagtrue) {
// save.drawflag1;putpixel(m.x,m.y,RGB(255,155,4));}switch(m.message) {case WM_LBUTTONDOWN:if(m.xshow-xm.xshow-xshow-am.yshow-ym.yshow-yshow-h) {
//printf(m.x %d\tm.y %d\t%d\t%d\n,m.x,m.y,save-m1x,save-m1y);save-drawflagtrue;// printf(drawflag %d\n,save-drawflag);}break;case WM_LBUTTONUP:save-drawflagfalse;
// 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.xshow.a,show.yshow.h);ExMessage m;while(1) {mgetmessage(EX_MOUSE);check(m,save,ak,show);draw(m,save,show,ak);}_getch();closegraph();
}