VC エディットボックスを単語単位で折り返さない方法

 

はじめに

エディットボックス(CEdit)をマルチラインで水平スクロールをOFFにすると、
長い文章を入力した時に、単語単位で折り返してしまいます。

こんな感じを、

こんな感じにしたい。

けれど、プロパティが見つからないんですよね…

※EditBoxの文章は、MSのEditWordBreakProcの説明より引用

 

やり方

どうやら、EditWordBreakProc()と言うコールバック関数を作ってあげて、
単語単位で折り返したくないエディットボックスに設定してあげればいいようです。

 

実装してみる

こちらの記事を参考にさせていただきました。

けど、記事の方法だと、OnChangeEdit1()が呼ばれるたびにコールバックを設定しているので、
私は、OnInitDialog()がいいかなと思って少し変えてみました。

int CALLBACK EditWordBreakProc(LPTSTR lpch, int ichCurrent, int cch, int code)
{
	return (WB_ISDELIMITER == code) ? 0 : ichCurrent;
}

BOOL CXXXXXDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	:
	:

	// TODO: 初期化をここに追加します。
	CEdit * pEdit = (CEdit *)GetDlgItem(IDC_EDIT1);
	::SendMessage(pEdit->m_hWnd, EM_SETWORDBREAKPROC, 0, (LPARAM)EditWordBreakProc);

	return TRUE;
}

EditWordBreakProcと言うコールバックを作成してあげて、
該当のエディットボックスをGetDlgItem()で取得。
その後、SendMessage()でEditWordBreakProcを設定してあげる。
OnInitDialog()あたりは一回呼ばれるのでいいかな?と思いました。

アプリケーション次第では、設定画面で呼んであげる必要があるかもしれませんね。
(単語単位で折り返すのチェックボックスがあるアプリとかね。)

最後に

けっこう、がんばって調べてたんですが、実装はお蔵入りになりそうだったので、
せっかくなのでこちらに紹介しておきました。

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です