2008-03-27

VC++>CRichEditCtrl>指定文字数で折り返す





cricheditctrl_string.png
制限なし
cricheditctrl_limitstring.png
制限あり(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

posted by travis at 16:30 | Comment(0) | TrackBack(0) | VC++
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。