9 HighDPI Unterstützung

Die Auflösung moderner Bildschirme wächst stetig. Damit ändern sich auch die Anforderungen an Design und Qualität der Bedienelemente und Oberflächen. Probleme sind dabei häufig, dass Anwendungen viel zu klein erscheinen und Text und Grafiken unscharf oder pixelig dargestellt werden. Die im System eingestellte Auflösung, DPI und Skalierung sowie Fonts und Größe und Qualität der Bilder beeinflussen das Darstellungsbild einer Anwendung. Damit bestehende Anwendungen auch auf hochauflösenden Bildschirmen detailreich und scharf dargestellt werden, müssen diese auf HighDPI vorbereitet werden.

Abbildung 19-35: ohne HighDPI Unterstützung

Abbildung 19-36: mit HighDPI Unterstützung

Der IDM für Motif, Qt und Microsoft Windows ab Version A.06.03.a (unter Microsoft Windows nur der IDM für Windows 11) bietet nun die geeigneten Werkzeuge um hochauflösende Bildschirme zu unterstützen und Anwendungen zukunftssicher zu gestalten. Außerdem wurde das Arbeiten mit mehreren Bildschirmen verbessert.
IDM-Anwendungen beachten nun die DPI-Einstellungen und Skalierungsfaktoren des Systems. Bisherige Probleme wie pixelige, matschige oder zu klein angezeigte Anwendungen oder verringerte Schriftgrößen bei hohen Auflösungen und geringer Bildschirmgröße (die Effekte können je nach System variieren) treten somit nicht mehr auf. Der IDM passt Geometrie, Layout, Schriftgrößen, Grafiken sowie Cursor nun automatisch an die entsprechende Auflösung und vom System bestimmte DPI an.
Der Skalierungsfaktor basiert dabei auf den Systemeinstellungen der jeweiligen Desktop-Umgebung.
Es steht dem Anwender aber frei durch verschiedene neue Attribute, Optionen und Mechanismen andere Vorgaben zu machen bzw. gestalterisch einzugreifen.

9.1 Startoptionen

-IDMscale <integer>

Über die Startoption -IDMscale <integer> kann die Skalierung durch den IDM aktiviert oder deaktiviert werden. Unter Qt und Motif gibt der Wert die Skalierung in % an.

Abbildung 19-37: links normal gestartet (Systemskalierung 100%), rechts mit 150% Skalierung gestartet

Hinweis

Diese Option sollte unter Microsoft Windows nicht verwendet werden. Die DPI-Awareness ist eine Eigenschaft der Anwendung und sollte in einer Manifest-Datei spezifiziert werden. Für Testzwecke kann die DPI-Awareness eingeschaltet (Wert: 1) oder ausgeschaltet (Wert: 0) werden.

Achtung:

Es wird empfohlen eine Skalierung > 0 und < 100% nicht zu verwenden, da es hier zu Einschränkung in der Darstellung und Bedienung von Objekten kommen kann.

-IDMtiledpi <integer>

Grafiken werden automatisch entsprechend des eingestellten Vergrößerungsfaktor skaliert. Es wird hierbei davon ausgegangen, dass die Bilder für einen DPI-Wert von 96 entworfen wurden. Sind die Bilder der Anwendung für eine höhere Auflösung entworfen worden, kann diese über die Startoption -IDMtiledpi <integer> eingestellt werden. Die Größe eines Bildes wird dann ausgehend von diesem Wert auf den aktuell geltenden DPI-Wert umgerechnet und dementsprechend skaliert.

Ebenso kann diese Einstellung direkt am setup-Objekt mit dem Attribut .tiledpi (siehe Erweiterung am Setup-Objekt) vorgenommen werden.

9.2 Layout-Ressourcen

Bisher waren die verfügbaren, vordefinierten Ressourcen beim IDM immer WSI- bzw. systemabhängig und bedurften bei Übertragung auf andere Systeme immer aufwändiger Anpassungen. Der IDM A.06.03.a bietet nun erstmals WSI-unabhängige und HighDPI-konforme, vordefinierte Layout-Ressourcen an. Dazu gehören folgende Ressourcen, die auf allen Systemen in ähnlicher Ausprägung bzw. Bedeutung verfügbar sind: font (Zeichensatz), color (Farbe), cursor.
Das bietet den enormen Mehrwert, dass Dialoge, die komplett auf die neuen UI-Ressourcen umgestellt wurden, nun einfach und ohne Aufwand auf andere Systeme übertragen werden können. Erkennbar sind diese Ressourcen über das Namensschema UI*_FONT, UI*_COLOR bzw. UI*_CURSOR.

Beispiel:

module Resc

 

font FontNormal "UI_FONT";

font FontBig "UI_FONT", 16;

font FontFixed "UI_FIXED_FONT";

 

cursor CurStop "UI_STOP_CURSOR";

 

!! Background color for group objects

color ColGrp "UI_BG_COLOR";

!! Background color for input objects

color ColInp "UI_INPUTBG_COLOR";

Die UI_-Ressourcennamen sind ebenfalls – wie alle anderen vordefinierten Ressourcennamen - am setup-Objekt über die Attribute .colorname[integer], .fontname[integer], .cursorname[integer] abfragbar.

Cursor

Die einheitlichen Cursor-Ressourcen haben das Namensschema UI*_CURSOR und sind wie folgt definiert:

UI_CURSOR

Standardcursor meist Pfeil

UI_IBEAM_CURSOR

Edittext-Einfügemarke

UI_WAIT_CURSOR

Anzeige, dass die Anwendung beschäftig ist, „Eieruhr“

UI_CROSS_CURSOR

Kreuz

UI_UP_CURSOR

Pfeil nach oben

UI_SIZEDIAGF_CURSOR

Sizing-Pfeil von links oben nach rechts unten

UI_SIZEDIAGB_CURSOR

Sizing-Pfeil von links unten nach rechts oben

UI_SIZEVER_CURSOR

Sizing-Pfeil von oben nach unten

UI_SIZEHOR_CURSOR

Sizing-Pfeil von links nach rechts

UI_MOVE_CURSOR

Verschiebe-Pfeil in alle Richtungen

UI_STOP_CURSOR

Verbotszeichen (durchgestrichener Kreis)

UI_HAND_CURSOR

Handsymbol (Zeigefinger dient zum Zeigen)

UI_HELP_CURSOR

Pfeil mit Fragezeichen (für Kontexthilfe-Modus)

Fonts

Die einheitlichen Font-Ressourcen haben das Namensschema UI*_FONT und sind wie folgt definiert:

UI_FONT

Schriftart, die standardmäßig für Oberflächenelemente verwendet wird (Default oder Dialog Font).

UI_FIXED_FONT

Schriftart mit einer festen Buchstabenbreite.

UI_MENU_FONT

Schriftart, die für Menüs verwendet wird.

UI_TITLE_FONT

Schriftart, die in der Fensterüberschrift verwendet wird.

UI_SMALLTITLE_FONT

Schriftart, die in einer kleinen/niedrigen Fensterüberschrift verwendet wird.

UI_STATUSBAR_FONT

Schriftart, die in der Statusbar verwendet wird.

UI_NULL_FONT

Verhalten als wenn keine Font-Vorgabe gemacht würde (null).
Das WSI benutzt den für das Oberflächenelement vorgesehenen Standard-Systemfont oder einen Systemfallback-Font.

Color

Die Farb-Ressourcen haben das Namensschema UI*_COLOR und sind wie folgt definiert:

UI_BG_COLOR

Farbe, die standardmäßig für allgemeine Hintergründe von (meist Gruppierungs-) Objekten verwendet wird.
Verwendung bei Objektklassen mit Attribut .bgc/.bgc[], z.B. Fenster, Groupbox, Notepage, Statictext, Pushbutton...

UI_FG_COLOR

Farbe, die standardmäßig für allgemeine Vordergründe/Textfarbe von (meist Gruppierungs-) Objekten verwendet wird.
Verwendung bei Objektklassen mit Attribut .fgc/.fgc [], z.B. Fenster, Groupbox, Notepage, Statictext, Pushbutton...

UI_INPUTBG_COLOR

Farbe, die standardmäßig bei Hintergründen von Eingabe-/Auswahl-Objekten verwendet wird.
Verwendung z.B. bei Edittext, Listen, Tabellen, Poptext, Treeview…(z.B. Objektklassen mit Attributen .bgc/.textbgc)

UI_INPUTFG_COLOR

Farbe, die standardmäßig bei Vordergründen von Eingabe-/Auswahl-Objekten verwendet wird, wie z.B. Edittext, Listen, Tabellen, Poptext, Treeview
(z.B. Objektklassen mit Attributen .fgc/.textfgc)

UI_BUTTONBG_COLOR

Farbe, die standardmäßig beim Hintergrund von Button-artigen Objekten,
z.B. Pushbutton oder Image, verwendet wird
(z.B. Objektklassen mit Attribut .bgc/.imagebgc).

UI_BUTTONFG_COLOR

Farbe, die standardmäßig beim Vordergrund von Button-artigen Objekten,
z.B. Pushbutton oder Image, verwendet wird (z.B. Objektklassen mit Attribut. fgc/.imagefgc).

UI_BORDER_COLOR

Farbe, die standardmäßig als Rahmen, Rand oder Begrenzung verwendet wird (z.B. an .bordercolor).

UI_ACTIVEBG_COLOR

Farbe, die standardmäßig als Hintergrundfarbe des aktiven Elements z.B. bei Listen, Poptext, Tabellen, ggf. Progressbar, Markierungen etc. verwendet wird.
Meist Invertierung der normalen Vorder- und Hintergrundfarben des Widgets (z.B. Objektklassen mit Attribut .bgc ).

UI_ACTIVEFG_COLOR

Farbe, die standardmäßig als Vordergrund-/Textfarbe des aktiven Elements z.B. bei Listen, Poptext, Tabellen, ggf. Progressbar, Markierungen etc. verwendet wird.
Meist Invertierung der normalen Vorder- und Hintergrundfarben des Objekts (z.B. Objektklassen mit Attribut .fgc).

UI_TITLEBG_COLOR

Farbe, die standardmäßig als Hintergrundfarbe bei Titelleisten oder Umrandungen von Fenstern/Dialogen verwendet wird, sofern unterstützt (z.B. an Attribut .titlebgc).

UI_TITLEFG_COLOR

Farbe, die standardmäßig als Vordergrund-/Textfarbe bei Titelleisten oder Umrandungen von Fenstern/Dialogen verwendet wird,
sofern unterstützt (z.B. an Attribut .titlefgc).

UI_MENUBG_COLOR

Farbe, die standardmäßig als Hintergrundfarbe bei Menüs verwendet wird,
sofern unterstützt (z.B. an Attribut .titlebgc).

UI_MENUFG_COLOR

Farbe, die standardmäßig als Vordergrund-/Textfarbe bei Menüs verwendet wird,
sofern unterstützt (z.B. an Attribut .titlefgc).

UI_HEADERBG_COLOR

Farbe, die standardmäßig als Hintergrundfarbe bei Tabellenheadern – sofern unterstützt – verwendet wird.

UI_HEADERFG_COLOR

Farbe, die standardmäßig als Vordergrund-/Textfarbe bei Tabellenheadern – sofern unterstützt – verwendet wird.
Verwendung bei Tablefield (z.B. an Attribut .rowheadfgc, .cloheadfgc).

UI_NULL_COLOR

Verhalten, als wenn keine Farbe (null) gesetzt wäre. WSI zeichnet nach seiner Standardpalette.

Es kann vorkommen, dass sich nicht alle UI*COLORS voneinander unterscheiden. Das liegt daran, dass die meisten Desktopfarben aus wenigen Basisfarben "berechnet" werden.

Hinweise Motif:

Neben den UI*_COLOR Farben wurden die Systemnamen für Farb-Ressourcen vervollständigt. Neu hinzugekommen sind:

  • INACTIVE_BACKGROUND
  • INACTIVE_FOREGROUND
  • INACTIVE_TOP_SHADOW
  • INACTIVE_BOTTOM_SHADOW
  • INACTIVE_SELECT
  • SECONDARY_BACKGROUND
  • SECONDARY_FOREGROUND
  • SECONDARY_TOP_SHADOW
  • SECONDARY_BOTTOM_SHADOW
  • SECONDARY_SELECT

Hinweise Windows:

Die UI*_COLOR Farben greifen auf die Windows Systemfarben zu. Hierbei ist zum einen zu beachten, dass mit Einführung der Visual Styles von den einzelnen Objekten nicht mehr die Systemfarben, sondern die durch das Theme definierten Farben verwendet werden. Je nach ausgewähltem Theme kann es somit starke Diskrepanzen geben. Deshalb sollten unter Windows nach Möglichkeit keine Farben (oder besser die UI_NULL_COLOR) gesetzt werden.
Zum anderen ist zu beachten, dass mit Windows 10 die Farbvielfalt verringert wurde. Die Farben UI_HEADERBG_COLOR, UI_HEADERFG_COLOR, UI_MENUBG_COLOR, UI_MENUFG_COLOR, UI_TITLEBG_COLOR und UI_TITLEFG_COLOR werden zum Beispiel nicht mehr unterstützt. Das heißt, dass diese Farben für den Anwender zwar noch verfügbar und nutzbar sind, sie aber aktuell von keinem Objekt defaultmäßig verwendet werden.

Hinweise Qt:

Die UI*_COLOR Farben greifen auf die von Qt angebotenen Farben der Standard-Palette zu. Für die Farbausprägung wird dabei die ColorGroup Normal bzw. Active zugrunde gelegt. Die Farben der Standard-Palette wiederum werden durch den aktuell eingestellten Systemstyle vorgegeben.

Neben den UI*_COLOR Farben wurden die vordefinierten Farben um weitere vom Qt-Toolkit angebotenen ColorRoles vervollständigt. Neu hinzugekommen (in allen Ausprägungen der ColorGroups) sind:

  • BRIGHTTEXT
  • ALTERNATEBASE
  • TOOLTIPBASE
  • TOOLTIPTEXT
  • LINK
  • LINKVISITED
  • PLACEHOLDERTEXT

9.3 Erweiterung an der Tile-Ressource

Die bestehenden Skalierungsoptionen an der Tile-Ressource wurden erweitert. Es kann nun ein .scalestyle angegeben werden, der bestimmt wie ein Tile skaliert werden soll. So können Muster (tiles) nun nach folgenden Merkmalen skaliert werden:

Abbildung 19-38: das gleiche Bild mit verschiedenen Ausprägungen des Attributs .scalestyle bei einer Systemskalierung von 150%

In der Regelsprache stehen dabei folgende Werte zur Auswahl:

Definition am Tile Dynamische Setzung Bedeutung
noscale scalestyle_none

Das Muster bzw. Bild wird nicht skaliert., .tiledpi hat keine Auswirkungen.

scale scalestyle_any

Höhe und Breite des Musters bzw. Bildes werden voll auf die verfügbare Fläche vergrößert.

propscale scalestyle_prop

Höhe und Breite des Musters bzw. Bildes werden auf die verfügbare Fläche vergrößert, wobei Höhen- und Breitenproportionen des Musters bzw. Bildes auf jeden Fall erhalten bleiben. D.h. es können oben und unten bzw. links und rechts Freiflächen entstehen.

numscale scalestyle_num

Die Skalierung des Musters bzw. Bildes wird durch einen numerischen Skalierungsteiler vorgenommen. Dabei wird die Skalierung in Viertel-Schritten vorgenommen, also 1.25-fach, 1.5-fach, 1.75-fach, 2-fach, 2.25-fach, 2.5-fach, usw.
Eine Verkleinerung finded bis maximal 0.25-fach statt.

dpi scalestyle_dpi

Das Muster bzw. Bild wird immer entsprechend der eingestellten Bildschirmskalierung skaliert.

Keine Angabe

scalestyle_auto

Das Muster bzw. Bild wird entsprechend der eingestellten Bildschirmskalierung skaliert. Eine zur Vorgängerversion kompatible Skalierung findet statt. Defaultwert

Der scalestyle kann dabei entweder direkt bei der Definition des Tiles oder aber als dynamisches Attribut angegeben werden.

Tile-Definition:

tileSpec ::= <tileBitmap> | "<Dateipfad>" | "<Grafikressource>" { scale | noscale | numscale | propscale | dpiscale} ;

Dynamisches Attribut:

 

Bezeichner

Datentyp

Regelsprache

.scalestyle

enum

C

AT_scalestyle

DT_enum

COBOL

AT-scalestyle

DT-enum

Klassifizierung

Objektspezifisches Attribut

Objekte

tile

Zugriff

get, set

Standardwert

scalestyle_auto

changed-Ereignis

nein

Vererbung

Beispiel:

dialog D

tile Ti_Rect_Pattern 5,5,

  "#####",

  "# #",

  "# #",

  "# #",

  "#####" noscale;          // entspricht scalestyle_none

tile Ti_BG „bg.gif“ scale;  // entspricht scalestyle_any

tile Ti_Logo „logo.gif“;    // Default: scalestyle_auto

...

on dialog start {

  if setup.scale > 100 then

  Ti_Logo.scalestyle := scalestyle_prop;   // dynamisch

endif

}

Siehe auch Kapitel „tile (Muster) “ im „Ressourcenreferenz“-Handbuch.

9.4 Erweiterung der Font-Ressource

Die Font-Ressource hat eine neue Eigenschaft .propscale. Dies steuert, ob das horizontale und vertikale Raster proportional auf den maximalen Wert gesetzt werden soll, welcher durch die Werteberechnung von xraster und yraster des Font-Rasters ermittelt wird.

Die propscale-Eigenschaft kann dabei entweder direkt bei der Definition des Fonts oder aber als dynamisches Attribut angegeben werden.

Der Divisor dient der Verfeinerung des Rasters.

Font-Definition:

fontspec ::=

...

...

{ x:= * <xscale> % + <xoffset> | / <xdivider>} { y:= * <yscale> %

+ <yoffset> | / <ydivider>}

{ propscale }

{ r:= "<RefString >" } ;

Dynamisc hes Attribut:

 

Bezeichner

Datentyp

Regelsprache

.propscale

boolean

C

AT_propscale

DT_boolean

COBOL

AT-propscale

DT-boolean

Klassifizierung

Objektspezifisches Attribut

Objekte

font

Zugriff

get, set

Standardwert

false

changed-Ereignis

nein

Vererbung

Siehe auch Kapitel „font (Zeichensatz)“ im „Ressourcenreferenz“-Handbuch.

9.5 Erweiterung am Setup-Objekt

 

Bezeichner

Datentyp

Regelsprache

.tiledpi

integer

C

AT_tiledpi

DT_integer

COBOL

AT-tiledpi

DT-integer

Klassifizierung

Objektspezifisches Attribut

Objekte

setup

Zugriff

get, set

Standardwert

changed-Ereignis

nein

Vererbung

 

Bezeichner

Datentyp

Regelsprache

.tiledpi

integer

C

AT_tiledpi

DT_integer

COBOL

AT-tiledpi

DT-integer

Klassifizierung

Objektspezifisches Attribut

Objekte

setup

Zugriff

get, set

Standardwert

96

changed-Ereignis

nein

Vererbung

Dieses Attribut bestimmt für welche Auflösung die Bilder/Muster entworfen wurden. Die Größe eines Bildes/Musters wird ausgehend von diesem Wert auf den aktuell geltenden DPI-Wert umgerechnet.

Siehe auch Kapitel „setup“ im „Objektreferenz“-Handbuch.

9.6 Erweiterungen am Image-Objekt

Für eine bessere Ausrichtung und erweiterte Layoutmöglichkeiten können nun über die folgenden Attribute am Image-Objekt die Ränder bzw. Abstände gesteuert werden:

 

Bezeichner

Datentyp

Regelsprache

.xmargin

integer

C

AT_xmargin

DT_integer

COBOL

AT-ymargin

DT-integer

Klassifizierung

Objektspezifisches Attribut

Objekte

image

Zugriff

get, set

Standardwert

0

changed-Ereignis

nein

Vererbung

ja

Dieses Attribut bestimmt den horizontalen Abstand zwischen Rand und Darstellungsbereich.

 

 

Bezeichner

Datentyp

Regelsprache

.ymargin

integer

C

AT_ymargin

DT_integer

COBOL

AT-ymargin

DT-integer

Klassifizierung

Objektspezifisches Attribut

Objekte

image

Zugriff

get, set

Standardwert

0

changed-Ereignis

nein

Vererbung

ja

Dieses Attribut bestimmt den vertikalen Abstand zwischen Rand und Darstellungsbereich.

Siehe auch Kapitel „image (Bild)“ im „Objektreferenz“-Handbuch.

9.7 Unterstützung von HiDPI Bild-Varianten

Für eine optimale Gestaltung der Oberfläche bzgl. Bilder und Applikations-Icons durch Ausnutzung der höheren Auflösung sind für die Skalierungsstufe angepasste Bilder sinnvoll.
Bisher gab es hier nur für die Fenstersysteme Windows und Qt eingeschränkte Möglichkeiten. Windows bietet hier bislang zur Unterstützung den ICON/BITMAP-Mechanismus und Qt den Icon-Ressource-Mechanismus. Beide Mechanismen ermöglichen das Vorhalten mehrerer Auflösungsstufen, sind jedoch begrenzt was Bildtyp oder Verwendung angeht. Einen solchen Mechanismus gibt es für Motif nicht.
Daher wurde mit dem IDM A.06.03.a eine Möglichkeit zum Laden mehrerer Auflösungsstufen geschaffen, die gleichermaßen für Windows, Qt und Motif angewandt werden kann und somit auch systemunabhängig ist.
Die Tile-Verwaltung vom IDM war bisher nur in der Lage eine Bilddatei zu laden (bspw.: tile Ti smiley.gif) und konnte nicht mehrere Auflösungsstufen der Datei vorhalten (bis auf o.g. Ausnahmen). Liegt nun eine Skalierung der Anwendung vor, versucht der neue Lademechanismus für Tile-Dateien nun zuerst die Bilddaten für die entsprechende Skalierung zu laden. Dazu wird in Anlehnung an den Qt-Mechanismus die Endung @nx an den Dateinamen und vor dem Suffix angehängt. Dabei steht n für die Skalierungsstufe zwischen 2 und 9. Die Zahl 2 entspricht dabei einer Skalierung von 150%-249%, 3 von 250%-349%, usw.
Sinnvollerweise sollten die Größenänderungen der Varianten Bilder der Skalierungsstufe entsprechen, wobei eine Überprüfung durch den IDM nicht erfolgt. Also z.B. Orginalbild smiley.gif (32x32 Pixel), smiley@2x.gif (64x64 Pixel), smiley@3x.gif (96x96 Pixel), smiley@4x.gif (128x128 Pixel).

Beispiel:

tile Ti „smiley.gif“;  // bei einer Skalierung von 200% wird – sofern

                       // vorhanden – vom IDM automatisch das Bild

                       // smiley@2x.gif geladen (Windows, Motif, Qt)

 

                       // bei einer Skalierung von 300% wird – sofern

                       // vorhanden – vom IDM automatisch das Bild

                       // smiley@3x.gif geladen (Windows, Motif, Qt)

 

tile Ti2 „smiley.ico“  // nur Windows! ICON-Mechanismus von Window nimmt

                       // das für die Auflösungsstufe am besten Bild aus

                       // der .ico-Datei

 

tile Ti3 „:/smiley“    // nur Qt! Der Resource-Mechanismus von Qt nimmt das

                       // für die Auflösungsstufe am besten passende Bild

                       // mit dem hier angegebenen Alias aus der Ressource-

                       // Datei

9.8 Installationshinweise

Um eine Anwendung für unterschiedliche Auflösungen vorzubereiten, kann es notwendig sein, die Grafiken für die verschiedenen Skalierungsstufen vorzuhalten. Wer das in Anspruch nehmen möchte und nicht den ICON-Mechanismus von Windows oder den Resource-Mechanismus von Qt nutzt, der sollte darauf achten die Bilderdateien entsprechend der @-Namensgebung (siehe Kapitel „Unterstützung von HiDPI Bild-Varianten“) mit seiner Anwendung mit auszuliefern bzw. diese ggf. in die Installationspakete mit aufzunehmen.

9.9 Geometrie und Koordinaten

Koordinaten und Größenangaben werden vom IDM passend zum Skalierungsfaktor des Systems transformiert um eine zu den Systemeinstellungen konsistente Darstellung zu gewährleisten.

Die Geometrieeinheiten werden dabei wie bisher in IDM-Pixelwerten oder Raster gesetzt.

Die IDM-Pixelwerte werden intern entsprechend dem Skalierungsfaktor in reale Pixelwerte hochgerechnet und umgesetzt. Dadurch wird die Anwendung als Ganzes skaliert und Verhältnisse und Proportionen der Objekte zu- und untereinander beibehalten.

Diese Konvertierung geschieht in beide Richtungen. Beim Abfragen von Größe und Position von Objekten wie auch bei der Event-Verarbeitung werden die realen Pixelwerte vom IDM ebenso wieder bereinigt in IDM-Pixelwerten angegeben. Der Vergrößerungsfaktor ist dann wieder herausgerechnet. Dies betrifft alle pixelorientierten Geometrieattribute.

Rasterwerte sind entweder an den verwendeten (HighDPI-fähigen) Zeichensatz geknüpft oder werden ebenfalls in IDM-Pixelwerten gesetzt und dann hoch skaliert. Die Rastereinheiten können basierend auf der zugrundeliegenden Schriftart ebenfalls zu IDM-Pixelwerten ermittelt werden.

9.10 Unterstützung hoher Auflösungen unter Motif

Das Motif-Toolkit selbst enthält zwar keine besondere Technologie zur Unterstützung hoher Auflösungen, wenn aber das verwendete X-Display die Xrender-Extension implementiert hat und eine Unterstützung von XFT-Fonts mit den entsprechenden Schriftarten vorliegt, können IDM-Anwendungen für Motif auf HiDPI-Bildschirmen, unter Berücksichtigung des Skalierungsfaktors des Desktops, betrieben werden.

Wie kann geprüft werden, ob auf dem verwendeten X-Display/Desktop eine Unterstützung vorliegt? Dazu kann die Serverinformation des X-Displays über die Option -IDMserver: erfragt werden.

$ idm -IDMserver

ServerVendor The X.Org Foundation

VendorRelease 12013000

Motif at compiletime @(#)Motif Version 2.3.8

Motif at runtime 2003

XRenderVersion 11 (active)

XFT Support yes (active)

Scaling 200% (active)

Screen dpi 96 (tile dpi: 96, scaled dpi: 192)

Die Version der Xrender-Extension und deren Nutzbarkeit (active) wird darin ebenso aufgelistet wie das Vorhandensein von XFT und seiner Nutzbarkeit. Die „Scaling“-Zeile zeigt den Skalierungsfaktor an, der in den Desktop-/Anzeigeeinstellungen vom Anwender gesetzt wurde.

Die DPI-Information welche X liefert, ist zumeist der Standardwert von 96 und spiegelt damit nicht unbedingt den real am Monitor vorhandene DPI-Wert wider. Die optional ausgegebenen „tile dpi“ und „scaled dpi“ dienen zur Kontrolle der für die Bilder und Bedienelemente zugrunde gelegten DPI-Werte.

Ein dynamisches Wechseln der Skalierung ist für Motif-Anwendungen nicht vorgesehen. Ebenso kann eine Umsetzung der Skalierung im Desktop nicht erkannt werden.

Unterstützung von XFT / Font-Handhabung / Motif-Font

Die Basis für eine GUI-Anwendung für unterschiedliche Desktop-Skalierungen stellen die verwendeten Schriften dar. Im Gegensatz zu den bisher unter Motif/X verwendbaren Schriftarten, die meist über einen XLFD (X Logical Font Descriptor) angeben wurden, werden XFT Fonts entsprechend der gesetzten Skalierung des Desktop mitskaliert.

Die bisher unter dem IDM für Motif verwendbaren Schriftarten hatten sich nicht automatisch an unterschiedliche Desktop-Skalierungen angepasst.

Die XFT-Unterstützung ist im IDM nur auf Linux-Plattformen verfügbar. Da die meisten Desktops auf Linux-Plattformen den Standard-Font für Motif-Widgets nur unzureichend setzen, benutzt der IDM Liberation Sans als Standard-Schrift und Liberation Mono als Festbreitenschriftart, wenn kein Font im Dialog gesetzt wurde. Dadurch skalieren sich Texte in IDM-Dialogen auch ohne gesetzte Schriftart.
Durch explizites Ausschalten des Scaling (über die Startoption -IDMscale=0), kann man die alten Default-Schriftarten erhalten.

Zum setzen eines XFT Fonts muss wie bei bisherigen Fontdefinitionen im IDM nur der Fontname und ggf. weitere Modifier gesetzt werden. Ist der Font als XFT Font auf dem System vorhanden, dann wird dieser geladen. Die Liste der auf dem System verfügbaren XFT Fonts kann im IDM Editor eingesehen werden.

Unter CDE-konformen Plattformen wie AIX und HP-UX verwendet der IDM als Standard-Schrift -dt-interface_system-medium-r-normal-* und -dt-interface_user-medium-r-normal-* als Festbreitenschrift, sofern keine Schrift gesetzt wurde. Je nach Skalierungsfaktor werden dabei unterschiedliche Größenausprägungen des Fonts herangezogen. Zwischen 1%...75% wird xs (extra small) verwendet, zwischen 75%-150% wird m (medium) verwendet, zwischen 150%-250% wird l (large) verwendet und ab 250% wird xxl (extra extra large) verwendet. Dadurch kann für solche Anwendungen eine Skalierbarkeit erreicht werden auch wenn keine XFT-Fonts verfügbar sind.

9.11 Unterstützung hoher Auflösungen beim IDM für Windows 11

Es gibt jetzt einen IDM für Windows 11 und einen für Windows 10. Der IDM für Windows 11 unterstützt DPI-Awareness und High DPI.

Der IDM für Windows 11 unterstützt hohe Auflösungen des Modells PerMonitor V2. Da die Unterstützung hoher Auflösungen eine Eigenschaft der Anwendung ist, muss diese im Anwendungsmanifest entsprechend gekennzeichnet werden. Entsprechende Setzung können in den IDM-Beispielen entnommen werden. Der IDM erkennt dies dann selbständig und rechnet die Koordinaten entsprechend dem eingestellten Vergrößerungsfaktor um. Mit anderen Worten, die Pixelkoordinaten des IDM sind virtuelle Pixel, die entsprechend dem eingestellten Vergrößerungsfaktor umgerechnet werden.

Die Manifest-Dateien der IDM-Beispiele kennzeichnen die gebauten Anwendungen als High DPI-Aware. Um eine Anwendung zu bauen, die nicht DPI-Aware ist, muss der gesamte Block <asmv3:application> aus der Manifest-Datei entfernt werden.

Hinweise IDM für Windows 11

Alle Funktionen, die Microsoft Windows Nachrichten verarbeiten: Wenn die Anwendung hohe Auflösungen unterstützt, dann sind alle Koordinaten, die über Microsoft Windows Nachrichten erhalten werden, die realen hochauflösenden Koordinaten. Der IDM benutzt dagegen um den Vergrößerungsfaktor bereinigte Koordinaten. Es muss also berücksichtigt werden, dass im Falle der Unterstützung hoher Auflösungen, die IDM-Koordinaten im Allgemeinen nicht mehr identisch zu den Microsoft Windows Koordinaten sind. Betroffen hiervon sind zum Beispiel Inputhandler-, Canvas-, Monitor- und Subclassing-Funktionen, sowie auch die USW-Implementierungen.

Hinweise IDM für Windows 10 und 11:

Die Unterstützung hoher Auflösungen erfordert eine andere Behandlung von Windowsnachrichten. Dadurch ist es leider nicht mehr möglich Fenster während des Verschiebens oder Vergrößerns an Rahmenbedingungen wie zum Beispiel Rasterkoordinaten anzupassen. Erst nach dem Loslassen der Maustaste wird das Fenster auf die nächste Rasterkoordinate angepasst.

Intern definierte Cursor werden jetzt auf die vom System geforderte Größe vergrößert bzw. verkleinert, um diese automatisch auf den eingestellten Vergrößerungsfaktor anzupassen. Hierdurch werden die Cursor richtig dargestellt, wenn die Anwendung hohe Auflösungen unterstützt. Bisher wurden die Cursor entweder mit durchsichtigen Bereichen aufgefüllt oder einfach abgeschnitten, wenn die Größe nicht passte.

Bilder (tile Ressource) werden automatisch entsprechend des eingestellten Vergrößerungsfaktor vergrößert. Es wird hierbei davon ausgegangen, dass die Bilder für einen DPI-Wert von 96 entworfen wurden. Sind die Bilder der Anwendung für eine höhere Auflösung gestaltet, dann kann dies am setup Objekt mit dem Attribute .tiledpi eingestellt werden. Eine automatische Anpassung gilt nur für die tile-Ressource. Bilder die direkt über den Dateinamen am .picture Attribute des image-Objektes angegeben werden, werden nicht automatisch angepasst.

Als Standardschriftart wird nun die in den Systemparameters definierte Dialog- bzw. Message-Schriftart verwendet, da diese sich an die Auflösung anpasst. Hierdurch kann es zu Änderungen der Darstellung von Objekten kommen, die keine Schriftart gesetzt haben. Die erwähnte Schriftart kann über Windows Systemeinstellungen konfiguriert werden.

Die alten Systemschriftarten sind nicht DPI-Aware. Nur die neuen UI*_FONT Schriftarten passen sich der eingestellten Auflösung an.
Die alten Windows-Schriftarten ANSI_FIXED_FONT, ANSI_VAR_FONT, DEVICE_DEFAULT_FONT und SYSTEM_FONT lassen sich nicht an verschiedene Auflösungen anpassen, daher wird von der Verwendung abgeraten. Von der Verwendung von Schriftarten ohne Größenangabe wird abgeraten, da in einem solchen Fall vom Windows Font Mapper eine schriftartspezifische Standardgröße gewählt wird, die sich nicht an unterschiedliche Auflösungen anpasst.

9.12 Unterstützung hoher Auflösungen unter Qt

Für die Unterstützung hoher Auflösungen aktiviert der IDM das Qt-seitige HighDpi-Scaling sowie das mögliche Rendern von Bildern über ihre eigentlich angeforderte Größe hinaus. D.h. die Skalierung wird auf Basis der Pixeldichte des Monitors vorgenommen.

Unter Linux Desktop-Umgebungen ist die Unterstützung für HighDPI leider sehr unterschiedlich ausgeprägt und fortgeschritten. Da die Werte für logische und tatsächliche Pixeldichte sowie Skalierungsfaktoren vom Qt-Framework bezogen werden, kann es sein, dass weniger populäre Desktop-Umgebungen hier unzureichende Werte liefern.

Hinweise zu HighDPI Einstellungen

Qt bietet noch einige Umgebungsvariablen an, mit denen die Darstellung bei hohen Auflösungen gesteuert werden kann. Bei Einsatz solcher Umgebungsvariablen sollte jedoch bewusst sein, dass somit das Verhalten des IDM überschrieben wird und es dadurch zu ungewollten Darstellungseffekten kommen kann.

Anmerkungen zur Skalierung von Tiles

Objekte werden standardmäßig mit den vom Desktop-Style vorgegebenen Werten durch das WSI/Toolkit dargestellt. Es kann daher in bestimmten Situationen vorkommen, dass die gewünschten Einstellungen bezüglich Größe und Skalierung von Tiles nicht umgesetzt werden. Dies betrifft die Verwendung von Tiles bei Objekten mit Tabs wie dem Notebook bzw. den Notepages sowie dem Menu mit Menuitems. Der IDM setzt zwar die gewünschten Darstellungsoptionen, jedoch unterliegt die finale Anzeige der Darstellungsrichtlinie der jeweiligen DrawingEngine des gesetzten UI-Styles. Das bedeutet, dass die Anzeige von den gesetzten Optionen Style-abhängig abweichen kann oder Optionen vollständig ignoriert werden.

9.13 Erweiterungen/ Änderungen im IDMED

Eine beliebige Auswahl der Schriftart für die Bedienoberflächen oder Regelcode ist nicht mehr möglich. Dafür kann die Schriftgröße zwischen Klein (Small) – Normal – Groß (Large) – Extra Groß (Extra Large) ausgewählt werden. Diese hat dann natürlich Einfluss auf die Fenstergröße.

Im Schriften- bzw. Font-Einstellungsbereich werden unter Motif auch XFT-Fonts aufgelistet. Außerdem kann die Liste der Auswählbaren Schriften zum Zwecke der Übersichtlichkeit auf UI-Fonts, X-Fonts und XFT-Fonts reduziert werden.

Der IDMED, TracefileAnalyzer sowie der Debugger setzen nun UI-Ressourcen ein.

9.14 Unterstützung hoher Auflösungen bei der USW-Programmierung

Die Funktion DM_GetToolkitDataEx wurde zur Unterstützung von HighDPI verbessert. Die ToolkitDaten-Struktur DM_ToolkitDataArgs wurde zu diesem Zweck erweitert und liefert nun detaillierte Informationen zu DPI, Skalierungsfaktor und Bild. Diese können über die Attribute AT_DPI und AT_XWidget erfragt werden.

Hinweis Motif

Der USW-Programmierer muss die Koordinaten zwischen dem IDM (dies betrifft Attribute sowie Events) und den Motif-Werten/Strukturen/Funktionen (X…/ Xt…/ Xm…) umrechnen. Die für eine Umrechnung benötigten Daten können über Funktion DM_GetToolkitDataEx mittels AT_DPI und die ToolkitDaten-Struktur DM_ToolkitDataArgs-Struktur (tile.scale.factor) erfragt werden. Je nach Bildart muss u.U. auch eine Skalierung vorgenommen werden.

Hinweis für Windows 11

Der IDM für Windows 11 unterstützt hohe Auflösungen. Wenn eine Anwendung für hohe Auflösungen freigegeben wird, dann müssen auch die von ihr verwendeten USW-Objekte hohe Auflösungen unterstützen. Das heißt dann, dass die USW-Objekte von Windows reale Koordinaten erhalten (um den Vergrößerungsfaktor vergrößert), während der IDM mit virtuellen Koordinaten (nicht vergrößert) arbeitet. Praktisch wird sich nicht viel ändern, da der IDM die Koordinatenberechnungen für das USW Objekt ausführt. Aber es ist zu berücksichtigen, dass der control Aufruf für UC_C_PrefSize reale Koordinaten erwartet, da diese im Normalfall aus Toolkitwerten berechnet werden. Sind hier fixe Zahlen wie im ucarrow Beispiel eingesetzt, dann müssen diese um den aktuellen DPI-Wert korrigiert werden (siehe ucarrow Beispiel).

Wenn die Anwendung als DPI-Aware gestartet wurde, werden nun von der Task UC_I_clientarea der Funktion UC_Inquire auch die hochauflösenden Werte erwartet.

Ergänzungen der C-Schnittstelle für DM_GetToolkitData() und DM_GetToolkitDataEx()

Bei den C-Schnittstellen Funktionen "DM_GetToolkitData()", "DM_GetToolkitDataEx()" und Toolkitdaten-Struktur "DM_ToolkitDataArgs" gibt es zur Unterstützung von hohen Auflösungen die folgenden Erweiterungen:

Attribute AT_DPI

Gibt den DPI-Wert des Systems oder des angegebenen Objektes zurück. Die Funktion "DM_GetToolkitDataEx()" muss mit einem Zeiger auf eine Toolkitdaten-Struktur "DM_ToolkitDataArgs" aufgerufen werden. In dieser Struktur werden weitere DPI-Informationen zurückgeliefert. Sie ist hierzu um das Datenfeld "dpi" und die Unterdatenstruktur "scale" erweitert.

Attribute "AT_Tile" bzw. "AT_XTile"

Dieses Attribut gab es schon für die "tile" Ressource. Jetzt kann die Funktion "DM_GetToolkitDataEx()" mit einem Zeiger auf eine Toolkitdaten-Struktur "DM_ToolkitDataArgs" aufgerufen werden, die um die Unterdatenstruktur "tile" erweitert wurde. Diese enthält unter anderem den DPI-Wert, für den die "tile" Ressource entworfen wurde.

Attribute "AT_IsNull"

Liefert einen Wert ungleich "0" zurück, wenn die angegebene "color" oder "font" Ressource auf "UI_NULL_FONT" bzw. "UI_NULL_COLOR" definiert war.

 

Siehe auch Kapitel„ToolkitDaten-Struktur DM_ToolkitDataArgs“ im „C-Schnittstelle - Grundlagen“-Handbuch.

Siehe auch Kapitel „DM_GetToolkitDataEx“ im „C-Schnittstelle - Funktionen“-Handbuch.

Siehe auch Kapitel „DM_GetToolkitDataEx“ im „C-Schnittstelle - Funktionen“-Handbuch.