调用initwindow/initgraph后程序停滞问题求助
问题:调用initgraph后程序停滞,后续代码无法执行
程序可正常编译,但调用initwindow或initgraph后直接停滞,后续代码完全不执行。已安装最新版MinGW与Code::Blocks,完成winbgim文件部署及编译器配置,原代码如下:
#include <graphics.h> #include <conio.h> #include <iostream> using namespace std; int main() { cout<<"Check"<<endl; int page=1; // initwindow(1200, 768); int gd=DETECT,gm; cout<<"Check2"<<endl; initgraph(&gd,&gm,""); cout<<"Check3"<<endl; int a=50, b=50; circle(a,b, 50); while(true){ if(GetAsyncKeyState(VK_RIGHT)){ //if key pressed is right a=a+25; } if(GetAsyncKeyState(VK_LEFT)){ //if key pressed is left a=a-25; } if(GetAsyncKeyState(VK_UP)){ //if key pressed is left b=b-25; //remember top left is 0, 0 } if(GetAsyncKeyState(VK_DOWN)){ //if key pressed is left b=b+25; //remember top left is 0, 0 } setactivepage(page); //to draw //draw setvisualpage(1-page); //to show delay(20); cleardevice(); circle(a,b, 50); page=1-page; } return 0; }
解决思路与方案
1. 控制台输出与图形窗口冲突
winbgim的图形窗口初始化后,控制台的cout输出会触发程序阻塞。解决方法:
- 移除所有
cout语句,改用outtextxy在图形界面输出调试信息; - 或者在
initgraph前添加freopen("NUL", "w", stdout);关闭控制台输出流。
2. 双页缓冲逻辑错误
原代码中setactivepage、setvisualpage和cleardevice的顺序完全错误,导致图形绘制逻辑混乱甚至程序卡死。正确的双页缓冲流程是:
- 切换到当前活动页
- 清除该页内容
- 在活动页绘制图形
- 切换可视页到当前活动页
3. GetAsyncKeyState的重复触发问题
GetAsyncKeyState会在按键按下的每一帧都返回true,导致一次按键触发多次移动。改用_kbhit()配合getch()可以避免这个问题,只在按键按下时处理一次。
4. 缺少退出与资源释放逻辑
原代码是死循环,没有退出条件,也未调用closegraph()释放图形资源,容易导致程序异常。添加ESC键退出逻辑,并在退出时调用closegraph()。
修改后的可运行代码
#include <graphics.h> #include <conio.h> using namespace std; int main() { int page = 0; int gd = DETECT, gm; initgraph(&gd, &gm, ""); int a = 50, b = 50; while (true) { // 处理按键输入,避免重复触发 if (_kbhit()) { char key = getch(); switch (key) { case 77: // 方向右键 a += 25; break; case 75: // 方向左键 a -= 25; break; case 72: // 方向上键 b -= 25; break; case 80: // 方向下键 b += 25; break; case 27: // ESC键退出程序 closegraph(); return 0; } } // 双页缓冲正确流程 setactivepage(page); cleardevice(); circle(a, b, 50); setvisualpage(page); delay(20); page = 1 - page; } closegraph(); return 0; }
额外配置检查
- 确保Code::Blocks的编译器链接选项中添加了:
-lbgi -lgdi32 -lcomdlg32 -luuid -loleaut32 -lole32,这些是winbgim依赖的系统库; - 若仍有停滞问题,尝试更换为TDM-GCC 4.9.2版本的MinGW,新版MinGW对winbgim兼容性较差;
- 避免在图形窗口初始化后使用控制台输入输出函数(如
cout、cin)。
内容的提问来源于stack exchange,提问作者Chocolatez
相关产品推荐
相关产品推荐

