win32开发(简单绘图)
2017-12-14 08:30
281 查看
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
在win32上面,所有的操作都是通过消息来完成的。正如前面一节说的那样,WM_CREATE、WM_PAINT、WM_SIZE、WM_DESTROY、WM_CHAR等消息都是我们在开发中经常要遇到的消息内容。这其中,以WM_PAINT和WM_SIZE处理得最为频繁。这是因为,每次app重新绘图的时候,os都要发送WM_PAINT消息给app。同理,每次窗口的长度发生改变的时候,os也会发送WM_SIZE消息给app。为了验证我们的想法,其实我们可以先定义一个全局变量g_text,比如像这样,
int g_text =0;
接着,我们在每次WM_PAINT绘图的时候,看看g_text的数值是不是发生改变,
case WM_PAINT:
g_text += 1;
TCHAR buffer[10];
buffer[9] = '\0';
_snprintf(buffer, 10, "%d\n", g_text);
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
RECT rt;
GetClientRect(hWnd, &rt);
DrawText(hdc, buffer, strlen(buffer), &rt, DT_CENTER);
EndPaint(hWnd, &ps);
break; 当然,这里我们需要一个buffer变量,它将g_text转变成字符串的形式,再用DrawText的方法显示出来。
这里,由于使用了_snprintf这个函数,你可能需要添加头文件才能编译通过,比如像这样
#include <stdio.h>
剩下来的事情就是编译这个项目,生成可执行文件、运行执行文件。这个时候,我们就会发现,不管是最小化应用、还是窗口被覆盖的时候,WM_PAINT都会被调用,因为g_text的数值是一直在增加的。相同的方法可以应用在其他消息当中,
比如,如果是验证WM_CREATE被调用了多少次,那么可以这么写
case WM_CREATE:
g_text += 1;
break; 再比如,如果是WM_MOUSEMOVE这种会一直发送的消息,我们想确认是不是真的一直在发送呢?它可以这么处理,
case WM_MOUSEMOVE:
g_text += 1;
InvalidateRect(hWnd, NULL, 0);
break; 编写命令行程序的时候,打印是一种很不错的方法。但是在win32上面,大家其实可以利用win32的消息机制,将要打印的信息投射在app上就可以了。这也是一种很重要的调试方法。这里InvalidateRect其实就是强力要求os重新绘制app的意思。
另外,有一些朋友为了跨平台,喜欢用opengl来绘图。作为游戏开发者,用opengl来做2d的渲染,这无可厚非,coco2dx等很多平台也是这么做的。但是,我还是建议大家可以好好学一学win32的开发方法,这对提高大家的开发技能很有好处。还有一个库是duilib,也很不错。建议大家学习的时候多练习win32,使用的时候多用duilib。
在win32上面,所有的操作都是通过消息来完成的。正如前面一节说的那样,WM_CREATE、WM_PAINT、WM_SIZE、WM_DESTROY、WM_CHAR等消息都是我们在开发中经常要遇到的消息内容。这其中,以WM_PAINT和WM_SIZE处理得最为频繁。这是因为,每次app重新绘图的时候,os都要发送WM_PAINT消息给app。同理,每次窗口的长度发生改变的时候,os也会发送WM_SIZE消息给app。为了验证我们的想法,其实我们可以先定义一个全局变量g_text,比如像这样,
int g_text =0;
接着,我们在每次WM_PAINT绘图的时候,看看g_text的数值是不是发生改变,
case WM_PAINT:
g_text += 1;
TCHAR buffer[10];
buffer[9] = '\0';
_snprintf(buffer, 10, "%d\n", g_text);
hdc = BeginPaint(hWnd, &ps);
// TODO: Add any drawing code here...
RECT rt;
GetClientRect(hWnd, &rt);
DrawText(hdc, buffer, strlen(buffer), &rt, DT_CENTER);
EndPaint(hWnd, &ps);
break; 当然,这里我们需要一个buffer变量,它将g_text转变成字符串的形式,再用DrawText的方法显示出来。
这里,由于使用了_snprintf这个函数,你可能需要添加头文件才能编译通过,比如像这样
#include <stdio.h>
剩下来的事情就是编译这个项目,生成可执行文件、运行执行文件。这个时候,我们就会发现,不管是最小化应用、还是窗口被覆盖的时候,WM_PAINT都会被调用,因为g_text的数值是一直在增加的。相同的方法可以应用在其他消息当中,
比如,如果是验证WM_CREATE被调用了多少次,那么可以这么写
case WM_CREATE:
g_text += 1;
break; 再比如,如果是WM_MOUSEMOVE这种会一直发送的消息,我们想确认是不是真的一直在发送呢?它可以这么处理,
case WM_MOUSEMOVE:
g_text += 1;
InvalidateRect(hWnd, NULL, 0);
break; 编写命令行程序的时候,打印是一种很不错的方法。但是在win32上面,大家其实可以利用win32的消息机制,将要打印的信息投射在app上就可以了。这也是一种很重要的调试方法。这里InvalidateRect其实就是强力要求os重新绘制app的意思。
另外,有一些朋友为了跨平台,喜欢用opengl来绘图。作为游戏开发者,用opengl来做2d的渲染,这无可厚非,coco2dx等很多平台也是这么做的。但是,我还是建议大家可以好好学一学win32的开发方法,这对提高大家的开发技能很有好处。还有一个库是duilib,也很不错。建议大家学习的时候多练习win32,使用的时候多用duilib。
相关文章推荐
- iOS海哥开发笔记 (海哥原创,绘图Quartz-2d的简单使用 二)
- 跟我一起玩Win32开发(8):绘图(A)
- 跟我一起玩Win32开发(10):绘图(C)
- 一个简单的win32程序开发框架—win-dev-framework
- iOS开发--CoreGraphics简单绘图
- JAVA绘图工具开发简单介绍
- 简单的WIN32屏保开发制作(可播放视频)
- IOS开发:CoreGraphics简单绘图
- iphone 开发周记2 触摸事件处理与简单绘图。
- win32开发(最简单的win32代码)
- 最简单的Windows win32 API 程序开发方法
- 跟我一起玩Win32开发(9):绘图(B)
- win32窗口的创建,GDI简单的绘图操作
- (转)IOS开发之——绘图(CGContext)
- Android应用开发高效工具集1---ant构建简单Android项目
- 简单之美-软件开发实践者的思考 03
- c# GDI+简单绘图(四)
- 【iOS开发】 CoreText 使用教程:以创建一个简单的杂志应用为例
- EBS Form开发利用QUERY_FIND来实现最简单的查询功能
- [Win32] 服务程序开发(3)Session 0隔离(下)创建SYSTEM权限可交互进程