První se podíváme na ty fonty. Abychom mohli používat všechny fonty, které jsou dostupné, musíme je načíst do nějakého objektu. Pro nás je nejlepším řešením Combo. Tak si jedno na formulář vložíme a nyní budeme potřebovat kratičký kód:
Sub LoadFonts()
Combo1.Clear 'vymažeme obsah comba
Form1.MousePointer = 11
Max = Screen.FontCount 'zjistíme počet fontů v systému
For i = 0 To Max 'cyklus, který načítá jeden font po druhém
Combo1.AddItem Screen.Fonts(i) 'uložení fontu do comba
DoEvents 'dáme počítači trochu času na vydechnutí.
Next i
Form1.MousePointer = 1
End Sub
Tento kód se může vykonávat poměrně dlouhou dobu, zvláště pokud je na počítači větší počet fontů. Třeba v řádech 1 000 ale i 200 fontů už načítá celkem dlouho. Proto se na začátku změní kurzor na hodiny a v cyklu je obsaženo DoEvents. Na závěr bychom mohli uvést toto:
Combo1.ListIndex = 0
Tím docílíme zobrazení některého z fontů přímo v Combu.
Tím to ale nekončí, my si totiž používaný font musíme umět z Comba vybrat a to také není příliš složité, jak vyplývá z kódu. Vložíme si na formulář ještě jeden větší picture box a zapíšeme tento ukázkový kód:
Private Sub Picture1_Click()
Picture1.Font.Name = Screen.Fonts(Combo1.ListIndex)
Picture1.Print Screen.Fonts(Combo1.ListIndex)
End Sub
Zde je taková ukázka. To ale není vyhovující, my bychom totiž měli dát uživateli na výběr i velikost fontu a také různé proporce (jako je například písmo tučné, kurzíva a podobné).
Picture1.Font.Name
Picture1.Font.Size
Picture1.FontBold
Picture1.FontItalic
Picture1.FontUnderline
Picture1.FontStrikethru
Picture1.FontTransparent
Nastavováním těchto vlastností měníme písmo, ale jeho poloha je stálá. To nám také nevyhovuje, proto potřebujeme, aby se písmo tisklo tam, kam chceme my. Proto nám objekt Picture poskytuje vlastnosti CurrentX a CurrentY. Ty měníme podle souřadnic, na kterých jsme klikli na objekt Picture. Takto:
Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Picture1.Font.Name = Screen.Fonts(Combo1.ListIndex)
Picture1.CurrentX = X
Picture1.CurrentY = Y
Picture1.Print "text"
End Sub
Já osobně radši používám proceduru MouseUp než MouseDown, ale podle mě je dobré nechat toto rozhodnutí na uživateli programu.
Co nám ještě chybí k dokončení celé akce? No je toho povíc, například je to nastavení vlastnosti Autoredraw na True.
Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Picture1.AutoRedraw = True
Picture1.Font.Name = Screen.Fonts(Combo1.ListIndex)
Picture1.CurrentX = X
Picture1.CurrentY = Y
Picture1.ForeColor = vbRed
Picture1.FontTransparent = True
Picture1.Print "text"
Picture1.Refresh
End Sub
Zde je taková kostra a vy si s tím můžete pohrát a zkompletovat to.
Mnohým z vás by do příštího dílu mohla hlavou vrtat otázka jak font natočit o určitý počet stupňů. A řeknu vám, ani na tohle není VB krátký, ale musí využít API funkcí. Já jsem se po něčem podobném pídil už kdysi dávno a teď je na čase, abych s tím seznámil vás. Víceméně uvedu jen kód. A s tím už si dělejte co uznáte za vhodné.
Private Declare Function CreateFontIndirect Lib "gdi32" Alias "CreateFontIndirectA" (lpLogFont As LOGFONT) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Const lfvelikost = 32
Private Type LOGFONT
lfHeight As Long
lfWidth As Long
lfEscapement As Long
lfOrientation As Long
lfWeight As Long
lfItalic As Byte
lfUnderline As Byte
lfStrikeOut As Byte
lfCharSet As Byte
lfOutPrecision As Byte
lfClipPrecision As Byte
lfQuality As Byte
lfPitchAndFamily As Byte
lfFaceName(lfvelikost) As Byte
End Type
Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim TextProp As LOGFONT
Picture1.AutoRedraw = True
Picture1.CurrentX = X
Picture1.CurrentY = Y
Picture1.ForeColor = vbRed
rot = 45 've stupních.
TextProp.lfItalic = 0
TextProp.lfEscapement = (rot * 10)
TextProp.lfHeight = 20
TextProp.lfQuality = PROOF_QUALITY
SelectObject Picture1.hdc, CreateFontIndirect(TextProp)
Picture1.Print "text"
Picture1.Refresh
End Sub
Upozorňuji vás, že tento kód není plně funkční, je to jen ukázka. Zprovoznit ho plně bude chtít dost přemýšlení, ale aspoň máte co dělat. Trochu si zagooglujte a… To by bylo pro dnešní díl vše. Více si povíme snad někdy příště.