2010-10-01 4 views
3

Voici la méthode OnPaint d'un contrôle qui hérite simplement de contrôle et fournit une propriété pour obtenir/définir la textrenderinghint:bug possible avec Graphics.DrawString et TextRenderingHint en .Net Winforms

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 

Maintenant, si vous placez deux d'entre eux sur un formulaire, laissez le premier par défaut et changez le second en AntiAlias, il semble très bien au moment de la conception, mais lorsque vous exécutez l'application, le mode de rendu de la première étiquette a changé. C'est comme si la méthode DrawString avait changé le systemdefault.

Voici quelques observations:

(1) Si je mets le mode de explicity le premier contrôle à ClearTypeGridFit, qui est la même que la valeur par défaut dans mon cas, il résout le problème. (2) Si vous placez un troisième contrôle sur le formulaire et laissez le mode par défaut, il résout le problème.

(3) TextRenderer.DrawText ne réplique pas le problème. (4) Si j'hérite du contrôle d'étiquette et remplace la méthode onpaint pour définir le mode de rendu, le problème n'est pas répliqué même si j'ai défini UseCompatibleTextRendering - qui force le label à rendre DrawString au lieu de DrawText.

Je suis sur XP avec cleartype activé et en utilisant Visual Studio 2008 Express Edition.

ETA: Je l'ai essayé en C# et la même chose arrive

Répondre

1

Cela ressemble à la question que nous avons rencontrés auparavant. Dans le code de démarrage de votre application, appelez-vous Application.SetCompatibleTextRenderingDefault (true)? (Ou il peut être mis à faux, j'oublie). Si oui, basculez l'état de ce booléen pour changer le mode de rendu du texte et il devrait fonctionner comme prévu.

+0

Malheureusement, il n'y a pas d'appel. Je serais surpris si cela a résolu le problème, car je dessine le texte moi-même et j'utilise explicitement la méthode gdi + drawstring. Aussi, avec mon observation 2, ci-dessus, cela semble être une question plus profonde. – Jules

+0

Ok. Cela vaut peut-être encore la peine d'ajouter un coup de fil, ajoutez cet appel au démarrage de votre application. Essayez avec SetCompatibleTextRenderingDefault (true) et SetCompatibleTextRenderingDefault (false) et voyez quel effet il a sur votre application. Cela fait un moment, après être passé à WPF depuis longtemps, mais j'ai l'impression que cela a un effet même sur les trucs de DrawString. –

0

J'ai eu un problème similaire. J'ai appelé ceci:

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

Mon code de démarrage ressemblait à ceci:

[STAThread] 
static void Main(string[] args) 
{ 
    Application.EnableVisualStyles(); 
    Application.SetCompatibleTextRenderingDefault(false); 

Alors j'ai essayé ce que Juda Himango suggéré et tout fonctionnait très bien.
Cela ressemble vraiment à un bug pour moi!

donc Assurez-vous que vous appelez:

Application.SetCompatibleTextRenderingDefault(true); 

a marché pour moi!