2012-09-13 253 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