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

TextBoxのEnabledをFalseにすると折り返ししない

環境/言語:[WindowsXP,VB.NET,NET Framework2.0]
分類:[.NET]

はじめて投稿させていただきます。
最近VB2005のExpressEditionにて開発を始めました。
どなたかご教示願えませんか?

textBoxのEnabledをFalseにしたときに文字の色が黒のままにしたいのですが、
うまくいきません。

こちらのhttp://dobon.net/vb/dotnet/control/tbenabledfalse.html#section1の「自分で描画する」を参考にさせていただきました。

ところがEnabledをFalseにするとMultilineがTrueなのに
自動折り返しがなくなっていまいます。

ex:「あああ →「あああああ」
   ああ」

よろしくお願いいたします。
> こちらのhttp://dobon.net/vb/dotnet/control/tbenabledfalse.html#section1の「自分で描画する」を参考にさせていただきました。

そのURLに記述のあるReadOnlyを使う方法ではダメですか?
ダメな場合はなぜダメなのかも説明された方がよいと思います。

> ところがEnabledをFalseにするとMultilineがTrueなのに
> 自動折り返しがなくなっていまいます。

「自分で描画する」方法ですから、折り返しも含めて自分で描画しなければなりません。
#特に調査はしていませんが、普通にTextBoxを使った場合とまったく同じ折り返し状態を
#実現しようとするとかなりめんどくさい処理になるだろうと予想できます。
よねKENさま

ご回答ありがとうございます。

> 「自分で描画する」方法ですから、折り返しも含めて自分で描画しなければなりません。
> #特に調査はしていませんが、普通にTextBoxを使った場合とまったく同じ折り返し状態を
> #実現しようとするとかなりめんどくさい処理になるだろうと予想できます。
>

「折り返しも含めて自分で描画」した場合にどのくらいに大変になるかも、
検討がつきませんでしたのでご質問させていただきました。
もしかしたら1行コーディングすれば済むのでは・・・なんて
浅はかな考えでした。

> そのURLに記述のあるReadOnlyを使う方法ではダメですか?
> ダメな場合はなぜダメなのかも説明された方がよいと思います。

ダメという明確な理由は特にありません。
ReadOnlyの場合、Enabledと同じようにするには
未入力時の背景色の変更とフォーカスが当たらないようにする対応が
必要になるからです。
また、現在かなり開発が進んでしまい、今からReadOnlyに変更するよりも
Enabledのままの方が、ゴールが近いように見えたためです。

お聞きした感じですと、「折り返しも含めて自分で描画」は大変そうですね。。
うーん。。
> お聞きした感じですと、「折り返しも含めて自分で描画」は大変そうですね。。
> うーん。。

「折り返しも含めて自分で描画」、元のサンプルコードに書くとこんな感じで
しょうか。GraphicsのMeasureStringを使うと文字を出力する際の幅か調べら
れます。
(下記では、描画が完全には一致しません。若干ずれます。)

'TextBoxを描画する
Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
MyBase.OnPaint(e)
Dim b As New System.Drawing.SolidBrush(Me.ForeColor)

Dim row As Integer = 0'出力する行数
Dim Num As Integer = 0'テキストの何文字目か
Dim DrawText As String'出力するテキスト

Do While Num < Me.TextLength
DrawText = ""

Do While True
If Me.Text(Num) <> ControlChars.Lf Then '改行かどうか
DrawText = DrawText & Me.Text(Num)

Num += 1
Else
Num += 1
Exit Do
End If
'描画する文字の幅がコントロールの幅以上ならループを抜け、描画
If e.Graphics.MeasureString(DrawText, Me.Font).Width >= Me.Width Then Exit Do
End If

If Num >= Me.TextLength Then '次の文字がなければ終了
Exit Do
End If
Loop
'文字列を描画する
e.Graphics.DrawString(DrawText, Me.Font, b, -1, 1 + Me.Font.Height * row)
row += 1
Loop

b.Dispose()
End Sub

> ReadOnlyの場合、Enabledと同じようにするには
> 未入力時の背景色の変更とフォーカスが当たらないようにする対応が
> 必要になるからです。

EnabledプロパティがFalseになったときに、BackColorを変更する。
GotFocusイベントで、EnabledプロパティがFalseはForm1とかにフォーカスを飛ばす。
それだけなら、自分で書くのは4行程度。
こっちのほうが簡単かもしれませんね(^^;

と歩さま

遅い時間にも関わらず、ありがとうございます。

作成していただいたサンプルをもとのもう一度考えて見ます。

>
> EnabledプロパティがFalseになったときに、BackColorを変更する。
> GotFocusイベントで、EnabledプロパティがFalseはForm1とかにフォーカスを飛ばす。
> それだけなら、自分で書くのは4行程度。
> こっちのほうが簡単かもしれませんね(^^;

⇒これはかなり画期的な気がします。(目からウロコでした)
 こちらも試してみます。

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

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