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

Buttonコントロールの文字折り返しについて

環境/言語:[WinXP(SP2)、VB.NET2003]
分類:[.NET]

はじめまして、以前より参考にさせていただいてましたが、質問は初めてです。

現在VisualBasic.NET 2003でプログラムしています。
ButtonコントロールのTextにセットした文字列が長いと、自動で折り返されるのですが
この折り返しを無効にしたいと思っています。しかしGoogleで調べても見つからず、
またプロパティにもそれと思わしきものが見つかりませんでした。
もしかして強制的に折り返される仕様なのでしょうか。それとも隠れたプロパティか、あるいはクラスを活用することで設定可能なのでしょうか。

最悪はどぼん様の「Buttonの表面を自分で描画する」を参考にして文字を描いてやろうと思っていますが、
できればグラフィック処理をせずに行いたいと思っています。

よろしくお願いします。
■No20759に返信(鶏唐揚さんの記事)
> 最悪はどぼん様の「Buttonの表面を自分で描画する」を参考にして文字を描いてやろうと思っていますが、

こんちは
隠れたプロパティ,,私も知りたいところです・・
最悪に走る前には、Button1.Text = "短い文字列”で済むとは思いますが・・(文字列のMeasureはどぼん様のTipsにありますし)
■No20761に返信(y4yamaさんの記事)
> ■No20759に返信(鶏唐揚さんの記事)
>>最悪はどぼん様の「Buttonの表面を自分で描画する」を参考にして文字を描いてやろうと思っていますが、
>
> こんちは
> 隠れたプロパティ,,私も知りたいところです・・
> 最悪に走る前には、Button1.Text = "短い文字列”で済むとは思いますが・・(文字列のMeasureはどぼん様のTipsにありますし)

はみでてしまうほどの文字列は入れないので大丈夫なのですが、
もともとサードパーティ製のコントロールを使っていたものを、標準コントロールに
したいという案件から発生した問題なのです。
それまでは、はみでてはいないものの、文字とコントロール端との隙間がないくらいギリギリのとこまでの表示がされていました。
(このコントロールは折り返し設定ができる)

しかし、移植してみると、標準Buttonはある程度の隙間が必ずあくようになっており、かつ勝手に折り返しがされるので困っているのです。
文字を小さくしてみる等を試しましたが、収まるまで小さくすると非常に見難くなり、
さらに「完全移植できるならしてくれ」といわれているのでできれば文字サイズも変更したくないというのが本音です。
テキストボックスみたいに折り返し設定があれば悩まずに済んだのですが…という状態です。

よろしくお願いします。
■No20764に返信(鶏唐揚さんの記事)
■No20759に返信(鶏唐揚さんの記事)
> 最悪はどぼん様の「Buttonの表面を自分で描画する」を参考にして文字を描いてやろうと思っていますが、
> できればグラフィック処理をせずに行いたいと思っています。

どうもVB.NET2003だとプロパティなどだけで設定というわけにはいかなそうですね。。。
なぜグラフィック処理をつかいたくないのでしょうか。

ご参照のこちらのどぼん様の「Buttonの表面を自分で描画する」
http://dobon.net/vb/dotnet/control/btnownerdraw.html
のコードで何とかなりませんか。

#私もちょっと試してみました。ご希望どおりにはならないかもしれませんが。

    Private Sub Button1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Button1.Paint
        Dim rect1 As Rectangle = e.ClipRectangle
        rect1.Inflate(-5, -5) '←この5根拠はないです
        Dim brush1 As Brush = New SolidBrush(Button1.BackColor)
        e.Graphics.FillRectangle(brush1, rect1)
        brush1.Dispose()
        Dim sf As StringFormat = New StringFormat
        sf.Alignment = StringAlignment.Center
        sf.LineAlignment = StringAlignment.Center
        sf.FormatFlags = sf.FormatFlags Or StringFormatFlags.NoWrap
        brush1 = New SolidBrush(Button1.ForeColor)
        e.Graphics.DrawString(Button1.Text, Button1.Font, brush1, RectangleF.op_Implicit(Button1.ClientRectangle), sf)
        brush1.Dispose()
    End Sub
お久しぶりです。仕事が忙しくなかなか見れませんでした。

■No20785に返信(IIJIMASさんの記事)
> ■No20764に返信(鶏唐揚さんの記事)
> ■No20759に返信(鶏唐揚さんの記事)
>>最悪はどぼん様の「Buttonの表面を自分で描画する」を参考にして文字を描いてやろうと思っていますが、
>>できればグラフィック処理をせずに行いたいと思っています。
>
> どうもVB.NET2003だとプロパティなどだけで設定というわけにはいかなそうですね。。。
> なぜグラフィック処理をつかいたくないのでしょうか。
>
> ご参照のこちらのどぼん様の「Buttonの表面を自分で描画する」
> http://dobon.net/vb/dotnet/control/btnownerdraw.html
> のコードで何とかなりませんか。
>
> #私もちょっと試してみました。ご希望どおりにはならないかもしれませんが。
>
> Private Sub Button1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Button1.Paint
> Dim rect1 As Rectangle = e.ClipRectangle
> rect1.Inflate(-5, -5) '←この5根拠はないです
> Dim brush1 As Brush = New SolidBrush(Button1.BackColor)
> e.Graphics.FillRectangle(brush1, rect1)
> brush1.Dispose()
> Dim sf As StringFormat = New StringFormat
> sf.Alignment = StringAlignment.Center
> sf.LineAlignment = StringAlignment.Center
> sf.FormatFlags = sf.FormatFlags Or StringFormatFlags.NoWrap
> brush1 = New SolidBrush(Button1.ForeColor)
> e.Graphics.DrawString(Button1.Text, Button1.Font, brush1, RectangleF.op_Implicit(Button1.ClientRectangle), sf)
> brush1.Dispose()
> End Sub
既存アプリケーション(複数ある)のサードパーティコントロールを排除する作業、
いわゆる移植のようなものなので、現状のロジックを崩したくなかったのですが
グラフィック描画方法だとスパゲティになりそうだったため、
手っ取り早くプロパティでできないかと思ったのです。

無理そうなのでIIJIMAS様とどぼん様のコードを参考に、グラフィック描画でやってみようと思います。
ありがとうございました。
解決済み!

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