渐变颜色填充

2024-09-08 08:38
文章标签 填充 颜色 渐变

本文主要是介绍渐变颜色填充,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

GradientFill函数可以对特定的矩形区域或者三角形区域进行渐变颜色的填充。我们先来看看GradientFill函数到底长得什么样子,帅不帅。

[cpp]  view plain copy print ?
  1. BOOL GradientFill(  
  2.   _In_  HDC hdc,  
  3.   _In_  PTRIVERTEX pVertex,  
  4.   _In_  ULONG nVertex,  
  5.   _In_  PVOID pMesh,  
  6.   _In_  ULONG nMesh,  
  7.   _In_  ULONG ulMode  
  8. );  

参数涉及结构体,于是有些人就开始感到痛苦了,调用函数一遇到结构体就会痛苦,而这个函数更痛苦,还要结构体的数组。

人家达摩祖师说了,痛苦是你的事,和API无关,它又不会因为你痛苦就变得简单易用,该简单的就简单,该复杂的还是那么复杂。我们来分析一个吧。首先第一个hdc就不用我说了,就是某个上下文,这个上下文你就理解为和谁有关,就是谁的句柄,句柄是一种资源标识,以前说过了,就好比身份证号码可以唯一标识你的身份一般(假身份证除外)。所以,这个hdc就是决定你要把渐变颜色画到哪里,画到窗口上就是窗口的HDC,画到桌面上就是桌面的HDC。

第二个参数,注意,是TRIVERTEX结构体的数组,数组中每一个TRIVERTEX结构体的变量指定一个渐变点的坐标和颜色,颜色是ARGB四通道的,也就是说你可以玩透明效果,A,R,G,B每个值的范围,MSDN上有说明是The color information of each channel is specified as a value from 0x0000 to 0xff00,这个范围用十进制表示到底是多少,自己打开“计算器”算一下就知道了,Win7以后的计算器程序严重强大,用来算命都可以,更别说进制换算了。

如果你写C++程序多了,你就会猜到第三个参数是什么了,凡是涉及到传数组作为参数的,后面肯定要带一个参数指明数组中有多少个元素。因为C语言的数组与托管语言不同,其实它是善变的,你定义了int a[3] ....,然后你赋值的时候,赋到a[5]都可以,虽然会报错,但是你不妨试试,即使报错,但是仍然可以取到值,因为内存分布是连续的。

不用说,nVertex 就是指明前面pVertex的个数;后面一个pMesh又是一个结构体的数组,但它是“雄雌同体”的,可以是GRADIENT_TRIANGLE结构体的数组,也可以是GRADIENT_RECT结构体的数组,具体得看你想怎么填充,从名字就知道,GRADIENT_TRIANGLE是三角形填充,就是填充出来的区域是三角形的,这个应该好理解,就是你的内裤的形状;而GRADIENT_RECT更好理解了,矩形,就是小学老师教你的长方形,正方形。

接着这个nMesh 参数你肯定知道了,不解释了,你懂的。

最后一个参数就是指定怎么填充,无非就是水平填过去,还是垂直填下来之类的。

 

那么,TRIVERTEX数组与GRADIENT_RECT或GRADIENT_TRIANGLE数组是如何对应的呢?

GRADIENT_TRIANGLE是定义三角形的,要确定一个三角形就得要三个点,所以这些点就从TRIVERTEX数组来,每个TRIVERTEX变量定义一个点。

比如,TRIVERTEX数组有六个元素,就有六个点,刚好可以定义两个三角形,GRADIENT_TRIANGLE中的三个成员就是三角形三个点的索引,这些索引就是TRIVERTEX数组中的元素的索引,六个点,索引是0,1,2,3,4,5,接着,如果第一个GRADIENT_TRIANGLE中的三个成员分别设为0,1,2,则六个点中前三个点就定义了第一个三角形,如果第二个GRADIENT_TRIANGLE的三个成员设置为3,4,5,那么,六个点中的后三个点组成一个三角形。如果是1,4,5,就说明六个点中的第二个,第五个和第六个点将组成一个三角形。

GRADIENT_RECT就更好理解了,两个点就可以确定一个矩形,即左上角的点,右下角的点,如果渐变点有四个,正好可以组成两个矩形。0和1,2和3.

 

下面的代码将画出两个矩形的填充区域。

[cpp]  view plain copy print ?
  1. case WM_PAINT:  
  2.     hdc = BeginPaint(hWnd, &ps);  
  3.     // TODO: 在此添加任意绘图代码...  
  4.     TRIVERTEX trives[4];  
  5.     trives[0].x=10;  
  6.     trives[0].y=12;  
  7.     trives[0].Alpha=0xff00;  
  8.     trives[0].Red=0xe100;  
  9.     trives[0].Green=0x00cc;  
  10.     trives[0].Blue=0xa3c3;  
  11.     trives[1].x=188;  
  12.     trives[1].y=80;  
  13.     trives[1].Alpha=0xff00;  
  14.     trives[1].Red=0x00fa;  
  15.     trives[1].Green=0x0068;  
  16.     trives[1].Blue=46;  
  17.     trives[2].x=280;  
  18.     trives[2].y=190;  
  19.     trives[2].Alpha=0xff00;  
  20.     trives[2].Red=0x0004;  
  21.     trives[2].Green=0x0017;  
  22.     trives[2].Blue=0xff00;  
  23.     trives[3].x=500;  
  24.     trives[3].y=320;  
  25.     trives[3].Alpha=0xff00;  
  26.     trives[3].Red=0xfac0;  
  27.     trives[3].Green=0xcccc;  
  28.     trives[3].Blue=0xcef0;  
  29.   
  30.     // 定义渐变区为矩形,并确定其点  
  31.     GRADIENT_RECT rects[2];  
  32.     rects[0].UpperLeft=0;  
  33.     rects[0].LowerRight=1;  
  34.     rects[1].UpperLeft =2;  
  35.     rects[1].LowerRight=3;  
  36.   
  37.     GradientFill(hdc,trives,4,rects,2,GRADIENT_FILL_RECT_H);  
  38.   
  39.     EndPaint(hWnd, &ps);  
  40.     break;  

最后就得到如下图所示的效果。


好,下面我们看看三角形的。

[cpp]  view plain copy print ?
  1. // 三角形  
  2. GRADIENT_TRIANGLE triangles[2];  
  3. triangles[0].Vertex1=2;  
  4. triangles[0].Vertex2=0;  
  5. triangles[0].Vertex3=3;  
  6. triangles[1].Vertex1=3;  
  7. triangles[1].Vertex2=1;  
  8. triangles[1].Vertex3=0;  
  9.   
  10. // 矩形填充  
  11. GradientFill(hdc,trives,4,rects,2,GRADIENT_FILL_RECT_V);  
  12. // 三角形填充  
  13. GradientFill(hdc,trives,4,triangles,2,GRADIENT_FILL_TRIANGLE);  

我们用的还是前面填充矩形的四个点,那有人会问了,不对啊,四个怎么能弄出两个三角形呢,不是应该要六个点吗?是啊,是六个点,但是这个四个点是可以重复利用,现在都说要环保,所以循环利用,2-0-3组成一个三角形,3-1-0又组成一个三角形。反正就是一个排列组合,你只要每个三角形弄足三个点就行了。前面的矩形同样道理,你只要每个矩形弄够两个点就行了。这就很像WPF中使用的三角形建模的三维图形同理,点的集合我就定义这么多个,但是我在其中任取三个就可以组成一个“模型单元”。

与前面的代码合并执行,最后得到这种效果。


 


这篇关于渐变颜色填充的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1147638

相关文章

在Linux中改变echo输出颜色的实现方法

《在Linux中改变echo输出颜色的实现方法》在Linux系统的命令行环境下,为了使输出信息更加清晰、突出,便于用户快速识别和区分不同类型的信息,常常需要改变echo命令的输出颜色,所以本文给大家介... 目python录在linux中改变echo输出颜色的方法技术背景实现步骤使用ANSI转义码使用tpu

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

苹果macOS 26 Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色

《苹果macOS26Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色》在整体系统设计方面,macOS26采用了全新的玻璃质感视觉风格,应用于Dock栏、应用图标以及桌面小部件等多个界面... 科技媒体 MACRumors 昨日(6 月 13 日)发布博文,报道称在 macOS 26 Tahoe 中

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

使用Python实现获取屏幕像素颜色值

《使用Python实现获取屏幕像素颜色值》这篇文章主要为大家详细介绍了如何使用Python实现获取屏幕像素颜色值,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、一个小工具,按住F10键,颜色值会跟着显示。完整代码import tkinter as tkimport pyau

pandas中位数填充空值的实现示例

《pandas中位数填充空值的实现示例》中位数填充是一种简单而有效的方法,用于填充数据集中缺失的值,本文就来介绍一下pandas中位数填充空值的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是中位数填充?为什么选择中位数填充?示例数据结果分析完整代码总结在数据分析和机器学习过程中,处理缺失数

使用Pandas进行均值填充的实现

《使用Pandas进行均值填充的实现》缺失数据(NaN值)是一个常见的问题,我们可以通过多种方法来处理缺失数据,其中一种常用的方法是均值填充,本文主要介绍了使用Pandas进行均值填充的实现,感兴趣的... 目录什么是均值填充?为什么选择均值填充?均值填充的步骤实际代码示例总结在数据分析和处理过程中,缺失数

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

SpringBoot自定义注解如何解决公共字段填充问题

《SpringBoot自定义注解如何解决公共字段填充问题》本文介绍了在系统开发中,如何使用AOP切面编程实现公共字段自动填充的功能,从而简化代码,通过自定义注解和切面类,可以统一处理创建时间和修改时间... 目录1.1 问题分析1.2 实现思路1.3 代码开发1.3.1 步骤一1.3.2 步骤二1.3.3