[WinAPI] Tekst in schaalbare fonts, hoe ?

Pagina: 1
Acties:

  • Xymox
  • Registratie: Februari 2002
  • Laatst online: 19-01 13:42

Xymox

Determinism rulez !

Topicstarter
Ik zit met het volgende en ik hoop dat er iemand hier wat meer over kan vertellen.

Ik ben bezig met het tekenen van tekst op een canvas (client area van een form) met behulp van de Windows API (GDI). De tekst dient altijd relatief gelijk geschaald te zijn met het window waar de tekst op staat.

Voorbeeld : als ik een form heb die exact vierkant is (op een bepaalde resolutie) en daar daat een tekst op (font type niet zo belangrijk, het zijn wel TTF of OpenType fonts) en ik verklein het scherm zodat deze de helft kleiner wordt in hoogte, dan moet de tekst gelijk meeschalen zodat deze ook de helft in hoogte wordt verkleind. Uiteraard moet de tekst (het font) zowel in hoogte als breedte meeschalen, relatief aan het form.

Het tekenen van tekst, het creeren van fonts en het bepalen van window groottes en omgaan met device contexts is geen probleem, echter het juiste font aanmaken om te selecteren in de device context lukt me niet. Het font lijkt altijd met stapjes te schalen, bijvoorbeeld 6, 9, 11 en 12 punt stappen. Het lijkt erop dat er een fixed font point groote wordt gebruikt.

Ik kan het mis hebben, maar ik had begrepen dat TrueType fonts (en de nieuwe OpenType) in elke gewenste grootte getekend kan worden en niet alleen in de fixed physical font grootes zoals bijvoorbeeld 8,10 en 12 punten.

MSDN is erg onduidelijk, ik heb uiteraard zelf wat info bij elkaar proberen te sprokkelen.

Hoe kan ik nu op een form (device context van de client) een tekst tekenen in exact het juiste font in breedte en hoogte ?
Zijn er wellicht ook omreken formules die obv een resolutie instelling of relatieve coordinaten de font settings kunnen uitrekenen ?

Het betreft hier pure WinApi (geen MFC) dat geïmplementeerd zou kunnen worden in C++.

Intel i9-9900K | MSI MPG Z390 Gaming Pro Carbon | MSI RTX 2080Ti Gaming X Trio | Ballistix Sport LT (32GB) | MSI Optix MAG274QRF-QD 1440p | Samsung 970 EVO Plus (2TB) | NZXT Kraken X52 | Valve Index | Fractal Design R6 | Synology DS420j


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 19:34

Tomatoman

Fulltime prutser

OpenType fonts kunnen met GDI functies nooit in niet-gehele sizes worden getekend, simpelweg omdat de functies de fontgroottes in integers verwachten. Dat is ook wel logisch, want hoe zou een font als een halve pixel op je scherm kunnen worden weergegeven?

Ook als je device context een printer is wordt een fontgrootte in hele eenheden verwacht. De grap is alleen dat een font dat op je scherm een size 12 heeft, op je printer opeens wordt afgedrukt met veel grotere size. Op je scherm wordt 96 dpi gebruikt en op je printer (bijvoorbeeld) 600 dpi, zodat je in de device context van de printer een fontgrootte van 600/96 x 12 = 75 moet gebruiken. Als je in bijvoorbeeld Word een fontgrootte van 11,5 opgeeft, verschijnt er op je scherm bij een zoom van 100% daarom altijd een font met grootte 11 of 12 en op je printer 600/96 x 11,5 = 72.

Wat het verschil tussen TrueType/OpenType fonts en fixed-size fonts is, is dat alle gehele fontgroottes zijn toegestaan, terwijl je bij een fixed-size font maar uit een beperkt aantal maten kunt kiezen (bijvoorbeeld 8, 10, 12, 14 en 20).

Een goede grap mag vrienden kosten.


  • Xymox
  • Registratie: Februari 2002
  • Laatst online: 19-01 13:42

Xymox

Determinism rulez !

Topicstarter
Hoe krijgen DTP en andere grafische toepassing ontwikkelaars het dan voor elkaar om TTF of PS fonts te laten schalen in elk formaat die de gebruiker maar wil ? Dat er afronding wordt toegepast omdat een lettertype niet compleet past in de gegevens ruimte aan pixels is wel logisch, maar zover het oog het ziet kan je vrijwel traploos schalen in hoogte en breedte.

Intel i9-9900K | MSI MPG Z390 Gaming Pro Carbon | MSI RTX 2080Ti Gaming X Trio | Ballistix Sport LT (32GB) | MSI Optix MAG274QRF-QD 1440p | Samsung 970 EVO Plus (2TB) | NZXT Kraken X52 | Valve Index | Fractal Design R6 | Synology DS420j


  • Adion
  • Registratie: Januari 2001
  • Laatst online: 06-05 16:12
Halve pixel groottes enzo kunnen in theorie wel degelijk gerenderd worden als anti-aliassing enzo wordt toegepast.
Verder heb ik ook niet echt een antwoord op je probleem. Volgens mij is de hoogte instelling die je bij CreateFont meegeeft toch normaalgezien in Pixels dacht ik, dus dan zou het idd zonder stappen moeten gaan.
Grafische toepassingen gebruiken trouwens mogelijk hun eigen font renderalgoritmes, zodat ze parameters als anti-aliassing 100% zelf in de hand hebben.

VirtualDJ 2026 - Fast Image Resizer - Instagram


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-05 14:03

curry684

left part of the evil twins

Je kunt met SetMapMode de mapping mode van je viewport opgeven, deze wordt vervolgens ook gebruikt voor de height parameter van CreateFont om het goede font-formaat te definieren. Als je extreem precies tekenwerk behoeft pak je sowieso een andere mapping mode dan 'pixels' om mee te rekenen, en dan kun je dus een font met height 250 hebben dat maar 10 pixels hoog is als je creatief met MM_ISOTROPIC of MM_TWIPS werkt :)

Professionele website nodig?