数字雨壁纸
环境:easyX,VS2017或者VC6.0。
涉及知识:C/C++基本语法,easyX部分函数,windowsAPI函数:FindWindow,EnumWindows,
SendMessageTimeout,SetParent。以及其中回调函数的概念。
效果如下图
initgraph函数的参数可自行更改,并在更改的同时修改数字雨回归开头的末尾坐标即可。
下附代码·。
#include<iostream>
#include<graphics.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#include<windows.h>
#define MAX 44 //字符串的数量
char name1[MAX][10];
int pos[MAX];
HWND g_workerw;//用来存储桌面句柄的句柄变量.
char name()//为一个字符随机赋值。
{
char names;
while (1)
{
names = rand() % 123;
if (names >= 65 && names <= 90 || names >= 97 || names >= 48 && names <= 57)break;
}
return names;
}
void getnames()//获取字符的值
{
int i, j;
for (i = 0; i < MAX; i++)
{
for (j = 0; j <= 9; j++)
{
name1[i][j] = name();
}
}
}
void getpos()//获得坐标1
{
int i;
for (i = 0; i < MAX; i++)
{
pos[i] = rand() % 480;
}
}
void rain()
{
int i, j;
for (i = 0; i < MAX; i++)
{
settextcolor(RGB(255, 255, 255));//还原字体颜色
for (j = 0; j <= 9; j++)
{
outtextxy(i * 15, pos[i] - 15 * j, name1[i][j]);//设置当前一个字符的
settextcolor(RGB(0, 255 - j * 27, 0));//随着一串字符的移动,从下向上颜色变浅。(表示当前字符的颜色)
}
}
for (i = 0; i < MAX; i++)//此循环内每个字符的纵坐标位置向下移动8.
{
Sleep(1);
pos[i] += 8;
}
for (j = 0; j <= MAX; j++)
{
if (pos[j] - 80 >= 480)pos[j] = 0;
}//字符串末尾超出窗口边界,将其纵坐标还原到初始状态
}
BOOL CALLBACK EnumWndCallback(HWND tophandle, LPARAM topparamhandle)
{
HWND p = FindWindowEx(tophandle, 0, L"SHELLDLL_DefView", 0);
if (p != 0)
{
g_workerw = FindWindowEx(0, tophandle, L"WorkerW", 0);
}
return true;
}
int main()
{
HWND hwnd = initgraph(640, 480);//该函数会返回一个创建的窗口的句柄。
SendMessageTimeout(0, 0x052c, 0, 0, SMTO_NORMAL, 1000, 0);
//发送全局的信息0x052c到计算机,这个信息会让计算机生成一个窗口类名为"WorkerW"的窗口
EnumWindows(EnumWndCallback, 0);//通过回调函数反复查找我们生成的窗口"WorkerW"。
if (g_workerw == 0)//如果没找到结束程序
{
closegraph();
return 0;
}
SetParent(hwnd, g_workerw);//将桌面窗口设置为图形窗口的父窗口。
setbkcolor(BLACK);//设置背景色
getnames();
getpos();//初始化坐标
while (1)
{
getnames();
BeginBatchDraw();
cleardevice();
rain();
EndBatchDraw();
}
getchar();
closegraph();
return 0;
}