Sign in Join
Wiki copytemporary

High DPI/de: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
1-\
21Zurück zu den [[Additional information/de|Zusätzlichen Informationen]].\
3-\
2+
43== Definition == DPI (dots per inch = Punkte pro Zoll) ist das Verhältnis zwischen Größe in Pixeln und der tatsächlichen Anzeigegröße. Hier steht "Punkt" (dot) als Äquivalent für Pixel in der Druckterminologie. Anwendungen können entweder Pixelgrößen verwenden, oder die aktuelle Anzeigegröße berücksichtigen. In diesem zweiten Fall sind die Größen in "Punkten" angegeben.
54
65Unter Windows Vista und höher ist es möglich, das DPI-Verhältnis zu ändern, um Elemente größer darzustellen. High DPI ("Hochauflösung") bedeutet jede benutzerdefinierte Textgröße (DPI) mit mehr als 96 DPI (Standard) \[<http://msdn.microsoft.com/en-us/library/ee318406(VS.85>).aspx *\].
76
87High DPI awareness (= Berücksichtigung der Hochauflösung) bedeutet also, dass eine Anwendung diese DPI-Einstellungen beachtet.
98
109## Pixel und Punkte
1110
1211Zum Beispiel bedeutet 300 DPI, dass es 300 Pixel (oder dot) pro Inch gibt. Wenn aber dafür 72 Punkte pro Inch definiert sind, so bedeutet das:
1312
1413300 Pixel ↔ 1 Inch
1514
1615300/72 Pixel ↔ 1 Punkt
1716
18174.16 Pixel ↔ 1 Punkt
1918
2019Im Fall von 96 DPI gilt:
2120
222172 Pixel ↔ 1 Inch
2322
24231.33 Pixel ↔ 1 Punkt
2524
2625und bei 144 DPI:
2726
2827144 Pixel ↔ 1 Inch
2928
30292 Pixel ↔ 1 Punkt
3130
3231## Benutzerdefinierte Textgröße (High DPI) in Windows festlegen
3332
3433Unter Windows 7 gehen Sie zu Systemsteuerung \> Darstellung und Anpassung \> Anzeige.
3534
3635Wählen Sie: Kleiner 100% (Standard), Mittel 125% oder Größer 150%. Wenn Sie 100% (96 DPI) ausgewählt haben, ist das die Standardeinstellung von Windows für den DPI-Wert, aber nicht High DPI.
3736
3837Bei 125% (120 DPI) ist die Option "DPI-Skalierung im Stil von Windows XP verwenden" aktiviert, Anwendungen werden unter diesen Einstellungen wie bei Windows XP skaliert.
3938
4039Bei 150% (144 DPI) ist die Option "DPI-Skalierung im Stil von Windows XP verwenden" deaktiviert (die DPI Virtualisierung ist aktiviert). Anwendungen, die mit dieser Einstellung ablaufen, müssen selbst die Hochauflösung verwalten ("High DPI Awareness") ansonsten liefert die Skalierung des Systems ein verwischtes, unscharfes Bild.
4140
4241Sie können den DPI-Wert auch mit dem Dialog "Benutzerdefinierte Textgröße (DPI) festlegen" einstellen und die DPI Virtualisierung aktivieren/ deaktivieren.
4342
4443## Beispiel
4544
4645Hier ist ein Formular mit undefinierter Fontgröße (Size ist auf 0 gesetzt; das ist der Vorgabewert). Entworfen bei 96 DPI (100%), sieht das so aus:
4746
48-<figure>
49-<img src="Testdpi100.png" title="Testdpi100.png" />
50-<figcaption>Testdpi100.png</figcaption>
51-</figure>
47+![](/wiki-images/7/75/Testdpi100.png)
5248
5349Jetzt mit 120 DPI (125%) wird es zu:
5450
55-<figure>
56-<img src="Testdpi125.png" title="Testdpi125.png" />
57-<figcaption>Testdpi125.png</figcaption>
58-</figure>
51+![](/wiki-images/0/03/Testdpi125.png)
5952
6053Wie Sie sehen wird die Schrift größer und abgeschnitten. Der Fenstertitel wird größer, aber der Clientbereich behält seine Abmessungen. Beachten Sie, dass diese Größenänderungen beim Einsatz verschiedener Windows-Themen oder eines anderen Betriebssystems auftreten können.
6154
6255Um dies zu vermeiden setzen Sie die Schriftgröße (Size) auf einen Wert ungleich 0. Beachten Sie, dass Font.Size in Punkten angegeben wird und Font.Height in Pixel. Tatsächlich wird nur der Wert von Font.Height gespeichert und Font.Size ändert sich abhängig vom aktuellen DPI-Wert. Wenn wir also Font.Size angeben, wird die Schriftgröße auf eine bestimmte Größe in Pixeln festgelegt.
6356
6457Ber einer fixierten Schriftgröße von 9 Punkt bei 96 DPI (100%), erhalten wir dies:
6558
66-<figure>
67-<img src="Testdpi100fixedM12P9.png" title="Testdpi100fixedM12P9.png" />
68-<figcaption>Testdpi100fixedM12P9.png</figcaption>
69-</figure>
59+![](/wiki-images/f/fe/Testdpi100fixedM12P9.png)
7060
7161Wenn jetzt das selbe Programm bei 120 DPI (125%) läuft, wird daraus:
7262
73-<figure>
74-<img src="Testdpi125fixedM12P9.png" title="Testdpi125fixedM12P9.png" />
75-<figcaption>Testdpi125fixedM12P9.png</figcaption>
76-</figure>
63+![](/wiki-images/a/a1/Testdpi125fixedM12P9.png)
7764
7865Das Ergebnis ist fast das selbe. Die Titelzeile ist größer, aber der Clientbereich und dessen Schriftgröße blieben gleich. Beachten Sie aber, dass sich die Punktgröße der Titelschriftart geändert hat.
7966
8067Als Schlussfolgerung ist es möglich, Inkonsistenzen der Anzeige durch Festlegung der Schriftgrößen zu vermeiden. Aber wir berücksichtigen dabei nicht, dass die grafischen Elemente durch die aktuellen DPI des Bildschirms weniger Platz lassen. Bei Berücksichtigung der Hochauflösung ist es möglich, dass sich Anwendungen so verhalten, als wüßten sie die wirkliche Größe der Pixel.
8168
8269## Beispiel (Windows)
8370
8471[CPickSniff](http://sourceforge.net/projects/cpicksniff2/) ist eine Anwendung zum Abfragen der Farben am Bildschirm. Wir nehmen sie als Beispiel, wie sich High DPI unter Windows auswirkt.
8572
8673### Standard DPI
8774
8875Das ist das Programm bei 96 DPI (100%). Es ist der Vorgabemodus, in dem keine Skalierung nötig ist.
8976
90-<figure>
91-<img src="cpicksniff_defaultdpi.png" title="cpicksniff_defaultdpi.png" />
92-<figcaption>cpicksniff_defaultdpi.png</figcaption>
93-</figure>
77+![](/wiki-images/4/4b/Cpicksniff_defaultdpi.png)
9478
9579### Windows DPI Skalierung
9680
9781Dies ist das gleiche Programm bei 144 DPI (150%) ohne ein Manifest, also skaliert Windows es wie eine Bitmap. Das Ergebnis ist ein verwaschenes Bild.
9882
99-<figure>
100-<img src="cpicksniff_blured.png" title="cpicksniff_blured.png" />
101-<figcaption>cpicksniff_blured.png</figcaption>
102-</figure>
83+![](/wiki-images/5/54/Cpicksniff_blured.png)
10384
10485### Mit Manifest
10586
10687Ebenfalls bei 144 DPI (150%). Dieses Mal enthält die Anwendung ein Manifest, aber sie enthält keinen Code, um mit der Skalierung umzugehen. Die Elemente werden nicht skaliert, die Schrift schon (Windows macht das automatisch), also wird der Text abgeschnitten.
10788
108-<figure>
109-<img src="cpicksniff_nohighdpi.png" title="cpicksniff_nohighdpi.png" />
110-<figcaption>cpicksniff_nohighdpi.png</figcaption>
111-</figure>
89+![](/wiki-images/1/1b/Cpicksniff_nohighdpi.png)
11290
11391### High DPI
11492
11593Zuletzt mit Manifest und einem Skalierungshandler, die Anwendung ist in High DPI.
11694
117-<figure>
118-<img src="cpicksniff_highdpi.png" title="cpicksniff_highdpi.png" />
119-<figcaption>cpicksniff_highdpi.png</figcaption>
120-</figure>
95+![](/wiki-images/b/bd/Cpicksniff_highdpi.png)
12196
12297## Hochauflösender Text in Lazarus
12398
12499Mit Lazarus erzeugen Sie eine Anwendung für hochauflösende Schriftgrößen unter Windows 7 mit den beiden folgenden Schritten.
125100
126101### SCHRITT 1 - Deklarieren Sie High DPI Awareness
127102
128103Dazu brauchen Sie eine Manifest-Datei die diese Deklaration enthält. Mit Lazarus 0.9.30 erreichen Sie dies mit Projekt \> Projekteinstellungen \> dann wählen Sie die Optionen "Themen mit Manifest-Datei einschalten (nur in Windows)" und "dpi-abhängige Anwendung (für Vista +)".
129104
130105### SCHRITT 2 - Skalieren Sie die Formulare und Steuerelemente
131106
132107Dazu rufen Sie die folgende Prozedur 'ScaleDPI' im Ereignis 'OnCreate' eines jeden Formulars aus Ihrem Projekt auf.
133108
134109Kopieren Sie zuerst den nachfolgenden Code und speichern Sie ihn in einer Textdatei namens "uscaledpi.pas":
135110
136111``` pascal
137112unit uscaledpi;
138113
139114{$mode objfpc}{$H+}
140115
141116interface
142117
143118uses
144119 Forms, Graphics, Controls;
145120
146121procedure HighDPI(FromDPI: Integer);
147122procedure ScaleDPI(Control: TControl; FromDPI: Integer);
148123
149124implementation
150125
151126procedure HighDPI(FromDPI: Integer);
152127var
153128 i: Integer;
154129begin
155130 for i:=0 to Screen.FormCount-1 do
156131 ScaleDPI(Screen.Forms[i],FromDPI);
157132end;
158133
159134procedure ScaleDPI(Control: TControl; FromDPI: Integer);
160135var
161136 n: Integer;
162137 WinControl: TWinControl;
163138begin
164139 if Screen.PixelsPerInch = FromDPI then exit;
165140
166141 with Control do begin
167142 Left:=ScaleX(Left,FromDPI);
168143 Top:=ScaleY(Top,FromDPI);
169144 Width:=ScaleX(Width,FromDPI);
170145 Height:=ScaleY(Height,FromDPI);
171146 Font.Height := ScaleY(Font.GetTextHeight('Hg'),FromDPI);
172147 end;
173148
174149 if Control is TWinControl then begin
175150 WinControl:=TWinControl(Control);
176151 if WinControl.ControlCount > 0 then begin
177152 for n:=0 to WinControl.ControlCount-1 do begin
178153 if WinControl.Controls[n] is TControl then begin
179154 ScaleDPI(WinControl.Controls[n],FromDPI);
180155 end;
181156 end;
182157 end;
183158 end;
184159end;
185160
186161end.
187162```
188163
189164Kopieren Sie diese Datei "uscaledpi.pas" in den Hauptordner Ihres Projekts:
190165
191166` MyProject\uscaledpi.pas`\
192167` `
193168
194169Fügen Sie im Abschnitt "uses" von Ihrem Projekt den Ausdruck "uScaleDPI" hinzu:
195170
196171``` pascal
197172unit form1;
198173
199174{$mode objfpc}{$H+}
200175
201176interface
202177
203178uses
204179 Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
205180 uScaleDPI; // Dies enthält die Prozedur 'ScaleDPI'
206181```
207182
208183Das OnCreate-Ereignis jedes Formulars ruft die Prozedur so auf:
209184
210185``` pascal
211186procedure TForm1.FormCreate(Sender: TObject);
212187begin
213188 ScaleDPI(Self,96); // 96 ist der DPI-Wert beim Entwurf des Formulars
214189end;
215190```
216191
217192### Skalieren Sie alle Formulare
218193
219194Sie können den Schritt 2 abändern, um alle Formulare zu skalieren.
220195
221196Dazu öffnen Sie den Quelltext Ihres Projektes (typischerweise die Datei *Project1.lpr*) und fügen 'uScaleDPI' im Abschnitt 'uses' hinzu.
222197
223198Dann rufen Sie die Prozedur *HighDPI* nach dem Code der die Formulare initialisiert auf:
224199
225200``` pascal
226201begin
227202 RequireDerivedFormResource := True;
228203 Application.Initialize;
229204 Application.CreateForm(TForm1, Form1);
230205 Application.CreateForm(TForm2, Form2);
231206 Application.CreateForm(TForm3, Form3);
232207 HighDPI(96); // 96 ist der DPI-Wert beim Entwurf der Formulare Form1, Form2 & Form3
233208 Application.Run;
234209end.
235210```
236211
237212Das Ergebnis sieht so aus:
238213
239214``` pascal
240215program Project1;
241216
242217{$mode objfpc}{$H+}
243218
244219uses
245220 {$IFDEF UNIX}{$IFDEF UseCThreads}
246221 cthreads,
247222 {$ENDIF}{$ENDIF}
248223 Interfaces, Forms,
249224 Unit1, Unit2, Unit3,
250225 uScaleDPI;
251226
252227{$R *.res}
253228
254229begin
255230 RequireDerivedFormResource := True;
256231 Application.Initialize;
257232 Application.CreateForm(TForm1, Form1);
258233 Application.CreateForm(TForm2, Form2);
259234 Application.CreateForm(TForm3, Form3);
260235 HighDPI(96);
261236 Application.Run;
262237end.
263238```
264239
265240### Fortgeschrittenes
266241
267242Einige Steuerelemente haben mehr Eigenschaften oder abweichende Eigenschaftsnamen wie TToolBar-Buttons (ButtonHeight / ButtonWidth anstelle von Width / Height). Ebenso kann sich das Verhalten unter verschiedenen Betriebssystemen ändern, wenn Sie festgelegte Schriftgrößen verwenden.
268243
269244Sie können die Prozedur 'ScaleDPI' anpassen, sodass der Code alle Steuerelemente in der von Ihnen gewünschten Weise skaliert.
270245
271246Dies ist die in [[LazPaint]] verwendete Unit *uscaledpi*. Sie ist beim Skalieren von ToolBars und ToolBox hilfreich. LazPaint verwendet auch fixe Schriftgrößen für eine einheitliche Darstellung unter verschiedenen Betriebssystemen.
272247
273248``` pascal
274249unit uscaledpi;
275250
276251{$mode objfpc}{$H+}
277252
278253interface
279254
280255uses
281256 Forms, Graphics, Controls, ComCtrls;
282257
283258procedure HighDPI(FromDPI: Integer);
284259procedure ScaleDPI(Control: TControl; FromDPI: Integer);
285260procedure ScaleImageList(ImgList: TImageList; FromDPI: Integer);
286261
287262implementation
288263
289264uses BGRABitmap, BGRABitmapTypes;
290265
291266procedure HighDPI(FromDPI: Integer);
292267var
293268 i: Integer;
294269begin
295270 for i:=0 to Screen.FormCount-1 do begin
296271 ScaleDPI(Screen.Forms[i],FromDPI);
297272 end;
298273end;
299274
300275procedure ScaleImageList(ImgList: TImageList; FromDPI: Integer);
301276var
302277 TempBmp: TBitmap;
303278 TempBGRA: array of TBGRABitmap;
304279 NewWidth,NewHeight: integer;
305280 i: Integer;
306281
307282begin
308283 if Screen.PixelsPerInch = FromDPI then exit;
309284
310285 NewWidth := ScaleX(ImgList.Width,FromDPI);
311286 NewHeight := ScaleY(ImgList.Height,FromDPI);
312287
313288 setlength(TempBGRA, ImgList.Count);
314289 TempBmp := TBitmap.Create;
315290 for i := 0 to ImgList.Count-1 do
316291 begin
317292 ImgList.GetBitmap(i,TempBmp);
318293 TempBGRA[i] := TBGRABitmap.Create(TempBmp);
319294 TempBGRA[i].ResampleFilter := rfBestQuality;
320295 if (TempBGRA[i].width=0) or (TempBGRA[i].height=0) then continue;
321296 while (TempBGRA[i].Width < NewWidth) or (TempBGRA[i].Height < NewHeight) do
322297 BGRAReplace(TempBGRA[i], TempBGRA[i].FilterSmartZoom3(moLowSmooth));
323298 BGRAReplace(TempBGRA[i], TempBGRA[i].Resample(NewWidth,NewHeight));
324299 end;
325300 TempBmp.Free;
326301
327302 ImgList.Clear;
328303 ImgList.Width:= NewWidth;
329304 ImgList.Height:= NewHeight;
330305
331306 for i := 0 to high(TempBGRA) do
332307 begin
333308 ImgList.Add(TempBGRA[i].Bitmap,nil);
334309 TempBGRA[i].Free;
335310 end;
336311end;
337312
338313procedure ScaleDPI(Control: TControl; FromDPI: Integer);
339314var
340315 n: Integer;
341316 WinControl: TWinControl;
342317 ToolBarControl: TToolBar;
343318begin
344319 if Screen.PixelsPerInch = FromDPI then exit;
345320
346321 with Control do begin
347322 Left:=ScaleX(Left,FromDPI);
348323 Top:=ScaleY(Top,FromDPI);
349324 Width:=ScaleX(Width,FromDPI);
350325 Height:=ScaleY(Height,FromDPI);
351326 Font.Height := ScaleY(Font.GetTextHeight('Hg'),FromDPI);
352327 end;
353328
354329 if Control is TToolBar then begin
355330 ToolBarControl:=TToolBar(Control);
356331 with ToolBarControl do begin
357332 ButtonWidth:=ScaleX(ButtonWidth,FromDPI);
358333 ButtonHeight:=ScaleY(ButtonHeight,FromDPI);
359334 end;
360335 end;
361336
362337 if Control is TWinControl then begin
363338 WinControl:=TWinControl(Control);
364339 if WinControl.ControlCount > 0 then begin
365340 for n:=0 to WinControl.ControlCount-1 do begin
366341 if WinControl.Controls[n] is TControl then begin
367342 ScaleDPI(WinControl.Controls[n],FromDPI);
368343 end;
369344 end;
370345 end;
371346 end;
372347end;
373348
374349end.
375350```
376351
377352## Abschließende Bemerkungen
378353
379354Das Entwickeln von Anwendungen, die die DPI-Einstellungen und Themen berücksichtigen, umfasst zwei Schritte:
380355
381356- Legen Sie eine fixe Schriftgröße fest zum Zeitpunkt der Entwickung (Nützlich für cross-platform Anwendungen, aber unnötig wenn nur Windows als Zielsystem)
382357- Skalieren Sie die Komponenten zur Laufzeit
383358- Passen Sie den ScaleDPI-Code an Ihre Bedürfnisse an
384359
385360**Anmerkung:**
386361
387362Siehe die Diskussionsseite für weitere Informationen: Talk:High_DPI.
388363
389364Wir verwenden nicht ScaleBy & ScaleControls:
390365
391366``` pascal
392367Self.ScaleBy(Screen.PixelsPerInch,96);
393368```
394369
395370Dies skaliert die Schrift, ist aber unter Windows überflüssig, weil das Betriebssystem die Schrift selbst ändert. Könnte nützlich sein, wenn Sie eine fixierte Schriftgröße verwenden.
396371
397372``` pascal
398373Self.ScaleControls(Screen.PixelsPerInch,96);
399374```
400375
401376Dies skaliert nicht die Breite / Höhe des Formulars. Könnte nützlich sein, wenn Sie diese selbst skalieren.
402377
403378## Externe Links
404379
405380- \[<http://msdn.microsoft.com/en-us/library/dd464646(v=VS.85>).aspx High DPI (Windows)\] MSDN article about High DPI
406381- [[Windows Icon]] How to create icons that work with High DPI.
407382
408383---
409384*From the Free Pascal wiki, page "High DPI/de", as it stood on 2020-02-17 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history