LPARAM lParam) {
PAINTSTRUCT ps;
RECT rect, rectCli;
HBRUSH hbrOld;
HDC hdc;
INT i, cy;
DWORD dwColorTable[] = {0x00000000, 0x00808080,
0x00cccccc, 0x00ffffff};
GetClientRect (hWnd, &rectCli);
hdc = BeginPaint (hWnd, &ps);
// Get the height and length of the string.
DrawText (hdc, TEXT ("Hello Windows CE"), -1, &rect,
DT_CALCRECT | DT_CENTER | DT_SINGLELINE);
cy = rect.bottom - rect.top + 5;
// Draw black rectangle on right half of window.
hbrOld = (HBRUSH)SelectObject (hdc, GetStockObject (BLACK_BRUSH));
Rectangle (hdc, rectCli.left + (rectCli.right - rectCli.left) / 2,
rectCli.top, rectCli.right, rectCli.bottom);
SelectObject (hdc, hbrOld);
rectCli.bottom = rectCli.top + cy;
SetBkMode (hdc, TRANSPARENT);
for (i = 0; i < 4; i++) {
SetTextColor (hdc, dwColorTable[i]);
SetBkColor (hdc, dwColorTable[3-i]);
DrawText (hdc, TEXT ("Hello Windows CE"), -1, &rectCli,
DT_CENTER | DT_SINGLELINE);
rectCli.top += cy;
rectCli.bottom += cy;
}
SetBkMode (hdc, OPAQUE);
for (i = 0; i < 4; i++) {
SetTextColor (hdc, dwColorTable[i]);
SetBkColor (hdc, dwColorTable[3-i]);
DrawText (hdc, TEXT ("Hello Windows CE"), -1, &rectCli,
DT_CENTER | DT_SINGLELINE);
rectCli.top += cy;
rectCli.bottom += cy;
}
EndPaint (hWnd, &ps);
return 0;
}
//----------------------------------------------------------------------
// DoDestroyMain - Process WM_DESTROY message for window.
//
LRESULT DoDestroyMain (HWND hWnd, UINT wMsg, WPARAM wParam,
LPARAM lParam) {
PostQuitMessage (0);
return 0;
}
TextDemo的实质内容在OnPaintMain函数里。对DrawText的第一次调用并没有在设备环境上画任何东西。相反,使用DT_CALCRECT标志指示Windows将文本串的矩形尺寸存在rect里。该信息用于计算字符串的高度,并存储在cy里。接下来,在窗口的右侧绘制了一个黑色矩形。我将在本章稍后一些讨论如何绘制一个矩形。该矩形用来在文本被书写之前,产生两个不同的背景。函数接下来用不同的前景色、背景色在透明和不透明模式下输出了 同样的字符串。程序结果如图2-2所示:
头四行使用透明模式来绘制。后四行使用不透明模式来绘制。文本颜色从黑到白,每行使用不同的颜色,同时背景色设置为从白到黑。在透明模式下,背景色是无关紧要的,因为并不使用该背景色。但是在不通明模式下,背景色欣然出现在每行里。
图2-2(略):TextDemo展示了文本色、背景色以及背景模式之间的关系。
字体
如果Windows提供的全部灵活性就是设置前景色和背景色,那我们还是回到MS-DOS和字符属性时代的好。有证据表明,Windows同MS-DOS最显著的变化就是Windows可改变显示文本字体的能力。所有Windows操作系统都是建立在WYS/WYG-所见即所得-的概念上的,而采用可变字体就是达到这一目的的一个主要手段。
在所有Windows操作系统里都有两种字体类型-光栅型(raster)和TrueType型。光栅型字体存储为位图,即小的像素图像,每个字符都有一个。光栅字体容易存储和使用,但有一个重要问题:不能很好的缩放。就像小图放大时出现锯齿纹一样,光栅字体放大到更大的字体时会出现锯齿纹。
TrueType字体解决了缩放问题。它不是存储成图象,每个TrueType字符存都存储成如何绘制字符的描述信息。作为在屏幕上绘制字符的Windows功能的一部分,字体引擎获得描述信息,并按需要的尺寸在屏幕上绘制字符。一个Windows CE系统支持TrueType或光栅字体,但不会同时支持。幸运的是,对光栅字体和TrueType字体来说,编程接口都是一样的,这减少了Windows 开发者对字体技术的担忧,毕竟字体技术用在所有应用里,也是最让人吃力的技术之一。
Windows CE里的字体函数同Windows其它版本中的字体函数很相近。从创建字体、选择进DC到最后删除字体,让我们看一下字体生存周期中用到的函数吧。如何查询当前字体以及枚举可使用的字体等,都会在下面几节里涉及到。