1

. 无效 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;
}

在所有提到的情况下输出

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

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

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

谢谢。

4

1 回答 1

0

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

const int SIZE_IN_POINTS = 12;
LogFont.lfHeight = -MulDiv(SIZE_IN_POINTS, DC.GetDeviceCaps(LOGPIXELSY), 72);
于 2012-09-19T07:05:58.907 回答