您的位置:首页 > 其它

入门win32——绘制图形

2018-02-09 17:31 218 查看
博主目前在入门期,文中难免有错误,请大家指正,努力做到基本正确,供有兴趣学习的朋友们看一看。

首先介绍一下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);


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  win32 图形 windows