1、输出文字
要在窗口描画文字或图像,首先要先取得设备文本(Device Contexts)。取设备文本一般有2种方法,BeginPaint()函数和GetDC()函数。描画结束后必须调用EndPaint()函数和ReleaseDC()来释放设备文本。
要在窗口的某个位置描画文字,必须取窗口的有效区域(ClientRect),因为窗口的边框、菜单、工具条、状态条等部分是不能利用的。例如,要在窗口的正中间写一个字,用窗口宽度和高度的一半来取正中位置是不对的,除非这个窗口无任何边框、菜单、工具条、状态条等。正确的方法是先定义一个区域变量(类型为RECT),然后用GetClientRect()函数取出窗口有效区域放入这个变量中。最后,调用DrawText()函数在矩形区输出文字。所谓区域类型RECT其实就是一个存放矩形块座标的结构体,下面是RECT的原型。
typedef struct tagRECT
{
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;
case WM_PAINT: //重画窗口消息
hdc = BeginPaint(hWnd, &ps);//开始描画
// TODO: Add any drawing code here...
RECT rt;
GetClientRect(hWnd, &rt);//取窗口有效区域
DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);//显示文字
EndPaint(hWnd, &ps);//结束描画
break;
使用BeginPaint()函数、EndPaint()函数时会同时得到一个结构体,里面有画图时的一些状态,一般为系统保留使用。
设置字体颜色:SetTextColor()
WINGDIAPI COLORREF WINAPI SetTextColor (HDC, COLORREF) //COLORREF -->DWORD-->unsigned long 前两个字节保留,后边是蓝绿红
如:SetTextColor(hdc, RGB(255, 0, 0));//0x0000FF 红色
设置文字背景色:SetBkColor
COLORREF SetBkColor( HDC hdc, COLORREF crColor );
设置背景模式:SetBkMode
mode是要设置的模式,其值可以为OPAQUE和TRANSPARENT
OPAQUE的方式是用当前背景的画刷的颜色输出显示文字的背景,而TRANSPARENT是使用透明的输出,也就是文字的背景是不改变的。
说白点,如果当前的SetBkColor是蓝色,而窗体是白色,那么SetBkMode为OPAQUE时,文字的背景色就是蓝色,设置为TRANSPARENT时,背景色就是白色,或者说是没有背景色
另外一种文字输出 :TextOut
GetDC()函数与BeginPaint()函数的区别
在BeginPaint()函数的帮助上清楚地写着,这个函数将自动更新有效区。原来窗口只要发生任何改变,操作系统都会发送一个WM_PAINT消息来通知窗口刷新,在
WM_PAINT中使用BeginPaint()函数,这个函数自动告诉操作系统窗口已经是最新的了。而GetDC()没有这个功能,因此GetDC()一般不用于WM_PAINT消息中,如果一定要在WM_PAINT中使用,那就要用ValidateRect()函数来手动刷新窗口。
case WM_PAINT:
hdc = GetDC (hWnd);SetTextColor(hdc, 0x0000FF);
SetBkColor(hdc, 0xCDFAFF);
TextOut(hdc,30,20,szHello,(int)strlen(szHello));
//下面三行程序如果没有,窗口不正常地闪动
RECT rt;
GetClientRect(hWnd, &rt);
ValidateRect(hWnd, &rt); //让窗口有效区变得有效
ReleaseDC (hWnd, hdc);
break;
2、创建字体
CreateFont()
SelectObject()
。。。
SelectObject()
DeleteObject()
在一行中显示不下时,可以改变字体的大小来使一行能够显示。字体和后面章节中讲到的画笔、画刷的使用方法是一样的,都是调用SelectObject()函数来把字体句柄与设备文本句柄进行绑定,同时得到绑定前的字体句柄,用完之后,不能忘记把原来的字体句柄绑定回去,这样,后面如果还有程序的话,可以不受任何影响。
创建字体是用CreateFont()函数来实现的,这儿说的“创建字体”并不是自创一个欧体还是柳体,而是创建一个字体对象,其中包括文字的宽度、高度、角度等许多信息。创建的字体用完之后也一定要手动删除,删除字体用DeleteObject()函数。
例子:
TCHAR str[] = "123";
PAINTSTRUCT ps;
HDC hdc;
HFONT hFont, hFontOld;
int width, height;
case WM_PAINT:
RECT rc;
hdc = BeginPaint(hWnd, &ps);
GetClientRect(hWnd, &rc);
SetBkMode(hdc, TRANSPARENT);
width = (rc.right - 20) / (int)strlen(str);
height = rc.bottom - 20;
hFont = CreateFont(
height, //字体的逻辑高度
width, //逻辑平均字符宽度
0, //与水平线的角度
0, //基线方位角度
FW_REGULAR, //字形:常规
FALSE, //字形:斜体
FALSE, //字形:下划线
FALSE, //字形:粗体
GB2312_CHARSET, //字符集
OUT_DEFAULT_PRECIS, //输出精度
CLIP_DEFAULT_PRECIS, //剪截精度
PROOF_QUALITY, //输出品质
FIXED_PITCH | FF_MODERN, //倾斜度
"隶书" //字体
);
hFontOld = (HFONT)SelectObject(hdc, hFont);//选择字体
SetTextColor(hdc, 0xC0C0C0);
TextOut(hdc, 10, 10, str, (int)strlen(str));
SelectObject(hdc, hFontOld);//选择旧字体
DeleteObject(hFont); //删除新字体
EndPaint(hWnd, &ps);
break;