如何多次调用 initgraph?

How do I can call initgraph more than one time?

请看下面的代码:

#include <stdio.h>
#include <graphics.h>
#include <conio.h>
using namespace std;
void drawrect()
{
    int gdriver = IBM8514, gmode;
    initgraph(&gdriver, &gmode, "");
    rectangle(500, 500, 700, 700);
    getch();
    cleardevice();
    closegraph();
}
int main()
{
    int f=1;
    while(f)
    {
        char c;
        printf("Press \"e\" to end, and any other character to draw a rectangle");
        scanf("%c",&c);
        c=='e' ? f=0:f=1;
        drawrect();
        fflush(stdin);
    }
}

我第一次 运行 这个程序时,它工作正常并绘制了一个矩形,但是第一次之后,矩形功能不起作用并且 GUI 屏幕完全空白,而我已清除并关闭之前的图形

那为什么第二次不行呢?

您的代码有未定义的行为。调用 initgraph

int gdriver = IBM8514, gmode;
initgraph(&gdriver, &gmode, "");

应该传递一个指向您要使用的图形模式的指针。 This page 描述函数及其参数,以及它所说的模式:

*graphmode is an integer that specifies the initial graphics mode (unless *graphdriver equals DETECT; in which case, *graphmode is set by initgraph to the highest resolution available for the detected driver). You can give *graphmode a value using a constant of the graphics_modes enumeration type, which is defined in graphics.h and listed below.

graphdriver and graphmode must be set to valid values from the following tables, or you will get unpredictable results. The exception is graphdriver = DETECT.

但是你没有设置模式,正如引用的第二段所说,结果是不可预测的。这可以是:按照您的预期工作、不工作、工作异常或炸毁处理器。

所以用say设置你想使用的图形模式

int gdriver = IBM8514, gmode = 0;

或您需要使用的任何模式。或者你可以告诉系统自己检测,在这种情况下你可以使用

int gdriver = DETECT, gmode;

Init 和 close 应该只调用一次,而不是在 drawrect 中调用,但通常在 main 中调用...在渲染例程中也有 getch 也没有意义...

我不会在这里触及你的代码的其他问题,因为我已经多年没有编写控制台的东西了 BGI 甚至更长时间,但我将从重新排序代码开始:

#include <stdio.h>
#include <graphics.h>
#include <conio.h>
using namespace std;
void drawrect()
{
    rectangle(500, 500, 700, 700);
}
int main()
{
    int f=1;

    int gdriver = IBM8514, gmode;
    initgraph(&gdriver, &gmode, "");

    while(f)
    {
        char c;
        printf("Press \"e\" to end, and any other character to draw a rectangle");
        scanf("%c",&c);
        c=='e' ? f=0:f=1;
        drawrect();
        getch();
        fflush(stdin);
    }

    cleardevice();
    closegraph();
}

将来还会用真实名称 BGI 来称呼库,因为 graphics.h 没有任何意义,因为几乎所有 gfx api/libs 都有一个具有该名称的文件...