许多刚学 Turbo C 2.0(以下简称 tc)的人在做图形程序时都遇到过下面这个错误吧: BGI Error: Graphics not initialized (use 'initgraph') 原因只有一个:程序找不到 BGI 图形驱动,初始化出错了。 请看我写的两种正确的调用方法: 方法一,比较正宗: 假设 tc 安装在 c:\tc20 下,要根据你的 tc 所在路径修改代码中的红色部分(路径中的反斜杠是转义符,要用 \\ 表示 \)。 #include <conio.h> #include <graphics.h>
void main() { int gdriver=VGA, gmode=VGAHI; initgraph(&gdriver, &gmode, "c:\\tc20\\bgi");
rectangle(100,100,300,300); /*画一个方块测试*/
getch(); closegraph(); } 方法二,比较偷懒: 使用以下代码前,请将 bgi 文件夹下的 EGAVGA.BGI 拷贝一份到上级目录,就是和 tc.exe 在同一个目录内。 #include <stdio.h> #include <conio.h> #include <graphics.h>
void main() { int gdriver=VGA, gmode=VGAHI; initgraph(&gdriver, &gmode, NULL);
rectangle(100,100,300,300); /*画一个方块测试*/
getch(); closegraph(); } 是的,BGI 的路径写 NULL 就可以了,initgraph 会在当前路径下找的。就算用的第一种方法,如果没有找到图形驱动,也会再找一下当前路径的。以下是 Borland C++ 3.1 中对第三个路径参数的描述(tc 通用): pathtodriver: Specifies the directory path where initgraph looks for graphics drivers (*.BGI) first. If they're not there, initgraph looks in the current directory. If pathtodriver is null, the driver files must be in the current directory. 所以,编译后的 exe 程序,不管是用的第一种还是第二种方法,也必须将 EGAVGA.BGI 文件和编译后的 exe 文件放在一起。 说到这里,有些朋友可能看别的书这么写:进入 dosshell,用 BGIOBJ.EXE 将 EGAVGA.BGI 转换为 EGAVGA.OBJ,用 TLIB 将 EGAVGA.OBJ 链接入 GRAPHICS.LIB 图形库,然后在程序里面写上 registerbgidriver(EGAVGA_driver) 注册驱动…… 书上写的没有错,目的是为了将图形库链入最终编译的 exe 文件。 我个人不建议链入图形驱动库,安装软件的时候都是好多文件呢,很少有单个文件的程序。既然多数软件都这么做,我们为什么非要将程序弄成一个文件呢? 从架构上讲,多个文件是有好处的(这里不讨论粒度问题)。比如,如果 tc 更新了 EGAVGA.BGI 文件(仅仅假设),那么我们只需要把这个文件拷贝到程序目录里面即可,不用重新编译程序。 如果是 Borland C++ 3.1,前面的内容都适用,毕竟是一个公司的产品。唯一需要注意的是,第二种比较偷懒的方法,要注意,bc 的启动文件在 bin 文件夹中。也就是说,要将 EGAVGA.BGI 拷贝到 bin 里面。 如果要在 Vista 下使用 TC 或 BC,请从这里下载: http://hi.baidu.com/yangw80/blog/item/a87599d1ef95ced6572c84b0.html 还可以直接在 VC 里面绘图,使用这个绘图库: http://hi.baidu.com/yangw80/blog/item/63ff598072a9f9d09023d97f.html,不会产生以上 BGI 错误。
|