在一个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"才对??
为什么会这样希望大家指点指点,先谢了。

解决方案 »

  1.   

    Print(CDC *pDC, CPrintInfo *pInfo)函数最开始写了段调试代码:LOGFONT lf;
    CString str;
    pDC->GetCurrentFont()->GetLogFont(&lf);
    pDC->GetTextFace(str);
    中断后发现:
    lf.lfFaceName = "System";
    str = "宋体"; 
    不明白此时pDC用的到底是哪种字体……
      

  2.   

    // This code fragment shows how to create a font object,
    // 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();
      

  3.   

    找到原因了:
    原来使用"MS Sans Serif"创建字体时,并没有创建成功,但是CreatePointFont仍然返回1。
    而且GetLogFont(&lg)查看该字体的名称也填充了"MS Sans Serif"!给人以错觉,以为成功了。
    可是系统却使用了默认字体,于是出现了str得到的是“宋体”。
    只有当使用无效字体时,系统才会使用默认字体,可见"MS Sans Serif"是个错误的字体名称。正确的应该使用"Microsoft Sans Serif"创建字体,这时pDC->GetTextFace(str);
    str得到的才是"Microsoft Sans Serif"。
      

  4.   

    不知道我的结论是否正确,有没有人使用"MS Sans Serif"成功创建字体?
      

  5.   

    经过进一步求证,得知:
    MS Sans Serif 是早先的bitmap字体,适合用于屏幕显示
    Microsoft Sans Serif 是新近的TrueType字体, 适合用于屏幕显示和打印。
    在打印时由于选择的Bitmap字体MS Sans Serif,不适合打印,系统自动选择了默认字体进行打印。所以在OnDraw中使用MS Sans Serif字体时没有问题的,而在OnPrint中就不能使用该字体了,应该选用适合打印的TrueType字体。