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.
galagher - Do 20.02.20 18:19
Leider nicht, es ändert sich nichts.
galagher hat folgendes geschrieben : |
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
Th69 hat folgendes geschrieben : |
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.
Th69 hat folgendes geschrieben : |
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
galagher hat folgendes geschrieben : |
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 Th69: URL-Titel hinzugefügt.
galagher - So 23.02.20 19:10
jaenicke hat folgendes geschrieben : |
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
galagher hat folgendes geschrieben : |
jaenicke hat folgendes geschrieben : | 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
jaenicke hat folgendes geschrieben : |
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
galagher hat folgendes geschrieben : |
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
jaenicke hat folgendes geschrieben : |
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
galagher hat folgendes geschrieben : |
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.
galagher hat folgendes geschrieben : |
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
jaenicke hat folgendes geschrieben : |
Entweder du möchtest, dass sich der Dialog an die Standards hält |
Grundsätzlich ja, ...
jaenicke hat folgendes geschrieben : |
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
galagher hat folgendes geschrieben : |
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
jaenicke hat folgendes geschrieben : |
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
galagher hat folgendes geschrieben : |
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
jaenicke hat folgendes geschrieben : |
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
galagher hat folgendes geschrieben : |
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
jaenicke hat folgendes geschrieben : |
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; Hoehe= 600; top = 200; var left : integer; begin left:=(Form1.Width - Breite) div 2; ShowSizedDlg('HILFE zu EMK - SORTIERUNG', cEmkText6 , Point(left, top), Breite, Hoehe, mtInformation, [mbOK]); end; |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!