C++编写图形glitch效果整蛊程序时出现绘图异常如何解决?
C++桌面Glitch效果代码异常原因及修复方案
核心错误原因
- 变量名大小写不匹配:定义的点数组是
wPt,后续赋值误用WPT、WPt,C++大小写敏感,直接导致编译失败。 - 点数组赋值逻辑完全错误:所有赋值操作都只反复覆盖
wPt[0].x的值,没有为wPt[0].y、wPt[1]、wPt[2]三个点的坐标赋值,PlgBlt需要3个有效点确定平行四边形映射关系,野值坐标自然无法正常绘图。 PlgBlt参数传参错误:- 源区域参数逻辑错误,你传入的
wRect.bottom - wRect.right是无效数值,源区域应该传入左上角坐标、宽度、高度四个参数 - 末尾参数多写了一个逗号,属于语法错误
- 源区域参数逻辑错误,你传入的
- 未初始化随机数种子:
rand()函数没有调用srand初始化,每次运行生成的随机序列固定,效果不会随机变化 - 坐标计算逻辑错误:类似
rand() % 5 - c的计算会生成负数坐标,超出桌面区域范围
修复方法
- 统一变量名拼写为小写开头的
wPt,分别给三个点的x、y坐标随机偏移赋值 - 修正
PlgBlt的参数,源区域传桌面左上角坐标、桌面宽高 - 程序启动时调用
srand(time(NULL))初始化随机数种子 - 修正随机偏移计算逻辑,偏移值控制在合理范围内,避免生成无效坐标
- 补充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
相关产品推荐
相关产品推荐

