改进我在Listview中绘制SubItems以吸收Windows外观的方式

时间:2013-12-17 13:20:24

标签: .net vb.net winforms listview user-controls

我想改进我的绘图,以便在调整列时调整默认窗口Listview在每个子项字符串末尾绘制的...个字符,就像您在此视频中看到的那样:

http://www.youtube.com/watch?v=J8LghvmLB4E

这是我用来绘制子项的代码:

    Dim bounds As Rectangle = e.Bounds
    bounds.X += 5
    bounds.Width -= 5

    Select Case e.Header.TextAlign

        Case HorizontalAlignment.Left

            TextRenderer.DrawText(e.Graphics, e.SubItem.Text, e.SubItem.Font,
                                  bounds, e.SubItem.ForeColor,
                                  TextFormatFlags.Left)

        Case HorizontalAlignment.Center

            TextRenderer.DrawText(e.Graphics, e.SubItem.Text, e.SubItem.Font,
                                  bounds, e.SubItem.ForeColor,
                                  TextFormatFlags.GlyphOverhangPadding Or TextFormatFlags.HorizontalCenter)

        Case HorizontalAlignment.Right
            TextRenderer.DrawText(e.Graphics, e.SubItem.Text, e.SubItem.Font,
                                  bounds, e.SubItem.ForeColor,
                                  TextFormatFlags.Right)

    End Select

1 个答案:

答案 0 :(得分:1)

我认为TextRenderer可能是错误的做法。如果使用DrawString,其中一个重载包含StringFormat参数:

Graphics.DrawString(String, System.Drawing.Font, Drawing.Brush,
              Drawing.RectangleF, Drawing.StringFormat)

您可以创建StringFormat来控制文字的呈现方式,其中一个选项是StringTrimming,这样您就可以指定ellipsis('...')。这些是:

    StringTrimming.EllipsisCharacter
    StringTrimming.EllipsisPath
    StringTrimming.EllipsisWord
    StringTrimming.Word         ' just chops at a word

与他们一起玩,看看你最喜欢哪一个。

我没有多少使用TextRenderer,但其重载包括TextFormatFlags允许一些省略号(EndEllipsis)。我不知道它的格式与StringFormat方法不同,但它看起来并不广泛 - 可能是一个印章。