---恢复内容开始---
一,绘制与重绘
1,windows不会保留窗口内容,当窗口被覆盖然后恢复时,Windows会发送WM_PAINT消息通知窗口过程重绘客户区(窗口中没有被标题栏,菜单栏,工具栏,状态栏遮住的地方,可以自由绘制),使用函数 GetClientRect(hwnd, &rect);可获得客户区域,储存在rect结构中。
2,WM_PAINT消息
调用 UpdateWindow()函数,windows会向窗口过程发送第一条WM_PAINT消息。
以下情况窗口过程会收到WM_PAINT消息
*用户移动一个窗口,导致原来被覆盖的部分窗口暴露出来。
*用户调整窗口大小(当窗口类型设定为CS_HREDRAW和CS_VREDRAW值时)
*程序调用ScrollWindow或ScrollDC函数滚动客户区。
*程序调用InvalidateRect或InvalidateRgn显式生成WM_PAINT消息
当客户区被临时遮盖,Windows会试图保存被覆盖内容,并不是每次都成功。以下情况,Windows可能会发送一条WM_PAINT消息。
*Windows关闭一个覆盖部分窗口的对话框或消息框
*下拉菜单被下拉然后收回
*显示提示信息
以下情况下,Windows总会保存被覆盖显示内容,然后在恢复
*鼠标指针在客户区移动
*在客户区拖动图
3,有效矩形和无效矩形
需要被绘制的区域被称为“无效区域”或“更新区域”,当客户区有一个无效区域Windows会在应用程序的消息队列中放一条WM_PAINT消息。
Windows为每个窗口保留一个绘图信息结构(保存无效矩形及其他信息)无效区域总是最新的,Windows不会在消息队列放置多条WM_PAINT消息
窗口过程可以调用InvalidateRect强制使客户区的一个矩形失效,如何消息队列中已有一条WM_PAINT消息,windows将会计算出新的无效矩形;如果没有将会放置一条WM_PAINT消息。在任何时候,可以使用GetUpdateRect函数获取坐标
窗口过程调用BeginPaint函数后,整个客户区会变得有效,也可以使用ValidateRect,当前消息队列中的WM_PAINT会被删除
二,GDI简介
1,绘制一个窗口的客户区需要调用Windows的图形设备接口函
用于字符串输出的函数为
TextOut(hdc ,x ,y ,psText , iLength);
hdc为设备环境接口,x,y确定了字符串的左上角,psText为指向字符串的指针,iLength是字符串的长度
2,句柄是一个32位无符号整数,用来标识唯一的对象,设备环境(DC)是GDI内部维护的一个数据结构,与特定设备相关联。必须在处理同一消息过程中,获取和释放句柄。
获取方法有两种
第一种 case WM_PAINT:
hdc=BeginPaint(hwnd ,&ps); //BeginPaint函数会使无效区域有效化,以窗口背景擦去无效区域,并填充ps各个字段
...
EndPaint(hwnd ,&ps);
return 0;
第二种
hdc=GetDC(hwnd);//裁剪矩形为整个客户区,不会讲无效区有效化
....
ReleaseDC(hwnd,hdc);
//GetWindowDC可以得到整个窗口的设备环境句柄
3,绘制信息结构PAINTSTRUCT
typedef struct tagPAINTSTRUCT { HDC hdc; BOOL fErase;//调用BeginPaint函数后,为TRUE。使用InvalidateRect(hwnd,NULL,TRUE)true时擦出原有背景 RECT rcPaint; BOOL fRestore; BOOL fIncUpdate; BYTE rgbReserved[32]; } PAINTSTRUCT;
4,TextOut函数详解
TextOut(hdc ,x ,y ,psText , iLength);
设备环境决定了文本颜色和文本背景色
字符大小
typedef struct tagTEXTMETRICW { LONG tmHeight; LONG tmAscent; LONG tmDescent; LONG tmInternalLeading; LONG tmExternalLeading; LONG tmAveCharWidth; LONG tmMaxCharWidth; } TEXTMETRIC;
---恢复内容结束---
原文地址:https://www.cnblogs.com/thisisdujian/p/9378991.html