
代码实现
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <graphics.h>
#define HEIGHT GetSystemMetrics(SM_CYSCREEN)
#define WIDTH GetSystemMetrics(SM_CXSCREEN)
typedef struct CharNode CHAR_NODE, *PCHAR_NODE;
struct CharNode
{
int x, y;
int length;
int speed;
int size;
PCHAR_NODE next;
};
PCHAR_NODE char_rain;
void add()
{
PCHAR_NODE rand_char = (PCHAR_NODE)malloc(sizeof(CHAR_NODE));
rand_char->y = 0;
rand_char->x = rand() % WIDTH;
rand_char->length = rand() % 15 + 5;
rand_char->speed = rand() % 30 + 5;
rand_char->size = rand() % 20 + 15;
rand_char->next = char_rain->next;
char_rain->next = rand_char;
}
void remove()
{
for (PCHAR_NODE p = char_rain->next, rear = char_rain; p != NULL; rear = p, p = p->next)
{
if (p->y > HEIGHT + p->length * p->size)
{
rear->next = p->next;
free(p);
return;
}
}
}
void draw()
{
BeginBatchDraw();
cleardevice();
for (PCHAR_NODE p = char_rain->next; p != NULL; p = p->next)
{
settextcolor(WHITE);
settextstyle(p->size - 5, 10, L"Courier");
int step = 200 / p->length;
for (int i = 0; i < p->length; ++i)
{
outtextxy(p->x, p->y - i * p->size, rand() % 26 + 65);
settextcolor(RGB(0, 255 - i * step, 0));
}
p->y += p->speed;
}
EndBatchDraw();
Sleep(100);
}
int main()
{
HWND hwnd = initgraph(WIDTH, HEIGHT);
SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, WIDTH, HEIGHT, SWP_SHOWWINDOW);
SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) - WS_CAPTION);
LONG WindowLong = GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED;
SetWindowLong(hwnd, GWL_EXSTYLE, WindowLong);
SetLayeredWindowAttributes(hwnd, RGB(0, 0, 0), 0, LWA_COLORKEY);
char_rain = (PCHAR_NODE)malloc(sizeof(CHAR_NODE));
char_rain->next = NULL;
srand((unsigned)time(NULL));
while (1)
{
add();
remove();
draw();
}
return 0;
}