字体显示
章节宗旨:使用Windows 提供的功能来取得关於程式执行环境的资讯。
1. WM_PAINT 消息
大多数Windows 程式在WinMain 中进入讯息回圈之前的初始化期间都要呼
叫函式UpdateWindow。Windows 利用这个机会给视窗讯息处理程式发送第一个
WM_PAINT 讯息。这个讯息通知视窗讯息处理程式:必须绘制显示区域。此後,
视窗讯息处理程式应在任何时刻都准备好处理其他WM_PAINT 讯息,必要的话,
甚至重新绘制视窗的整个显示区域。在发生下面几种事件之一时,视窗讯息处
理程式会接收到一个WM_PAINT 讯息:
在使用者移动视窗或显示视窗时,视窗中先前被隐藏的区域重新可见。
使用者改变视窗的大小(如果视窗类别样式有著CS_HREDRAW 和CS_VREDRAW
位元旗标的设定)。
程式使用ScrollWindow 或ScrollDC 函式滚动显示区域的一部分。
程式使用InvalidateRect或InvalidateRgn函式刻意产生WM_PAINT讯息。
在某些情况下,显示区域的一部分被临时覆盖,Windows 试图保存一个显示
区域,并在以後恢复它,但这不一定能成功。在以下情况下,Windows 可能发送
WM_PAINT 讯息:
Windows 擦除覆盖了部分视窗的对话方块或讯息方块。
功能表下拉出来,然後被释放。
显示工具提示讯息。
在某些情况下,Windows 总是保存它所覆盖的显示区域,然後恢复它。这些
情况是:
滑鼠游标穿越显示区域。
图示拖过显示区域。
GDI
讲解GDI的时候没有过多的解释什么,个人理解应该要表述的GDI应该是对于一系列对于外部接入设备(显示器)能够交互的一组函数。然后介绍了一下第一个参数hdc翻译为装置内容代号。
装置内容
装置内容实际上市GDI 内部保存的资料结构。装置内容与特定的显示设备相关。对于显示器装置内容与显示器上特定的视窗相关。(hdc为一个装置内容的代号,通过这个可以操作这个所谓的装置内容)。
装置内容中的有些值是图形属性,这些属性定义了GDI绘图函数工作的细节。 个人理解就是所有在屏幕上显示的一些东西,所谓的装置内容(DC)都有与之对应的属性。字体有颜色字体大小。图像有各种各样的图像还有等等各种属性。
另外使用之前必须获得装置内容的代号(也就是DC句柄)。
每个信息只能使用一个装置内容代号(后面不在用着拗口名字,直接用句柄),每个信息的处理过程中,必须获取句柄和是放假句柄同时存在。每个信息是重点,也就是不能再这个信息里面申请的DC句柄,然后在另外一个小心里面使用。 但是貌似有过一个CreateDC函数不是这样。
取得DC(装置内容代号)方法1
BeginPaint 和 EndPaint方法
HDC BeginPaint(
__in HWND hwnd,
__out LPPAINTSTRUCT lpPaint
);
第一个参数将要被重画的窗体句柄,第二个参数一个指向PAINTSTRUCTURE 的指针。返回的也就是所谓的装置内容代号(DC句柄)。小例子一枚
绘图咨询结构(PAINTSTRUCTURE)
typedef struct tagPAINTSTRUCT
{
HDC hdc ;
BOOL fErase ;
RECT rcPaint ;
BOOL fRestore ;
BOOL fIncUpdate ;
BYTE rgbReserved[32] ;
} PAINTSTRUCT ;
使用BeginPaint函数前,用户和操作系统应该填充其中的一些值。使用者只需控制前三项。其他的是windows内部使用。
第三个参数应该是最为重要,使用它我们可以控制我们将要操作的无效矩形的大小(所谓无效举行可以理解为通过WM_PAINT将要改变的矩形)
取得DC句柄(装置内容代号)方法2
HDC GetDC(
__in HWND hWnd
);
参数将要获得这个DC句柄的窗体句柄
int ReleaseDC(
__in HWND hWnd,
__in HDC hDC
);
参数 窗体句柄,DC句柄
TextOut细节
BOOL TextOut(
__in HDC hdc,
__in int nXStart,
__in int nYStart,
__in LPCTSTR lpString,
__in int cchString
);
第一个参数DC句柄,可以使前面介绍的GetDC和BeginPaint任何一个返回句柄的函数返回的对象。DC的属性控制了被现实字符创的特征。颜色大小等等。
nXStart 和 nYStart 控制了字符串的开始时候的坐标,从左上角开始数。
LPCTSTR lpString 将要显示的字符串
Int cchString 将要显示字符串个数
系统字体
HDC还同时定义了呼叫TextOut时候windows使用的字体。内定为系统字体。但是可以使用表头文件中的识别字。SYSTEM_FONT.
字体大小
控制字体大小的总体思路,获取整个窗体的像素数,然后获得每一个字符的像素数,然后就可以获得屏幕大小中可以容纳的行数。
int WINAPI GetSystemMetrics(
__in int nIndex
);
可以通过这个获得一系列系统的各种参数。
BOOL GetTextMetrics(
__in HDC hdc,
__out LPTEXTMETRIC lptm
);
获得每一个字符的高度。
格式化文字
基本要求算是完结