首页 > 其他分享 >win32开发(简单绘图)

win32开发(简单绘图)

时间:2022-11-23 13:07:59浏览次数:45  
标签:buffer text WM win32 PAINT 绘图 简单 app



    在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。


标签:buffer,text,WM,win32,PAINT,绘图,简单,app
From: https://blog.51cto.com/feixiaoxing/5880997

相关文章

  • win32开发(添加菜单)
      使用win32编写菜单是一件很简单的事情。要添加自己的菜单,其实只要做好两方面的事情就可以了,一个就是在ResourceView中找到菜单入口,另外一个就是在WndProc添加好回调函......
  • 随想录(编写简单资源管理代码)
      不管编写什么软件,我们都会涉及到模块的编写。说是模块,其实就是管理一片资源,这些资源的概念很广,可以是内存、锁、socket、字符串、文件、空间大小等等。所以不管是什么......
  • 1742. 盒子中小球的最大数量 ------ 简单vector使用、简单模拟
    你在一家生产小球的玩具厂工作,有n个小球,编号从lowLimit开始,到highLimit结束(包括lowLimit和 highLimit,即 n==highLimit-lowLimit+1)。另有无限数量的盒子,编......
  • WPF-简单数据绑定
    为了保持数据和控件内容的同步,我们通常的方法是在:数据类中创建事件,在属性修改时通知控件修改内容;在控件所属类中创建事件,在内容修改时通知数据对象更新属性,这叫做数据绑定......
  • wxPython绘图API
    简单介绍一个Pthon的绘图库wxPython.GDI+(图形绘制接口),CoreGraphics和Cairo库形成wxPython绘图API的框架。wx.GraphicsContext是主要绘制对象,使用它来创建各种设备上下文......
  • VUE3 全局共享数据方案之一 (简单快速实现类似vuex)
    自定义封装单列模式!globalstate由于vue3的响应式系统本身可以脱离组件而存在,因此可以充分利用这一点,轻松制造多个全局响应式数据,并且通过和vuex一样通过某个模块指定......
  • recastnavigation计算三角形离给定点最近位置方法简单注释
    三角形在recastnavigation中,三角形是最基础的元素,很多逻辑都是基于三角形进行的,其中比较常见的一个操作就是计算指定点到某三角形上的最近距离。由于三角形通常代表行走面......
  • mysql初识下载与curd简单语法
    存取数据的演变1.文本文件 文件路径不固定:C:\aaa.txt数据格式不统一:jason:123jason|123jason1232.软件开发目录 规定了数据应该报错再db目录下》》》:路径偏向......
  • leetcode35. 搜索插入位置(简单)
    题目描述:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为O(logn)......
  • 2022NOIP A层联测33 GCD 简单题 建筑 树上前缀和
    T1:[图论/枚举]给出有边权无向图,边权保证互不相同,Q次询问从S到T的路径中,边权的gcd最大是多少。(n<=1e4,Q<=2e5,w<=1e6)考场根据之前的一道图论题经验,在最短路上加个“\(w......