第二种方法从逻辑上说的可能性大些,因为我实在记不清了,只能从逻辑上猜测了,因为程序运行离不开寄存器,graphics的内核应该会读到完整的颜色值放进里面,只是返回时迫于函数原型将值截断了。
楼主有时间可以试试,不过先申明我只是凭稀薄的印象回忆的,所以很可能只是我梦到的而没有任何的依据,所以没成功可别骂我哦。
我改了改变量类型 然后显示后重显测试成功了
至于你那个方法我还要多研究一段日子(发现技术上有点限制)
我现在先用这个:
unsigned int far *videoptr = (int far *)MK_FP(0xa000, 0);
unsigned int get64kdot(int x,int y)
{
long addr;
int page;
page = (int)((addr = (long)y *GRPAH_MAXX +(long)x) >> 15);
_BX = 0;
_DX =page;
_AX = 0x4f05;
__int__(0x10);
return *(videoptr + (unsigned)(addr & 0xffff));
}
所以非常感谢斑竹的帮助
[此贴子已经被作者于2006-9-8 15:32:40编辑过]
原理是这样的,Jordan Hargraphix Software提供的BGI的getpixel函数的返回值实际上是32bit的,它将这个返回值放入了EAX寄存器,这也是C函数调用的通常做法,因此putpixel函数的正确的声明应该如下:
unsigned long far _Cdecl getpixel(int x, int y);
然而,在graphics.h中getpixel的函数原型为:
unsigned far _Cdecl getpixel(int x, int y);
其返回值是16bit的,所以编译器认为getpixel的返回值为16bit,并且放入了AX寄存器中。所以对于16bit色模式的返回值在TC2.0中是可以正常取得的,而对于24bit色和32bit色的颜色值,就只能取得其低16bit了,因为TC2.0中不支持EAX寄存器,并且graphics.h中getpixel函数声明的返回值也是16bit的。
在TC3.0种,可以访问EAX寄存器以下的写法对于16bit、24bit和32bit都是适用的:
DWORD color = 0;
getpixel(x, y);
color = _EAX;
[此贴子已经被作者于2006-9-8 15:33:24编辑过]
结论:
TC2.0下不能取得24bit色和32bit色的像素值,可以取得16bit色的像素值,方法如下:
WORD color = 0;
getpixel(x, y);
color = _AX; // 绝对能行
或者:
WORD color = 0;
color = getpixel(x, y); // 理论上能行,我没有测试过
TC3.0下能够取得16bit色、24bit色、32bit色的像素值,方法如下:
DWORD color = 0;
getpixel(x, y);
color = _EAX; // 绝对能行
或者:
改getpixel函数原型为:unsigned long far _Cdecl getpixel(int x, int y);
然后如下:
DWORD color = 0;
color = getpixel(x, y); // 理论上能行,我没有测试
[此贴子已经被作者于2006-9-8 15:34:05编辑过]
另外setrgbpalette可以用来设置颜色是对setcolor函数的功能扩充,如下:
#define SET_DRAW_COLOR 1024
#define SET_FILL_COLOR 1025
#define SET_PIXEL_COLOR 1026
setrgbpalette(SET_DRAW_COLOR, r, g ,b); // 设置画笔颜色
setrgbpalette(SET_FILL_COLOR, r, g ,b); // 设置填充颜色
setrgbpalette(SET_PIXEL_COLOR, r, g ,b); // 设置putpixel函数所使用的颜色
16bit色、24bit色和32bit色下的绘点方法:
setrgbpalette(SET_PIXEL_COLOR, r, g ,b);
putpixel(x, y, 0);
如有问题可以进一步参考Jordan Hargraphix Software BGI的相关文档,在上面讲的非常清楚。(不过这个原始版本的BGI很难搞到的,我这里有一份,可是没法给你;-)。
[此贴子已经被作者于2006-9-8 15:34:32编辑过]