AW: Skripting - Grundlagen und Allgemeines
Weiteres zum Thema Skripting und darin eingebettete Dialoge:
"Scheinbare Merkwürdigkeiten"
Wie bereits im Zusammenhang mit der Ankündigung zur letzten Version (3.5)
(siehe dortigen Beitrag 198) des ImageSelectors angedeutet, möchte ich mal die Gelegenheit nutzen, ein paar Anmerkungen zu genannten Thema machen.
Bei der Definition von Dialogen innerhalb eines Skriptings wird mit der Funktion FF_AddDialog("Dialogname", Weite, Höhe) ein Dialogfenster namens "Dialogname" in der Größe Weite x Höhe festgelegt, wobei die Dimensionierung für Weite und Höhe in sogenannten DialogUnits vorzunehmen ist (siehe hierzu einige Beiträge weiter oben). In dieses Dialogfenster können nun verschiedene Dialogelemente (Buttons etc. , wie im Beitrag von Mecki14:
Anleitung für FixFotos Skript-Dialogeditorl bestens beschrieben) in Art, Größe und Position definiert werden.
Was der grundlegenden Definition des Ausgangs-Dialogfensters (leider?) fehlt, ist die Festlegung, an welcher Stelle auf dem Bildschirm diese Fenster positioniert werden soll. Nach meinen Beobachtungen erfolgt diese Positionierung immer in der Mitte des zuletzt aktiven Fensters - vorausgesetzt es bleibt damit zur Gänze auf dem Bildschirm sichtbar. Dieses Dialogfenster ist nicht fixiert; es lässt sich - wie bei Windows üblich - mit der LMT in der oberen Titelleiste "anpacken" und verschieben aber nicht in der Größe ändern; die ist ja mit Weite und Höhe festgelegt.
Wie ist das nun mit der anzugebenden Weite und Höhe eines Dialogfensters, wenn es den gesamten Bildschirm ausfüllen soll? Für die Weite deckt sich dies mit der in DialogUnits per FF_GetSystemMetrics abrufbaren Bildschirmbreite. Für die Höhe muss man allerdings berücksichtigen, dass das mit FF_AddDialog(..., ..., Höhe) für Höhe angegebene Maß die
innere Abmessung des Dialogfensters bestimmt, d.h.
ohne die Höhe der immer zusätzlich dargestellten Titelleiste (title bar). Die Dicke (Höhe) dieser Titelleiste ist über
Systemsteuerung,
Anzeige,
Darstellung,
Erweitert,
aktives Fenster ("Titelleiste des aktiven Fensters") festgelegt und kann - wenn gewünscht - dort auch geändert werden. Will mann also ein "Vollbild"-Dialogfenster festlegen, so muss man von der in DialogUnits per FF_GetSystemMetrics abrufbaren Bildschirmhöhe die Höhe der Titelleiste abziehen und die so erhaltenen Differenz als Höhe-Parameter an FF_AddDialog übergeben. Bedauerlicherweise lässt sich diese Größe, die auch noch in Pixelmaß der Bildschirmauflösung angegeben ist, nicht so ohne weiteres aus der Windows-Registry abfragen. Will man sich nicht auf Spekulation über die Höhe der Titelleiste beschränhken, was u.U. dazu führen kann, dass der "Vollbild"-Dialog nicht - wie gewünscht - korrekt dargestellt wird, muss man auf die Ermittlung dieses Maßes durch den FF-Skript-Aufruf: FF_GetSystemMetrics(SM_CYCAPTION) zurückgreifen. Wie das geht sei in dem folgenden Scripting-Code-Beispiel (für VBS) dargestellt. Die JS-Befehlsfolge kann sicher einfach anhand dem weiter oben in diesem Thread angeführten Beispiel zur Ermittlung Bildschirmgröße abgeleitet werden.
Code:
function titlebarheight
const SM_CYCAPTION=4
titlebarheight=round((FF_GetSystemMetrics(SM_CYCAPTION)*8) / (CDbl(FF_GetDialogBaseUnits) \ &h10000&))
end function
Mit dem Aufruf der Funktion erhält man die Höhe der Titelleiste (Title Bar) direkt umgerechnet (und ggf. aufgerundet) in DialogUnits; mit msgbox("Höhe der Titelleiste=" & titlebarheight) bekommt man zur Kontrolle den Wert angezeigt.
Unabhängig von diesen Besonderheiten wird die Darstellung des "Vollbild"-Dialoges noch beeinflusst durch die individuell eingestellten Taskleiten-Eigenschaften. Meine Empfehlung für die optimale Darstellung von "Vollbild"-Dialogen ist es von den vielfältigen Möglichkeiten, die sich aus:
- Taskleiste fixieren
- Taskleiste automatisch ausblenden
- Taskleiste immer im Vordergrund halten
ergeben, diejenige, bei der lediglich
Taskleiste fixieren angehakt ist und die anderen abgewählt sind. Erreichbar sind diese Optionen über einen Klick mit der RMT in die Taskleiste und dann die Auswahl
Eigenschaften mit LMT anklicken.
Eine weitere Besonderheit im Zusammenhang mit der Definition von Dialogen innerhalb von Skripten ist bei der Definition von Dialogelementen vom Typus IMAGE zu beachten. Wie im ImageSelector ja anschaulich demonstriert lassen sich innerhalb eines Dialogfensters (beispielsweise "4er-Ansicht" oder "Thumb-Ansicht" zum Rückladen entfernter Bilder) ja eine beliebige Anzahl von Unterdialogfenster" mit FF_AddControl("Dialogname", "lfd. Elementname", IMAGE, lfd-x-Position, lfd-y-Position, Bildweite, Bildhöhe) definieren. Mit FF_SetControl("Dialogname", "lfd. Elementname", "lfd. Bildname") wird erreicht, dass das Image mit dem Pfad "lfd. Bildname" im betreffenden Dialogelementfenster wiedergegeben wird. Anstelle der Pfadangabe kann auch mit 0 das gerade geladene Bild aus dem Speicher oder mit 1, 2 usw. von den entsprechenden Stackpositionen geladen werden.
Aber Achtung!
In die entsprechenden Dialogelemente werden mit FF_SetControl nicht schon direkt die Bilder hineingeladen und dann mit FF_ShowDialog zur Anzeige auf dem Bildschirm gebracht! In die Dialogelemente werden mit FF_SetControl zunächst nur die Bildpfade bzw. Stackpositionen abgespeichert; die dazugehörenden Images werden dann erst mit FF_ShowDialog geladen und angezeigt. Dies bedeutet, innerhalb eines Loops können beispielsweise
nicht nacheinander die darzustellenden Fotos mit FF_LoadImage(...) oder FF_LoadThumb(...) und mit FF_SetControl(..., ..., IMAGE, 0) vorbereitend zur Anzeige gebracht werden. In jedem Dialogelement wird lediglich als Bildquelle die "0" abgelegt, was dazu führt, dass mit FF_ShowDialog(...) in allen Image-Elementen das gleiche - eben das zuletzt geladene - Image geladen und abgebildet wird.
Gruß
Heinrich