Tabsheet-Dialoge laden und anzeigen


Es verbleiben noch zwei Schritte: Für jedes Tabsheet einen Dialog aus dem Ressourcenskript laden und den Dialog des ersten Tabsheets anzeigen. Ersteres geschieht wieder in einer Schleife:

for i := 0 to length(hTabDlgs) - 1 do
  hTabDlgs[i] := CreateDialog(hInstance, MAKEINTRESOURCE((i + 2) * 100),
  hDlg, @tabdlgfunc);

Hier werden also die Dialoge aus der Ressource geladen (clevererweise haben sie die IDs 200 und 300) und einer Dialogprozedur zugewiesen. Man kann natürlich auch jedem Dialog eine separate Dialogprozedur zuweisen, aber das ist Geschmackssache.

Zu guter Letzt wollen wir noch den Dialog für den ersten Tabsheet im selbigen anzeigen. Dazu müssen wir dessen Position und Größe ermitteln, was wir mit Hilfe der Nachricht "TCM_GETITEMRECT" tun. Der wParam gibt den Index des Tabsheets an, dessen Position wir benötigen und dem lParam wird ein Zeiger auf ein TRect-Record übergeben, die dann die Position enthält.

SendMessage(hTab, TCM_GETITEMRECT, 0, Longint(@rect));

Der Funktionsaufruf von "SetWindowPos" sollte keine Probleme bereiten. Er sorgt dafür, dass die jeweilige Registerseite an der richtigen Position erscheint:

SetWindowPos(hTabDlgs[0], 0, 50, (rect.Bottom - rect.Top) + 50, 0, 0,
  SWP_NOSIZE or SWP_NOZORDER or SWP_SHOWWINDOW);

Eine kleine Anmerkung meinerseits: +50, weil sich meine Dialogelemente nicht am oberen und linken Rand des Dialogfensters befinden.


Hinweis für Windows XP

Wenn Sie sich das Beispielprogramm bereits angeschaut haben, dann wissen Sie bereits, dass beim Erzeugen der Dialoge noch ein weiterer Befehl benutzt wird: EnableThemeDialogTexture. Er sorgt für die farblich korrekte Anzeige des Dialoges unter Windows XP, wenn Sie aktivierten Themes arbeiten. Ohne den Befehl wäre der Dialog deutlich sichtbar (linkes Bild).
 

Im rechten Bild sehen Sie, dass der Dialog die Farben des aktiven Themes benutzt. Dass er hier dennoch zu erkennen ist (wenn man genau hinsieht, kann man die etwas hellere Färbung erkennen), liegt einfach nur daran, dass er nicht die komplette Fläche des TabSheets ausfüllt.