1

. void CMainWindow::OnPaint() { CPaintDC DC(これ); //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 の 1 つのみ) を使用する場合、OffSetX と OffSetY が 1 で rc(5, 5, 191, 99) の場合、描画されるテキストは完璧です。しかし、OffSetX と OffSetY を 0.2 と rc(1, 1, 38, 19) に変更すると、テキストは右下から切り捨てられます。これは、上記のフォント サイズが 1 つだけで、他のフォントが正常に機能し、描画されたテキストが適切にスケーリングされている場合にのみ発生します。

フォントには 1 つのフォント サイズがあるためDrawText、すべての場合にこのフォント サイズを使用しており、指定された rect が小さすぎてこのテキストに対応できないため、少数の文字しか表示されていません。これらのズーム条件でテキストが拡大縮小されるように、修正できる方法はありますか。これは、上記のシナリオでズームイン操作を実行すると、MFC プロジェクトの 1 つで得られる動作です。

これに対する提案や代替案は非常に役に立ち、高く評価されます。

ありがとう。

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 に答える