c - 如何多次调用 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屏幕完全空白,虽然我已经清除并关闭了以前的图形
那么为什么它在第二次不起作用?
解决方案
您的代码具有未定义的行为。呼吁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;
推荐阅读
- javascript - 如何获取 Javascript 跟踪脚本的订单详细信息?
- c# - 如何在 MacOS 上创建每像素 16 位的位图?
- java - Spring Boot Redis 架构设计
- jquery - 如何在 Django 模型中正确使用 jQuery / Ajax 发布
- python - Pygame窗口刚刚制作后没有响应
- multithreading - 函数try-block是否等同于包含整个函数的try-catch?
- python - 制作没有控制台窗口的 .exe 的问题(PyInstaller)
- javascript - Firebase 网络 - 获取 Google OAuth 令牌
- python - 在 Python 中调用生成器时出错
- python - 不可见的 tkinter 窗口上的 Blit 图像