家・車以外で、人生で一番奮発した買い物

お世話になります。
ListBoxで1行に収まらない場合、スクロールバーで全て表示することはできるのですが、
これをスクロールバー非表示で折返し表示(改行)して表示したいのですができますか?
あと、ListBoxの行間のサイズを変えることはできるのでしょうか?

よろしくお願いします。

A 回答 (2件)

1. MeasureItemイベントで文字数から必要な矩形を計算し、e.ItemWidthとe.ItemHeightに設定


2. DrawItemイベントで、e.Bounsに指定された矩形に文字列を描画
この2点がポイントになります。

回答の正誤確認のためコードを書いたのでそのまま載せておきます。各項目の高さが分かるように枠を描画しています。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
ListBox1.DrawMode = Windows.Forms.DrawMode.OwnerDrawVariable

ListBox1.Items.Add("aaa")
ListBox1.Items.Add("abcdefghijklmnopqrstuvwxyz")
ListBox1.Items.Add("あいうえおかきくけこさしすせそたちつてと")
ListBox1.Items.Add("012345678901234567890123456789")
ListBox1.Items.Add("aaa")
ListBox1.Items.Add("abcdefghijklmnopqrstuvwxyz")
ListBox1.Items.Add("あいうえおかきくけこさしすせそたちつてと")
ListBox1.Items.Add("012345678901234567890123456789")
End Sub

Private Sub ListBox1_MeasureItem(ByVal sender As Object, ByVal e As System.Windows.Forms.MeasureItemEventArgs) Handles ListBox1.MeasureItem
Dim size As System.Drawing.SizeF
e.Graphics.PageUnit = Drawing.GraphicsUnit.Pixel
' ListBoxの幅で固定して高さを計測
size = e.Graphics.MeasureString(ListBox1.Items(e.Index).ToString, ListBox1.Font, ListBox1.ClientSize.Width)
e.ItemWidth = Convert.ToInt32(size.Width)
e.ItemHeight = Convert.ToInt32(size.Height)
End Sub

Private Sub ListBox1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles ListBox1.DrawItem

If CBool(e.State And Windows.Forms.DrawItemState.Selected) Then
e.Graphics.FillRectangle(Drawing.Brushes.Blue, e.Bounds)
e.Graphics.DrawString(ListBox1.Items(e.Index).ToString, ListBox1.Font, Drawing.Brushes.White, e.Bounds)

Else
e.Graphics.FillRectangle(Drawing.Brushes.White, e.Bounds)
e.Graphics.DrawRectangle(Drawing.Pens.Pink, e.Bounds)
e.Graphics.DrawString(ListBox1.Items(e.Index).ToString, ListBox1.Font, Drawing.Brushes.Black, e.Bounds)

End If

End Sub
「ListBoxで改行したい」の回答画像2
    • good
    • 2
この回答へのお礼

上記の方法で無事解決できました!
ありがとうございました!

お礼日時:2009/09/13 01:07

オーナードローを使う必要があると思います。


.NET系なら比較的簡単に出来ますが、VB6/VBAだとWinAPIと格闘することになります。

.NET系でのオーナードロー
http://dobon.net/vb/dotnet/control/lbownerdraw.h …

VB6については過去ログにありました。
http://okwave.jp/qa1637047.html

この回答への補足

回答ありがとうございます!
.NET系なのでオーナードローでできそうです。
ですが、、1行に収まらない場合の改行ができません・・・。
行高さを文字数で変えてみたのですが、行高さのみが変わり、
改行とならず、1行に表示されたままです。
どのようにすればいいのでしょうか?

補足日時:2009/09/06 23:28
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A