系统调色板的迷惑....

最近正在学习有关系统调色板的知识,看了不少书,但仍然是迷雾重重。最后我从计算机硬件入手,加上不断的编程实验,终于把问题解决了。下面我来分享一下我的理解,希望有同样迷惑的人可以少走一点弯路。。。。

    下面的程序有详细的注释,希望认真读下去!在程序的最后有关于系统调色板的解释:
#include "stdio.h"
#include "conio.h"
#include "graphics.h"//载入Borland公司的画图文件
main()
{
    int gDriver=DETECT;  /* 定义显示驱动器,VGA常量在graphics.h中定义 */
    int gModel,color;   /* 定义显示模式 ,DETECT为自动检测显示驱动,它的显示模式为最高显示模式。例如:CGA为CGAC3,EGA/VGA为EGAHI/VGAHI*/
    struct palettetype palette;

    initgraph(&gDriver,&gModel,""); /* 初始化图形驱动器,并且让应用程序切换到图形界面 */
    getpalette(&palette);   /* 得到系统调色板的16个寄存器值,每个寄存器都有一个颜色值 */

    for(color=0;color<palette.size;color++)     /* 在屏幕上划线 */
    {
        setcolor(color+1);  /* 设置显示颜色值,即设置相应的调色板寄存器的值*/
        line(10,10*color,50,10*color);
    }

    getch();
    /* 每按一次任意按键,就消失一条横线 */
    for(color=0;color<palette.size;color++)
    {
        setpalette(color,EGA_BLACK);  /* 把调色半寄存器设置成黑色,也就是0号寄存器的默认值,而0号寄存器的值就是背景色,所以寄存器控制的对应划线的颜色就会在屏幕"消失" */
        getch();
    }

    setallpalette(&palette); /* 还原系统调色板 */
    closegraph(); /* 别忘了在最后要关闭画图界面哦 */


    printf("Please press any return....");
    getch();
}
/* 关于调色板的补充说明:调色板寄存器共有16个,编号是0--15,每个寄存器中都放了一个颜色值,其中0号寄存器控制屏幕的背景色。
其它的15个寄存器控制前景色,当我们在屏幕画图时,图画的颜色就是15个前景寄存器控制的,即:第一个寄存器控制接下来的第一个图形,第二个寄存器控制接下来的第二个图形,依次类推... */

/*我们可以通过setcolor(int color)函数控制对应的寄存器设置前景色。
setcolor()函数的color就是要设置的颜色值,setcolor()函数设置的寄存器编号就是从1--15,即:第一次调用setcolor()函数时,设置1号寄存器,第二次调用时,设置2号寄存器,依次类推... */

/* 除了setcolor()函数外,我们还可以用更加直观的函数setpalette(int index,int color)函数来设置寄存器,index就是寄存器编号,color就是颜色值。当index为0时,就是设置背景色*/

/*除了上面介绍的两个函数外,还有一个函数可以设置背景色,那就是setbkcolor(int color),该函数有一个默认参数,即设置编号为0的寄存器*/

/*介绍了3个函数,下面就该来了解一下color值的含义了。我们都知道EGA/VGA显示器都有16个颜色寄存器,这16个寄存器都是8位寄存器,其中有6位表示颜色值,另外的高2位为保留值。那么这些颜色寄存器中存放的颜色值是怎么表示的呢?
下面我就拿其中的一个寄存器来解释一下:
D7      D6      D5      D4      D3      D2      D1      D0
X       X       R'      G'      B'      R       G       B
保留    保留    淡红    淡绿    淡蓝    红      绿      蓝
上面用二进制表示的颜色值可以重新设置,即:我们可以通过设置相应的比特位,来控制不同的颜色显示比例。
我们都知道6中颜色的组合共有2^6=64种颜色,所以EGA/VGA可以表示64中颜色,这比CGA表示的16种颜色丰富多了.....*/


    上面的程序已经在windowsXP+winTC环境下调试通过,运行该程序后,当看到15条不同颜色的横线后,请耐心的按16次键盘(任意键),这15条横线就会自动”消失“了。。。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值