2012-09-13 193 views
1

。无效CMainWindow :: OnPaint() { CPaintDC DC(this); // CRect rc(5,5,191,99); CRect rc(1,1,38,19); CRect rc(1,1,38,19);如何使用MFC的DrawText在字体大小只有一种字体大小时缩放字体

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

当使用系统或使用fixedsys字体(其仅具有一个字体大小10和9 RESP)然后在绘制的文本是在壳体完美当OFFSETX和OFFSETY是1和rc(5, 5,191,99)。但是,如果我将OffSetX和OffSetY更改为0.2和rc(1,1,38,19),则文本如果从右下方截断。只有在使用上面提到的只有一种字体大小的字体并且其他字体正常工作并且文本绘制得到适当缩放时,情况才是这种情况。

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

任何建议或替代这将是非常有益的和可观的。

谢谢。

回答

0

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

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

是的当然!我也用这个得到了这个值。但只是为了在这里解释我的场景。我用这些常数。 – dearvivekkumar

+0

我认为这个问题是因为固定大小的字体是位图,而不是可缩放的真正类型的字体。 – dearvivekkumar

+0

尝试在写字板中使用'System'字体。作品。您是否尝试在SIZE_IN_POINTS值而不是最终的lfHeight值上执行缩放乘法? – l33t