DOBON.NET DOBON.NETプログラミング掲示板過去ログ

RichTextBoxで入力文字が途中で自動で折り返す

環境/言語:[Windows7 VB.NET2010 FrameWork4.0]
分類:[.NET]


RichTextBoxに文字をMultiline=true,WordWrap=trueで複数行表示される設定にしているのですが、実行して文字を入力すると勝手に折り返して表示する事があります。
枠の最後で折り返す方法が判らず投稿させて頂きました。
よろしくお願いします。


入力枠イメージ
--------------------------------------------------
|A123456789A123456789A   |
|123456789A123456789A    |
|123456789A123456789A    |
--------------------------------------------------
                      ↑勝手に折り返して表示される
                       改行コードは入っていません
以下のパターンはきれいに表示される。
--------------------------------------------------
|ABCDEFGHIJKLMNOPQRSTUVWX|
|YZABCDEFGHIJKLMNOPQRSTUV|
|WXYZABCDEFGHIJKLMNOPQRST|
--------------------------------------------------
■No32152に返信(みけんにしわさんの記事)
> 実行して文字を入力すると勝手に折り返して表示する事があります。
全角の数字部分が原因かと思います。いわゆる『禁則処理』ですね。


> 枠の最後で折り返す方法が判らず投稿させて頂きました。
EM_SETWORDBREAKPROC を SendMessage すれば解除できます。


Imports System.Runtime.InteropServices
Public Class Form1
    Private Const EM_SETWORDBREAKPROC As Integer = &HD0
    Private Const WB_ISDELIMITER As Integer = 2

    ' http://msdn.microsoft.com/ja-jp/library/cc410811.aspx
    Delegate Function EditWordBreakProc(lpch As IntPtr, ichCurrent As Integer, cch As Integer, code As Integer) As Integer

    <DllImport("user32")> _
    Shared Function SendMessage(hWnd As IntPtr, msgId As Integer, wParam As IntPtr, lParam As EditWordBreakProc) As IntPtr
    End Function

    Private callback As EditWordBreakProc

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        callback = Function(lpch, ichCurrent, cch, code) If(code = WB_ISDELIMITER, 0, ichCurrent)
        SendMessage(RichTextBox1.Handle, EM_SETWORDBREAKPROC, IntPtr.Zero, callback)
    End Sub
End Class


上記は手抜きなので、ダブルクリックでの単語選択や、
[Ctrl]+[→] での単語単位の移動などには対応できていません。
必要に応じて、コールバック関数を書き換えてみてください。
魔界の仮面弁士さま

おもった表示にできるようになりました。

『禁則処理』、、、
恥ずかしながら、言葉をしりませんでした。

ありがとうございました。


■No32155に返信(魔界の仮面弁士さんの記事)
> ■No32152に返信(みけんにしわさんの記事)
>>実行して文字を入力すると勝手に折り返して表示する事があります。
> 全角の数字部分が原因かと思います。いわゆる『禁則処理』ですね。
>
>
>>枠の最後で折り返す方法が判らず投稿させて頂きました。
> EM_SETWORDBREAKPROC を SendMessage すれば解除できます。
>
>
> Imports System.Runtime.InteropServices
> Public Class Form1
> Private Const EM_SETWORDBREAKPROC As Integer = &HD0
> Private Const WB_ISDELIMITER As Integer = 2
>
> ' http://msdn.microsoft.com/ja-jp/library/cc410811.aspx
> Delegate Function EditWordBreakProc(lpch As IntPtr, ichCurrent As Integer, cch As Integer, code As Integer) As Integer
>
> <DllImport("user32")> _
> Shared Function SendMessage(hWnd As IntPtr, msgId As Integer, wParam As IntPtr, lParam As EditWordBreakProc) As IntPtr
> End Function
>
> Private callback As EditWordBreakProc
>
> Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
> callback = Function(lpch, ichCurrent, cch, code) If(code = WB_ISDELIMITER, 0, ichCurrent)
> SendMessage(RichTextBox1.Handle, EM_SETWORDBREAKPROC, IntPtr.Zero, callback)
> End Sub
> End Class
>
>
> 上記は手抜きなので、ダブルクリックでの単語選択や、
> [Ctrl]+[→] での単語単位の移動などには対応できていません。
> 必要に応じて、コールバック関数を書き換えてみてください。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板