Vytvoření a výběr písma
Dialogové okno Písmo běžné zjednodušuje proces vytváření a výběru písem. Inicializací struktury CHOOSEFONT a voláním funkce CHOOSEFONT může aplikace podporovat stejné rozhraní pro výběr písma, které dříve vyžadovalo mnoho řádků vlastního kódu. (Další informace o písmu běžné dialogové okno naleznete v tématu Knihovna běžných dialogových oken.)
Výběr uživatelem
Většina operací vytváření a výběru písma zahrnuje uživatele. Aplikace pro zpracování textu například umožňují uživateli vybrat jedinečná písma pro nadpisy, poznámky pod čarou a základní text. Jakmile uživatel vybere písmo pomocí dialogového okna Písmo a stiskne tlačítko OK, funkce CHOOSEFONT inicializuje členy LOGFONT struktury s atributy požadovaného písma. Pokud chcete toto písmo použít pro operace s textovým výstupem, musí aplikace nejprve vytvořit logické písmo a pak toto písmo vybrat do kontextu zařízení. logické písmo je popis ideálního písma zadaný aplikací. Vývojář může vytvořit logické písmo voláním CreateFont nebo funkcí CreateFontIndirect. V tomto případě aplikace volá CreateFontIndirect a zadá ukazatel na LOGFONT struktury inicializované CHOOSEFONT. Obecně je efektivnější volat CreateFontIndirect, protože CreateFont vyžaduje několik parametrů, zatímco CreateFontIndirect vyžaduje pouze jeden ukazatel na LOGFONT.
Než může aplikace začít kreslit text logickým písmem, musí najít nejbližší shodu z písem uložených interně na zařízení a písem, jejichž prostředky byly načteny do operačního systému. Písma uložená v zařízení nebo v operačním systému se nazývají fyzická písma. Proces nalezení fyzického písma, které nejvíce odpovídá zadanému logickému písmu, se nazývá mapování písem. K tomuto procesu dochází, když aplikace volá funkci SelectObject a poskytuje popisovač identifikující logické písmo. Mapování písem se provádí pomocí interního algoritmu, který porovnává atributy požadovaného logického písma s atributy dostupných fyzických písem. Když algoritmus mapperu písma dokončí hledání a určí nejbližší možnou shodu, vrátí funkce SelectObject a aplikace může začít kreslit text novým písmem.
Funkce SetMapperFlags určuje, zda algoritmus mapperu písma hledá pouze fyzická písma s poměry stran, které odpovídají fyzickému zařízení. Poměr stran pro zařízení je poměr tvořený šířkou a výškou pixelu na daném zařízení.
Systémové písmo (označované také jako prostředí nebo výchozí písmo) je písmo používané pro text v záhlavích, nabídkách a dialogových oknech.
Důležité informace o speciálním výběru písma
I když většina operací výběru písma zahrnuje uživatele, existují některé instance, kde to není pravda. Vývojář může například chtít použít jedinečné písmo v aplikaci k kreslení textu v ovládacím okně. Pokud chcete vybrat vhodné písmo, musí být aplikace schopná určit, která písma jsou k dispozici, vytvořit logické písmo, které popisuje jedno z těchto dostupných písem, a pak toto písmo vybrat do příslušného kontextu zařízení.
Aplikace může zobrazit výčet dostupných písem pomocí funkcí EnumFonts nebo EnumFontFamilies. EnumFontFamilies se doporučuje, protože obsahuje výčet všech stylů přidružených k rodinnému jménu. To může být užitečné pro písma s mnoha nebo neobvyklými styly a pro písma, která překračují mezinárodní hranice.
Jakmile aplikace vypíše dostupná písma a našel odpovídající shodu, měla by použít hodnoty vrácené funkcí výčtu písma k inicializaci členů LOGFONT struktury. Potom může volat funkci CreateFontIndirect a předat jí ukazatel na inicializovanou strukturu LOGFONT. Pokud je funkce CreateFontIndirect úspěšná, aplikace pak může vybrat logické písmo zavoláním funkce SelectObject. Při inicializaci členů struktury LOGFONT nezapomeňte zadat konkrétní znakovou sadu v lfCharSet členu. Tento člen je důležitý v procesu mapování písem a výsledky budou nekonzistentní, pokud tento člen není inicializován správně. Pokud zadáte název typu v lfFaceName člen struktury LOGFONT, ujistěte se, že lfCharSet hodnota odpovídá znakové sadě písma zadané v lfFaceName. Pokud například chcete vybrat písmo, například MS Mincho, lfCharSet musí být nastavena na předdefinovanou hodnotu SHIFTJIS_CHARSET.
Písma pro mnoho východoasijských jazyků mají dva názvy typů: anglický název a lokalizovaný název. CreateFont, CreateFontIndirecta CreateFontIndirectEx převzít lokalizovaný název typface pro systémové národní prostředí, které odpovídá jazyku, ale přebírají název anglického typeface pro všechna ostatní systémová národní prostředí. Nejlepší metodou je vyzkoušet jeden název a při selhání zkuste druhý. Všimněte si, že EnumFonts, EnumFontFamiliesa EnumFontFamiliesEx vrátit název anglického typu, pokud národní prostředí systému neodpovídá jazyku písma. Počínaje Windows 2000, to už není problém, protože mapovač písma pro CreateFont, CreateFontIndirecta CreateFontIndirectEx rozpozná název písma bez ohledu na národní prostředí.