c ++ - Hvad er den hurtigste måde at tegne formateret tekst på i Win32 API?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg implementerer en tekstredigerer i C ++ bare ved hjælp af vanille Win32 API og jeg forsøger at finde den bedste måde at implementere syntaxhævning på. Jeg ved, at der findes eksisterende kontroller derude som scintilla, men jeg gør det for sjovt så Jeg vil selv gøre det meste af arbejdet. Jeg vil også have det hurtigt og let.


Fra det jeg har lært hidtil, ser det ud til, at det mest lave niveau valg til tegning af tekst i GDI er funktionen TextOut. Men hvis jeg behøver at ændre skrifttypens farve, betyder det, at jeg bliver nødt til at lave mange ringer til TextOut for at tegne en teksttekst med blandet formatering. Er dette ineffektivt? Når syntaxbelysning og rige tekstkontroller implementeres, vil de sandsynligvis bruge TextOut bag kulisserne eller er er der en anden måde? Er hver anden metode til tegning af tekst i GDI bare et højere niveau wrapper omkring TextOut?

Bedste reference


Både DrawText og TextOut er wrappers til ExtTextOut, så ExtTextOut er API på lavt niveau. ExtTextOut er efter min erfaring temmelig hurtig, så jeg tvivler på, at du kan se nogen præstationsproblemer med ExtTextOut selv. Oprettelse/valg af skrifttyper kan imidlertid være en kilde til ydeevneproblemer, så hvis du skifter frem og tilbage mellem skrifttyper, kan du realisere betydelige præstationsgevinster ved at cache og genbruge skrifttyper (HFONT) i stedet for CreateFont/SelectObject/DeleteObject hver gang. I grund og grund første gang du ringer SelectObject efter oprettelse af en ny skrifttype, udfører Windows en skriftlig matchningsproces for at finde den bedste fysiske skrifttype til Den logiske skrifttype, du har anmodet om. Dette er en ret kompleks proces, så du vil minimere antallet af gange, der opstår i situationer, hvor ydeevnen er vigtig.


Jeg udviklede en rig redigeringskontrol for mange år siden, det var i det væsentlige en mini-version af Microsoft Word. Jeg brugte ExtTextOut som den vigtigste arbejdshest for alle tekstudgange. Kontrolen ville opretholde en font cache for de senest anvendte skrifttyper (standard cache størrelse var 10 skrifttyper). Det understøttede WYSIWYG layout, så det faktisk gjorde alt layout ved hjælp af en printer DC og skrifttyper, så ville gøre en skærm kompatibel version ved hjælp af en skærm DC og lignende skrifttyper, så der var meget ekstra arbejde foregår, sandsynligvis er ikke relevant for din situation Alligevel var ydeevnen fremragende ved at køre på typisk hardware af dagen (fx 266 MHz Pentium).

Andre referencer 1


I stedet for at overveje, hvilken 'draw text' -funktion er den hurtigste, er det sandsynligvis langt mere fordelagtigt at overveje, 'Hvordan kan jeg minimere mængden af ​​tekst, jeg skal gøre overhovedet ' ved at være smart om, hvad der skal redraw/invalidate som tekstændringer, eller hvordan man kan cache gengivet tekst til at rulle.

Andre referencer 2


For kompleks brug vil du nok have DrawText, da det giver dig mere kontrol end TextOut. Den har nogle grundlæggende formateringsstøtte, men mindre end du vil have brug for en redaktør. Det næste trin er den rige tekstredaktør fra det fælles kontrolbibliotek, der stort set tager sig af alt det for dig.