C#ListView DrawSubitem字体已更改

时间:2014-10-12 11:34:47

标签: c# listview fonts charts

我的函数“listView1_DrawSubItem”有问题。我只更改第二列,因为我必须在第二列中放置一些图像。 问题在于FONT。当我绘制第二列时,字体比第一列更清晰。只有当我第一次打开图表表格时,它才会出现。 正如它在代码中显示的那样,第一列默认为drawinng,第二列是由我绘制的。

有一个这样的形象。以全分辨率观看它。 With chart, without chart

这是我的代码:

fo是我可以改变的字体。

private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
    {
        if (e.Header != this.columnHeader2)
        {
            e.DrawDefault = true;
            return;
        }

        if (e.Item.SubItems[1].Text == "1")
        {
            e.DrawBackground();
            e.Graphics.DrawImage(Properties.Resources.Blank_Badge_Green, e.SubItem.Bounds.Location.X, e.SubItem.Bounds.Location.Y, 10, 10);
        }
        else if (e.Item.SubItems[1].Text == "0")
        {
            e.DrawBackground();
            e.Graphics.DrawImage(Properties.Resources.Blank_Badge_Grey, e.SubItem.Bounds.Location.X, e.SubItem.Bounds.Location.Y, 10, 10);
        }
        else
        {
            e.DrawBackground();
            e.Graphics.DrawString(e.SubItem.Text, fo, new SolidBrush(e.SubItem.ForeColor), e.SubItem.Bounds.Location.X, e.SubItem.Bounds.Location.Y);
        }
    }

    private void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)
    {
        e.DrawDefault = true;
    }

2 个答案:

答案 0 :(得分:3)

   e.Graphics.DrawString(...)

两个问题。第一个是您使用的方法,ListView在引擎盖下使用TextRenderer.DrawText()。当您使用SysInternals的ZoomIt(推荐)这样的实用程序时,第二个问题是显而易见的,您会看到在没有蓝色/红色抗锯齿像素的情况下渲染令人讨厌的文本。您需要设置Graphics.TextRenderingHint属性以避免这种情况。

所以,粗略地说:

else
{
    e.DrawBackground();
    e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
    TextRenderer.DrawText(e.Graphics, ...);
}

答案 1 :(得分:0)

您很可能必须测试您绘制的图形的各种SmoothingModes:

    e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
    e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
    e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighSpeed;
    e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.None;

尝试查看哪种匹配最符合系统绘制单元格的质量!

在绘制文本之前设置它!

理论上,其他一些属性可能会有所不同:

int e.Graphics.TextContrast    // for adding a gamma correction
e.Graphics.InterpolationMode   // for resizing images
e.Graphics.CompositingMode     // for combining an image with the pixels below
e.Graphics.CompositingQuality  // controls the quality thereof

但最有可能的是SmoothingMode。