3

コントロールから単純に継承し、textrenderinghint を取得/設定するプロパティを提供するコントロールの OnPaint メソッドを次に示します。

 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

これらのうちの 2 つをフォームに配置し、最初のラベルをデフォルトのままにして、2 番目のラベルを AntiAlias に変更すると、デザイン時には問題なく見えますが、アプリを実行すると、最初のラベルのレンダリング モードが変更されます。DrawString メソッドがシステムのデフォルトを変更したかのようです。

ここにいくつかの観察があります:

(1) 最初のコントロールのモードを私の場合のデフォルトと同じ ClearTypeGridFit に明示的に設定すると、問題が修正されます。

(2) フォームに 3 番目のコントロールを配置し、デフォルト モードのままにすると、問題が修正されます。

(3) TextRenderer.DrawText は問題を再現しません。

(4) ラベル コントロールを継承し、onpaint メソッドをオーバーライドしてレンダリング モードを設定すると、UseCompatibleTextRendering を設定しても問題は再現されません。これにより、ラベルは DrawText ではなく DrawString でレンダリングされます。

私は XP で cleartype を有効にし、Visual Studio 2008 Express Edition を使用しています。

ETA: C# で試してみましたが、同じことが起こります

4

2 に答える 2

1

これは、以前に遭遇した問題のようです。アプリのスタートアップ コードに、Application.SetCompatibleTextRenderingDefault(true) への呼び出しがありますか? (または、false に設定されている可能性があります。忘れてしまいました)。

その場合は、その bool の状態を切り替えてテキスト レンダリング モードを変更すると、期待どおりに動作するはずです。

于 2010-10-01T19:33:34.793 に答える
0

同様の問題がありました。私はこれを呼んだ:

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);

それから、ユダ・ヒマンゴが提案したことを試してみたところ、すべてうまくいきました。
これは間違いなく私にはバグのように見えます!

したがって、必ず次のように呼び出してください。

    Application.SetCompatibleTextRenderingDefault(true);

私のために働いた!

于 2011-11-13T11:58:57.323 に答える