织梦CMS - 轻松建站从此开始!

罗索

在UI实现渐进颜色处理(加入灯光效应)

罗索客 发布于 2009-12-25 22:45 点击:次 
采用差分处理,在起始颜色和终点颜色中插入一系列中间过渡颜色,让人眼产生错觉。当然这个算法实现起来比较简单,但是微软已经提供了GradientFill函数,不用自己去实现了,这个函数原型是(此函数博主验证过,可以直接使用)
TAG:

采用差分处理,在起始颜色和终点颜色中插入一系列中间过渡颜色,让人眼产生错觉。当然这个算法实现起来比较简单,但是微软已经提供了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);
 }

(罗索客)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/200912/8184.html]
本文出处:网络博客 作者:罗索客
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容