MFCのエディットボックスで自動改行させない話

管理人のタツです。

仕事で詰まった話を紹介します。

ダイアログでエディットボックスを作成し、文字を入れます。

この後にもう一文字oを入れると

Cooperatioが下に自動改行されてしまいます。

まぁ、普通ですよね。

英語の記事とかWordで英文作成する際も、このように自動改行されます。

単語の途中で改行されるのはあまり見ない気がします。

ただし、今回この処理をどうしてもしたくなかったので、
(つまり、右端まで埋めて単語の途中でも改行させたかったので)色々調べていました。

すると、以下のサイトを参考にすると解消できたので、紹介します。

エディットボックスの自動折り返し | zoro0nine
エディットボックスを右端で自動折り返ししたい時サンプルstatic int CALLBACK EditWordBreakProc( LPTSTR , int , int , int );BEGIN_MESSAGE_MAP...

余談ですが、JOCVはJapan Overseas Cooperation Volunteersの略です。

実験

ダイアログ作成

Visual Studio 2022で試します。

プロジェクトを新規作成。

プロジェクト名 ・ソリューション名はTurnBackとかでいいでしょう。

アプリケーションの種類をダイアログベースにして作成。

さっそくエディットボックスを配置しちゃいます。

比較用に2つエディットボックスを用意しました。

左のエディットボックスのIDはIDC_EDIT_NO_TURN。
右のエディットボックスのIDはIDC_EDIT_TURN。

今回、折り返しを行いたいので、
プロパティで自動HScrollFalseに設定しておきます。

さらにもう一つ、これだけだと端まで文字を入れたらそれ以上何も入らないので、
複数行Trueにしておきます。

これで右端まで文字が埋まると、下に折り返されるようになります。

IDC_EDIT_TURNの方も忘れずに。

いったんビルド。

はい、折り返されているのを確認。

処理追加

上記参考サイトを真似してみます。

TurnBackDlg.cppに3点追加

①関数宣言

DoDataExchangeの真下に以下を入れておきます。

static int CALLBACK EditWordBreakProc(LPTSTR, int, int, int);

②関数処理

OnInitDialogの真上に以下を追加。

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

③エディットボックスに適用

OnInitDialog内に処理を追加します。

今回、左のIDC_EDIT_NO_TURNはそのままにしておいて、
右のIDC_EDIT_TURNの方だけ適用させます。

処理は以下の通り。

CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT_TURN);
::SendMessage(pEdit->m_hWnd, EM_SETWORDBREAKPROC, 0, (LPARAM)EditWordBreakProc);

ビルド

ビルドしてexeを開きます。

今回入力する文字は「I am a mathematician.」

mathematicianのところで折り返す or 折り返さないの違いが見ることができればOKです。

結果は…

OKです( ´∀`)bグッ!

最後に

以上、エディットボックスの文字を自動改行させない処理の紹介でした。

多分、日常生活ではこの処理の方が稀な気がしますが、
業務によってはこの自動改行させない方が習慣になってるところはあるんですかね?

コメント

タイトルとURLをコピーしました