[原创]如何编写自己的图形开发包 — 第一章 实现图形初始化
此文章出至 [url]www.[/url] 作者:孙靖[bold]第一章
实现图形初始化[/bold]
要实现这个,在代码上来说,其实就那么10来行代码。真的太简单了,我都不好意思拿出来现眼。我更关心的是,为大家解释一下图形模式。
在这我不想给您把显示器光栅原理,硬件实现说的个底朝天,我也没那么深的功力。如果下面我说的您还是不能理解,那就先记住,再去看代码,运行一下实例有那么个印象就可以啦。
我们的机器在跑起来的时候并不是直接就到了绚丽多彩的图形模式。(如我们的WIN)他也是要经过一系列的初始化工作才能让我们的机器基于图形模式,至于他怎么实现那是硬件工程师操心的事我们不用太过多操心啦。
图形模式我们只要记住两个概念,分辨率+色深。
分辨率:这个我想不用我多加说明吧,比如我们需要一个320X200大小的画面。那么我们就需要编写一定代码去把我们的机器设置成这样的模式。
色深:也许有的朋友很清楚啦,可这个也是让很多初学者揣摩很久的概念。他的意思就是,我们的机器能显示多少种颜色,这个也是需要我们去设置的。
有心人看了以上两条应该能得到这样一个结论:我们需要什么图形模式,一定是我们的机器自身就具备的。这个是个基础,是个根本。如果你使用机器根本不具备某种图形模式,你再怎么设置也是惘然不会出你想要的效果。可值得庆幸的是,我所介绍的内容在我们现今的机器上是一定可以实现的。
在这里我们打算实现的图形模式有:
320X200 - 256色(8位色深)
640X480 - 256色(8位色深)
800X600 - 256色(8位色深)
1024X768 - 256色(8位色深)
哦!就这么简单的几种模式?小弟无能啊,我看我只能讲这么多,其实只要理解并会实现这几个模式,16位色深、24位色深的伪彩,甚至32位色深的真彩实现也就是这么个方法。后面要有时间会适当的介绍高色深的实现。
代码:
/*===对常用类型进行可移植性封装===*/
typedef char BOOL;
typedef char INT8;
typedef short INT16;
typedef long INT32;
typedef long long INT64;
typedef unsigned char UINT8;
typedef unsigned short UINT16;
typedef unsigned long UINT32;
typedef unsigned long long UINT64;
/*=== 几种图形模式宏 ===*/
#define TRY320X200X256 0X103
#define TRY640X480X256 0X101
#define TRY800X600X256 0X103
#define TRY1024X768X256 0X105
void SetSVGAMode(INT16 vmode); /* 设置图形模式 */
void SetSVGAMode(INT16 vmode)
{
_AX = 0x4f02;
_BX = vmode;
__int__(0x10); /* 设置好寄存器,并完成初始化 */
}
简单吧?什么?不懂?不懂没关系,记住就是啦。我开始也不懂,记得上面说过的吗?某种图形模式是要我们的机器本身具备这个能力,我们只是做些设置将其初始化为某种模式。看到上面的代码,其实就是做了点设置工作。DOS下,你只要这样做就可以实现图形初始化啦。比如,初始化成320X200 - 256色(8位色深),只要SetSVGAMode(TRY320X200X256);就OK了。您可以运行char01-main1的实例,此时您除了看到一个黑乎乎的屏什么也看不到,不过他的确是实现了图形模式。
强烈建议各位在运行这些实例的时候使用DOSBox虚拟机。为什么要使用他呢?因为目前很多机器你直接运行DOS下的高分辨率高色深程序会黑屏,具体原因可以参考“[url]http://bbs.bccn.net/viewthread.php?tid=150119&highlight=%2BRockCarry[/url]”。
效果如图1.1:
图1.1 实现320X200 - 256色(8位色深)效果图
如果你按任意键,此程序将结束。并跳出了一个很不成比列输入符,天这也太不优美啦。因为此时DOS系统还处在320X200 - 256色(8位色深)模式。我们多做个模块,纪录初始化图形之前的模式并在程序结束时返回原来的模式。
代码:
INT16 GetSVGAMode(); /* 获取当前模式 */
INT16 GetSVGAMode()
{
_AX = 0x4f03;
__int__(0x10);
return _BX;
}
看,简单吧?还是不懂?没关系,老办法记住就可以。您可以参考chap01-main2的实例。这里就不展示其效果图啦。
仔细对比main1与main2的效果。main1退出后字符变的很粗大,那是因为DOS系统被设置为320X200 - 256色(8位色深)模式啦,所以他的字符样式也变了,而main2却又重新将DOS系统设置回原来的模式,所以他的字符样式就很协调。
到此,如何实现图形初始化就介绍完毕。简单吧,代码就那么几行废话到不少。不过就总那么个黑乎乎的屏也没什么意思啊。下一章我们就要给你点颜色瞧瞧。
配套资料下载:[url]http://bbs.bccn.net/attachment.php?aid=32175[/url]
[[italic] 本帖最后由 jig 于 2008-1-21 17:04 编辑 [/italic]]