なんとか工夫して、Windows7のエクスプローラで表示方法をコンテンツにした時のような見栄えにはできないでしょうか?
具体的な要件は以下の通りです。
1.ViewはDetailsで
2.自分のコード上でサイズ設定した上で、画像を表示するようにしたい
(SmallIconのサイズは小さすぎます)
3.複数行を表示したい
4.item内の文字を、部分部分で変えれるとなおよい
以下文字数制限に引っかかったので、コメント欄に記載します。
VB.NET2008に詳しい方、よろしくお願いします。
複数行や部分的な色を変更するにはオーナードローで行います。
オーナードローでやると、自分でアイコンの絵や、罫線、文字、フォーカス時の
色などは自分で描画する必要があります。
行の高さは、イメージリストのサイズで決まります。
描画はDrawItemイベントやDrawSubItemイベントで行います。
Public Class Form1 Public Sub New() ' この呼び出しは、Windows フォーム デザイナで必要です。 InitializeComponent() ' InitializeComponent() 呼び出しの後で初期化を追加します。 Me.ListView1.View = View.Details Me.ListView1.OwnerDraw = True End Sub Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim files As String() = System.IO.Directory.GetFiles( _ System.Environment.GetFolderPath(Environment.SpecialFolder.Personal), "*", System.IO.SearchOption.TopDirectoryOnly) Dim file As String Dim imageList As New ImageList() Me.ListView1.Columns.Add("ファイル名", 200) Me.ListView1.SmallImageList = imageList Dim width As Integer = 48 Dim height As Integer = 48 imageList.ImageSize = New Size(width, height) Dim idx As Integer = 0 For Each file In files Dim appIcon As Icon appIcon = System.Drawing.Icon.ExtractAssociatedIcon(file) imageList.Images.Add(appIcon.ToBitmap()) Dim fileName As String fileName = System.IO.Path.GetFileName(file) ' リストビューアイテム作成 Dim item As ListViewItem = New ListViewItem(fileName) Me.ListView1.Items.Add(item) Me.ListView1.Items(idx).ImageIndex = idx idx += 1 Next End Sub Private Sub ListView1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawListViewItemEventArgs) Handles ListView1.DrawItem Dim g As Graphics g = e.Graphics Dim drawString As String Dim drawString2 As String drawString = "AAA" + vbCrLf + "BBB" drawString2 = "CCC" + e.ItemIndex.ToString Dim rect As Rectangle rect = e.Bounds '背景描画 If e.Item.Selected = True Then g.FillRectangle(Brushes.SkyBlue, rect) Else g.FillRectangle(Brushes.Yellow, rect) End If '罫線の描画 Using pen As New Pen(Color.Gray) g.DrawRectangle(pen, rect) End Using '文字の描画位置 rect.Location = New Point(e.Bounds.Left + e.Item.ImageList.Images(e.ItemIndex).Width, e.Bounds.Top) '文字を書く g.DrawString(drawString, Me.ListView1.Font, Brushes.Black, rect) Dim stringSize As SizeF = g.MeasureString(drawString, Me.ListView1.Font) '文字を書く g.DrawString(drawString2, Me.ListView1.Font, Brushes.Red, rect.Location.X, rect.Location.Y + stringSize.Height) g.DrawImage(e.Item.ImageList.Images(e.ItemIndex), e.Bounds.Location) End Sub End Class
こんな感じのことをやりたかったのでしょうか?
Details表示でアイコンサイズを変更する方法
フォームにListViewを貼り付けてください。
実行するとマイドキュメント内のファイル名とアイコンを表示します。
Public Class Form1 Public Sub New() ' この呼び出しは、Windows フォーム デザイナで必要です。 InitializeComponent() ' InitializeComponent() 呼び出しの後で初期化を追加します。 Me.ListView1.View = View.Details End Sub Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim files As String() = System.IO.Directory.GetFiles( _ System.Environment.GetFolderPath(Environment.SpecialFolder.Personal), "*", System.IO.SearchOption.TopDirectoryOnly) Dim file As String Dim imageList As New ImageList() Me.ListView1.Columns.Add("ファイル名", 200) Me.ListView1.SmallImageList = imageList Dim width As Integer = 32 Dim height As Integer = 32 imageList.ImageSize = New Size(width, height) Dim idx As Integer = 0 For Each file In files Dim appIcon As Icon appIcon = System.Drawing.Icon.ExtractAssociatedIcon(file) imageList.Images.Add(appIcon.ToBitmap()) Dim fileName As String fileName = System.IO.Path.GetFileName(file) ' リストビューアイテム作成 Dim item As ListViewItem = New ListViewItem(fileName) Me.ListView1.Items.Add(item) Me.ListView1.Items(idx).ImageIndex = idx idx += 1 Next End Sub End Class
heke2meeさんありがとうございます。
まだ実際の動作は確認していないのですが、1と2はImageListで解決できるのですね。
では、3はいかがでしょうか?
heke2meeさんの例であれば、画像の隣にファイル名と作成日時を縦に並べて表示させてみるような感じです。
普通にやってみた場合、listviewには1行の高さを入れるような項目がプロパティを探しても見当たらないですし、改行を入れても無視されて表示される印象です。
複数行や部分的な色を変更するにはオーナードローで行います。
オーナードローでやると、自分でアイコンの絵や、罫線、文字、フォーカス時の
色などは自分で描画する必要があります。
行の高さは、イメージリストのサイズで決まります。
描画はDrawItemイベントやDrawSubItemイベントで行います。
Public Class Form1 Public Sub New() ' この呼び出しは、Windows フォーム デザイナで必要です。 InitializeComponent() ' InitializeComponent() 呼び出しの後で初期化を追加します。 Me.ListView1.View = View.Details Me.ListView1.OwnerDraw = True End Sub Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim files As String() = System.IO.Directory.GetFiles( _ System.Environment.GetFolderPath(Environment.SpecialFolder.Personal), "*", System.IO.SearchOption.TopDirectoryOnly) Dim file As String Dim imageList As New ImageList() Me.ListView1.Columns.Add("ファイル名", 200) Me.ListView1.SmallImageList = imageList Dim width As Integer = 48 Dim height As Integer = 48 imageList.ImageSize = New Size(width, height) Dim idx As Integer = 0 For Each file In files Dim appIcon As Icon appIcon = System.Drawing.Icon.ExtractAssociatedIcon(file) imageList.Images.Add(appIcon.ToBitmap()) Dim fileName As String fileName = System.IO.Path.GetFileName(file) ' リストビューアイテム作成 Dim item As ListViewItem = New ListViewItem(fileName) Me.ListView1.Items.Add(item) Me.ListView1.Items(idx).ImageIndex = idx idx += 1 Next End Sub Private Sub ListView1_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawListViewItemEventArgs) Handles ListView1.DrawItem Dim g As Graphics g = e.Graphics Dim drawString As String Dim drawString2 As String drawString = "AAA" + vbCrLf + "BBB" drawString2 = "CCC" + e.ItemIndex.ToString Dim rect As Rectangle rect = e.Bounds '背景描画 If e.Item.Selected = True Then g.FillRectangle(Brushes.SkyBlue, rect) Else g.FillRectangle(Brushes.Yellow, rect) End If '罫線の描画 Using pen As New Pen(Color.Gray) g.DrawRectangle(pen, rect) End Using '文字の描画位置 rect.Location = New Point(e.Bounds.Left + e.Item.ImageList.Images(e.ItemIndex).Width, e.Bounds.Top) '文字を書く g.DrawString(drawString, Me.ListView1.Font, Brushes.Black, rect) Dim stringSize As SizeF = g.MeasureString(drawString, Me.ListView1.Font) '文字を書く g.DrawString(drawString2, Me.ListView1.Font, Brushes.Red, rect.Location.X, rect.Location.Y + stringSize.Height) g.DrawImage(e.Item.ImageList.Images(e.ItemIndex), e.Bounds.Location) End Sub End Class
heke2meeさん大変ありがとうございます。
ListViewもやればできる子なんですね(ずいぶんコードが必要ですけど)。
試してみましたところ、ヘッダー部分の表示がおかしかったので
Private Sub ListView1_DrawColumnHeader(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DrawListViewColumnHeaderEventArgs) Handles ListView1.DrawColumnHeader
e.DrawDefault = True
End Sub
という表示を付け加えて対応しました。
あと、選択色がBrushes.SkyBlue、非選択色がBrushes.Yellowになっていますが、ここは何とかシステムカラーでできないか調べてみます。
heke2meeさん大変ありがとうございます。
ListViewもやればできる子なんですね(ずいぶんコードが必要ですけど)。
試してみましたところ、ヘッダー部分の表示がおかしかったので
Private Sub ListView1_DrawColumnHeader(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DrawListViewColumnHeaderEventArgs) Handles ListView1.DrawColumnHeader
e.DrawDefault = True
End Sub
という表示を付け加えて対応しました。
あと、選択色がBrushes.SkyBlue、非選択色がBrushes.Yellowになっていますが、ここは何とかシステムカラーでできないか調べてみます。