• ベストアンサー

ListBoxで改行したい

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

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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

bo281
質問者

お礼

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

その他の回答 (1)

回答No.1

オーナードローを使う必要があると思います。 .NET系なら比較的簡単に出来ますが、VB6/VBAだとWinAPIと格闘することになります。 .NET系でのオーナードロー http://dobon.net/vb/dotnet/control/lbownerdraw.html VB6については過去ログにありました。 http://okwave.jp/qa1637047.html

bo281
質問者

補足

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

関連するQ&A