2010-09-15 22 views
3

J'utilise une jauge personnalisée, basée sur l'exemple fourni avec Delphi (5 Enterprise). Pour ceux qui ne le savent pas, c'est comme une barre de progression lisse, mais affiche le pourcentage ou la valeur au centre (verticalement et horizontalement) du composant.Existe-t-il un moyen de désactiver l'anti aliasing de police lors de l'utilisation de TextRect (aka ExtTextOut dans GDI32) dans Delphi?

Pour être sûr que le texte est lisible à la fois lorsque la jauge est pleine et lorsqu'elle est vide, le texte est affiché en utilisant des couleurs inversées. Lorsque l'anticrénelage des polices est utilisé, ces couleurs inversées font apparaître le bord de la police dans des couleurs vraiment folles, ce qui ruine l'aspect du composant.

Est-il possible de désactiver le lissage/l'anti-crénelage des polices pour ce seul composant ou de le désactiver, de dessiner le texte, puis de le réactiver? Ma solution actuelle consiste à utiliser une police qui n'est pas lissée, comme "MS Sans Serif", mais je voudrais utiliser la même police que le reste de l'interface utilisateur pour la cohérence.

+1

Ne pas utiliser anticrénelage ruines du composant sous-pixel. Refonte –

+1

Inverser simplement les couleurs ne signifie pas que le texte sera lisible. L'inverse du gris est toujours gris. Vous avez quatre couleurs, non? L'utilisateur peut choisir la couleur d'arrière-plan du contrôle et la couleur de la barre de progression, mais je vous offrirai seulement un paramètre de couleur pour le texte quand il doit y en avoir clairement deux. Vous devez proposer des paramètres pour le texte qui apparaît sur la barre de progression colorée, ainsi que pour le texte qui s'affiche en arrière-plan. Laissez l'utilisateur choisir de bonnes couleurs contrastantes. (Il existe également des moyens de choisir automatiquement des couleurs contrastées.) –

+0

Il n'y a pas d '"utilisateurs" de ce composant sauf pour moi-même et un autre développeur dans une seule application. Les jauges sont remplies de noir à l'heure actuelle, il n'est donc pas nécessaire de compliquer énormément la chose en calculant où se trouve le chevauchement. Il n'y a pas besoin de commentaires condescendants, les gars. – Drarok

Répondre

12

Spécification NONANTIALIASED_QUALITY dans la structure LOGFONT devrait tourner antialiasing off:

procedure SetFontQuality(Font: TFont; Quality: Byte); 
var 
    LogFont: TLogFont; 
begin 
    if GetObject(Font.Handle, SizeOf(TLogFont), @LogFont) = 0 then 
    RaiseLastOSError; 
    LogFont.lfQuality := Quality; 
    Font.Handle := CreateFontIndirect(LogFont); 
end; 

procedure TForm1.PaintBox1Paint(Sender: TObject); 
const 
    FontQualities: array[Boolean] of Byte = (DEFAULT_QUALITY, NONANTIALIASED_QUALITY); 
var 
    Canvas: TCanvas; 
begin 
    Canvas := (Sender as TPaintBox).Canvas; 
    SetFontQuality(Canvas.Font, FontQualities[CheckBox1.Checked]); 
    Canvas.TextOut(12, 12, 'Hello, world!'); 
end; 
+0

Cool! La différence est plus évidente avec les polices plus volumineuses (et un événement CheckBox1 OnClik). –

+4

+1. C'est en effet le moyen de désactiver le lissage des polices, qui est ce que la question a demandé. Dommage le lissage des polices n'est pas vraiment le problème de Drarok. –