在Pocket PC设备上实现一个字体选择对话框是一个常见的需求,尤其是在需要用户自定义文本显示样式的应用程序中。本文将介绍如何创建一个具有ClearType支持的字体选择对话框,并展示其实现过程。
该字体选择对话框具备以下特点:
对话框的布局基于Pocket Excel,允许在SIP(软键盘)弹出时使用。
对话框作为一个属性页实现,可以轻松集成到自己的属性页中。示例项目使用了自定义的CCePropertySheet类来封装它。
该类使用两个公共成员与用户进行交互:
m_logFont
:一个LOGFONT变量,用于接收和返回字体定义。可以直接在CreateFontIndirect中使用。m_strPreview
:一个CString变量,用于接收希望在预览中渲染的文本。默认值是"AaBbCcXxYyZz"。通过调用EnumFontFamilies函数枚举字体族。此函数接收一个回调函数指针,该指针将填充字体组合框。当对话框初始化时,它会尝试将m_logFont中指定的字体与组合框中的内容匹配。如果无法匹配字体名称和大小,对话框将设置适当的组合框中的名称和大小。对话框不准备接收一个干净的m_logFont,在使用对话框之前,必须填写它。
ClearType支持取决于系统是否支持它。请检查设备供应商,以确定设备是否支持ClearType。
创建具有ClearType属性的字体非常简单,只需将LOGFONT结构的lfQuality成员指定为5即可。
使用对话框非常简单:
void CChildView::OnChooseFont() {
CCePropertySheet sheet(_T("Choose Font"));
CChooseFontPage page;
// 创建默认字体
page.m_logFont.lfHeight = -11;
page.m_logFont.lfWidth = 0;
page.m_logFont.lfEscapement = 0;
page.m_logFont.lfOrientation = 0;
page.m_logFont.lfWeight = FW_NORMAL;
page.m_logFont.lfItalic = FALSE;
page.m_logFont.lfUnderline = FALSE;
page.m_logFont.lfStrikeOut = 0;
page.m_logFont.lfCharSet = ANSI_CHARSET;
page.m_logFont.lfOutPrecision = OUT_DEFAULT_PRECIS;
page.m_logFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
page.m_logFont.lfQuality = DEFAULT_QUALITY;
page.m_logFont.lfPitchAndFamily = DEFAULT_PITCH | FF_SWISS;
_tcscpy(page.m_logFont.lfFaceName, TEXT("Tahoma"));
sheet.AddPage(&page);
sheet.DoModal();
}
退出时,m_logFont变量将包含新的字体定义,准备使用。