Last Updated 2011/04/30
Programming Tips Visual C++ MFC GDI  索 引 
TextOutで改行処理
2004/06/18

TextOut() にて改行させながら文字を描画する方法を考える.

スペースのみで切り出しを行う,非常に安易な改行処理が以下である.
ビューの横幅にて改行位置が変わるのが分かる.
(ウィンドウの大きさを変更させる)

static void DrawFunction(CDC& dc, LPCTSTR psz, int nWidth)
{
    const int nLength = _tcslen(psz) + 1;

    // _tcstok() を使用する為文字列を複写
    TCHAR* const pszBuffer = new TCHAR[ nLength ];
    memcpy(pszBuffer, psz, sizeof(TCHAR) * nLength);

    const LPCTSTR pszSep = _T(" ");  // デリミタ文字群
    bool bTop = true;

    dc.SetTextAlign(TA_LEFT | TA_TOP | TA_UPDATECP);
    dc.MoveTo(0, 0);    // 原点は 0, 0 とする

    for(LPTSTR pszToken = _tcstok(pszBuffer, pszSep);
        pszToken != NULL; pszToken = _tcstok(NULL, pszSep) ) {

        const CString str(pszToken);
        const CSize size = dc.GetOutputTextExtent(str);
        const CPoint point = dc.GetCurrentPosition();
        if( point.x + size.cx > nWidth ) {
            // 文字の高さが行中で不変の場合
            dc.MoveTo(0, point.y + size.cy);    // 改行
            bTop = true;
        }
        //  フォントや色の設定が必要なら行う
        dc.TextOut(0, 0, bTop ? str : (CString(' ') + str));
        bTop = false;
    }

    delete[] pszBuffer;
}


void CTestView::OnDraw(CDC* pDC)
{
    // ドキュメントから取得すべき文字列をここでは仮に以下のものとする
    static const TCHAR  psz[] =
    _T("abc def ghi jklmno pqrs tuv wx yz "
       "ABC D E FG HI JKL MNO PQ RS TU VWXYZ"
       "abc def ghi jklmno pqrs tuv wx yz "
       "ABC D E FG HI JKL MNO PQ RS TU VWXYZ");

    CRect               rect;
    GetClientRect(&rect);   // ここでは仮に描画の度に Get
    ASSERT_VALID(pDC);
    DrawFunction(*pDC, psz, rect.Width());
}


参照
TextOutとDrawText
前後のTips
TextOutで改行処理

DSS ProgrammingTipsCGI Ver2.02