午後わてんのブログ

ベランダ菜園とWindows用アプリ作成(WPFとC#)

DataGridViewを使ってみた、画像を表示

DataGridViewを使ってみた

↑ここ見ながら
 
イメージ 1
下の三行の画像が文字を描画した画像
 
昨日テストしていたListViewに画像を表示するにはImageListに
画像を登録してそこから表示したい画像を選択して表示するという2手必要だった
しかもImageListはサイズが異る画像を登録しても一回決めたサイズに
拡大縮小されてぼやけてしまっていた
今回使ってみたDataGridViewは表示する画像は等倍で表示できるのでぼやけないし
用意した画像をそのまま指定すればいいだけ、素晴らしい
DataGridViewはいままでのクラスと違って使い方が難しそうだけどかなりいろいろなことができるみたい
見た目がエクセルに似ているのも面白いなあ
コードにもエクセルVBAで馴染みのあるcellやRow、Columnがでてくる

 
Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        '        連載:.NETグリッド・コントロール大研究:第1回 .NETの新しいデータグリッドを大解剖 (4/4) - @IT
        'http://www.atmarkit.co.jp/ait/articles/0605/10/news116_4.html

        Dim dgv As New DataGridView()
        With dgv
            .Dock = DockStyle.Fill
            .AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells '行の高さの自動調整
            .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells '列の幅の自動調整
            .AllowUserToAddRows = False
            .ReadOnly = True

        End With

        '列の作成
        Dim column1 As New DataGridViewTextBoxColumn
        column1.HeaderText = "1列目の見出し"
        Dim column2 As New DataGridViewImageColumn
        column2.HeaderText = "2列目の見出し"

        '列の追加
        dgv.Columns.Add(column1)
        dgv.Columns.Add(column2)

        '行の追加、データも同時に追加(アイコンの名前とアイコン画像)
        With dgv.Rows
            .Add("Asterisk", SystemIcons.Asterisk)
            .Add("Error", SystemIcons.Error)
            .Add("Exclamation", SystemIcons.Exclamation)
            .Add("Question", SystemIcons.Question)
            .Add("WinLogo", SystemIcons.WinLogo)
        End With

        '行の追加してからデータの追加
        Dim rowIndex As Integer = dgv.Rows.Add
        With dgv.Rows(rowIndex)
            .Cells(0).Value = "Shield"
            .Cells(1).Value = SystemIcons.Shield
        End With

        '行の追加してからデータの追加その2
        rowIndex = dgv.Rows.Add()
        dgv(0, rowIndex).Value = "Information"
        dgv(1, rowIndex).Value = SystemIcons.Information

        'フォント名とフォント名を画像にしたものを追加
        Dim mozi() As String = {"Meiryo UI", "MS ゴシック", "游ゴシック"} 'フォント名
        Dim myB() As Brush = {New SolidBrush(Color.Red), New SolidBrush(Color.Blue), New SolidBrush(Color.Orange)} '色塗りのブラシ
        Dim img As Image
        '画像作成してレコード(row)を追加
        For i As Integer = 0 To UBound(mozi)
            img = img画像作成(mozi(i), myB(i))
            rowIndex = dgv.Rows.Add
            With dgv.Rows(rowIndex)
                .Cells(0).Value = mozi(i)
                .Cells(1).Value = img
            End With
        Next

        'データグリッドビューをフォームに追加表示
        Me.Controls.Add(dgv)

    End Sub
    Private Function img画像作成(mozi As String, myB As Brush) As Image
        '文字列(フォント名)と色塗りのブラシを受け取って画像を返す
        Dim canvas As New Bitmap(1, 1) '適当な大きさのBitmap
        Dim g As Graphics = Graphics.FromImage(canvas) 'BitmapからGraphicsオブジェクト作成
        Dim myFont As Font
        Dim fSize As Integer = 30       'フォントサイズ
        myFont = New Font(mozi, fSize)  'フォント作成
        Dim drawSize As SizeF = g.MeasureString(mozi, myFont) '文字列を描画してその画像の大きさを測って取得
        Dim w As Integer = CInt(drawSize.Width) '画像の幅
        Dim h As Integer = CInt(drawSize.Height) '画像の高さ
        canvas = New Bitmap(w, h) '測った大きさでBitmap作成
        g = Graphics.FromImage(canvas) 'Graphicsオブジェクト作成
        g.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias '文字の描画のアンチエイリアス

        '文字の描画
        g.DrawString(mozi, myFont, myB, 0, 0)
        g.Dispose() '後片付け

        Return canvas '画像を返す
    End Function
End Class
 

f:id:gogowaten:20191017124421p:plain

画像だとこう

f:id:gogowaten:20191017124432p:plain

デザイン画面はなんにも追加していない

今回のを使って