20240830-GradientFill函数的应用示例

颜色渐变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

效果图如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值