Windows程序设计--文本输出(一)

绘制和重绘
之前就写过,windows是一个消息驱动的系统,有两种方式把各种事件通知给应用程序:1是把消息放在应用程序的消息队列中;2是向适当的窗口过程直接发送消息。
这里主要讨论的是WM_PAINT消息 ,以下任何一个事件发送,窗口过程都会收到一条WM_PAINT消息:
1用户移动一个窗口,导致原来被遮盖的部分窗口暴露出来;
2用户调整了窗口的大小;
3程序调用ScrollWindow或ScrollDC函数滚动客户区;
4程序调用InvalidateRect或InvalidateRgn函数显示生成WM_PAINT消息。

GDI简介
绘制一个窗口的客户区需要调用windows的图形设备接口函数,即GDI。
windows提供了几个GDI函数用于在客户端内输出字符串,其中有DrawText、TextOut等,TextOut可谓是最常见的:
格式:TextOut(hdc, x, y, psText, iLength);
功能:向窗口的客户区输出一个字符串
参数:hdc是一个设备环境句柄(几乎所有的GDI函数都需要这个句柄作为第一个参数的);psText为指向字符串的指针;iLength是字符串的长度(以字节为单位);参数x,y定义了字符串在客户区中的开始位置。

那么既然提到了hdc,那就要说明一下,什么是设备环境:
设备环境句柄是程序窗口使用GDI函数的“通行证”;
设备环境实际上是GDI内部维护的一个数据结构;
设备环境与特定的显示设备相关联;
程序在绘制前必须获取一个设备环境句柄;
当程序完成对客户区的绘制后,必须释放设备环境句柄。

那么问题又来了,如何获取设备环境句柄呢?
法一:
这种方法可以在处理WM_PAINT消息时使用。涉及到BeginPaint和EndPaint两个函数,两个函数需要两个参数:一个是窗口的句柄,另一个是类型为PAINTSTRUCT结构变量的地址。
处理WM_PAINT时,窗口过程先调用BeginPaint,函数的返回值就是设备环境句柄,而调用EndPaint函数释放设备环境变量。代码如下:

PAINTSTRUCT ps;
....
case: WM_PAINT
hdc = BeginPaint(hwnd, &ps);
/*使用GDI函数*/
EndPaint(hwnd, &ps);
return 0;

上面代码中提到了PAINTSTRUCT,即所谓的绘制信息结构,看看如何定义的:

typedef struct tagPAINTSTRUCT {
HDC hdc;
BOOL fErase;
RECT rcPaint;
BOOL fRestore;
BOOL fIncUpdate;
BYTE rgbReserved[32];
} PAINTSTRUCT, *PPAINTSTRUCT;

hdc是用于绘制的句柄,
fErase如果为非零值则擦除背景,否则不擦除背景,
rcPaint 通过制定左上角和右下角的坐标确定一个要绘制的矩形范围,该矩形单位相对于客户区左上角,
后面三个参数都是系统预留的,编程一般用不到。

法二:
可以调用GetDC函数来获得窗口客户区的设备环境变量;
使用完调用ReleaseDC函数将它释放:

hdc = GetDC(hwnd); /*使用GDI函数*/ ReleaseDC(hwnd, hdc);

那么以上的两种方法到底有何不同呢?
简而言之,使用PaintBegin方法是作用于无效矩形区域;而使用GetDC返回的设备环境句柄中的裁剪区域是整个客户区,不再区分有效和无效区。

好了,有了以上的一些概念,我们明天要”翔细“讲诉TEXTOUT函数了。再见!

[email protected]
Beijing

你可能感兴趣的:(windows)