Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Meldungsfenster - Font ermitteln


galagher - Mi 19.02.20 22:35
Titel: Meldungsfenster - Font ermitteln
Schönen Abend!

Wie kann ich den von Windows für Meldungsfenster verwendeten Font herausfinden? Ich meine damit solche Meldungsfenster, die man in Delphi mit MessageBox, ShowMessage etc. erzeugt.

Es geht darum, dass ich einen eigenen, selbst geschriebenen MessageDialog habe, der unter Windows 7 zufällig den selben Font hatte wie die "herkömmlichen" Meldungen. Windows 10 benutzt für die selben Meldungen jedoch einen anderen Font. Kann man den ermitteln?

Natürlich könnte ich jetzt einfach meinen MessageDialog anpassen, aber das wäre eben doch nur wieder hard-codiert. Ich möchte das aber lieber flexibler machen, in dem er den von Windows benutzen Font verwendet.


Th69 - Do 20.02.20 10:45

(T)Screen.MessageFont [http://docwiki.embarcadero.com/Libraries/Rio/en/Vcl.Forms.TScreen.MessageFont] sollte der passende Font sein.


galagher - Do 20.02.20 18:19

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
(T)Screen.MessageFont [http://docwiki.embarcadero.com/Libraries/Rio/en/Vcl.Forms.TScreen.MessageFont] sollte der passende Font sein.
Leider nicht, es ändert sich nichts.

user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Ich meine damit solche Meldungsfenster, die man in Delphi mit [...] ShowMessage etc. erzeugt.
Da habe ich mich geirrt, bei ShowMessage ist es der selbe Font wie in meinem MessageDialog. Bei MessageBox und Application.MessageBox hingegen nicht, da ist es entweder ein anderer Font oder die Schriftgrösse ist kleiner.

Ich vermute, dass Windows 10 bei dieser Art von Meldungen eingreift, bzw. es liegt einfach an verwendeten Design. Wäre aber schön, wenn alle Meldungsfenster die selbe Schrift verwenden!


Th69 - Fr 21.02.20 10:53

Die ganzen Standard-Fonts (und andere Einstellungen) stehen in der Registry unter "HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics" (u.a. "MessageFont"). Die Font-Einträge sind dabei aber "encrypted" (entsprechend der LOGFONTW [https://docs.microsoft.com/en-us/windows/win32/api/wingdi/ns-wingdi-logfontw]-Struktur) - ich nehme aber mal an, daß Screen.MessageFont eben genau diesen Registry-Eintrag ausliest bzw. beschreibt (falls du den VCL-Source hast, kannst du ja mal reinschauen).

Bei der Anzeige der MessageBox können aber noch andere Faktoren wie DPI o.ä. die tatsächliche Anzeige beeinflussen.


galagher - Fr 21.02.20 20:32

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
ich nehme aber mal an, daß Screen.MessageFont eben genau diesen Registry-Eintrag ausliest bzw. beschreibt (falls du den VCL-Source hast, kannst du ja mal reinschauen).
Habe leider nichts gefunden, was mir weiter hilft.

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Bei der Anzeige der MessageBox können aber noch andere Faktoren wie DPI o.ä. die tatsächliche Anzeige beeinflussen.
Kannst du mir das bitte näher erklären?


Th69 - Sa 22.02.20 11:39

Damit meine ich nur, daß wenn z.B. ein Anwender den Skalierungsfaktor (DPI-Wert) geändert hat, daß dann Windows bei seinen Standard-Dialogen diesen Wert mitberücksichtigt - wenn du aber einen eigenen Dialog erzeugt hast, deiner evtl. die aktuelle Einstellung nicht mit berücksichtigt (aber es gibt ja auch noch andere Einstellungen wie z.B. ClearType, welche die Darstellung beeinflussen).


galagher - Sa 22.02.20 13:59

Ok, dann war die Übereinstimmung unter Windows 7 wirklich nur Zufall - es hat eben alles gepasst. Und unter Windows 10 eben nicht mehr. Das jetzt aufzuschlüsseln mag zwar möglich sein, aber ich denke, wenn, dann "Windows-seitig". Da gibt es bei Windows 10 aber bei Weitem nicht mehr so viele Möglichkeiten wie noch unter XP, und auch weniger als unter Windows 7. Wnn man von direkten Eingriffen in die Registry mal absieht.


jaenicke - So 23.02.20 06:27

user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Es geht darum, dass ich einen eigenen, selbst geschriebenen MessageDialog habe
Die Frage ist aber auch, welche Möglichkeiten der Dialog benötigt, die man nicht mit Bordmitteln abbilden kann. Windows hat ja nicht umsonst die Möglichkeit mehrere Meldungen, Details zum aufklappen, Fortschrittsbalken usw. in einem solchen Dialog anzuzeigen...
Hier in der Doku findest du auch entsprechende Screenshots:
Task Dialogs - Overview [https://docs.microsoft.com/en-us/windows/win32/controls/task-dialogs-overview]

Moderiert von user profile iconTh69: URL-Titel hinzugefügt.


galagher - So 23.02.20 19:10

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Die Frage ist aber auch, welche Möglichkeiten der Dialog benötigt, die man nicht mit Bordmitteln abbilden kann.
Wenn mit Möglichkeiten die Schriftart / -grösse gemeint ist: Ich habe noch nicht herausgefunden, wie Windows den Font festlegt. Screen.MessageFont bringt mich leider nicht weiter.


jaenicke - So 23.02.20 20:11

user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Die Frage ist aber auch, welche Möglichkeiten der Dialog benötigt, die man nicht mit Bordmitteln abbilden kann.
Wenn mit Möglichkeiten die Schriftart / -grösse gemeint ist
Nein, ich meine warum du überhaupt einen eigenen Dialog benötigst. Denn Microsoft hat ja genau um das in den meisten Fällen unnötig zu machen den Taskdialog eingeführt.

Viele machen nämlich eigene Dialoge, machen dann dort aber nicht mehr als der Standard-Taskdialog schon kann, weil sie den schlicht nicht kennen. Deshalb wollte ich nur darauf hinweisen, falls du den noch nicht kennst.


galagher - Mo 24.02.20 12:36

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Nein, ich meine warum du überhaupt einen eigenen Dialog benötigst.
Den benötige ich, weil ich ein eigenes Hilfedatei-Format entwickelt habe (ich kann HTML nicht und habe auch keine Lust, mich näher damit zu befassen!), diese Hilfedateien kann mein Dialog über den Hilfebutton aufrufen. Weiters kann der OK-Button beliebigen Text anzeigen, der Rückgabewert bleibt aber natürlich weiterhin mrOK.

Das ist ein Vorteil, wenn man hobbymässig programmiert: Man kann sich mit etwas befassen, muss es aber nicht!


jaenicke - Mo 24.02.20 20:36

user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
diese Hilfedateien kann mein Dialog über den Hilfebutton aufrufen. Weiters kann der OK-Button beliebigen Text anzeigen, der Rückgabewert bleibt aber natürlich weiterhin mrOK.
All das kann der Taskdialog auch, der bereits seit Delphi 2009 glaube ich als TTaskDialog in Delphi existiert. ;-)

Beispiel:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
var
  TaskDialog: TTaskDialog;
  Button: TTaskDialogBaseButtonItem;
begin
  TaskDialog := TTaskDialog.Create(Self);
  try
    TaskDialog.Title := 'Meldungstitel';
    TaskDialog.Caption := 'Meldungsüberschrift';
    TaskDialog.Text := 'Bist du sicher?';
    TaskDialog.CommonButtons := [];
    TaskDialog.MainIcon := tdiInformation;
    Button := TaskDialog.Buttons.Add;
    Button.Caption := 'Mein Ok-Button';
    Button.ModalResult := mrOk;
    Button := TaskDialog.Buttons.Add;
    Button.Caption := 'Abbrechen';
    Button.ModalResult := mrCancel;
    Button := TaskDialog.Buttons.Add;
    Button.Caption := 'Hilfe';
    Button.ModalResult := MB_HELP;
    if TaskDialog.Execute then
      case TaskDialog.ModalResult of
        mrOk:
          ShowMessage('Ok gedrückt');
        mrCancel:
          ShowMessage('Abbrechen gedrückt');
        MB_HELP:
          ShowMessage('Hilfe anzeigen');
      end;
  finally
    TaskDialog.Free;
  end;
end;


galagher - Mo 24.02.20 21:17

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
All das kann der Taskdialog auch, der bereits seit Delphi 2009 glaube ich als TTaskDialog in Delphi existiert. ;-)
Ok, den kannte ich tatsächlich nicht! Aber kann der auch farbigen Text anzeigen und jede möglichen Kombination an Butttons?

//Edit: Ach ja, fast hätte ich es vergessen: Auch der Hintergrund des Dialogs kann in jeder beliebigen Farbe dargestellt werden.


jaenicke - Mo 24.02.20 21:37

user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Aber kann der auch farbigen Text anzeigen
Entweder du möchtest, dass sich der Dialog an die Standards hält oder nicht. Die Schriftart und -farbe kommen dort aus den Einstellungen, die der Benutzer unter Windows angegeben hat. Bzw. genauer gesagt kommt das aus den Einstellungen des verwendeten Themes.

Für den normalen Benutzer ist es schon von Vorteil, wenn diese Dialoge immer gleich aussehen. Insbesondere für sehbehinderte Benutzer ist das sehr sehr wichtig. Deshalb macht ein anderer Hintergrund als vom Benutzer im System gewünscht oder andere Schriftfarben in 99,9% der Fälle keinen Sinn.

Aber wenn es einen echten Sonderfall gibt, bei dem das nötig oder gewünscht ist, dann funktioniert es mit den Stadarddialogen tatsächlich wenn, dann nur auf Umwegen. Dann macht ein eigener Dialog ggf. tatsächlich Sinn, aber dann sieht er eben auch anders aus, ggf. auch die Schriftart.

user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
und jede möglichen Kombination an Butttons?
Das geht, ja. Du kannst die wie im Beispiel beliebig hinzufügen oder bei Standardbuttons einfach unter CommonButtons angeben.


galagher - Di 25.02.20 07:01

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Entweder du möchtest, dass sich der Dialog an die Standards hält
Grundsätzlich ja, ...

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Aber wenn es einen echten Sonderfall gibt, bei dem das nötig oder gewünscht ist,
... das war damals tatsächlich ein Sonderfall.

Jedenfalls kenne ich nun einen Dialog mehr! :mrgreen:

Aber es bleibt die Frage offen, warum Windows 10 (oder Delphi?) verschiedene Standarddialoge in unterschiedlichen Fonts präsentiert.


jaenicke - Di 25.02.20 07:40

user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Aber es bleibt die Frage offen, warum Windows 10 (oder Delphi?) verschiedene Standarddialoge in unterschiedlichen Fonts präsentiert.
Windows hat beim Taskdialog ja auch verschiedene Schriftarten. Das soll den Benutzer besser dabei unterstützen das Wesentliche schnell zu sehen, aber dennoch Details hinzuzufügen. Deshalb gibt es dort den Titel in der Titelleiste, die Überschrift als kurze Frage z.B. und einen längeren Text für Details. Und für weitere technische Details, die man nicht unbedingt gleich sehen soll, gibt es dann die Möglichkeit noch unten mehr auszuklappen.

Ich finde das schon gut strukturiert.


galagher - Di 25.02.20 21:27

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Windows hat beim Taskdialog ja auch verschiedene Schriftarten. Das soll den Benutzer besser dabei unterstützen das Wesentliche schnell zu sehen, aber dennoch Details hinzuzufügen. Deshalb gibt es dort den Titel in der Titelleiste, die Überschrift als kurze Frage z.B. und einen längeren Text für Details. Und für weitere technische Details, die man nicht unbedingt gleich sehen soll, gibt es dann die Möglichkeit noch unten mehr auszuklappen.
Das meine ich nicht. Ich meine, warum nicht alle Dialog"arten" in der gleichen Schriftart angezeigt werden, siehe Grafik!


jaenicke - Mi 26.02.20 14:16

user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Ich meine, warum nicht alle Dialog"arten" in der gleichen Schriftart angezeigt werden, siehe Grafik!
ShowMessage und MessageDlg verwenden intern TaskDialogIndirect, also sprich den oben angesprochenen neuen Dialog, während Application.MessageBox die alte API-Funktion MessageBox verwendet.


galagher - Mi 26.02.20 20:54

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
ShowMessage und MessageDlg verwenden intern TaskDialogIndirect, also sprich den oben angesprochenen neuen Dialog, während Application.MessageBox die alte API-Funktion MessageBox verwendet.
Immerhin weiss ich jetzt, woran es liegt, danke!
Also verwenden manche/einige/viele Programme (auch Windows selbst?) die API-Funktion MessageBox, und man kann da eben nichts machen?


jaenicke - Mi 26.02.20 21:42

user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
Also verwenden manche/einige/viele Programme (auch Windows selbst?) die API-Funktion MessageBox, und man kann da eben nichts machen?
An dem Unterschied nicht, nein. Die alte MessageBox wurde damals (vor 30 Jahren!) mit nur einer Schriftart entworfen und der neue TaskDialog moderner gestaltet.


galagher - Do 27.02.20 16:35

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
An dem Unterschied nicht, nein. Die alte MessageBox wurde damals (vor 30 Jahren!) mit nur einer Schriftart entworfen
Damals hatte ich von Computern noch gar keine Ahnung!


hRb - Sa 14.03.20 12:15

Hallo galagher,
eine direkte Antwort auf Deine Frage nach dem Font habe ich nicht. Hatte jedoch früher im Forum einmal die Frage gestellt wie ich meinen Text im Meldefenster besser umbrechen kann, um Breite/Höhe des Fensters festzulegen. Verwendete nämlich auch MessageDlg zur Anzeige kleiner Hilfetexte. (Die Original-Antwort" wurde später gelöscht).
Hier die Procedur. Da es sich bei temp um eine TForm handelt, müsste sich auch Farbe und Font einbauen lassen.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure ShowSizedDlg(ACaption, AMsg: string; APos: TPoint; AWidth, AHeight: Integer;
  ADlgType: TMsgDlgType; AButton: TMsgDlgButtons);
var
  temp: TForm;
begin
  temp := CreateMessageDialog(AMsg, ADlgType, AButton);
  try
    temp.Caption := ACaption;
    temp.Left := APos.X;
    temp.Top := APos.Y;
    temp.Width := AWidth;
    temp.Height := AHeight;
    temp.ShowModal;
  finally
    temp.Free;
  end;
end;

Hier die Anwendung:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.HilfezuEmKSortierung1Click(Sender: TObject);
const Breite=700;       //Breite des Fensters
      Hoehe= 600;       //Höhe des Fensters
      top  = 200;       //TopPos am Screen
var   left : integer;   //LeftPos innerhalb des Programms
begin
    left:=(Form1.Width - Breite) div 2;
    ShowSizedDlg('HILFE zu EMK - SORTIERUNG', cEmkText6 {längerer Text}, Point(left, top), Breite, Hoehe,
             mtInformation, [mbOK]);
// MessageDlg(cEmkText6, mtInformation, [mbOK], 0);
end;