![]() 制限なし | ![]() 制限あり(16文字) |
SetRect関数を使い、表示領域を限定する事で折り返します。
これにはCRichEditCtrl作成時に水平オートスクロール(ES_AUTOHSCROLL)をOFFにしておく必要があります。
// CRichEditCtrl m_richedit;
1.SetDefaultCharFormat関数で固定ピッチフォントを指定します。
// デフォルト書式設定
CHARFORMAT cf;
cf.cbSize = sizeof(CHARFORMAT);
cf.dwMask = CFM_SIZE | CFM_FACE;
m_richedit.GetDefaultCharFormat(cf); // 取得
strcpy(cf.szFaceName, "MS ゴシック"); // 固定ピッチフォント
m_richedit.SetDefaultCharFormat(cf); // 新たに設定
2.次に指定したフォントサイズ(Twip単位)をPixel単位に変換します。
// Twip -> Pixel
CDC* pDC = GetDC();
int PixelY = (int)( ((double)cf.yHeight / 1440.0) * (double)pDC->GetDeviceCaps(LOGPIXELSY) );
ReleaseDC(pDC);
3.書式指定用の四角形をフォントサイズ(Pixel単位)から指定文字数分の幅に設定します。
// 描画領域を設定する事で文字制限する
#define LIMIT_FONT_COUNT 16
CRect rc;
m_richedit.GetRect(&rc);
int width = PixelY * LIMIT_FONT_COUNT; // 必要な幅(pixel)
if( rc.Width() > width )
{
// rc.leftにoffsetを入れる
int w = rc.Width()-width;
rc.right = rc.left + width; // 拡張
}
else
{
// 水平スクロールが自動的に現れるのを期待したが、
// 残念ながら小は大を兼ねないようです。
}
m_richedit.SetRect(&rc); // 表示領域設定
追記080327
もっと簡単に折り返しを幅制限出来る方法がありました。深くは調べてないのですが、
// 簡単に文字数制限が出来る。でも指定数より-1になる。
m_richedit.SetTargetDevice(pDC->GetSafeHdc(), cf.yHeight * (LIMIT_FONT_COUNT+1));
MSDNに
WYSIWYG書式化で使われるターゲット デバイスと行幅を設定します。
とあるので、行幅はTwip単位で指定する模様。
VC6/SP5/MFC, XP/SP1