如何使用MFC的DrawText在font-face只有一个字体大小时缩放字体

时间:2012-09-13 08:52:04

标签: visual-c++ mfc fonts

。     void CMainWindow :: OnPaint()     {         CPaintDC DC(this);         // CRect rc(5,5,191,99);         CRect rc(1,1,38,19);

    CBrush brush(DC.GetBkColor());  
    CBrush* pOldBrush = DC.SelectObject(&brush); 
    DC.FillRect(&rc, &brush);
    DC.SelectObject(pOldBrush);

    DC.SetBkMode(TRANSPARENT);

    LOGFONT LogFont;
    LogFont.lfHeight        = -13;
    LogFont.lfWidth         = 0;
    LogFont.lfEscapement        = 0;
    LogFont.lfOrientation       = 0;
    LogFont.lfWeight        = 400;
    LogFont.lfItalic        = 0;
    LogFont.lfUnderline     = 0;
    LogFont.lfStrikeOut     = 0;
    LogFont.lfCharSet       = 0;
    LogFont.lfOutPrecision      = 0;
    LogFont.lfClipPrecision     = 0;
    LogFont.lfQuality       = 0;
    LogFont.lfPitchAndFamily    = 0;
    wcscpy_s(LogFont.lfFaceName,    _T("System"));

    //float OffSetY = 1.0;
    //float OffSetX = 1.0;

    float OffSetY = 0.2;
    float OffSetX = 0.2;
    LogFont.lfHeight        = (int)(LogFont.lfHeight * OffSetY); 
    LogFont.lfWidth         = (int)(LogFont.lfWidth * OffSetX); 

    CFont* pFont = new CFont;
    pFont->CreateFontIndirect(&LogFont); 

    CFont* pOldFont = DC.SelectObject( pFont );

    CString sTemp(_T("Title  current_folder\r\nField1\r\nComment:\r\nControl #:\r\nDescription:\r\nMagnification:\r\n"));
    sTemp.Replace(_T("&"), _T("&&"));

    int alignment = 0;
    switch(alignment)
    {
    case 1:
        DC.DrawText(sTemp, -1, rc, DT_WORDBREAK | DT_RIGHT | DT_EDITCONTROL);
        break;

    case 2:                                                       
        DC.DrawText(sTemp, -1, rc, DT_WORDBREAK | DT_CENTER | DT_EDITCONTROL);
        break;

    default:
        DC.DrawText(sTemp, -1, rc, DT_WORDBREAK | DT_EDITCONTROL);
        break;   
    }

    DC.SelectObject( pOldFont );

    delete pFont;
}

output at all the cases mentioned

当使用System或FixedSys字体(只有一个字体大小为10和9时)时,如果OffSetX和OffSetY为1且rc(5,5,191,99),则在绘制的文本中是完美的。但如果我将OffSetX和OffSetY更改为0.2和rc(1,1,38,19),则文本将从右下角截断。只有当使用上面提到的只有一个字体大小的字体并且其他字体工作正常并且正确缩放文本时,才会出现这种情况。

由于字体具有一个字体大小,因此DrawText在所有情况下都使用此字体大小,并且给定的rect太小而无法容纳此文本,因此它仅显示少数字符。 有什么方法可以修复它,以便在这些缩放条件下缩放文本。当我在上述场景中执行放大操作时,这是我在MFC项目中获得的行为。

对此的任何建议或替代方案都将非常有用和可观。

感谢。

1 个答案:

答案 0 :(得分:0)

不要硬编码你的字体大小!相反,执行必要的计算:

const int SIZE_IN_POINTS = 12;
LogFont.lfHeight = -MulDiv(SIZE_IN_POINTS, DC.GetDeviceCaps(LOGPIXELSY), 72);