DOS下的图形编程

DOS系统下图形库是BGI(Borland Graphics Interface,TurboC也是borland公司开发的),BGI包含图形库文件graphics.lib,图形头文件graphics.h(记得《计算机图形学》中的例子程序都引用了这个头文件),许多图形显示器的驱动(CGA.BGI,EGAVGA.BGI等)和一些字体驱动。在TurboC的include目录中就有这个文件,使用这个图形库就可以在黑色的dos窗口中绘图了。

16位的系统和32位的系统图形处理的方式不同,所以Tc的图形库不能用在vc中。但据说已经有了winBGIm的库,可以在VC中使用,练习dos下的图形编程。在vc下也可以使用grx库可以得到相同的效果,而且接口和graphics兼容。

很多dos下的游戏就是用这个库编写的。也有的为了获得更大的灵活性,直接写屏幕内存。
直接写屏技术在DOS下面很容易实现,调用BIOS的10h中断的00h功能即可进入视频模式,对于VGA、VESA的显示模式,显存的起始地址都是A000:0000H(是一个16位地址的段址+偏移形式)。在支持DOS程序的C编译器下面很容易实现进入视频模式,并且用一个far指针指向视频显存的首地址,然后你就可以在显存里面为所欲为了,比如画点什么的。下面引用别人写的一个例子:
 

#define MODE_VGA13H  0x13
#define MODE_TEXT       0x03

void setmode(char mode)      //设置视频模式的函数
{
    asm mov ah,0x00    //调用00h功能设置视频模式
    asm mov al,mode    //AL寄存器放欲设置的视频模式号,这里以13h视频模式为例
    asm int    0x10        //调用10h中断
}

char far * vediobuf=(char far*)0xa0000000L;    //指向显存地址的指针

void putpixel(int x,int y,int c)    //画点的函数
{
    *(vediobuf+x+320*y)=c;
}

int getpixel(int x,int y)              //取点的函数
{
    return *(vediobuf+x+320*y);
}

void main(void)
{
    int i;
    int j;

    //设置VGA13H视频模式
    setmode(MODE_VGA13H);

    //用一个二重循环画满屏幕
    for(i=0;i<20;i++)
        for(j=0;j<320;j++)
            putpixel(j,i,j);

    getch();
    //返回DOS文本模式
    setmode(MODE_TEXT);
}

上面实现了一个画点的函数和一个取点的函数,在此基础上结合一些算法很容易写出画直线、画矩形、画圆等图形函数,对于BMP位图的显示,只要了解BMP的文件结构,再根据位图中的数据画点就可以把位图显示出来了。
直接写屏的性能非常高,但在Windows中绝不会允许你这样做,如果想在windows下直接写屏,就使用directdraw吧。


 

你可能感兴趣的:(DOS下的图形编程)