2008-03-27

VC++>CRichEditCtrl>ワードブレークを解除する





cricheditctrl_limitstring.png
ワードブレークあり

cricheditctrl_limitstring_wordbreak_off.png
ワードブレークなし



※「ヘヴィメタル」の赤文字がワードブレーク対象

ワードブレークを解除します。

1.自前のWordBreakProcを設定します。
::SendMessage(m_edit.m_hWnd, EM_SETWORDBREAKPROC, (WPARAM)0, (LPARAM)EditWordBreakProc);

2.自前のWordBreakProcを実装します。
// .h
static int CALLBACK EditWordBreakProc(LPTSTR lpch, int ichCurrent, int cch, int code);
// .cpp
int CALLBACK CTestDlg::EditWordBreakProc(LPTSTR lpch, int ichCurrect, int cch, int code)
{
// ワードブレイク処理を握りつぶす
return 0;
}

元ネタ
テキストボックス入力にて、ワード単位をコントロールに認識させないためには
MSDN:EM_SETWORDBREAKPROC Message
MSDN:EditWordBreakProc


追記080327
真面目にEditWordBreakを実装する場合は以下が参考になりそう。
[HOWTO] RichEdit コントロールに EditWordBreak プロシージャを実装する方法


VC6/SP5/MFC, XP/SP1
posted by travis at 16:45 | Comment(0) | TrackBack(0) | VC++

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++

2008-03-27

VC++>CRichEditCtrl>折り返しのOn/Off

右端での折り返しのOn/Off。
SetTargetDevice関数、またはEM_SETTARGETDEVICEメッセージを使います。
// CRichEditCtrl m_richedit;
::SendMessage(m_richedit.m_hWnd, EM_SETTARGETDEVICE, 0, 0); // 折り返しOn
::SendMessage(m_richedit.m_hWnd, EM_SETTARGETDEVICE, 0, 1); // 折り返しOff

元ネタ
Richeditで右端折り返しのON/OFF
MSDN:EM_SETTARGETDEVICE Message


VC6/SP5/MFC, XP/SP1
posted by travis at 16:09 | Comment(0) | TrackBack(0) | VC++

2007-10-30

雑記>AS3+αが◎

ちょっとづつAS3.0が分かり始めた気がするようでしない今日この頃。
出来ること、向き不向きもちょっと分かり始めた…かな?

「やりたい事」がそもそもぼんやりしてはいるんだけど、AS3+αが◎。

だと気づいて、ネット徘徊して情報読み漁ったり。


で、気づいた。
どうも拙者WEBプログラム全般に大変興味がある模様…マゾだねぇ。
Web、DB、Linux全てまったく無知、だから苦手(逆かも…)なのに。

キビシイなぁ…。
ま、ちょっと分かりかけが一番面白い訳で(謎説く予兆というか、今すこぶる楽しい、自虐的に)
んな訳で暫らく大風呂敷広げて色々試してみる所存。
posted by travis at 19:26 | Comment(0) | TrackBack(0) | 雑記

2007-10-30

VC++>warning C4786

VC++6.0でSTLのヘッダーファイルを取り込むと、warning C4786が発生する場合がある。
これはデバッグ情報で使われる識別子が長すぎる警告。

これを避けるには、
#pragma warning (disable:4786)

を使えば警告が出なくなります。
posted by travis at 16:42 | Comment(0) | TrackBack(0) | VC++

広告


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

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

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


×

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