Welcome

首页 / 软件开发 / C++ / Win32开发入门(23):渐变颜色填充

Win32开发入门(23):渐变颜色填充2013-06-06GradientFill函数可以对特定的矩形区域或者三角形区域进行渐变颜色的填充。我们先来看看GradientFill函数到底长得什么样子,帅不帅。

BOOL GradientFill(_In_HDC hdc,_In_PTRIVERTEX pVertex,_In_ULONG nVertex,_In_PVOID pMesh,_In_ULONG nMesh,_In_ULONG ulMode);
参数涉及结构体,于是有些人就开始感到痛苦了,调用函数一遇到结构体就会痛苦,而这个函数更痛苦,还要结构体的数组。

人家达摩祖师说了,痛苦是你的事,和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,就说明六个点中的第二个,第五个和第六个点将组成一个三角形。