入门win32——绘制图形
2018-02-09 17:31
218 查看
博主目前在入门期,文中难免有错误,请大家指正,努力做到基本正确,供有兴趣学习的朋友们看一看。
首先介绍一下WM_PAINT消息
WndProc处理的第二个消息为WM_PAINT。这个消息在Windows程序设计中是很重要的。当窗口显示区域的一部分显示内容或者全部变为“无效”,以致于必须“更新画面”时,将由这个消息通知程序。win32最核心的便是消息循环,我们接收到这个消息之后就进入消息处理;
比如这样:
绘图就是从这样一个结构开始;
PAINTSTRUCT叫油漆结构,哈哈哈哈,很形象吧,我们先打个一桶油漆,三棵树健康漆就挺好,油漆是我们粉刷的必要条件;油漆结构结构包含应用程序的信息。该信息可用于描述该应用程序拥有的一个窗口的客户端区域,里面有什么呢?
hdc
设备上下文是一种包含有关某个设备(如显示器或打印机)的绘制属性信息的 Windows 数据结构。所有绘制调用都通过设备上下文对象进行,这些对象封装了用于绘制线条、形状和文本的 Windows API
fErase
指定后台是否必须被删除。如果应用程序应该擦除背景,那么这个值是非零的。如果没有后台刷创建窗口类,应用程序将负责擦除背景。要了解更多信息,请参阅WNDCLASS结构的hbr后台成员的描述。
rcPaint
指定了一个矩形结构,它指定了绘制绘画的矩形的左上角和右下角,在设备单元中,相对于客户端区域的左上角。
fRestore保留;系统内部使用。
fIncUpdate保留;系统内部使用。
rgbReserved保留;系统内部使用。
BeginPaint()和EndPaint()就不需要说了,就和matlab里的那种差不多意思,我开始吃饭了,我吃好了。就是这样,告诉系统妈妈我要吃饭了,你快做饭,我吃好了,你快收碗。逃:)
中间代码段就是我们画图的地方了,画图函数千千万,我就例举一些常见的;
文本:
前三个参数不需要细说,见字会意;
LPRECT:
不知还记不记得油漆里有个RECT,对就是它,里面规定了一个矩形结构,该结构包含了文本要被格式化的矩形(在逻辑坐标中),加个LP代表指针,我们只需要调用油漆里的就行了;
uFormat :
指定格式化文本的方法。该参数可以是下列值中的一个或多个
DT_BOTTOM,啊呀,好多,不详细写了,大家可以自己去MSDN看;
示例:
一次性绘制多个字符串:
第一个和第三个参数不需要多说,第二个参数 POLYTEXT ,这是一个结构体,规定了文本;
先得定义一个数组用来存放这些信息,然后在绘图函数里调用;x,y是参考点坐标,n是字符串长度,LPCTSTR是文本信息,不需要null,之前指定了长度了,uiflags是文本是否剪切在下面RECT规定的矩形中,最后pdx是指向包含字符串中每个字符宽度值的数组的指针。就是有几个字符给几个宽度值;
示例:
有一个疑问点,如果有朋友知道帮忙评论补充一下,我反复尝试发现,POLYTXT的第三个参数,就是文本长度值必须一样才能正确显示,比如都是4,多退少补。
简单图形:
文本写完来画几个简单的图形。
首先介绍一下WM_PAINT消息
WndProc处理的第二个消息为WM_PAINT。这个消息在Windows程序设计中是很重要的。当窗口显示区域的一部分显示内容或者全部变为“无效”,以致于必须“更新画面”时,将由这个消息通知程序。win32最核心的便是消息循环,我们接收到这个消息之后就进入消息处理;
比如这样:
switch (Message) { /*。。。。。。*/ case WM_PAINT: { PAINTSTRUCT ps; BeginPaint(hwnd, &ps); /*。。。。。。*/ EndPaint(hwnd, &ps); } /*。。。。。。*/ }
绘图就是从这样一个结构开始;
PAINTSTRUCT叫油漆结构,哈哈哈哈,很形象吧,我们先打个一桶油漆,三棵树健康漆就挺好,油漆是我们粉刷的必要条件;油漆结构结构包含应用程序的信息。该信息可用于描述该应用程序拥有的一个窗口的客户端区域,里面有什么呢?
typedef struct tagPAINTSTRUCT { HDC hdc; BOOL fErase; RECT rcPaint; BOOL fRestore; BOOL fIncUpdate; BYTE rgbReserved[32]; } PAINTSTRUCT, *PPAINTSTRUCT;
hdc
设备上下文是一种包含有关某个设备(如显示器或打印机)的绘制属性信息的 Windows 数据结构。所有绘制调用都通过设备上下文对象进行,这些对象封装了用于绘制线条、形状和文本的 Windows API
fErase
指定后台是否必须被删除。如果应用程序应该擦除背景,那么这个值是非零的。如果没有后台刷创建窗口类,应用程序将负责擦除背景。要了解更多信息,请参阅WNDCLASS结构的hbr后台成员的描述。
rcPaint
指定了一个矩形结构,它指定了绘制绘画的矩形的左上角和右下角,在设备单元中,相对于客户端区域的左上角。
fRestore保留;系统内部使用。
fIncUpdate保留;系统内部使用。
rgbReserved保留;系统内部使用。
BeginPaint()和EndPaint()就不需要说了,就和matlab里的那种差不多意思,我开始吃饭了,我吃好了。就是这样,告诉系统妈妈我要吃饭了,你快做饭,我吃好了,你快收碗。逃:)
中间代码段就是我们画图的地方了,画图函数千千万,我就例举一些常见的;
文本:
int DrawText( HDC hDC, // handle to DC LPCTSTR lpString, // text to draw int nCount, // text length LPRECT lpRect, // formatting dimensions UINT uFormat // text-drawing options );
前三个参数不需要细说,见字会意;
LPRECT:
不知还记不记得油漆里有个RECT,对就是它,里面规定了一个矩形结构,该结构包含了文本要被格式化的矩形(在逻辑坐标中),加个LP代表指针,我们只需要调用油漆里的就行了;
uFormat :
指定格式化文本的方法。该参数可以是下列值中的一个或多个
DT_BOTTOM,啊呀,好多,不详细写了,大家可以自己去MSDN看;
示例:
DrawText(ps.hdc, "你好 ",4, &(ps.rcPaint), DT_CENTER);
一次性绘制多个字符串:
BOOL PolyTextOut( HDC hdc, // handle to DC CONST POLYTEXT *pptxt, // array of strings int cStrings // number of strings in array );
第一个和第三个参数不需要多说,第二个参数 POLYTEXT ,这是一个结构体,规定了文本;
typedef struct _POLYTEXT { int x; int y; UINT n; LPCTSTR lpstr; UINT uiFlags; RECT rcl; int *pdx; } POLYTEXT, *PPOLYTEXT;
先得定义一个数组用来存放这些信息,然后在绘图函数里调用;x,y是参考点坐标,n是字符串长度,LPCTSTR是文本信息,不需要null,之前指定了长度了,uiflags是文本是否剪切在下面RECT规定的矩形中,最后pdx是指向包含字符串中每个字符宽度值的数组的指针。就是有几个字符给几个宽度值;
示例:
int arr1[2] = { 20,0 }; POLYTEXT polys[] = { {50,0,4,"大家",ETO_CLIPPED,ps.rcPaint,arr1 }, { 50,25,4,"新年",ETO_CLIPPED,ps.rcPaint,arr1}, { 50,50,4,"快乐",ETO_CLIPPED,ps.rcPaint,arr1} }; PolyTextOut(ps.hdc, &polys[0], 3);//这里数组调用和上面arr1其实都是取首地址的意思
有一个疑问点,如果有朋友知道帮忙评论补充一下,我反复尝试发现,POLYTXT的第三个参数,就是文本长度值必须一样才能正确显示,比如都是4,多退少补。
简单图形:
文本写完来画几个简单的图形。
HBRUSH hb = CreateSolidBrush(RGB(0, 0, 255));//创建带颜色的画刷 HBRUSH orgBrs = (HBRUSH)SelectObject(ps.hdc, hb); Ellipse(ps.hdc, 0, 0, 100, 100); SelectObject(ps.hdc, orgBrs); //选回画刷 Ellipse(ps.hdc, 100, 100, 200, 200);//我画了两个正圆 DeleteObject(hb);
相关文章推荐
- matplotlib入门——绘制简单图形
- 调用HTML5的Canvas API绘制图形的快速入门指南
- Android自定义控件入门绘制基本图形
- matlab入门1--利用plot函数绘制正弦函数图形
- 在浏览器绘制图形入门
- SVG 2D入门2 - 图形绘制
- Astah绘制UML图形-入门篇
- esri-leaflet入门教程(5)- 动态绘制图形
- Android入门——利用Canvas完成绘制点、圆、直线、路径、椭圆、多边形等2D图形
- Matlab入门_05_同一图像绘制多图形
- Canvas入门(1):绘制矩形、圆、直线、曲线等基本图形
- Directx9入门(2)绘制第一个2D图形
- OpenGL入门学习——第二课 绘制几何图形
- 突袭HTML5之SVG 2D入门2 - 图形绘制
- Android自定义控件绘制基本图形基础入门
- OpenGL入门学习——第三课 绘制几何图形的一些细节问题
- win32开发(图形绘制)
- Java入门:绘制简单图形
- matlab画图入门篇--各种基本图形绘制的函数与实例【转载】
- matlab入门教程四 ----- 绘制平面图形