windows - Hvordan kan jeg finde, hvilken skrifttype der faktisk blev brugt til mit CreateFont-opkald?

Indlæg af Hanne Mølgaard Plasc

Problem



I Windows kan CreateFontIndirect() -opkaldet lydløst erstatte kompatible skrifttyper, hvis den ønskede skrifttype ikke er anmodet om. GetObject() kaldet afspejler ikke denne substitution; den returnerer den samme LOGFONT indsendt. Hvordan kan jeg finde, hvilken skrifttype der blev faktisk oprettet? Alternativt, hvordan kan jeg tvinge Windows til kun at returnere den nøjagtige skrifttype, der anmodes om? [4] [5]

Bedste reference



  I Windows kan CreateFontIndirect () -opkaldet lydløst erstatte kompatible skrifttyper, hvis den ønskede skrifttype ikke er anmodet om. GetObject () -opkaldet afspejler ikke denne substitution; den returnerer det samme LOGFONT-godkendt.



Det er ikke CreateFontIndirect, der gør substitutionen. Substitutionen sker, når skrifttypen vælges i DC. CreateFontIndirect giver dig bare et håndtag til en intern kopi af LOGFONT. Derfor giver GetObject dig den samme LOGFONT tilbage.



  Hvordan kan jeg finde, hvilken skrifttype der blev faktisk oprettet?



Hvis du vælger HFONT i mål DC, kan du derefter spørge DC for informationen om den skrifttype, der faktisk blev valgt som den bedste match til LOGFONT.



  • Ansigtsnavnet er tilgængeligt med GetTextFace.

  • Du kan få metrics med GetTextMetrics.

  • Hvis den valgte skrifttype er TrueType eller OpenType, kan du få flere målinger med GetOutlineTextMetrics.



Det fortæller i det væsentlige, hvilken skrifttype der faktisk blev oprettet. [6] [7] [8]


Bortset:


Når du laver noget som en forhåndsvisning, kan du starte med en LOGFONT, vælg den i printeren DC (eller IC), tag detaljerne i den faktiske skrifttype (printere erstatter ofte skrifttyper), og lav derefter et nyt LOGFONT, som er mere repræsentativt af den faktiske skrifttype. Vælg det i skærmen DC, og - med passende størrelse konverteringer - gør en ret god kamp for, hvad brugeren faktisk får.

Andre referencer 1



  For at få den korrekte skrifttype på forskellige sprogversioner af operativsystemet,
  ring EnumFontFamiliesEx med de ønskede skrifttypegenskaber i
  LOGFONT struktur, og hent derefter det korrekte skrifttypenavn og
  Opret skrifttypen ved hjælp af CreateFont eller CreateFontIndirect.



Selvom det ikke er en universel måde at få det egentlige skrifttypenavn fra en HFONT til, kan du på forhånd kontrollere, hvilken CreateFontIndirect ville (mest sandsynligt) returnere.


At dømme efter, hvordan MSDN foreslår dette som en god løsning for at få en skrifttypefamilie fra attributterne, det virker som den måde, hvorpå Windows internt udfører substitutionen.