Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .Net Winforms中Graphics.DrawString和TextRenderingHint可能存在错误_C#_.net_Vb.net_Textrenderer - Fatal编程技术网

C# .Net Winforms中Graphics.DrawString和TextRenderingHint可能存在错误

C# .Net Winforms中Graphics.DrawString和TextRenderingHint可能存在错误,c#,.net,vb.net,textrenderer,C#,.net,Vb.net,Textrenderer,下面是控件的OnPaint方法,该方法仅从控件继承,并提供用于获取/设置textrenderinghint的属性: Private _mode as TextRenderingHint = SystemDefault. Public Property Mode as TextRenderingHint Get & Set _mode ... Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.P

下面是控件的OnPaint方法,该方法仅从控件继承,并提供用于获取/设置textrenderinghint的属性:

 Private _mode as TextRenderingHint = SystemDefault.
 Public Property Mode as TextRenderingHint
    Get & Set _mode
 ...

 Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
    Dim g = e.Graphics
    Dim savMode = g.Save
    g.TextRenderingHint = Me._mode
    g.DrawString(Me.Text, Me.Font, Brushes.Black, 0, 0)
    g.Restore(savMode)
    MyBase.OnPaint(e)
 End Sub
现在,如果将其中两个放置在表单上,将第一个保留为默认值,并将第二个更改为AntiAlias,则在设计时看起来不错,但在运行应用程序时,第一个标签的呈现模式已更改。就好像DrawString方法已经更改了systemdefault

以下是一些观察结果:

(1) 如果我明确地将第一个控件的模式设置为ClearTypeGridFit,这与本例中的默认模式相同,它将修复问题

(2) 如果在窗体上放置第三个控件并保持默认模式,则会修复问题

(3) TextRenderer.DrawText不会复制该问题

(4) 如果我继承label控件并重写onpaint方法以设置渲染模式,则即使我设置了UseCompatibleTextRendering,也不会复制问题-这将强制标签使用DrawString而不是DrawText进行渲染

我在XP上启用了cleartype并使用VisualStudio2008Express版


埃塔:我在C#中试过,同样的情况也发生了

这听起来像是我们以前遇到的问题。在应用程序启动代码中,是否调用Application.SetCompatibleTextRenderingDefault(true)?(或者我忘了它可能被设置为false)


如果是这样,请切换该bool的状态以更改文本呈现模式,它应该可以按预期工作。

我也遇到了类似的问题。我称之为:

Image i = new Bitmap(size, size);
Graphics g = Graphics.FromImage(i);

// When this line is uncommented TextRenderingHint is broken for ALL other Graphics-Objects.
// Setting "g.TextRenderingHint" later works sometimes in unpredictable ways.
//g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
...
我的启动代码如下所示:

[STAThread]
static void Main(string[] args)
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
然后我尝试了Judah Himango的建议,一切都很顺利。
这对我来说绝对像个虫子

所以,只要确保你打电话:

    Application.SetCompatibleTextRenderingDefault(true);

为我工作

不幸的是没有电话。但是,如果这真的解决了问题,我会感到惊讶,因为我自己正在绘制文本,并显式地使用gdi+drawstring方法。另外,根据我上面的观察2,这似乎是一个更深层次的问题。可能仍然值得一试,将该调用添加到应用程序启动中。尝试使用SetCompatibleTextRenderingDefault(true)和SetCompatibleTextRenderingDefault(false),看看它对应用程序有什么影响。已经有一段时间了,很久没有换成WPF了,但我似乎记得这甚至对抽绳的东西也有影响。