windows api 文本输出(一)

2021-03-26 17:26

阅读:334

标签:long   esc   数据   api   状态栏   client   符号   bsp   重绘   

---恢复内容开始---

一,绘制与重绘

  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;

 

---恢复内容结束---

windows api 文本输出(一)

标签:long   esc   数据   api   状态栏   client   符号   bsp   重绘   

原文地址:https://www.cnblogs.com/thisisdujian/p/9378991.html


评论


亲,登录后才可以留言!