(透明代码雨/屏保)c++百行代码,超简单

极简 代码雨/屏保 c++代码,原创。

此代码雨也可以作秀告白。

基于Easyx,

在vs端使用,

若是其他编译器自行修改scanf等函数。

也就   百行   而已。

先放效果图吧:

 

 

 

 

 

 

 

 

 

 

 

若想直接体验,

百度网盘软件如下:

链接:https://pan.baidu.com/s/1h_k7K863o55Z7q6lhkuQWw
提取码:1234

 ------------------------------------------- 重大更新 -------------------------------------------

2020.12.2——如果vs报错,outtextxy无法找到重构,

解决办法:项目——属性

1.顶部平台(改为所有平台)

2.左侧配置属性——高级——字符集(改为使用多节字符集)

------------------------------------------- 重大更新 -------------------------------------------

 

代码如下:

#include<graphics.h>
#include<cstdio>
#include<Windows.h>
#include<cstring>
#define N 50
#define M 10
int X, Y, n, choice;
char SS[20][9];
struct pt
{
    TCHAR s[M];
    int x, y;
    int a, b, c;
}S[N];
void Init(int i)
{
    for (int k = 0; k <= M; ++k)
    {
        if (rand() % 3)
        {
            S[i].s[k] = 'a' + rand() % 26;
        }
        else S[i].s[k] = '0' + rand() % 9;
    }
    S[i].x = rand() % X;
    S[i].y = rand() % Y;
    if (!rand() % 3)S[i].y = 0;
    do
    {
        S[i].a = rand() % 240;
        S[i].b = rand() % 240;
        S[i].c = rand() % 240;
    } while (S[i].a + S[i].b + S[i].c < 510);
}
void out_s()
{
    int i, k;
    for (i = 0, k = 0; i < N; ++i, k = 0)
    {
        settextcolor(RGB(255, 255, 255));
        outtextxy(S[i].x, S[i].y + k * 16, S[i].s[k]);
        for (; k < n; ++k)
        {
            int x = (M - k + 1) / (double)M * S[i].a;
            int y = (M - k + 1) / (double)M * S[i].b;
            int z = (M - k + 1) / (double)M * S[i].c;
            settextcolor(RGB(x, y, z));
            if(choice!=3)outtextxy(S[i].x, S[i].y + k * 16, SS[k]);
            else outtextxy(S[i].x, S[i].y + k * 16, S[i].s[k]);
        }
        S[i].y++;
        if (S[i].y > Y)
            Init(i);
    }
}
int main()
{
    do
    {
        system("cls");
        puts("\n输入选择:");
        printf_s("**************\n");
        printf_s("|   1.告白   |\n");
        printf_s("|   2.自由   |\n");
        printf_s("|   3.耍帅   |\n");
        printf_s("**************\n");
        scanf_s("%d", &choice);
    } while (choice != 1 && choice != 2 && choice != 3);
    if (choice == 1)
    {
        puts("输入名字个数");
        scanf_s("%d", &n);
        puts("输入名字,格式如:张 二 蛋\n每个字之间必须要空格");
        for (int i = 0; i < n; ++i)
            scanf_s("%s", SS[i],10);
        strcpy_s(SS[n], "");
        strcpy_s(SS[n + 1], "");
        strcpy_s(SS[n + 2], "");
        n += 3;
    }
    else if (choice == 2)
    {
        puts("先输入所想语句的字数,20字以内");
        scanf_s("%d", &n);
        puts("输入语句,格式如:张 二 蛋\n每个字之间必须要空格");
        for (int i = 0; i < n; ++i)
            scanf_s("%s", SS[i], 10);
    }
    else n = M;
    int Choice;
    do
    {
        system("cls");
        puts("\n请选择模式:");
        printf_s("**************\n");
        printf_s("|   1.慕雨   |\n");
        printf_s("|   2.屏保   |\n");
        printf_s("**************\n");
        puts("若要关掉屏保模式,请按开始键,在任务栏关掉程序嗷");
        scanf_s("%d", &Choice);
    } while (Choice != 1 && Choice != 2);
    X = GetSystemMetrics(SM_CXSCREEN);
    Y = GetSystemMetrics(SM_CYSCREEN);
    HWND hwnd = initgraph(X, Y);// 获取窗口句柄
    for (int i = 0; i < N; ++i)Init(i);
    //SetWindowText(hwnd, "Hello!");// 设置窗口标题文字
    SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) - WS_CAPTION);//透明框架
    SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, X, Y, SWP_SHOWWINDOW);//定位
    
    //屏保模式注意:
    //要返回界面就  按开始键  在  任务栏  关掉程序
    //要返回界面就  按开始键  在  任务栏  关掉程序
    //要返回界面就  按开始键  在  任务栏  关掉程序
    //下面这部分注释掉就变成屏保了(实际占用偏高cpu,并不算是屏保)
    ///*
    if (Choice == 1)
    {
        LONG WindowLong = GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED;
        SetWindowLong(hwnd, GWL_EXSTYLE, WindowLong);//窗口风格
        SetLayeredWindowAttributes(hwnd, RGB(0, 0, 0), 0, LWA_COLORKEY);//透明底色
    }
    //*/

    while (1)
    {
        BeginBatchDraw();
        out_s();
        EndBatchDraw();
        Sleep(5);
        cleardevice();
    }
    return 0;
}
c++

2020.8.10——(更新)1.添加20以内的自由模式,提高功能性  2.添加屏保选项,不用改代码直接选择。没有更新图片,都差不多,没必要。

此放所用函数说明网址:

1.GetSystemMetrics,我在前博客Easyx基础里发过说明

2.SetWindowLong,https://baike.baidu.com/item/SetWindowLong/6375538?fr=aladdin

3.GetWindowLong,https://blog.csdn.net/hnhyhongmingjiang/article/details/2154410 + https://baike.baidu.com/item/GetWindowLong/6375452?fr=aladdin

4.WS_CAPTION,https://blog.csdn.net/weixin_36929359/article/details/54342859

5.SetWindowPos,https://baike.baidu.com/item/SetWindowPos/6376849?fr=aladdin

6.WS_EX_LAYERED,https://blog.csdn.net/tyhjtw/article/details/38107577

7.SetLayeredWindowAttributes,https://baike.baidu.com/item/SetLayeredWindowAttributes/10134503

posted @ 2020-08-10 18:05  Renhr  阅读(1774)  评论(0编辑  收藏  举报