跟我一起玩Win32开发(7):多边形窗口
通常情况下,窗口都是一个矩形,不过,调用下面这个函数,可以自定义窗口的形状。
- int SetWindowRgn(
- __in HWND hWnd,
- __in HRGN hRgn,
- __in BOOL bRedraw
- );
第一个参数是窗口的句柄,第二个参数也是一个句柄——HRGN,一个多边形的区域,可以用CreatePolygonRgn函数来创建。第三个参数指定函数调用成功后是否重画窗口,如果窗口还没有显示,就不必了,如果窗口已经显示,可以考虑设为TRUE。
我们创建用于显示窗口形状的区域句柄HRGN可以不显示用DeleteObject函数删除,因为MSDN上面有这么一句话:In particular, do not delete this region handle. The system deletes the region handle when it no longer needed.
OK,理论知识准备好了,下面就趁温暖打铁,实战一下吧。
接下来我们要做出这个模样的窗口。
由于这个形状是固定的,只需要设置一次即可,所以,我不打算在处理WM_PAINT消息的时候来设置多边形区域,改为在CreateWindow成功后就设置,设置之后再ShowWindow。
- WNDCLASS wc = {};
- wc.lpszClassName = L"MyApp";
- wc.hbrBackground = CreateSolidBrush(RGB(254, 239, 180));
- wc.lpfnWndProc = WindowProc;
- wc.hInstance = hThisApp;
- wc.style = CS_HREDRAW | CS_VREDRAW;
- wc.hCursor = LoadCursor(hThisApp, IDC_ARROW);
- RegisterClass(&wc);
- HWND hwnd = CreateWindow(L"MyApp",
- L"我的应用",
- WS_POPUP,
- 300,140,400,400,
- NULL,NULL,hThisApp,NULL);
- if(hwnd == NULL)
- return -1;
- POINT pts[5] =
- {
- { 200, 0},
- { 0, 160 },
- { 120, 400 },
- { 285, 400 },
- { 400, 160 }
- };
- HRGN rgn = CreatePolygonRgn(pts, 5, WINDING);
- SetWindowRgn(hwnd, rgn, FALSE);
- //DeleteObject(rgn);
- ShowWindow(hwnd,nShow);
- //UpdateWindow(hwnd);
为了去掉标题栏和边框,我在CreateWindow的时候,使用WS_POPUP。
不过,这窗口好像有点单调,于是,我想着能画些什么东西在上面,故也处理了WM_PAINT消息。
- case WM_PAINT:
- {
- PAINTSTRUCT ps;
- BeginPaint(hwnd, &ps);
- //创建红色的pen
- HPEN pen= CreatePen(PS_DASHDOTDOT, 1, RGB(255,0,0));
- //把pen选择到设备上下文
- auto orgObj = SelectObject(ps.hdc, pen);
- //第一部分
- POINT lnpts1[5] =
- {
- {200,50}, {180,360}, {220, 360}, {60,120}, {340,120}
- };
- BYTE bts1[5] = {PT_MOVETO, PT_LINETO, PT_LINETO, PT_MOVETO, PT_LINETO };
- PolyDraw(ps.hdc,lnpts1,bts1,5);
- // 第二部分
- POINT lnpts2[2] = { {200,50}, {220,360} };
- BYTE bts2[2] = { PT_MOVETO, PT_LINETO};
- PolyDraw(ps.hdc, lnpts2, bts2, 2);
- // 第三部分
- POINT lnpts3[2] = {{180,360}, {60,120}};
- BYTE bts3[2] = {PT_MOVETO, PT_LINETO};
- PolyDraw(ps.hdc, lnpts3, bts3, 2);
- // 第四部分
- POINT lnpts4[2] = {{220,360}, {340,120}};
- BYTE bts4[2] = {PT_MOVETO, PT_LINETO};
- PolyDraw(ps.hdc, lnpts4, bts4, 2);
- SelectObject(ps.hdc, orgObj);
- // 删除HPEN
- DeleteObject(pen);
- EndPaint(hwnd, &ps);
- }
- return 0;
画些线条上面,让窗口可视区域看上去不那么单调。
下面是完整的代码清单。
- #include <Windows.h>
- LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
- int WINAPI WinMain(HINSTANCE hThisApp,
- HINSTANCE hPrevApp,
- LPSTR cmdlint,
- int nShow)
- {
- WNDCLASS wc = {};
- wc.lpszClassName = L"MyApp";
- wc.hbrBackground = CreateSolidBrush(RGB(254, 239, 180));
- wc.lpfnWndProc = WindowProc;
- wc.hInstance = hThisApp;
- wc.style = CS_HREDRAW | CS_VREDRAW;
- wc.hCursor = LoadCursor(hThisApp, IDC_ARROW);
- RegisterClass(&wc);
- HWND hwnd = CreateWindow(L"MyApp",
- L"我的应用",
- WS_POPUP,
- 300,140,400,400,
- NULL,NULL,hThisApp,NULL);
- if(hwnd == NULL)
- return -1;
- POINT pts[5] =
- {
- { 200, 0},
- { 0, 160 },
- { 120, 400 },
- { 285, 400 },
- { 400, 160 }
- };
- HRGN rgn = CreatePolygonRgn(pts, 5, WINDING);
- SetWindowRgn(hwnd, rgn, FALSE);
- //DeleteObject(rgn);
- ShowWindow(hwnd,nShow);
- //UpdateWindow(hwnd);
- // 消息循环
- MSG msg;
- while(GetMessage(&msg, NULL, 0, 0))
- {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- return 0;
- }
- LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
- {
- switch(msg)
- {
- case WM_PAINT:
- {
- PAINTSTRUCT ps;
- BeginPaint(hwnd, &ps);
- //创建红色的pen
- HPEN pen= CreatePen(PS_DASHDOTDOT, 1, RGB(255,0,0));
- //把pen选择到设备上下文
- auto orgObj = SelectObject(ps.hdc, pen);
- //第一部分
- POINT lnpts1[5] =
- {
- {200,50}, {180,360}, {220, 360}, {60,120}, {340,120}
- };
- BYTE bts1[5] = {PT_MOVETO, PT_LINETO, PT_LINETO, PT_MOVETO, PT_LINETO };
- PolyDraw(ps.hdc,lnpts1,bts1,5);
- // 第二部分
- POINT lnpts2[2] = { {200,50}, {220,360} };
- BYTE bts2[2] = { PT_MOVETO, PT_LINETO};
- PolyDraw(ps.hdc, lnpts2, bts2, 2);
- // 第三部分
- POINT lnpts3[2] = {{180,360}, {60,120}};
- BYTE bts3[2] = {PT_MOVETO, PT_LINETO};
- PolyDraw(ps.hdc, lnpts3, bts3, 2);
- // 第四部分
- POINT lnpts4[2] = {{220,360}, {340,120}};
- BYTE bts4[2] = {PT_MOVETO, PT_LINETO};
- PolyDraw(ps.hdc, lnpts4, bts4, 2);
- SelectObject(ps.hdc, orgObj);
- // 删除HPEN
- DeleteObject(pen);
- EndPaint(hwnd, &ps);
- }
- return 0;
- case WM_DESTROY:
- PostQuitMessage(0);
- return 0;
- }
- return DefWindowProc(hwnd, msg, wParam, lParam);
- }
关于绘图方面的东东,后面会专门介绍,这里重点是说一下SetWindowRgn函数。
跟我一起玩Win32开发(7):多边形窗口的更多相关文章
- 跟我一起玩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):监视剪贴板
自从郭大侠和蓉儿离开桃花岛后,最近岛比较寂静,有一种“门前冷落鞍马稀”的感觉.于是,老邪就拿出<九阴真经>认真阅读,同时用迅雷下载经典大剧<汉武大帝>晚上睡觉前看上几集,老邪一 ...
随机推荐
- 有遍历struct中字段信息的函数或方法
例:struct a{int a;char b[10];double c;}; 在程序中只知道一个结构 a 的指针, 有没有函数能通过结构的名字 和 指向结构的指针 随次得到 结构中的变量类型 和 变 ...
- DRF 之 版本控制
1.版本控制是干什么用的,为什么要有版本? 我们都知道每一个程序都是有版本的.而且版本也会升级从v1升级到v2.v3.v4·····,但是我们不可能因为新版本出现旧版本就不去维护,因为用户有权选择不更 ...
- SQL常见问题及解决备忘
1.mysql中:you cant't specify tartget table for update in from clause 错误 含义:在同一语句中update或delete某张表的时候, ...
- 从小姐姐博客那里看到的流光文字(CSS3 animate)
对于流光文字,大家并不陌生,毕竟我们都经历过非主流的时代.你们卟懂绯紸流!色彩缤纷的QQ空间...... 还记得那些炫酷的签名档,或者那些炫酷的动态头像.不过大家对于流光文字的印象还是图片.那么在网页 ...
- docker pure-ftp 搭建ftp服务器
参考:https://hub.docker.com/r/stilliard/pure-ftpd/ docker-compose.yml: ftp: image: stilliard/pure-ftpd ...
- Linux下配置rsync服务器
一.简介 rsync是一个远程数据同步工具,可以快速同步多台主机间的文件.Rsync使用所谓的“Rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都 ...
- 计算机学院大学生程序设计竞赛(2015’12)Pick Game
Pick Game Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- ODC(Orthogonal Defect Classification)简介——正交缺陷分类法
Defect分析是软件开发和测试中一个重要的环节,ODC介绍了一种不同于大家常用的非常有效的defect分类及分析方法.这篇文章简单的向大家介绍了什么是ODC,以及如何在项目和产品开发中使用ODC来改 ...
- 关于python代码的性能
在python中性能测试是一个很难应付的任务,因为它在反复地优化,也许版本和版本之间差别很大.python中的一个主要的原则是,首先为了简单和可读性去编写代码,在程序运行后,并证明了确实有必要考虑性能 ...
- ios 给移动的控件添加点击事件
前言: 给一个UIView做移动动画,虽然看起来frame在持续改变,但是它的frame已经是最终值了. 也就是说表面看到的动画都是假象,它的真实位置已经是固定的了.所以只有点击在他的真实frame范 ...