图一
用户可以在这个对话框中选择活动窗口、消息框以及文字的颜色和字体。你可以调用SystemParametersInfo函数,用SPI_GETNONCLIENTMETRICS作为第一个参数来查出用户选择了什么字体;SystemParametersInfo 函数将你需要的信息填写到NONCLIENTMETRICS 结构中:
// NONCLIENTMETRICS 结构(winuser.h)
//
struct NONCLIENTMETRICS
{
UINT cbSize;
int iBorderWidth;
int iScrollWidth;
int iScrollHeight;
int iCaptionWidth;
int iCaptionHeight;
LOGFONT lfCaptionFont;
int iSmCaptionWidth;
int iSmCaptionHeight;
LOGFONT lfSmCaptionFont;
int iMenuWidth;
int iMenuHeight;
LOGFONT lfMenuFont;
LOGFONT lfStatusFont;
LOGFONT lfMessageFont;
};
这个结构含有用于菜单、消息及其它字体的LOGFONT结构。一旦你有了字体,那如何知道显示给定的文本串需要多大的屏幕空间?这是Windows编程的一个共同问题。所幸的是,Windows中有一个专门的函数,用它可以在屏幕的任何地方显示文本,这个函数就是 DrawText。在Windows中这是一个基本的文本显示函数。它的功能是在指定的屏幕坐标上显示(或者说绘制)文本串。
CDC dc = ...;
CRect rc = ...;
CString str = "Hello";
dc.DrawText(str, &rc, 0);
DrawText 在你指定的矩形框中显示文本-但是如果你不知道这个矩形应该是多大,该怎么办呢?这时有一个很容易的办法来计算矩形大小:
CRect rc(0,0,0,0);
dc.DrawText(str, &rc, DT_CALCRECT);
DrawText实际上并不绘制文本,而是计算出文本需要多少空间。DrawText改变传入矩形的大小以便适应文本的宽度和高度。调用DrawText之后,rc.Widtrh和rc.Height将返回文本的宽度和高度。你可以用希望的左上角坐标初始化CRect,即(rc.left,rc.top)代替(0,0)。然后DrawText将根据文本宽度和高度产生有下脚坐标。
当然,前面的代码段假设字体的设备上下文已经选定。仅仅用LOGFONT怎能行呢?如果你已经有一个DC,因为MFC把它传给你了(例如,当MFC调用视图的CView::OnDraw或宿主绘画项的CWnd::OnDrawItem时),你可以使用提供的DC作为你的设备上下文;否则,你必须调用下面的两个CDC创建函数之一。
// 创建客户DC
CClientDC dc(pMyWnd);
或者
// 创建window DC
CWindowDC dc(pMyWnd);
因为你不想真的画任何东西,所以使用那个设备上下文并不重要。只要你是创建屏幕DC-相对于打印机或者其它的设备而言,调用任何的CDC创建函数都行(除非你想要一个打印机的设备上下文)。
一旦你有了设备上下文,你就得创建字体对象并将它选进DC。这是标准的Windows图形编程。
// 创建字体
CFont font;
font.CreateFontIndirect(&ncm.lfMessageFont);
// 将字体选进DC
CFont* pOldFont = dc.SelectObject(&font);
// 计算文本大小
dc.DrawText(str, rc, DT_CALCRECT);
// 回复旧字体-这是必须的
dc.SelectObject(pOldFont);
(完)