跟我一起玩Win32开发(23):渐变颜色填充
GradientFill函数可以对特定的矩形区域或者三角形区域进行渐变颜色的填充。我们先来看看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,就说明六个点中的第二个,第五个和第六个点将组成一个三角形。
GRADIENT_RECT就更好理解了,两个点就可以确定一个矩形,即左上角的点,右下角的点,如果渐变点有四个,正好可以组成两个矩形。0和1,2和3.
下面的代码将画出两个矩形的填充区域。
- case WM_PAINT:
- hdc = BeginPaint(hWnd, &ps);
- // TODO: 在此添加任意绘图代码...
- TRIVERTEX trives[4];
- trives[0].x=10;
- trives[0].y=12;
- trives[0].Alpha=0xff00;
- trives[0].Red=0xe100;
- trives[0].Green=0x00cc;
- trives[0].Blue=0xa3c3;
- trives[1].x=188;
- trives[1].y=80;
- trives[1].Alpha=0xff00;
- trives[1].Red=0x00fa;
- trives[1].Green=0x0068;
- trives[1].Blue=46;
- trives[2].x=280;
- trives[2].y=190;
- trives[2].Alpha=0xff00;
- trives[2].Red=0x0004;
- trives[2].Green=0x0017;
- trives[2].Blue=0xff00;
- trives[3].x=500;
- trives[3].y=320;
- trives[3].Alpha=0xff00;
- trives[3].Red=0xfac0;
- trives[3].Green=0xcccc;
- trives[3].Blue=0xcef0;
- // 定义渐变区为矩形,并确定其点
- GRADIENT_RECT rects[2];
- rects[0].UpperLeft=0;
- rects[0].LowerRight=1;
- rects[1].UpperLeft =2;
- rects[1].LowerRight=3;
- GradientFill(hdc,trives,4,rects,2,GRADIENT_FILL_RECT_H);
- EndPaint(hWnd, &ps);
- break;
最后就得到如下图所示的效果。
好,下面我们看看三角形的。
- // 三角形
- GRADIENT_TRIANGLE triangles[2];
- triangles[0].Vertex1=2;
- triangles[0].Vertex2=0;
- triangles[0].Vertex3=3;
- triangles[1].Vertex1=3;
- triangles[1].Vertex2=1;
- triangles[1].Vertex3=0;
- // 矩形填充
- GradientFill(hdc,trives,4,rects,2,GRADIENT_FILL_RECT_V);
- // 三角形填充
- GradientFill(hdc,trives,4,triangles,2,GRADIENT_FILL_TRIANGLE);
我们用的还是前面填充矩形的四个点,那有人会问了,不对啊,四个怎么能弄出两个三角形呢,不是应该要六个点吗?是啊,是六个点,但是这个四个点是可以重复利用,现在都说要环保,所以循环利用,2-0-3组成一个三角形,3-1-0又组成一个三角形。反正就是一个排列组合,你只要每个三角形弄足三个点就行了。前面的矩形同样道理,你只要每个矩形弄够两个点就行了。这就很像WPF中使用的三角形建模的三维图形同理,点的集合我就定义这么多个,但是我在其中任取三个就可以组成一个“模型单元”。
与前面的代码合并执行,最后得到这种效果。
跟我一起玩Win32开发(23):渐变颜色填充的更多相关文章
- 跟我一起玩Win32开发(转自CSDN-东邪独孤)
跟我一起玩Win32开发(1):关于C++的几个要点 跟我一起玩Win32开发(2):完整的开发流程 跟我一起玩Win32开发(3):窗口的重绘 跟我一起玩Win32开发(4):创建菜单 跟我一起玩W ...
- 跟我一起玩Win32开发(17):启动和结束进程
这里我再次说明一下,我不知道为什么,现在的人那么喜欢走极端,估计是价值观都“升级”了的缘故吧. 我撰写这一系列Win32相关的文章,并不是叫大家一定要用Win32去开发项目,仅仅是给大家了解一下,Wi ...
- 跟我一起玩Win32开发(18):使用对话框的两个技巧
相信大家知道对话框怎么用了,就是先用“资源编辑器”设计一个对话框,然后在代码中加载处理.今天,我向大家分享两个使用对话框的技巧,还是比较实用的.不用担心,先喝杯茶,很简单的,一点也不复杂,总之,看俺写 ...
- 跟我一起玩Win32开发(19):浏览和打开文件
在应用程序中,我们很经常要实现的功能,是Open文件或保存文件对话框,让用户来选择一个或N个文件.本文我将介绍两种思路,第一种方法较为复杂,第二种方法较为简单. 方法一:老规矩 这是一种传统方法,使用 ...
- 跟我一起玩Win32开发(12):使用控件——单选按钮
今天,咱们还是接着玩“控件斗地主”,这是我原创的超级游戏,有益身心健康,玩一朝,十年少. 哦,对,脑细胞极速运动了一下,想起了一个问题,这个破问题虽然网上有很多种解决方案,但是,并没有让所有人都解决问 ...
- 跟我一起玩Win32开发(21):复制&粘贴&剪贴板操作
我要提醒一下大家,看了我的博文学到的知识,千万不要用于实际开发,不然你会被你的上司骂:“妈的,这些东西哪来的,从来没有人这样做过.”不信你试试,脑细胞被冻结的经理或者技术总监们肯定会这样说的. 如果是 ...
- 跟我一起玩Win32开发(4):创建菜单
也不知道发生什么事情,CSDN把我的文章弄到首页,结果有不少说我在误人子弟,是啊,我去年就说过了,如果你要成为砖家级人物,请远离我的博客,我这个人没什么特长,唯一厉害的一点就是不相信权威,鄙视砖家,所 ...
- 跟我一起玩Win32开发(2):完整的开发流程
上一篇中我给各位说了一般人认为C++中较为难的东西——指针.其实对于C++,难点当然不局限在指针这玩意儿上,还有一些有趣的概念,如模板类.虚基类.纯虚函数等,这些都是概念性的东西,几乎每一本C++书上 ...
- 跟我一起玩Win32开发(25):监视剪贴板
自从郭大侠和蓉儿离开桃花岛后,最近岛比较寂静,有一种“门前冷落鞍马稀”的感觉.于是,老邪就拿出<九阴真经>认真阅读,同时用迅雷下载经典大剧<汉武大帝>晚上睡觉前看上几集,老邪一 ...
随机推荐
- OpenStack源码系列---nova-compute
nova-compute运行的节点为计算节点,虚拟机运行于计算节点上.例如对于创建虚拟机请求,nova-api接收到客户端请求后,经过nova-scheduler调度器调度,再将请求发送给某个选定的n ...
- RC4算法的Python实现详注
刚对RC4算法进行了学习,网上发现https://ju.outofmemory.cn/entry/46753 中作者展示了RC4的python实现,但代码缺乏注释,较为晦涩,因此本文对部分代码进行了注 ...
- WEBGIS控制图层的显示
看别人搞的GIS应用,常常有勾选.取消某个图层的操作,然后地图上就有相应的图形显隐,觉得好酷. 咋实现的? 其实说起来好像也不是特别复杂.在WEB端,实现该功能的原理和步骤是: 1.WEB端加载地图服 ...
- 细数AutoLayout以来UIView和UIViewController新增的相关API
本文转载至 http://www.itjhwd.com/autolayout-uiview-uiviewcontroller-api/ 细数AutoLayout以来UIView和UIViewContr ...
- MRUnit测试
新建一个专门的测试类,代码如下: wordcount的map函数输入string line, 输出<单词 , 1> 右键-> run as junit 出错了,因为输出不是 ...
- 新手必备的SEO优化工具
- iOS 摇一摇功能的实现
在 UIResponder中存在这么一套方法 - (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event __OSX_A ...
- redis11----监控工具 sentinel
当master宕机了要把slave1变为master,并把slave2指向slave1. 可以运行时更改master-slave,config set/get,修改一台slave(设为A)为new m ...
- 如何用redis做到限制,一个手机号,1分钟内最多发一条,一天内最多10条
需要两个缓存 key名称 phone-busy,缓存1分钟 key名称 phone-send-count,缓存1天,每成功发送一条+1 发送的时候流程如下: 判断phone-busy是否存在,存在直接 ...
- Pyhton:List build-in function
列表是Python中的可迭代对象之一,在讲列表的内建函数之前我们可以自己在IDE上看看都有那些内建函数,我们可以在pycharm中使用代码及其运行结果如下: print(dir(list)) ['__ ...