您的位置:首页 > 其它

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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: