-1

请看下面的代码:

#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屏幕完全空白,虽然我已经清除并关闭了以前的图形

那么为什么它在第二次不起作用?

4

2 回答 2

1

您的代码具有未定义的行为。呼吁initgraph

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

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

*graphmode 是指定初始图形模式的整数(除非 *graphdriver 等于 DETECT;在这种情况下,*graphmode 由 initgraph 设置为可用于检测到的驱动程序的最高分辨率)。您可以使用 graphics_modes 枚举类型的常量给 *graphmode 一个值,该常量在 graphics.h 中定义并在下面列出。

graphdriver 和 graphmode 必须设置为下表中的有效值,否则您将得到不可预知的结果。例外是graphdriver = DETECT。

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

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

int gdriver = IBM8514, gmode = 0;

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

int gdriver = DETECT, gmode;
于 2019-01-21T18:37:14.933 回答
0

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 都有一个具有该名称的文件......

于 2019-01-22T09:16:21.990 回答