在一个Print(CDC *pDC, CPrintInfo *pInfo)函数中有如下代码,意在改变当前字体用以打印:CFont ft;
ft.CreatePointFont(120,"MS Sans Serif");
ft.GetLogFont(&lg);
pDC->SelectObject(&ft);
pDC->GetTextFace(str);可是令人不解的是,str得到的却总是“宋体”,应该是"MS Sans Serif"才对??
为什么会这样希望大家指点指点,先谢了。
ft.CreatePointFont(120,"MS Sans Serif");
ft.GetLogFont(&lg);
pDC->SelectObject(&ft);
pDC->GetTextFace(str);可是令人不解的是,str得到的却总是“宋体”,应该是"MS Sans Serif"才对??
为什么会这样希望大家指点指点,先谢了。
CString str;
pDC->GetCurrentFont()->GetLogFont(&lf);
pDC->GetTextFace(str);
中断后发现:
lf.lfFaceName = "System";
str = "宋体";
不明白此时pDC用的到底是哪种字体……
// select the font object into a DC (device context) for text
// drawing, and finally delete the font object.CClientDC dc(this);CFont font;
VERIFY(font.CreatePointFont(120, _T("Arial"), &dc));// Use the font you just created.
CFont* def_font = dc.SelectObject(&font);
dc.ExtTextOut(5, 5, ETO_OPAQUE, NULL, _T("Hello"), NULL);
dc.SelectObject(def_font);// Finished with the font, now delete the font object.
font.DeleteObject();
原来使用"MS Sans Serif"创建字体时,并没有创建成功,但是CreatePointFont仍然返回1。
而且GetLogFont(&lg)查看该字体的名称也填充了"MS Sans Serif"!给人以错觉,以为成功了。
可是系统却使用了默认字体,于是出现了str得到的是“宋体”。
只有当使用无效字体时,系统才会使用默认字体,可见"MS Sans Serif"是个错误的字体名称。正确的应该使用"Microsoft Sans Serif"创建字体,这时pDC->GetTextFace(str);
str得到的才是"Microsoft Sans Serif"。
MS Sans Serif 是早先的bitmap字体,适合用于屏幕显示
Microsoft Sans Serif 是新近的TrueType字体, 适合用于屏幕显示和打印。
在打印时由于选择的Bitmap字体MS Sans Serif,不适合打印,系统自动选择了默认字体进行打印。所以在OnDraw中使用MS Sans Serif字体时没有问题的,而在OnPrint中就不能使用该字体了,应该选用适合打印的TrueType字体。