颜色渐变API函数GradientFill的应用示例
在Windows API中有一个GradientFill函数,该函数为颜色渐变充填函数。一般情况下涉及颜色渐变处理时会调用Gdi+函数,但其实有些功能可以由Gdi中的GradientFill函数处理。GradientFill是一个基本函数,需要自己编写具体的充填函数,使用应用更加方便。本文介绍如何使用GradientFill函数充填三角形、矩形、柱形的方法,并利用该函数来绘制颜色渐变的水平线和垂直线。
1. GradientFill参数说明
GradientFill函数原型如下:
BOOL GradientFill(
[in] HDC hdc,
[in] PTRIVERTEX pVertex,
[in] ULONG nVertex,
[in] PVOID pMesh,
[in] ULONG nMesh,
[in] ULONG ulMode
);
函数参数如下:
(1) hdc=目标设备上下文的句柄。
(2) pVertex=TRIVERTEX结构数组的地址,每个结构定义一个顶点坐标与颜色。
(3) nVertex=pVertex中的顶点数目,即TRIVERTEX结构个数。
(4) pMesh=三角形模式下的GRADIENT_TRIANGLE结构数组,或矩形模式下的GRADIENT_RECT结构数组。
(5) nMesh=参数pMesh中的数组数目。
(6) ulMode=渐变填充模式。 此参数的取值可为下列值之一:
GRADIENT_FILL_RECT_H=0: 矩形水平方向渐变。在该模式下,两个端点表示一个矩形。该矩形被定义成左右边界具有固定颜色(由TRIVERTEX结构指定)。GDI从上至下插入颜色,并填充内部区域。
GRADIENT_FILL_RECT_V=1: 矩形垂直方向渐变。在该模式下,两个端点表示一个矩形。该矩形定义其顶部和底部边界的颜色为固定值(通过TRIVERTEX结构指定),GDI从顶至底部边界插入颜色,并填充内部区域。
GRADIENT_FILL_TRIANGLE=2: 三角形模式。在该模式下,TRIVERTEX结构数组以及描述单个三角形的数组索引序列被传给GDI。GDI在三角形顶点之间进行线性插值,并填充内部区域。在24和32位/像素模式下,绘图是直接进行。在16、8、4和1位/像素模式中进行抖动处理。
2. GDI颜色渐变充填函数
共有9个函数应用函数,分别说明如下:
(1)Gdi_SetTrivet: 设置TRIVERTEX结构中一个点的坐标及颜色参数。
(2)Gdi_GradientFillTri: 充填一个颜色渐变三角形。
(3)Gdi_GradientFillRect: 充填一个颜色渐变矩形。
(4)Gdi_GradientFillCylH: 充填一个颜色渐变圆柱矩形(水平方向)。
(5)Gdi_GradientFillCylV: 充填一个颜色渐变圆柱矩形(垂直方向)。
(6)Gdi_GradientFillFlatCylH: 充填一个颜色渐变扁圆柱矩形(水平方向)
(7)Gdi_GradientFillFlatCylV: 充填一个颜色渐变扁圆柱矩形(垂直方向)
(8)Gdi_GradientLineH: 绘制一条颜色渐变水平直线。
(9)Gdi_GradientLineV: 绘制一条颜色渐变垂直直线。
.code
;====================================================
;设置TRIVERTEX结构中一个点的坐标及颜色
;入: pTris=TRIVERTEX结构数组地址
; Idx=要设置的TRIVERTEX结构索引号(0...)
; x,y=点的坐标
; Argb=ARGB颜色
;====================================================
Gdi_SetTrivet proc pTris:QWORD,Idx:QWORD,x:QWORD,\
y:QWORD,Argb:QWORD
test rdx,rdx
jz ss_1
mov eax,SIZEOF TRIVERTEX
mul edx
mov rcx,pTris
add rcx,rax
ss_1:
mov [rcx.TRIVERTEX].x,r8d
mov [rcx.TRIVERTEX].y,r9d
mov rdx,Argb
mov al,dl
shl ax,8
mov [rcx.TRIVERTEX].Blue,ax
shr edx,8
mov al,dl
shl ax,8
mov [rcx.TRIVERTEX].Green,ax
shr edx,8
mov al,dl
shl ax,8
mov [rcx.TRIVERTEX].Red,ax
shr edx,8
mov al,dl
shl ax,8
mov [rcx.TRIVERTEX].Alpha,ax
ret
Gdi_SetTrivet endp
;======================================================
;充填一个颜色渐变三角形
;入: hdc=DC句柄
; x1,y1=三角形顶点1的坐标
; x2,y2=三角形顶点2的坐标
; x3,y3=三角形顶点3的坐标
; Argb1=顶点1的的RGB颜色
; Argb2=顶点2的的RGB颜色
; Argb3=顶点3的的RGB颜色
;--------------------------------------------------
;invoke Gdi_GradientFillTri,hdc,160,10,10,160,310,160,\
; 0ff8000h,900090h,900090h
;======================================================
Gdi_GradientFillTri proc hdc:QWORD,x1:QWORD,y1:QWORD,\
x2:QWORD,y2:QWORD,x3:QWORD,y3:QWORD,\
Argb1:QWORD,Argb2:QWORD,Argb3:QWORD
LOCAL ss_ptinfo[3]:TRIVERTEX
LOCAL ss_PtIdx:GRADIENT_TRIANGLE
invoke Gdi_SetTrivet,ADDR ss_ptinfo,0,x1,y1,Argb1
invoke Gdi_SetTrivet,ADDR ss_ptinfo,1,x2,y2,Argb2
invoke Gdi_SetTrivet,ADDR ss_ptinfo,2,x3,y3,Argb3
mov ss_PtIdx.Vertex1,0
mov ss_PtIdx.Vertex2,1
mov ss_PtIdx.Vertex3,2
invoke GradientFill,hdc,ADDR ss_ptinfo,3,ADDR ss_PtIdx,1,GRADIENT_FILL_TRIANGLE
ret
Gdi_GradientFillTri endp
;==========================================================
;充填一个颜色渐变矩形
;入: hdc=DC句柄
; pRc=RECT结构地址。包含矩形的起止坐标
; Argb1=矩形起始边的RGB颜色
; Argb2=矩形终止边的RGB颜色
; ulMode=充填模式:
; GRADIENT_FILL_RECT_H=0: 水平方向渐变。
; GRADIENT_FILL_RECT_V=1: 垂直方向渐变。
;---------------------------------------------------
;invoke Gdi_GradientFillRect,hdc,ADDR rc,0ffh,0ff0000h,0
;==========================================================
Gdi_GradientFillRect proc hdc:QWORD,pRc:QWORD,Argb1:QWORD,\
Argb2:QWORD,ulMode:QWORD
LOCAL ss_ptinfo[2]:TRIVERTEX
LOCAL ss_PtIdx:GRADIENT_RECT
;---设置左上角点信息---
mov r8d,[rdx.RECT].left
mov r9d,[rdx.RECT].top
invoke Gdi_SetTrivet,ADDR ss_ptinfo,0,r8,r9,Argb1
;---设置右下角点信息---
mov rdx,pRc
mov r8d,[rdx.RECT].right
mov r9d,[rdx.RECT].bottom
invoke Gdi_SetTrivet,ADDR ss_ptinfo,1,r8,r9,Argb2
;---填写方向---
mov ss_PtIdx.UpperLeft,0 ;左上角TRIVERTEX结构索引
mov ss_PtIdx.LowerRight,1 ;右下角TRIVERTEX结构索引
;---充填---
invoke GradientFill,hdc,ADDR ss_ptinfo, 2,ADDR ss_PtIdx,1,ulMode
ret
Gdi_GradientFillRect endp
;==========================================================
;充填一个颜色渐变圆柱矩形---水平方向
;入: hdc=DC句柄
; pRc=RECT结构地址。包含矩形的起止坐标
; Argb1=矩形两边的ARGB颜色
; Argb2=矩形中间的ARGB颜色
; Percent=中心距左边的百分比(0-100)
; >100: 向右扩展矩形,前产生折线。
;==========================================================
Gdi_GradientFillCylH proc hdc:QWORD,pRc:QWORD,Argb1:QWORD,\
Argb2:QWORD,Percent:QWORD
LOCAL ss_ptinfo[4]:TRIVERTEX
LOCAL ss_PtIdx[2]:GRADIENT_RECT
LOCAL ss_xm:QWORD
;---计算中间坐标---
mov eax,[rdx.RECT].right
sub eax,[rdx.RECT].left
mov rcx,Percent
imul ecx
mov ecx,100
idiv ecx
mov rdx,pRc
add eax,[rdx.RECT].left
mov ss_xm,rax
;---设置第1个矩形左上角信息---
mov r8d,[rdx.RECT].left
mov r9d,[rdx.RECT].top
invoke Gdi_SetTrivet,ADDR ss_ptinfo,0,r8,r9,Argb1
;---设置第1个矩形右下角信息---
mov rdx,pRc
mov r9d,[rdx.RECT].bottom
invoke Gdi_SetTrivet,ADDR ss_ptinfo,1,ss_xm,r9,Argb2
;---设置第2个矩形左上角信息---
mov rdx,pRc
mov r9d,[rdx.RECT].top
invoke Gdi_SetTrivet,ADDR ss_ptinfo,2,ss_xm,r9,Argb2
;---设置第2个矩形右下角信息---
mov rdx,pRc
mov r8d,[rdx.RECT].right
mov r9d,[rdx.RECT].bottom
invoke Gdi_SetTrivet,ADDR ss_ptinfo,3,r8,r9,Argb1
;---填写索引---
mov ss_PtIdx.UpperLeft,0
mov ss_PtIdx.LowerRight,1
mov ss_PtIdx.UpperLeft[SIZEOF GRADIENT_RECT],2
mov ss_PtIdx.LowerRight[SIZEOF GRADIENT_RECT],3
;---充填---
invoke GradientFill,hdc,ADDR ss_ptinfo,4,ADDR ss_PtIdx,2,GRADIENT_FILL_RECT_H
ret
Gdi_GradientFillCylH endp
;==========================================================
;充填一个颜色渐变圆柱矩形---垂直方向
;入: hdc=DC句柄
; pRc=RECT结构地址。包含矩形的起止坐标
; Argb1=矩形两边的ARGB颜色
; Argb2=矩形中间的ARGB颜色
; Percent=中心距左边的百分比(0-100)
; >100: 向右扩展矩形,前产生折线。
;==========================================================
Gdi_GradientFillCylV proc hdc:QWORD,pRc:QWORD,Argb1:QWORD,\
Argb2:QWORD,Percent:QWORD
LOCAL ss_ptinfo[4]:TRIVERTEX
LOCAL ss_PtIdx[2]:GRADIENT_RECT
LOCAL ss_ym:QWORD
;---计算中间坐标---
mov eax,[rdx.RECT].bottom
sub eax,[rdx.RECT].top
mov rcx,Percent
imul ecx
mov ecx,100
idiv ecx
mov rdx,pRc
add eax,[rdx.RECT].top
mov ss_ym,rax
;---设置第1个矩形左上角信息---
mov r8d,[rdx.RECT].left
mov r9d,[rdx.RECT].top
invoke Gdi_SetTrivet,ADDR ss_ptinfo,0,r8,r9,Argb1
;---设置第1个矩形右下角信息---
mov rdx,pRc
mov r8d,[rdx.RECT].right
invoke Gdi_SetTrivet,ADDR ss_ptinfo,1,r8,ss_ym,Argb2
;---设置第2个矩形左上角信息---
mov rdx,pRc
mov r8d,[rdx.RECT].left
invoke Gdi_SetTrivet,ADDR ss_ptinfo,2,r8,ss_ym,Argb2
;---设置第2个矩形右下角信息---
mov rdx,pRc
mov r8d,[rdx.RECT].right
mov r9d,[rdx.RECT].bottom
invoke Gdi_SetTrivet,ADDR ss_ptinfo,3,r8,r9,Argb1
;---填写索引---
mov ss_PtIdx.UpperLeft,0
mov ss_PtIdx.LowerRight,1
mov ss_PtIdx.UpperLeft[SIZEOF GRADIENT_RECT],2
mov ss_PtIdx.LowerRight[SIZEOF GRADIENT_RECT],3
;---充填---
invoke GradientFill,hdc,ADDR ss_ptinfo,4,ADDR ss_PtIdx,2,GRADIENT_FILL_RECT_V
ret
Gdi_GradientFillCylV endp
;==============================================================
;充填一个颜色渐变扁圆柱矩形---水平方向
;入: hdc=DC句柄
; pRc=RECT结构地址。包含矩形的起止坐标
; Argb1=矩形两边的ARGB颜色
; Argb2=矩形中间的ARGB颜色
; Percent1=第1转换点距左边的百分比(0-100)
; Percent2=第2转换点距左边的百分比(0-100)
;---------------------------------------------------
;invoke Gdi_GradientFillFlatCylH,hdc,pRc,08080h,0d0d0h,40,60
;==============================================================
Gdi_GradientFillFlatCylH proc hdc:QWORD,pRc:QWORD,Argb1:QWORD,\
Argb2:QWORD,Percent1:QWORD,Percent2:QWORD
LOCAL ss_rbx:QWORD
LOCAL ss_ptinfo[6]:TRIVERTEX
LOCAL ss_PtIdx[3]:GRADIENT_RECT
LOCAL ss_xm1:QWORD
LOCAL ss_xm2:QWORD
mov ss_rbx,rbx
mov rbx,rdx
;---计算中间坐标1---
mov eax,[rbx.RECT].right
sub eax,[rbx.RECT].left
mov rcx,Percent1
imul ecx
mov ecx,100
idiv ecx
add eax,[rbx.RECT].left
mov ss_xm1,rax
;---计算中间坐标2---
mov eax,[rbx.RECT].right
sub eax,[rbx.RECT].left
mov rcx,Percent2
imul ecx
mov ecx,100
idiv ecx
add eax,[rbx.RECT].left
mov ss_xm2,rax
;---设置第1个矩形左上角信息---
mov r8d,[rbx.RECT].left
mov r9d,[rbx.RECT].top
invoke Gdi_SetTrivet,ADDR ss_ptinfo,0,r8,r9,Argb1
;---设置第1个矩形右下角信息---
mov r9d,[rbx.RECT].bottom
invoke Gdi_SetTrivet,ADDR ss_ptinfo,1,ss_xm1,r9,Argb2
;---设置第2个矩形左上角信息---
mov r9d,[rbx.RECT].top
invoke Gdi_SetTrivet,ADDR ss_ptinfo,2,ss_xm1,r9,Argb2
;---设置第2个矩形右下角信息---
mov r9d,[rbx.RECT].bottom
invoke Gdi_SetTrivet,ADDR ss_ptinfo,3,ss_xm2,r9,Argb2
;---设置第3个矩形左上角信息---
mov r9d,[rbx.RECT].top
invoke Gdi_SetTrivet,ADDR ss_ptinfo,4,ss_xm2,r9,Argb2
;---设置第3个矩形右下角信息---
mov r8d,[rbx.RECT].right
mov r9d,[rbx.RECT].bottom
invoke Gdi_SetTrivet,ADDR ss_ptinfo,5,r8,r9,Argb1
;---填写索引---
mov ss_PtIdx.UpperLeft,0
mov ss_PtIdx.LowerRight,1
mov ss_PtIdx.UpperLeft[SIZEOF GRADIENT_RECT],2
mov ss_PtIdx.LowerRight[SIZEOF GRADIENT_RECT],3
mov ss_PtIdx.UpperLeft[SIZEOF GRADIENT_RECT*2],4
mov ss_PtIdx.LowerRight[SIZEOF GRADIENT_RECT*2],5
;---充填---
invoke GradientFill,hdc,ADDR ss_ptinfo,6,ADDR ss_PtIdx,3,GRADIENT_FILL_RECT_H
mov rbx,ss_rbx
ret
Gdi_GradientFillFlatCylH endp
;==============================================================
;充填一个颜色渐变扁圆柱矩形---垂直方向
;入: hdc=DC句柄
; pRc=RECT结构地址。包含矩形的起止坐标
; Argb1=矩形两边的ARGB颜色
; Argb2=矩形中间的ARGB颜色
; Percent1=第1转换点距上边的百分比(0-100)
; Percent2=第2转换点距上边的百分比(0-100)
;---------------------------------------------------
;invoke Gdi_GradientFillFlatCylV,hdc,pRc,08080h,0d0d0h,40,60
;==============================================================
Gdi_GradientFillFlatCylV proc hdc:QWORD,pRc:QWORD,Argb1:QWORD,\
Argb2:QWORD,Percent1:QWORD,Percent2:QWORD
LOCAL ss_rbx:QWORD
LOCAL ss_ptinfo[6]:TRIVERTEX
LOCAL ss_PtIdx[3]:GRADIENT_RECT
LOCAL ss_ym1:QWORD
LOCAL ss_ym2:QWORD
mov ss_rbx,rbx
mov rbx,rdx
;---计算中间坐标1---
mov eax,[rbx.RECT].bottom
sub eax,[rbx.RECT].top
mov rcx,Percent1
imul ecx
mov ecx,100
idiv ecx
add eax,[rbx.RECT].top
mov ss_ym1,rax
;---计算中间坐标2---
mov eax,[rbx.RECT].bottom
sub eax,[rbx.RECT].top
mov rcx,Percent2
imul ecx
mov ecx,100
idiv ecx
add eax,[rbx.RECT].top
mov ss_ym2,rax
;---设置第1个矩形左上角信息---
mov r8d,[rbx.RECT].left
mov r9d,[rbx.RECT].top
invoke Gdi_SetTrivet,ADDR ss_ptinfo,0,r8,r9,Argb1
;---设置第1个矩形右下角信息---
mov r8d,[rbx.RECT].right
invoke Gdi_SetTrivet,ADDR ss_ptinfo,1,r8,ss_ym1,Argb2
;---设置第2个矩形左上角信息---
mov r8d,[rbx.RECT].left
invoke Gdi_SetTrivet,ADDR ss_ptinfo,2,r8,ss_ym1,Argb2
;---设置第2个矩形右下角信息---
mov r8d,[rbx.RECT].right
invoke Gdi_SetTrivet,ADDR ss_ptinfo,3,r8,ss_ym2,Argb2
;---设置第3个矩形左上角信息---
mov r8d,[rbx.RECT].left
invoke Gdi_SetTrivet,ADDR ss_ptinfo,4,r8,ss_ym2,Argb2
;---设置第3个矩形右下角信息---
mov r8d,[rbx.RECT].right
mov r9d,[rbx.RECT].bottom
invoke Gdi_SetTrivet,ADDR ss_ptinfo,5,r8,r9,Argb1
;---填写索引---
mov ss_PtIdx.UpperLeft,0
mov ss_PtIdx.LowerRight,1
mov ss_PtIdx.UpperLeft[SIZEOF GRADIENT_RECT],2
mov ss_PtIdx.LowerRight[SIZEOF GRADIENT_RECT],3
mov ss_PtIdx.UpperLeft[SIZEOF GRADIENT_RECT*2],4
mov ss_PtIdx.LowerRight[SIZEOF GRADIENT_RECT*2],5
;---充填---
invoke GradientFill,hdc,ADDR ss_ptinfo,6,ADDR ss_PtIdx,3,GRADIENT_FILL_RECT_V
mov rbx,ss_rbx
ret
Gdi_GradientFillFlatCylV endp
;==========================================================
;绘制一条颜色渐变水平直线
;入: hdc=DC句柄
; x,y=线段起始坐标
; wt=线段长度
; lnwt=线宽度(0: 默认为1)。线宽>1时居中绘制
; Argb1=矩形起始边的RGB颜色
; Argb2=矩形终止边的RGB颜色
;---------------------------------------------------
;invoke Gdi_GradientLineH,hdc,10,10,200,0,0ffh,0ff0000h
;==========================================================
Gdi_GradientLineH proc hdc:QWORD,x:QWORD,y:QWORD,wt:QWORD,\
lnwt:QWORD,Argb1:QWORD,Argb2:QWORD
LOCAL ss_ptinfo[2]:TRIVERTEX
LOCAL ss_PtIdx:GRADIENT_RECT
;---设置左上角点信息---
mov rax,lnwt
sar rax,1
sub y,rax ;居中
invoke Gdi_SetTrivet,ADDR ss_ptinfo,0,x,y,Argb1
;---设置右下角点信息---
mov r8,x
add r8,wt
mov r9,y
mov rax,lnwt
test rax,rax
jnz ss_1
mov rax,1
ss_1:
add r9,rax
invoke Gdi_SetTrivet,ADDR ss_ptinfo,1,r8,r9,Argb2
;---填写方向---
mov ss_PtIdx.UpperLeft,0 ;左上角TRIVERTEX结构索引
mov ss_PtIdx.LowerRight,1 ;右下角TRIVERTEX结构索引
;---充填---
invoke GradientFill,hdc,ADDR ss_ptinfo, 2,ADDR ss_PtIdx,1,GRADIENT_FILL_RECT_H
ret
Gdi_GradientLineH endp
;==========================================================
;绘制一条颜色渐变垂直直线
;入: hdc=DC句柄
; x,y=线段起始坐标
; ht=线段高度
; lnwt=线宽度(0: 默认为1)。线宽>1时居中绘制
; Argb1=矩形起始边的RGB颜色
; Argb2=矩形终止边的RGB颜色
;---------------------------------------------------
;invoke Gdi_GradientLineV,hdc,10,10,200,0,0ffh,0ff0000h
;==========================================================
Gdi_GradientLineV proc hdc:QWORD,x:QWORD,y:QWORD,ht:QWORD,\
lnwt:QWORD,Argb1:QWORD,Argb2:QWORD
LOCAL ss_ptinfo[2]:TRIVERTEX
LOCAL ss_PtIdx:GRADIENT_RECT
;---设置左上角点信息---
mov rax,lnwt
sar rax,1
sub x,rax ;居中
invoke Gdi_SetTrivet,ADDR ss_ptinfo,0,x,y,Argb1
;---设置右下角点信息---
mov r8,x
mov rax,lnwt
test rax,rax
jnz ss_1
mov rax,1
ss_1:
add r8,rax
mov r9,y
add r9,ht
invoke Gdi_SetTrivet,ADDR ss_ptinfo,1,r8,r9,Argb2
;---填写方向---
mov ss_PtIdx.UpperLeft,0 ;左上角TRIVERTEX结构索引
mov ss_PtIdx.LowerRight,1 ;右下角TRIVERTEX结构索引
;---充填---
invoke GradientFill,hdc,ADDR ss_ptinfo, 2,ADDR ss_PtIdx,1,GRADIENT_FILL_RECT_V
ret
Gdi_GradientLineV endp
3. 测试
下面是一个测试函数,该函数绘制一个三角形,六个矩形、一条水平线和一条垂直线。
;======================================================
;颜色渐变测试函数
;入: hdc=DC句柄
;======================================================
Gdi_Gradient proc hdc:QWORD
LOCAL ss_rc:RECT
;---充填颜色渐变三角形---
invoke Gdi_GradientFillTri,hdc,160,10,10,160,310,160,0ff8000h,900090h,900090h
;---充填颜色渐变矩形---
invoke SetRect,ADDR ss_rc,26,180,300,230
invoke Gdi_GradientFillRect,hdc,ADDR ss_rc,0ffh,0ff0000h,0
add ss_rc.top,70
add ss_rc.bottom,70
invoke Gdi_GradientFillRect,hdc,ADDR ss_rc,0ffh,0ff0000h,1
;---水平方向充填颜色渐变矩形(圆柱效果)---
invoke SetRect,ADDR ss_rc,320,50,600,100
invoke Gdi_GradientFillCylH,hdc,ADDR ss_rc,0ffh,0ff0000h,50
;---垂直方向充填颜色渐变矩形(圆柱效果)---
add ss_rc.top,70
add ss_rc.bottom,70
invoke Gdi_GradientFillCylV,hdc,ADDR ss_rc,0ffh,0ff0000h,50
;---水平方向充填颜色渐变矩形(扁圆柱效果)---
add ss_rc.top,70
add ss_rc.bottom,70
; invoke Gdi_GradientFillFlatCylH,hdc,ADDR ss_rc,08080h,0d0d0h,40,60
invoke Gdi_GradientFillFlatCylH,hdc,ADDR ss_rc,0ffh,0ff0000h,30,70
;---垂直方向充填颜色渐变矩形(扁圆柱效果)---
add ss_rc.top,70
add ss_rc.bottom,70
; invoke Gdi_GradientFillFlatCylV,hdc,ADDR ss_rc,08080h,0d0d0h,40,60
invoke Gdi_GradientFillFlatCylV,hdc,ADDR ss_rc,0ffh,0ff0000h,40,60
;---水平线和垂直线---
mov r8d,ss_rc.bottom
add r8d,20
invoke Gdi_GradientLineH,hdc,10,r8d,300,0,0ffh,0ff0000h ;水平线
invoke Gdi_GradientLineV,hdc,315,10,300,0,0ffh,0ff0000h ;垂直线
ret
Gdi_Gradient endp
效果图如下: