图形变亮/像素化的原因

时间:2017-12-23 22:40:57

标签: .net vb.net graphics

我让组合框画出这样的字体名称:

Private Sub cboFontName_DrawItem(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles cboFontName.DrawItem

    e.DrawBackground()
    If (e.State And DrawItemState.Focus) <> 0 Then
        e.DrawFocusRectangle()
    End If
    Dim objBrush As Brush = Nothing
    Try
        If e.Index > -1 Then
            objBrush = New SolidBrush(e.ForeColor)
            Dim sFontName As String = Me.cboFontName.Items(e.Index).ToString
            Dim nFont As Font = Nothing
            Dim nFontFamily = New FontFamily(sFontName)
            If nFontFamily.IsStyleAvailable(FontStyle.Regular) Then
                nFont = New Font(nFontFamily, 14, FontStyle.Regular)
            ElseIf nFontFamily.IsStyleAvailable(FontStyle.Bold) Then
                nFont = New Font(nFontFamily, 14, FontStyle.Bold)
            ElseIf nFontFamily.IsStyleAvailable(FontStyle.Italic) Then
                nFont = New Font(nFontFamily, 14, FontStyle.Italic)
            End If
            e.Graphics.DrawString(sFontName, nFont, objBrush, e.Bounds)
        End If
    Finally
        If objBrush IsNot Nothing Then
            objBrush.Dispose()
        End If
        objBrush = Nothing
    End Try

End Sub

它一直很好,但是现在(我不知道我改变了什么),字体呈现锐利/像素化:

左边是看起来像之前的变化(漂亮而流畅),右边是当前的像素化版本。

enter image description here

此外,某些第三方控件突然呈现像素化,因此它似乎是应用程序范围内的效果。我无法控制这些第三方控件如何呈现文本。

我真的不知道是什么导致了这一点。

这是什么原因?

当我打电话

    e.Graphics.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias

......它再次平稳,但我确实发誓以前我不必这样做。我现在才发现它。

ps:右边的屏幕截图来自一个沙盒Windows,我在那里运行了旧的版本,所以不要对不同的滚动条外观感到惊讶。它曾经在非沙盒的Windows上运行良好。

以下是我在Windows设置中禁用ClearType时的外观: enter image description here

1 个答案:

答案 0 :(得分:0)

我找到了罪魁祸首:

由于某种原因,此行会导致此行为:

g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias

但是我不知道为什么这样做导致像素化错误,并且在所有其他形式中也是如此,尽管我不在其他形式中使用此代码。

具体来说,我在下面的代码中使用它。 当我注释掉“g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias”这一行时,一切正常。

Public Sub DrawTextWEx(ByRef uBitmap As Bitmap, ByVal uText As String, ByVal uColor As Color, ByVal uStringFormat As StringFormat, ByRef uFont As Font, ByRef uAvailableRect As Rectangle)

    Using g As Graphics = Graphics.FromImage(uBitmap)
        g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias
        Using nBrush As New System.Drawing.SolidBrush(uColor)
            g.DrawString(uText, uFont, nBrush, uAvailableRect, uStringFormat)
        End Using
    End Using

End Sub