zoukankan      html  css  js  c++  java
  • (透明代码雨/屏保)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("
    输入选择:");
            printf_s("**************
    ");
            printf_s("|   1.告白   |
    ");
            printf_s("|   2.自由   |
    ");
            printf_s("|   3.耍帅   |
    ");
            printf_s("**************
    ");
            scanf_s("%d", &choice);
        } while (choice != 1 && choice != 2 && choice != 3);
        if (choice == 1)
        {
            puts("输入名字个数");
            scanf_s("%d", &n);
            puts("输入名字,格式如:张 二 蛋
    每个字之间必须要空格");
            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("输入语句,格式如:张 二 蛋
    每个字之间必须要空格");
            for (int i = 0; i < n; ++i)
                scanf_s("%s", SS[i], 10);
        }
        else n = M;
        int Choice;
        do
        {
            system("cls");
            puts("
    请选择模式:");
            printf_s("**************
    ");
            printf_s("|   1.慕雨   |
    ");
            printf_s("|   2.屏保   |
    ");
            printf_s("**************
    ");
            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

  • 相关阅读:
    Legacy(点对线段有路走,线段向点有路走,线段树走dij)
    G. Death DBMS(查询每个主串和n个模板串匹配后val最大值,支持单点更新)
    2020 CCPC Wannafly Winter Camp Day5 J Xor on Figures(矩阵转01串,统计01串异或种类)
    zoj3988(自己集合和自己集合匹配)
    2020 CCPC Wannafly Winter Camp Day7 A(求任何子序列中相邻范围内数的个数的总和)
    hdu6241(给定树中向上向下限制求最小可能个数)
    hdu6230(求限制条件的回文个数,利用manacher+BIT求解)
    NOIP 2020 游记
    分散层叠算法学习笔记
    代理模式
  • 原文地址:https://www.cnblogs.com/Renhr/p/13471309.html
Copyright © 2011-2022 走看看