windows api 文本输出(一)

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

一,绘制与重绘

  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

时间: 2024-10-16 05:49:14

windows api 文本输出(一)的相关文章

MFC字体与文本输出

字体 成员函数 1.CFont( ); 构造一个CFont对象.此对象在使用之前应该先使用CreateFont.CreateFontIndirect.CreatePointFont或CreatePointFontIndirect初始化. 2. BOOL CreateFont( int nHeight, int nWidth, int nEscapement, int nOrientation, int nWeight, BYTE bItalic, BYTE bUnderline, BYTE cS

VS2010/MFC字体和文本输出:文本输出

字体和文本输出:文本输出 本节主要讲解文本输出的方法和实例. 文本输出过程 在文本输出到设备以前,我们需要确定字体.字体颜色和输出的文本内容等信息.Windows窗口的客户区由应用程序管理,所以我们还要在应用程序中控制输出文本的格式,例如后续字符的位置.换行等格式. 由此,文本的输出过程大致包括确定字体信息.格式化文本和执行输出操作三个步骤.下面分别讲解. 1.确定字体信息 文本在输出以前应该先确定字体信息,或者是当前正在使用的字体,或者是自定义的字体,之后就可以根据确定的字体来显示文本或者利用

Windows API参考大全新编

书名:新编Windows API参考大全 作者:本书编写组 页数:981页 开数:16开 字数:2392千字 出版日期:2000年4月第二次印刷 出版社:电子工业出版社 书号:ISBN 7-5053-5777-8 定价:98.00元 内容简介 作为Microsoft 32位平台的应用程序编程接口,Win32 API是从事Windows应用程序开发所必备的.本书首先对Win32 API函数做完整的概述:然后收录五大类函数:窗口管理.图形设备接口.系统服务.国际特性以及网络服务:在附录部分,讲解如何

Windows API所提供的功能可以归为七类

1.基础服务(Base Services),提供对Windows系统可用的基础资源的访问接口.比如象:文件系统(file system).外部设备(device).,进程(process).线程(thread)以及访问注册表(Windows registry)和错误处理机制(error handling).这些功能接口位于,16位Windows下的kernel.exe.krnl286.exe或krnl386.exe系统文档中:以及32位Windows下的 kernel32.dll和advapi3

Windows API 教程(七) hook 钩子监听

Windows API 教程(七) hook 钩子监听 Posted on 2013-08-15 茵蒂克丝 如何创建一个窗口 手动创建窗口的流程 实际代码 安装钩子 (Install hook) 钩子简介 SetWindowsHookEx 函数 设置监听[键盘]消息 设置监听[鼠标]消息 如何创建一个窗口 另外一个再录的 Windows SDK教程 里面有讲到快捷创建窗口的方式,不过这样的话要分好几个文件,感觉有点混所以这里就用原始的方式创建一个窗口. 那么,为什么讲到 hook(钩子)的时候要

Windows API 大全

常用Windows API1. API之网络函数WNetAddConnection 创建同一个网络资源的永久性连接WNetAddConnection2 创建同一个网络资源的连接WNetAddConnection3 创建同一个网络资源的连接WNetCancelConnection 结束一个网络连接WNetCancelConnection2 结束一个网络连接WNetCloseEnum 结束一次枚举操作WNetConnectionDialog 启动一个标准对话框,以便建立同网络资源的连接WNetDis

使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程

http://bbs.pediy.com/showthread.php?p=1354999 标 题: [原创]使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程.作 者: shayi时 间: 2015-02-12,05:19:54链 接: http://bbs.pediy.com/showthread.php?t=197829 使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程. (本文同步更

windows API之控制台界面

windows API之控制台界面 tkorays ([email protected]) 在windows里面,用户界面包括控制台(Console)形式的和窗口(Window)形式的.控制台形式的界面我们也是经常接触的,不就是那个黑色的框框吗?但是我们并没有直接使用Windows API,通常我们调用printf来输出.scanf来输入.实际上,这个c语言函数也是通过Windows API来实现的.不信的话,可以打开crtdll.dll查看里面的字符串. 关于Console的API不是很多,主

在VBA中使用Windows API

VBA是一种强大的编程语言,可用于自定义Microsoft Office解决方案.通过使用VBA处理一个或多个Office应用程序对象模型,可以容易地修改Office应用程序的功能或者能够使两个或多个Office应用程序协同工作以完成单个应用程序无法完成的任务.然而,使用VBA仅能控制操作系统的一小部分.Windows API提供了控制操作系统绝大多数方面的功能.下面,介绍在VBA中使用Windows API的一些知识. 理解APIs API只是一组函数,可用于处理组件.应用程序或操作系统.通常