前段时间,我看见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;
}
好了,那功能也就实现了,本期内容就到这了。