采用差分处理,在起始颜色和终点颜色中插入一系列中间过渡颜色,让人眼产生错觉。当然这个算法实现起来比较简单,但是微软已经提供了GradientFill函数,不用自己去实现了,这个函数原型是(此函数博主验证过,可以直接使用):
GradientFill(
HDC hdc,
PTRIVERTEX pVertex,
ULONG nVertex, // 注意pVertex可以是一个数组,大小用nVertex表示
PVOID pMesh,
ULONG nCount, // 同上pMesh可以是一个数组,大小用nCount表示
ULONG ulMode // GRADIENT_FILL_RECT_H or GRADIENT_FILL_RECT_V
);
其中用到两个结构,
typedef struct _TRIVERTEX {
LONG x;
LONG y;
COLOR16 Red; // RGB分量值
COLOR16 Green;
COLOR16 Blue;
COLOR16 Alpha; // 没有用这个分量,
}TRIVERTEX,*PTRIVERTEX,*LPTRIVERTEX;
typedef struct _GRADIENT_RECT {
ULONG UpperLeft; // 这里的值是pVertex数组的下标。
ULONG LowerRight;
}GRADIENT_RECT, *PGRADIENT_RECT;
代码:
VOID DrawRainbow2(HWND hWnd)
{
HDC hdc;
RECT rect;
TRIVERTEX vert[2] ;
GRADIENT_RECT gRect;
hdc = GetDC(hWnd);
GetClientRect(hWnd, &rect);
vert [0] .x = rect.left;
vert [0] .y = rect.top;
vert [0] .Red = 0x0000;
vert [0] .Green = 0xFF00;
vert [0] .Blue = 0x0000;
vert [0] .Alpha = 0x0000;
vert [1] .x = rect.right;
vert [1] .y = rect.bottom;
vert [1] .Red = 0x0000;
vert [1] .Green = 0x0000;
vert [1] .Blue = 0xFF00;
vert [1] .Alpha = 0x0000;
gRect.UpperLeft = 0;
gRect.LowerRight = 1;
GradientFill(hdc,vert,2,&gRect,1,GRADIENT_FILL_RECT_H);
ReleaseDC(hWnd, hdc);
} 这里实现了一个水平从蓝色变到绿色的区域,其中TRIVERTEX数组大小为2,在结构GRADIENT_RECT中左上角就是TRIVERTEX数组第一个元素,右下角就是TRIVERTEX数组第二个元素。
花稍一点的:
VOID DrawRainbow2(HWND hWnd)
{
HDC hdc;
RECT rect;
TRIVERTEX vert[7] ;
GRADIENT_RECT gRect[4];
hdc = GetDC(hWnd);
GetClientRect(hWnd, &rect);
vert [0] .x = rect.left;
vert [0] .y = rect.top;
vert [0] .Red = 0x3100;
vert [0] .Green = 0x9A00;
vert [0] .Blue = 0xEF00;
vert [0] .Alpha = 0x0000;
vert [1] .x = rect.right;
vert [1] .y = 20;//rect.bottom/3;
vert [1] .Red = 0x0000;
vert [1] .Green = 0x4500;
vert [1] .Blue = 0x9C00;
vert [1] .Alpha = 0x0000;
vert [2] .x = rect.left;
vert [2] .y = rect.bottom/3;
vert [2] .Red = 0x0000;
vert [2] .Green = 0x0000;
vert [2] .Blue = 0x0000;
vert [2] .Alpha = 0x0000;
vert [3] .x = rect.right;
vert [3] .y = rect.bottom*2/3;
vert [3] .Red = 0x0000;
vert [3] .Green = 0xFF00;
vert [3] .Blue = 0x0000;
vert [3] .Alpha = 0x0000;
gRect[0].UpperLeft = 0;
gRect[0].LowerRight = 1;
gRect[1].UpperLeft = 2;
gRect[1].LowerRight = 3;
vert [4] .x = rect.left;
vert [4] .y = rect.bottom*2/3;
vert [4] .Red = 0x0000;
vert [4] .Green = 0x0000;
vert [4] .Blue = 0x0000;
vert [4] .Alpha = 0x0000;
vert [5] .x = rect.right/2;
vert [5] .y = rect.bottom*5/6;
vert [5] .Red = 0x0000;
vert [5] .Green = 0x0000;
vert [5] .Blue = 0xFF00;
vert [5] .Alpha = 0x0000;
vert [6] .x = rect.right;
vert [6] .y = rect.bottom;
vert [6] .Red = 0x0000;
vert [6] .Green = 0xFF00;
vert [6] .Blue = 0x0000;
vert [6] .Alpha = 0x0000;
gRect[2].UpperLeft = 4;
gRect[2].LowerRight = 5;
gRect[3].UpperLeft = 5;
gRect[3].LowerRight = 6;
GradientFill(hdc,vert,7,&gRect,4,GRADIENT_FILL_RECT_H);
ReleaseDC(hWnd, hdc);
}
(罗索客) |