c++也能做动图?——devc++窗口做简单移动

前段时间,我看见CSDN的主页有许多利用各种语言写动图的帖子,唯独没有c++的。为什么呢?因为c++有点过时了。现在只有算法、操作系统会用到c++,动图是不会用到c++的。但是,我作为一名c++小学员,当然不能让c++在这个领域被抛弃,于是我就开始了c++动图计划。

上次我看到,有博主用某语言写出一个小长方形在舞台中移动的程序,我仔细想了下:对呀,c++运行窗口不就是一个长方形吗?那么,我们是不是可以制作一个小正方形在屏幕中移动,来模仿动画呢?

说干就干。首先,我们先认识一个函数叫SetWindowPos()。这个函数包含7个参数,分别是:

  hWnd:窗口句柄。
  hWndlnsertAfter:在z序中的位于被置位的窗口前的窗口句柄。
  x:以客户坐标指定窗口新位置的左边界。
  Y:以客户坐标指定窗口新位置的顶边界。
  cx:以像素指定窗口的新的宽度。
  cy:以像素指定窗口的新的高度。
  uFlags:窗口尺寸和定位的标志

 本次要控制的是控制台,控制台探出时往往在最前面,所以窗口句柄可以用GetForegroundWindow()来获取。我们要将窗口至于最前端,所以hWndlnsertAfter的值可以是HWND_TOP。x、y、cx、cy的值可能有点难理解,我们可以理解为x和y使用来控制窗口左上角的坐标,而cx和cy则是用来控制右下角坐标。但是右下角x坐标是cx+x的坐标,右下角y坐标是cy+y的坐标。至于最后一个uFlags,本次用不到,设为0即可。

那么,一个让窗口横着飘过的代码就做好了:

#include<bits/stdc++.h>
#include<windows.h>
int cx=GetSystemMetrics(SM_CXSCREEN);
int cy=GetSystemMetrics(SM_CYSCREEN);
HWND hwnd=GetForegroundWindow(); 
int main(){
	for(int i=0;i<cx;i++){
		SetWindowPos(hwnd,HWND_TOP,i,cy/2,cx/10,cy/10,0);
		Sleep(10);
	}
	return 0;
}

 但是窗口外面的边框倒是很难看,所以可以用SetWindowLong();来消除。我就不做详细讲解了,直接上代码:

#include<bits/stdc++.h>
#include<windows.h>
int cx=GetSystemMetrics(SM_CXSCREEN);
int cy=GetSystemMetrics(SM_CYSCREEN);
HWND hwnd=GetForegroundWindow(); 
LONG l_WinStyle=GetWindowLong(hwnd,GWL_STYLE);
int main(){
	SetWindowLong(hwnd,GWL_STYLE,(l_WinStyle|WS_POPUP|WS_MAXIMIZE)&~WS_CAPTION&~WS_THICKFRAME&~WS_BORDER);
	for(int i=0;i<cx;i++){
		SetWindowPos(hwnd,HWND_TOP,i,cy/2,cx/10,cy/10,0);
		Sleep(10);
	}
	return 0;
}

 我上次看到的文章所写的是一个长方形一伸一缩的动图,那么c++想做出通用效果源代码即为这样:

#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
int cx=GetSystemMetrics(SM_CXSCREEN);
int cy=GetSystemMetrics(SM_CYSCREEN);
HWND hwnd=GetForegroundWindow(); 
LONG l_WinStyle=GetWindowLong(hwnd,GWL_STYLE);
int main(){
	SetWindowLong(hwnd,GWL_STYLE,(l_WinStyle|WS_POPUP|WS_MAXIMIZE)&~WS_CAPTION&~WS_THICKFRAME&~WS_BORDER);
	int up=cy/10*4,H=cy/10,W=cx/20;
	for(int left=0;left<=cx/20*19;){
		W+=cx/20;
		SetWindowPos(hwnd,HWND_TOP,left,up,W,H,0);
		Sleep(500);
		left+=cx/20;
		W-=cx/20;
		SetWindowPos(hwnd,HWND_TOP,left,up,W,H,0);
		Sleep(500);
	}
	
	return 0;
}

好了,那功能也就实现了,本期内容就到这了。

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值