Dialog Units sind abhängig von der Schriftart, die dem Dialog zugewiesen ist. Das bringt einen Vorteil, aber auch einen riesigen Nachteil. Der Vorteil ist die Unabhängigkeit von festen Bezugspunkten. Um einen Dialog zu vergrößern, muss man nur dessen Schriftart vergrößern, alle Controls passen sich an. So sind auch Dialoge auf Systemen mit speziellen Zugangshilfen für Sehbehinderte bei den großen Schriften nirgendwo abgeschnitten. Das ist aber auch gleichzeitig der Nachteil. Bei der Entwicklung von Dialog-Ressourcen muss man oft stundenlang rumprobieren, bis das Layout den Vorstellungen entspricht und zwischendurch natürlich ständig neu kompilieren, falls man den unten beschriebenen Trick nicht kennt.
Dialog Units sind, wie schon gesagt, von der Schriftart und -größe des Dialoges abhängig. Eine horizontale Dialog Unit ist ein Viertel der durchschnittlichen Zeichenbreite in Pixeln, eine vertikale Dialog Unit entspricht einem Achtel der durchschnittlichen Zeichenhöhe.
Doch nun zum erwähnten Trick: Wer schlecht im Schätzen ist oder sich gar nicht erst die Mühe machen will, durch Probieren ans Ziel zu gelangen, kann sich das Leben mit Taschenrechner und einem kleinen Testprogramm vereinfachen.
Dazu muss man zunächst einen leeren Dialog mit der gewünschten Schriftart zu erzeugen. Das RC dazu sieht wie folgt aus:
// Dialog1
100 DIALOGEX 0, 0, 162, 95
STYLE DS_3DLOOK | DS_NOFAILCREATE | DS_CENTER | WS_MINIMIZEBOX |
WS_MAXIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Arbeiten mit Dialog-Ressourcen"
FONT 8, "MS Sans Serif"
{
}
Das ist das Skript aus dem Dialog-Tutorial, jedoch wurden alle Control-Definitionen weggelassen (also entsteht ein leeres Fenster).
Als Font wurde MS Sans Serif mit 8 Punkten angegeben, dies ist die Dialogschrift.
Jetzt kompiliert man die Ressource und schreibt ein kleines Programm, das die Ressource lädt.
Die Funktion
Um die Anzahl an Pixeln für eine Dialog Unit zu bekommen, sieht der Aufruf wie folgt aus:
var DialogUnits: TRect = (Left: 1; Top: 1);
// [...] // (z.B. in der Bearbeitung für die WM_INITDIALOG-Message) MapDialogRect(hDlg, DialogUnits); // [...]
DialogUnits enthält jetzt in Left und Top jeweils die Anzahl an Pixel für eine horizontale, bzw. vertikale Dialog Unit. Da aber die Werte nicht immer gleichmäßig sind, weil bei Dezimalzahlen gerundet wird, sollte man nicht nur für 1 prüfen, sondern bei mehreren verschiedenen Werten und dann den Durchschnitt bilden. Kein Problem, wenn das Ergebnis eine Dezimalzahl sein sollte: da Windows rundet, können Sie das getrost auch tun.
Mit diesem einfachen Trick kann man sich das Leben sehr vereinfachen, jetzt kann man nämlich wie gewohnt in Pixeln arbeiten und braucht vorher nur umzurechnen, den entsprechenden Faktor hat man ja nun.