【C语言实现花屏效果并打包程序为exe可执行文件】

说明:该程序为临摹改良(😀)作品,源地址C/C++屏幕恶搞程序

效果展示

在这里插入图片描述

上代码

#include <windows.h>

#define NUM 11451

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int main() // Renamed WinMain to main
{
    static int iKeep[NUM][4];
    HDC        hdcScr, hdcMem;
    int        cx, cy;
    HBITMAP    hBitmap;
    HWND       hwnd;
    int        i, j, x1, y1, x2, y2;

    if (LockWindowUpdate(hwnd = GetDesktopWindow()))
    {
        hdcScr = GetDCEx(hwnd, NULL, DCX_CACHE | DCX_LOCKWINDOWUPDATE);
        hdcMem = CreateCompatibleDC(hdcScr);
        cx = GetSystemMetrics(SM_CXSCREEN) / 10;
        cy = GetSystemMetrics(SM_CYSCREEN) / 10;
        hBitmap = CreateCompatibleBitmap(hdcScr, cx, cy);

        SelectObject(hdcMem, hBitmap);a

        srand((int)GetCurrentTime());

        for (i = 0; i < 2; i++)
            for (j = 0; j < NUM; j++)
            {
                LockWindowUpdate(hwnd = GetDesktopWindow());
                if (i == 0)
                {
                    iKeep[j][0] = x1 = cx * (rand() % 10);
                    iKeep[j][1] = y1 = cy * (rand() % 10);
                    iKeep[j][2] = x2 = cx * (rand() % 10);
                    iKeep[j][3] = y2 = cy * (rand() % 10);
                }
                else
                {
                    x1 = iKeep[NUM - 1 - j][0];
                    y1 = iKeep[NUM - 1 - j][1];
                    x2 = iKeep[NUM - 1 - j][2];
                    y2 = iKeep[NUM - 1 - j][3];
                }
                BitBlt(hdcMem, 0, 0, cx, cy, hdcScr, x1, y1, SRCCOPY);
                BitBlt(hdcScr, x1, y1, cx, cy, hdcScr, x2, y2, SRCCOPY);
                BitBlt(hdcScr, x2, y2, cx, cy, hdcMem, 0, 0, SRCCOPY);
            }

        DeleteDC(hdcMem);
        ReleaseDC(hwnd, hdcScr);
        DeleteObject(hBitmap);
    }
    return 0;
}

代码会在桌面上随机选取一些区域,并将它们的内容进行快速的随机移动和交换,产生一种视觉上的动态效果。

原理

  1. 定义了一个较大的二维数组 iKeep 来存储一些坐标信息。
  2. 通过 GetDesktopWindow 获取桌面窗口句柄,使用相关的图形设备接口(GDI)函数进行操作。
  3. CreateCompatibleDCCreateCompatibleBitmap 创建与屏幕兼容的设备上下文和位图。
  4. 使用 rand 函数生成随机数来确定移动区域的起始和结束坐标。
  5. 通过 BitBlt 函数在不同的设备上下文之间复制位图,实现区域的移动效果。

这边也改良了一个加速版本

通过减少循环次数和每次操作之间的等待时间来加快随机移动的速度:

#include <windows.h>
#include <ctime>

#define NUM 5000  // 减少循环次数以加快速度

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int main()
{
    static int iKeep[NUM][4];
    HDC hdcScr, hdcMem;
    int cx, cy;
    HBITMAP hBitmap;
    HWND hwnd;
    int i, j, x1, y1, x2, y2;

    srand(static_cast<unsigned int>(time(nullptr)));  // 初始化随机数生成器

    if (LockWindowUpdate(hwnd = GetDesktopWindow()))
    {
        hdcScr = GetDCEx(hwnd, NULL, DCX_CACHE | DCX_LOCKWINDOWUPDATE);
        hdcMem = CreateCompatibleDC(hdcScr);
        cx = GetSystemMetrics(SM_CXSCREEN) / 10;
        cy = GetSystemMetrics(SM_CYSCREEN) / 10;
        hBitmap = CreateCompatibleBitmap(hdcScr, cx, cy);

        SelectObject(hdcMem, hBitmap);

        for (i = 0; i < 1;  // 将循环次数从 2 减少为 1
             i++)
        {
            for (j = 0; j < NUM; j++)
            {
                LockWindowUpdate(hwnd = GetDesktopWindow());
                if (i == 0)
                {
                    iKeep[j][0] = x1 = cx * (rand() % 10);
                    iKeep[j][1] = y1 = cy * (rand() % 10);
                    iKeep[j][2] = x2 = cx * (rand() % 10);
                    iKeep[j][3] = y2 = cy * (rand() % 10);
                }
                else
                {
                    x1 = iKeep[NUM - 1 - j][0];
                    y1 = iKeep[NUM - 1 - j][1];
                    x2 = iKeep[NUM - 1 - j][2];
                    y2 = iKeep[NUM - 1 - j][3];
                }
                BitBlt(hdcMem, 0, 0, cx, cy, hdcScr, x1, y1, SRCCOPY);
                BitBlt(hdcScr, x1, y1, cx, cy, hdcScr, x2, y2, SRCCOPY);
                BitBlt(hdcScr, x2, y2, cx, cy, hdcMem, 0, 0, SRCCOPY);

                // 此处可以添加一些短暂的暂停来控制速度,例如 Sleep(1) 表示暂停 1 毫秒
                // Sleep(1);  
            }
        }

        DeleteDC(hdcMem);
        ReleaseDC(hwnd, hdcScr);
        DeleteObject(hBitmap);
    }

    return 0;
}

将其打包成可执行程序

当然,把代码写出来,想整人的话还得研究怎么用,所以就得把程序打包
我用的是Visual Studio所以就以VS为例
按照以下步骤进行:

第一步:点击 扩展》管理扩展

在这里插入图片描述

第二步:搜索Installer,找到第一个微软的那个,然后安装它

在这里插入图片描述
下载好之后你需要关闭VS,然后会弹出一个安装程序,一直下一步跟着安装好就行,安装好之后再次打开VS

第三步:在当前的“解决方案” 右键》添加》新建项目

在这里插入图片描述
在新建项目这里搜索“setup”,选择第一个Setup Project
在这里插入图片描述
选择在setup下的Detected Dependencies,在右侧的Application Folder上找到Add,点击右侧的“项目输出”
在这里插入图片描述
弹出的窗口中选择“主输出”即可,点解“确定”,下一步
在这里插入图片描述

第四步:生成打包文件

右击 setup 在弹出来的菜单中选择重新生成即可
在这里插入图片描述
在资源管理器中选择
在这里插入图片描述
进入Debug文件夹,这里的都是安装程序
在这里插入图片描述
OK

  • 17
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值