这次我们将学习有关文本的诸多属性如字体和颜色等。
理论:
Windows 的颜色系统是用RGB值来表示的,R 代表红色,G 代表绿色,B 代表蓝色。如果您想指定一种颜色就必须给该颜色赋相关的 RGB 值,RGB 的取值范围都是从 0 到 255,譬如您想要得到纯红色,就必须对RGB赋值(255,0,0),纯白色是 (255,255,255)。
您可以用函数 SetTextColor
和 SetBkColor
来“绘制”字符颜色和背景色,但是必须传递一个“设备环境”的句柄和 RGB 值作为参数。RGB 的结构体的定义如下:
|
|
其中第一字节为 0 而且始终为 0,其它三个字节分别表示蓝色、绿色和红色,刚好和 RGB 的次序相反。这个结构体用起来挺别扭,所以我们重新定义一个宏用它来代替。该宏接收红绿蓝三个参数,并在 eax 寄存器中返回 32 位的 RGB 值,宏的定义如下:
|
|
您可以把该宏放到头文件中以方便使用。
您可以调用 CreateFont
和 CreateFontIndirect
来创建自己的字体,这两个函数的差别是:前者要求您传递一系列的参数,而后者只要传递一个指向 LOGFONT
结构的指针。这样就使得后者使用起来更方便,尤其当您需要频繁创建字体时。在我们的例子中由于只要创建一种字体,故用 CreateFont
就足够了。在调用该函数后会返回所创建的字体的句柄,然后把该句柄选进“设备环境”使其成为当前字体,随后所有的“绘制”文本串的函数在被调用时都要把该句柄作为一个参数传递
例子:
|
|
分析:
CreateFont
函数产生一种逻辑字体,它尽可能地接近参数中指定的各相关值。这个函数大概是所有 Windows API 函数中所带参数最多的一个。它返回一个指向逻辑字体的句柄供调用 SelectObject
函数使用。下面我们详细讲解该函数的参数:
|
|
nHeight
: 希望使用的字体的高度,0为缺省。nWidth
: 希望使用的字体的宽度,一般情况下最好用0, 这样 Windows 将会自动为您选择一个和高度匹配的值。因为在我们的例子中那样做的话会使得字符因太小而无法显示,所以我们设定它为16。nEscapement
: 每一个字符相对前一个字符的旋转角度,一般设成0。900代表转90度,1800转190度,2700转270度。nOrientation
: 字体的方向。nWeight
: 字体笔画的粗细。
Windows 为我们预定义了如下值:
|
|
cItalic
: 0为正常,其它值为斜体。cUnderline
: 0为正常,其它值为有下划线。cStrikeOut
: 0为正常,其它值为删除线。cCharSet
: 字体的字符集。一般选择OEM_CHARSET,它使得 Windows 会选用和操作系统相关的字符集。cOutputPrecision
: 指定我们选择的字体接近真实字体的精度。 一般选用OUT_DEFAULT_PRECIS,它决定了缺省的映射方式。cClipPrecision
: 指定我们选择的字体在超出裁剪区域时的裁剪精度。 一般选用CLIP_DEFAULT_PRECIS,它决定了裁剪精度。cQuality
: 指定输出字体的质量。它指出GDI应如何尽可能的接近真实 字体,一共有三种方式:DEFAULT_QUALITY, PROOF_QUALITY 和DRAFT_QUALITY。cPitchAndFamily
:字型和字体家族。lpFacename
: 指定字体的名称。
上面的描述不一定好理解,您如果要的到更多的信息,应参考 WIN32 API 指南。
|
|
在我们得到了指向逻辑字体的句柄后必须调用 SelectObject
函数把它选择进“设备环境”,我们还可以调用该函数把诸如此类的像颜色、笔、画刷 等GDI对象选进“设备环境”。该函数会返回一个旧的“设备环境”的句柄。您必须保存该句柄,以便在完成“绘制”工作后再把它选回。在调用 SelectObject
函数后一切的绘制函数都是针对该“设备环境”的。
|
|
我们用宏 RGB 产生颜色,然后分别调用 SetTextColor
和 SetBkColor
。
|
|
我们调用 TextOut
在客户区用我们前面选定的字体和颜色“绘制”文本串。 TextOut,hdc,x,y,lpString,nCount
|
|
在我们“绘制”完成后,必须恢复“设备环境”。