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

调用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的顺序完全错误,导致图形绘制逻辑混乱甚至程序卡死。正确的双页缓冲流程是:

  1. 切换到当前活动页
  2. 清除该页内容
  3. 在活动页绘制图形
  4. 切换可视页到当前活动页

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 19:40:07