You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++编写图形glitch效果整蛊程序时出现绘图异常如何解决?

C++桌面Glitch效果代码异常原因及修复方案

核心错误原因

  • 变量名大小写不匹配:定义的点数组是wPt,后续赋值误用WPT、WPt,C++大小写敏感,直接导致编译失败。
  • 点数组赋值逻辑完全错误:所有赋值操作都只反复覆盖wPt[0].x的值,没有为wPt[0].y、wPt[1]、wPt[2]三个点的坐标赋值,PlgBlt需要3个有效点确定平行四边形映射关系,野值坐标自然无法正常绘图。
  • PlgBlt参数传参错误:
    1. 源区域参数逻辑错误,你传入的wRect.bottom - wRect.right是无效数值,源区域应该传入左上角坐标、宽度、高度四个参数
    2. 末尾参数多写了一个逗号,属于语法错误
  • 未初始化随机数种子:rand()函数没有调用srand初始化,每次运行生成的随机序列固定,效果不会随机变化
  • 坐标计算逻辑错误:类似rand() % 5 - c的计算会生成负数坐标,超出桌面区域范围

修复方法

  1. 统一变量名拼写为小写开头的wPt,分别给三个点的x、y坐标随机偏移赋值
  2. 修正PlgBlt的参数,源区域传桌面左上角坐标、桌面宽高
  3. 程序启动时调用srand(time(NULL))初始化随机数种子
  4. 修正随机偏移计算逻辑,偏移值控制在合理范围内,避免生成无效坐标
  5. 补充DC资源释放逻辑,避免GDI资源泄漏

修复后完整代码

#include <windows.h>
#include <time.h>

int main() {
    HDC hdc = GetDC(HWND_DESKTOP);
    POINT wPt[3];
    RECT wRect;
    int screenW = GetSystemMetrics(SM_CXSCREEN);
    int screenH = GetSystemMetrics(SM_CYSCREEN);
    srand((unsigned int)time(NULL)); // 初始化随机数种子

    while (TRUE) {
        int offset = 15; // 随机偏移幅度,可自行调整控制glitch强度
        GetWindowRect(GetDesktopWindow(), &wRect);
        // 为平行四边形三个点赋值随机偏移
        wPt[0].x = wRect.left + rand() % offset - offset/2;
        wPt[0].y = wRect.top + rand() % offset - offset/2;
        wPt[1].x = wRect.right + rand() % offset - offset/2;
        wPt[1].y = wRect.top + rand() % offset - offset/2;
        wPt[2].x = wRect.left + rand() % offset - offset/2;
        wPt[2].y = wRect.bottom + rand() % offset - offset/2;
        // 修正PlgBlt参数
        PlgBlt(hdc, wPt, hdc, wRect.left, wRect.top, 
               wRect.right - wRect.left, wRect.bottom - wRect.top, 
               NULL, 0, 0);
        Sleep(300);
    }
    ReleaseDC(HWND_DESKTOP, hdc); // 释放DC资源
    return 0;
}

编译说明:Windows环境下编译即可运行,MinGW编译时需加-lgdi32参数链接GDI库,VS默认已自动链接。

内容的提问来源于stack exchange,提问作者Omega864632

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 04:15:03