Stap 2: Hoe het werkt...
Lettertypeselectie
LaserCAD maakt gebruik van Microsofts GDI + bibliotheek voor het beheer van lettertypen. Wanneer u een lettertype selecteert in de vervolgkeuzelijst op het tekstvak bewerken wordt een lijst met beschikbare lettertypen weergegeven. Nadat u tekst invoeren en klik op Ok, LaserCAD de naam van de lettertypefamilie opgehaald uit de drop lijst en toegangsbewijs voor GDI + met behulp van code die er ongeveer zo uitziet als dit:
Hier is pwzFontFamily de tekenreeks die is getrokken uit de ComboBox lettertype. fSize is een float met de grootte van het lettertype grootte drop-down en iStyle vlaggen voor vet, cursief en onderstrepen (enz.)
Wanneer deze constructor wordt aangeroepen, de Microsoft code (de bron is beschikbaar) roept GdipCreateFont() doorgeven van vergelijkbare gegevens. Als een overeenkomende lettertype niet kan worden gevonden en foutcode geretourneerd en wordt de Microsoft code schakelt dan over naar een generieke San Serif-lettertype als weergegeven hieronder:
Zoals gezegd, om het juiste lettertype van LaserCAD als-is, je moet weten als het lettertype dat u hebt geselecteerd vet of cursief, (zeldzame) onderstrepen opgenomen in de lijst van de stijl aan GdipCreateFont doorgegeven moet. Een lettertype als Monotype Corsiva bestaat bijvoorbeeld alleen een gecursiveerd. Als Gdiplus::FontStyle::FontStyleRegular wordt doorgegeven aan GdipCreateFont, zoals het geval zijn zal als een van de knoppen voor vet, cursief of onderstreping niet is ingeschakeld, GdipCreateFont zullen niet vinden de alleen-cursief Monotype Corsiva en de generieke San Serif-lettertype wordt gebruikt.
De correctie van de selectie lettertype
Dit probleem kunt die wij de volgende code te gebruiken zal als het geselecteerde lettertype vet, cursief, onderstrepen of normaal ondersteunt:
Zodra we welke stijlen weten de lettertypeondersteuning wij kunnen onbruikbaar maken de knoppen die niet van toepassing. Als het lettertype geen ondersteuning biedt voor FontStyle::FontStyleRegular maar biedt ondersteuning voor vet of cursief, zal een van deze worden gecontroleerd. Als er slechts één wordt ondersteund zal het ook worden uitgeschakeld zodat het niet kan worden uitgeschakeld.
Om te kunnen om dit te doen, onderscheppen ik de bewerken tekst dialoogvenster van DialogProc terugbellen. Dit kan gebeuren via subclassificering, maar een andere techniek werd gebruikt hier die buiten het bestek van dit artikel valt. De originele code kan worden vastgesteld door een wijziging van de bestaande DialogProc om het zelfde ding doen.
Tekstinvoer en Rendering
De bug met de niet-ANSI (nietEngelse) tekstinvoer treedt op omdat de DialogProc leest de tekst van het besturingselement voor bewerking met een ANSI-functie, zoals GetDlgItemTextA. Het venster zelf (zoals met de meeste besturingselementen bewerken) staat voor het aanhouden van Unicode-tekst is maar de aanroep van GetDlgItemTextA zal niet zitten kundig voor de tekens correct vertegenwoordigen en zal deze vervangen door vraagtekens of andere vervangende tekens.
Om dit te verhelpen, omdat ik gemakkelijk de bestaande code niet wijzigen, heb ik een haak op de Windows API EndDialog geplaatst. Mijn haak functie wordt hieronder weergegeven:
Het werkt door het lezen van de tekst van het besturingselement voor bewerking voordat het dialoogvenster wordt gesloten en dat tekst op te slaan in een globale variabele: g_wstrLastKnownText.
De laatste stap is het aansluiten van de GDI +-functie die wordt gebruikt voor het maken van de tekst: GdipAddPathString. Wanneer het wordt aangeroepen, vervang ik gewoon de tekst die wordt doorgegeven aan het met de tekenreeks die ik gered van het besturingselement voor bewerking. Helaas moest de tekst die werd wordt doorgegeven aan de GdipAddPathString door de LaserCAD opnieuw terug in een Unicode-tekenreeks moet worden geconverteerd voordat het kan worden verzonden naar GdipAddPathString, maar de schade was al gedaan. Hier is mijn vervanger voor GdipAddPathString:
Met dat gedaan, is het nu mogelijk om niet-ANSI-tekst invoeren in het besturingselement voor bewerking en hebben het goed wordt weergegeven voor Laser snijden / graveren!
De noodzakelijke correctie
De code van de LaserCAD kan worden vastgesteld door gewoon met behulp van Unicode (wchar_t) in plaats van ANSI (char) teken buffers bij het lezen van de tekenreeks van het besturingselement voor bewerking. Zolang het nooit geconverteerd naar een ANSI-tekenreeks het zal goed wordt weergegeven wanneer de doorgegeven aan GdipAddPathString.