Programmierung

Eins, zwei oder drei…

Drei Bildschirme

Das Betreiben von zwei oder mehr Monitoren an einem PC stellt heutzutage kein Problem mehr dar – die richtige Hardware vorausgesetzt. Der vorliegende Artikel gibt einen kurzen Einblick über das Bildschirm-Management von Windows und zeigt, wie Informationen über die Monitorkonfiguration auch in CONZEPT 16 ermittelt werden können.

Einleitung

Unter Windows können mehrere Bildschirme komfortabel in der Systemsteuerung konfiguriert werden. Dabei erlaubt Windows unterschiedliche Modi, wenn mehr als ein Monitor angeschlossen ist:

  • Anzeige erweitern (erweitert den Desktop auf mehrere Bildschirme)
  • Anzeige duplizieren (stellt denselben Desktop auf mehreren Bildschirmen dar)

In den meisten Fällen werden zusätzliche Monitore wohl dazu verwendet, um mehr Anzeigefläche für laufende Anwendungen zu erhalten, weshalb wahrscheinlich der Modus „Anzeige erweitern“ öfter anzutreffen ist.

Hauptbildschirm

Ein Bildschirm stellt den sogenannten Hauptbildschirm dar. Dieser zeigt den Logon-Screen von Windows an. Des Weiteren öffnen sich die meisten Anwendungen auf diesem Bildschirm, wenn sie gestartet werden. Der Hauptbildschirm besitzt jedoch noch eine andere Eigenschaft.

Virtueller Bildschirm

Im Modus „Anzeige erweitern“ fasst Windows die betreffenden Bildschirme zu einem sogenannten virtuellen Bildschirm zusammen (Abb. 1).

Virtueller BildschirmAbb. 1: Virtueller Bildschirm

Der virtuelle Bildschirm ergibt sich aus der Begrenzung und Anordnung aller Monitore. Der Hauptbildschirm besitzt immer den Koordinatenursprung (0,0). Dies wurde von Microsoft aus Kompatibilitätsgründen für bereits bestehende Anwendungen festgelegt.

Ausgehend von der Monitoranordnung in Abb.1 ergibt sich für den Monitor 2 ein negativer Koordinatenursprung. Die linke, obere Ecke eines im Monitor 2 dargestellten Fensters würde also negative Koordinaten besitzen.

Die einzelnen Bildschirme müssen nicht alle dieselbe Farbtiefe besitzen, was jedoch nicht zu empfehlen ist. CONZEPT 16 berücksichtigt bei der Farbtiefe jedenfalls nur den Hauptbildschirm.

Bildschirmbereiche

Windows unterscheidet zwischen Bildschirm- und Arbeitsbereich. Der Bildschirmbereich ist der gesamte zur Verfügung stehende Anzeigebereich eines Bildschirms. Der Arbeitsbereich (work area) stellt den Teil dar, der nicht von fest installierten Fenstern (wie z.B. der Windows task bar) beschlagnahmt wird.

Überleitung

Im Allgemeinen muss eine CONZEPT 16-Anwendung nicht auf den Betrieb für mehrere Monitore angepasst werden. Soll aber ein Fenster z.B. immer auf dem Primärbildschirm und ein zweites immer auf dem Sekundärbildschirm dargestellt werden, dann kommt man um die Ermittlung der Koordinaten für den zweiten Bildschirm nicht herum. Hat man diese erst einmal, reicht das Setzen der Eigenschaft wpArea aus, um das Fenster zu positionieren.

Der CONZEPT 16-Entwickler kann über die Eigenschaften wpAreaScreen und wpAreaWork das Rechteck des Bildschirm- und Arbeitsbereiches für den Hauptbildschirm ermitteln. Ab der Version 5.7.05c ist es außerdem auch möglich die zusätzlich vorhandenen Monitore abzufragen. Hierzu wurden die Eigenschaften um die optionale Angabe einer Bildschirm-Nummer erweitert.

// work area des zweiten Monitors
tWorkRect2 # _App->wpAreaWork(1);

// screen area des zweiten Monitors
tScreenRect2 # _App->wpAreaScreen(1);

Bei der in Klammern angegebenen Zahl handelt es sich um eine fortlaufende Nummer (>=0), die den Monitor identifiziert. Die Nummer „0“ entspricht immer dem Hauptbildschirm, so auch der Aufruf ohne die Angabe einer Nummer.

Darf’s noch ein bisschen mehr sein?

Aufbauend auf den Eigenschaften lassen sich weitere Informationen, wie die Anzahl der Bildschirme und das Rechteck des virtuellen Bildschirms ermitteln. Das Modul Monitor kapselt die Informationen nach dem Prinzip der modularen Programmierung.

// Schnittstelle öffnen
Monitor:Open();

// Work-Areas ausgeben
DbgTrace('Monitor Count: ' + CnvAI(Monitor:GetCount()));
DbgTrace('=== Work Areas ===');

for tMonitor # 1 loop inc(tMonitor)
  while (tMonitor <= Monitor:GetCount())
{
  Monitor:GetMonitorText(tMonitor,var tText,true);
  DbgTrace(tText);
}

// Screen-Areas ausgeben
DbgTrace('=== Screen Areas ===');

for tMonitor # 1 loop inc(tMonitor)
  while (tMonitor <= Monitor:GetCount())
{
  Monitor:GetMonitorText(tMonitor,var tText,false);
  DbgTrace(tText);
}

// Schnittstelle schließen
Monitor:Close();

Das obige Programm gibt die Anzahl der vorhandenen Monitore sowie die einzelnen Rechtecke der jeweiligen Monitore im Debugger aus.

MonitorDump:main  25  Monitor Count: 2
MonitorDump:main  26  === Work Areas ===
MonitorDump:main  31  Monitor 1: (0,0) - (1.280,994) - PRIMARY
MonitorDump:main  31  Monitor 2: (1.280,0) - (2.560,1.024)
MonitorDump:main  35  === Screen Areas ===
MonitorDump:main  40  Monitor 1: (0,0) - (1.280,1.024) - PRIMARY
MonitorDump:main  40  Monitor 2: (1.280,0) - (2.560,1.024)

Daraus ist zu ersehen, dass zwei Bildschirme vorhanden sind, die beide die gleichen Dimensionen besitzen. Die Angabe PRIMARY zeigt an, dass es sich um den Hauptbildschirm handelt. Der Arbeitsbereich des Hauptbildschirmes enthält die Taskleiste am unteren Bildschirmrand (das müssen Sie mir glauben). Aus diesem Grund ist die Höhe des Arbeitsbereiches etwas kleiner als die Gesamthöhe (994 statt 1024). Schön ist auch zu sehen, dass der ‚Monitor 2‘ den Koordinatenursprung (1280,0) besitzt. ‚Monitor 1‘ beginnt bei (0,0).

Mit dem Modul ‚Monitor‘ und der Prozedur ‚MonitorDump‘ (am Ende des Artikels) können Sie nach Herzenslust die neuen Funktionen testen. Am besten natürlich mit mehreren Monitoren…

Download

Monitor.zip Monitor.zip (1.87 KB)
Sie müssen angemeldet sein, um die Datei herunterladen zu können.

Keine Kommentare

Kommentar abgeben