首页 > 解决方案 > 如何多次调用 initgraph?

问题描述

请看下面的代码:

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

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

标签: cbgi

解决方案


您的代码具有未定义的行为。呼吁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;

推荐阅读