目录
设置字体
MFC提供了一个CFont类专门用来设置字体。这个类派生于CGdiObject类,封装了一个Windows图形设备接口(GDI)的字体。在实际编程时,在构造了一个CFont对象后,还必须利用该类提供的几个初始化函数之一对该对象进行初始化,然后才能使用这个对象。CFont类提供的初始化函数有:
■ CreateFont
■ CreateFontIndirect
■ CreatePointFont
■ CreatePointFontIndirect
这些初始化函数的作用主要是将CFont这个C++对象与字体资源关联起来。本例将使用CreatePointFont这个初始化函数,其声明形式如下所示。
CFont::CreatePointFont
BOOL CreatePointFont(int nPointSize, LPCTSTR lpszFaceName, CDC* pDC = NULL);
该函数带有三个参数,各个参数的含义如下所述。
■ nPointSize设置将要创建的字体的高度,单位是一个点的十分之一。例如,如果该参数值为120,那么要求创建一个12个点的字体。
■ lpszFaceName字体的名称,就像Word中使用的“楷体”“宋体”这些字体名称一样。
在VisualStudio开发环境中,可以看到这些字体的名称,方法是单击【工具】菜单下的【选项】菜单命令,这时会弹出“选项”对话框,在左边的列表框中展开“环境”节点,选中“字体和颜色”,接下来就可以在“字体”的下拉列表中看到所有可用的字体名称,如下图所示。
但是, Visual Studio开发环境支持的字体还是少了一些,我们可以在机器的系统目录下看到系统已安装的所有字体。系统目录是Windows。在系统目录下有一个Fonts目录,在该目录下列出的内容就是操作系统已安装的字体。我们编写的程序并不能够对所有这些字体提供支持,程序支持哪些字体,需要通过试验才能知道。
■ pDC这是一个 CDC 对象的指针,用来把 nPointSize 中指定的高度转换为逻辑单位。如果其值为空,就使用一个屏幕设备描述表来完成这种转换。
在程序中,与其他GDI对象一样,当创建了一个字体对象并初始化后,还必须将它选入设备描述表,之后这个新字体才能发挥作用。这可以利用CDC类的SelectObject函数来实现,同样,该函数会返回先前的字体,我们可以保存这个字体,在使用完新字体后,再把设备描述表中的字体恢复为先前的字体。
在OnChar函数中添加了字体的设置之后,该函数完整的代码如例所示。
CFont font;
font, CreatePointFont(300, _T("华文行楷"), NULL);
CFont *pOldFont = dc.SelectObject(&font);
dc.SelectObject(pOldFont);
void CTextView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CClientDC dc(this);
CFont font;
font, CreatePointFont(300, _T("华文行楷"), NULL);
CFont *pOldFont = dc.SelectObject(&font);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
if (0x0d == nChar)
{
m_strLine.Empty();
m_ptOrigin.y += tm.tmHeight;
}
else if (0x08 == nChar)
{
COLORREF clr = dc.SetTextColor(dc.GetBkColor());
dc.TextOut(m_ptOrigin.x, m_ptOrigin.y, m_strLine);
m_strLine = m_strLine.Left(m_strLine.GetLength() - 1);
dc.SetTextColor(clr);
}
else
{
m_strLine += (TCHAR)nChar;
}
CSize sz = dc.GetTextExtent(m_strLine);
CPoint pt;
pt.x = m_ptOrigin.x + sz.cx;
pt.y = m_ptOrigin.y;
SetCaretPos(pt);
dc.TextOut(m_ptOrigin.x, m_ptOrigin.y, m_strLine);
dc.SelectObject(pOldFont);
CView::OnChar(nChar, n