|
Während das Screen- und Printer-Objekt uns Listen der für den
Bildschirm oder den eingestellten Drucker verfügbaren Fonts
liefern, finden wir leider nirgendwo eine Liste der verfügbaren
Schriftgrößen eines Fonts. Zwar können Sie einem Font-Objekt
(eines Steuerelements oder eines Containers) jede beliebige Größe
in der Maßeinheit vbPoints zuweisen. Doch werden Sie feststellen,
dass der tatsächliche Wert nach einer Zuweisung oft vom
ursprünglichen zugewiesenen Wert abweicht. Das Font-Objekt
berechnet automatisch die auf dem Bildschirm real darstellbare
Größe und gibt diese in seiner Size-Eigenschaft zurück.
Soll der Anwender eine Schriftgröße aus einer Liste (etwa in
einer ComboBox) auswählen können, wäre es naheliegend, ihm auch
nur die tatsächlich verfügbaren Schriftgrößen zur Auswahl zu
stellen. Denn diese sind nicht bei allen Schriften gleich. Bei
Truetype-Schriften gibt es meistens (systemabhängig) nur zwei
verschiedene Wertefolgen. Aber bei den verfügbaren Schriftgrößen
der Standard- und Systemschriften (Fixedsys, MS Serif, MS
Sans Serif, System) gibt es doch größere Unterschiede.
Diese sind auch nicht frei skalierbar und stehen in nur wenigen
festen Größen zur Verfügbar.
Um eine Liste der tatsächlichen Schriftgrößen zu erhalten,
machen wir uns die Eigenschaft des Font-Objekts zunutze, nach einer
Zuweisung jeweils den realen Wert zurück zu geben. Weisen Sie der
Reihe nach alle Größen eines gewünschten Bereichs (etwa von
1 bis 100) der Size-Eigenschaft zu und lesen Sie
den Wert der Eigenschaft sofort wieder aus. Da dabei manche Werte
mehrfach vorkommen, müssen Sie diese Dubletten irgendwie aussieben.
Der einfachste Weg ist die Verwendung einer Collection, in die Sie
die gefundenen Größen einfügen. Verwenden Sie dabei den Wert auch
als Schlüssel (in einen String konvertiert), können Sie jeden Wert
nur einmal einfügen. Die überzähligen Einfügeversuche können
Sie über eine Fehlerbehandlung automatisch ignorieren.
Wenn Sie die Werte in einem anderen ScaleMode-Maßstab als
vbPoints benötigen, können Sie die Werte vor dem Einfügen in die
Collection mit der ScaleY-Methode eines Containers (Form, PictureBox,
Printer, UserControl usw.) umrechnen.
Die Funktion FontSizes liefert Ihnen eine so zusammengestellte
Liste zu jeder beliebigen Schrift für einen frei wählbaren
Größenbereich (Voreinstellung 1 bis 100). Geben Sie
im optionalen Parameter ScaleMode einen anderen Maßstab als
vbPoints an, erfolgt die Umrechnung automatisch - Sie müssen dann
allerdings den Container dazu angeben.
Public Function FontSizes(FontName As String, _
Optional ByVal MinSize As Single = 1, _
Optional ByVal MaxSize As Single = 100, _
Optional Container As Object, _
Optional ByVal ScaleMode As ScaleModeConstants = vbPoints) _
As Collection
Dim nFont As New StdFont
Dim i As Integer
Dim nSize As Single
Dim nFontSizes As Collection
Set nFontSizes = New Collection
With nFont
.Name = FontName
If ScaleMode <> vbPoints Then
On Error Resume Next
For i = MinSize To MaxSize
.Size = i
nSize = Container.ScaleY(.Size, vbPoints, ScaleMode)
nFontSizes.Add nSize, CStr(nSize)
Next 'i
Else
On Error Resume Next
For i = MinSize To MaxSize
.Size = i
nSize = .Size
nFontSizes.Add nSize, CStr(nSize)
Next 'i
End If
End With
Set FontSizes = nFontSizes
End Function
Die Funktion FontSizesArray liefert die Größenliste als Array.
Intern ruft sie dazu die obenstehende FontSizes-Funktion auf, damit
wieder die Dubletten eliminiert werden. Im optionalen Parameter
OptionBase können Sie zusätzlich angeben, an welcher Untergrenze
das Array beginnen soll (Voreinstellung 1).
Public Function FontSizesArray(FontName As String, _
Optional ByVal MinSize As Single = 1, _
Optional ByVal MaxSize As Single = 100, _
Optional ByVal OptionBase As Integer = 1, _
Optional Container As Object, _
Optional ByVal ScaleMode As ScaleModeConstants = vbPoints) _
As Variant
Dim nFontSizes As Collection
Dim i As Integer
Dim nArray() As Single
Dim nIndex As Integer
Set nFontSizes = _
FontSizes(FontName, MinSize, MaxSize, Container, ScaleMode)
nIndex = OptionBase
ReDim nArray(OptionBase To OptionBase + nFontSizes.Count - 1)
For i = 1 To nFontSizes.Count
nArray(nIndex) = nFontSizes(i)
nIndex = nIndex + 1
Next 'i
FontSizesArray = nArray
End Function
Die beiden Prozeduren FontSizesList und FontSizesCombo füllen
eine ListBox bzw. eine ComboBox mit der Liste der Schriftgrößen.
Auch sie erstellen intern zunächst eine Collection über die
Funktion FontSizes.
Public Sub FontSizesList(ListBox As ListBox, FontName As String, _
Optional ByVal MinSize As Single = 1, _
Optional ByVal MaxSize As Single = 100, _
Optional Container As Object, _
Optional ByVal ScaleMode As ScaleModeConstants = vbPoints)
Dim nFontSizes As Collection
Dim i As Integer
Set nFontSizes = _
FontSizes(FontName, MinSize, MaxSize, Container, ScaleMode)
With ListBox
.Clear
For i = 1 To nFontSizes.Count
.AddItem nFontSizes(i)
Next
End With
End Sub
Public Sub FontSizesCombo(ComboBox As ComboBox, FontName As String, _
Optional ByVal MinSize As Single = 1, _
Optional ByVal MaxSize As Single = 100, _
Optional Container As Object, _
Optional ByVal ScaleMode As ScaleModeConstants = vbPoints)
Dim nFontSizes As Collection
Dim i As Integer
Set nFontSizes = _
FontSizes(FontName, MinSize, MaxSize, Container, ScaleMode)
With ComboBox
.Clear
For i = 1 To nFontSizes.Count
.AddItem nFontSizes(i)
Next
End With
End Sub
|