Hacking LaserCAD (2 / 4 steg)
Steg 2: Hur det fungerar...
Val av teckensnitt
LaserCAD använder Microsofts GDI +-bibliotek för att hantera teckensnitt. När du väljer ett teckensnitt från nedrullningsbara listan för redigera textrutan visas en lista över tillgängliga teckensnitt. När du skriver text och klicka på Ok, LaserCAD kopierar teckensnittsfamilj namnet från listan drop och övergår till GDI + med hjälp av kod som ser ut ungefär så här:
Gdiplus::Font teckensnitt (pwzFontFamily, fSize, iStyle);
Här är pwzFontFamily textsträngen drog från Font ComboBox. fSize är en flottör med storlek från font storlek drop-down och iStyle har flaggor för fet, kursiv och understruken (etc.)
När denna konstruktor anropas, Microsoft-koden (källkod är tillgänglig) kallar GdipCreateFont() passerar liknande information. Om en matchande teckensnitt inte kan hittas och felkod returneras och Microsoft-koden sedan växlar till ett generiskt San Serif-teckensnitt som visas nedan:
Som nämnts tidigare, för att få rätt teckensnitt från LaserCAD som-är, du måste veta om teckensnittet du har valt behöver fet, kursiv eller (sällsynt) understrykning med i listan skickas till GdipCreateFont. Ett teckensnitt som Monotype Corsiva finns for example endast som en kursiv. Om Gdiplus::FontStyle::FontStyleRegular skickas till GdipCreateFont, så kommer vara fallet om någon av knapparna fet, kursiv eller understrykning inte kontrolleras, GdipCreateFont inte kommer att hitta den kursiv-bara Monotype Corsiva och generiska San Serif typsnitt ska användas.
Font val av Fix
Åtgärda problemet vi kommer att använda den följande koden till om teckensnittet användas av fet, kursiv, understrykning eller Normal:
När vi vet vilka formatmallar som teckensnitt stöd vi kan inaktivera de knappar som inte gäller. Om teckensnittet inte stöder FontStyle::FontStyleRegular men fet eller kursiv, kommer en av dessa att kontrolleras. Om bara en stöds inaktiveras det även så att det inte kan vara avstängda.
För att kunna göra detta, avlyssna jag redigera Text dialogrutan DialogProc motringning. Detta kan göras via skapa underklasser, men en annan teknik som används här som är utanför ramen för denna artikel. Den ursprungliga koden kan fastställas genom att ändra de befintliga DialogProc för att göra samma sak.
Textinmatning och Rendering
Bugg med icke-ANSI (icke-engelska) textinmatning beror på att DialogProc läser texten från redigeringskontrollen använder en ANSI-funktion som GetDlgItemTextA. Fönstret själv (som med de flesta redigeringskontroller) kan innehålla Unicode-text men anropet till GetDlgItemTextA kommer inte att kunna representera tecknen korrekt och kommer att ersätta dem med frågetecken eller andra substitut tecken.
För att åtgärda detta, eftersom jag inte kan enkelt ändra den befintliga koden, har jag placerat en krok på Windows API EndDialog. Min krok funktion visas nedan:
Det fungerar genom att läsa texten från redigeringskontrollen innan dialogrutan stängs och lagra texten i en global variabel: g_wstrLastKnownText.
Det sista steget är att koppla den GDI +-funktion som används för att återge texten: GdipAddPathString. När den anropas, ersätta jag helt enkelt den text som skickas till det med strängen jag sparat från redigeringskontrollen. Tyvärr fick den text som skickades till GdipAddPathString av LaserCAD omvandlades till en Unicode-sträng innan det kunde skickas till GdipAddPathString, men skadan var redan skedd. Här är min ersättare för GdipAddPathString:
Med det gjort, är det nu möjligt att ange icke-ANSI-text i redigeringskontrollen och har det återges korrekt för Laser skärning / gravyr!
Behövde fixa
LaserCAD koden kan fastställas genom att bara använda Unicode (wchar_t) i stället för ANSI (char) karaktär buffertar när man läser strängen från redigeringskontrollen. Så länge som aldrig konverteras den till en ANSI-sträng det återges korrekt när skickas till GdipAddPathString.