来看看,可能是Delphi VCL的Bug!请高手进来研讨分析(50分)

  • 主题发起人 主题发起人 NeutronDelphi
  • 开始时间 开始时间
N

NeutronDelphi

Unregistered / Unconfirmed
GUEST, unregistred user!
我曾经看到怎么用两种颜色渐变填充一矩形的代码。
在WinXP以前的操作系统中,窗口标题栏默认的颜色就是由两种颜色渐变填充的,我就想,肯定有一个API可以实现,
终于,我找到了,是GradientFill
声明如下:
The GradientFill function fills rectangle and triangle structures.
BOOL GradientFill(
HDC hdc, // handle to DC
PTRIVERTEX pVertex, // array of vertices
ULONG dwNumVertex, // number of vertices
PVOID pMesh, // array of gradients
ULONG dwNumMesh, // size of gradient array
ULONG dwMode // gradient fill mode
);
其中一个数据结构
The TRIVERTEX structure contains color information and position information.
typedef struct _TRIVERTEX {
LONG x;
Long y;
COLOR16 Red; //请注意这里COLOR16
COLOR16 Green;
COLOR16 Blue;
COLOR16 Alpha;
}TRIVERTEX, *PTRIVERTEX;
在Windows.pas 中是这样定义的

COLOR16 = Shortint;
奇怪了,COLOR16应该是16位两个字节才对,怎么会是一个介于-127-126的ShortInt呢?
在WinGDI.H(VC++7.1)中是这样定义的
#define COLOR16 USHORT
在VC++中USHORT是无符号16的整形,相当于WORD
MSDN中也提到COLOR16是介于0000H-FF00H的数值,
我想这到底是什么意思?

其实我初步认得不是Delphi的Bug,因为COLOR16占一个字节,那么Red,Blue,Green加起来
就是24位,可以表示24位颜色值,再加Alpha就是32位。
疑惑就在Red应该是0-255怎么会是-127-126呢?
 
有符号的-127~-1,转成无符号不就是127~255吗?
 
to BeginDelphi。
问题不在这里,难道你不明白吗?
要解决这个问题还不简单,最后是自己重新定义结构体
 
后退
顶部