Hallo Forum
Problemstellung:
Die Schriftart (Font) eines Steuerelementes soll über die Nachricht
WM_SETFONT verändert werden. Testweise soll der Schriftzug Kursiv und in Rot erscheinen.
Ich zeige mal 2 Möglichkeiten auf, wie es nicht funktioniert. Das Testobjekt ist ein
TEdit:
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:
| procedure DummyFontChange(Ctrl: TWinControl); var f: TFont; begin f := TFont.Create; try f.Color := clRed; f.Style := [fsItalic]; Ctrl.Perform(WM_SETFONT, f.Handle, 1); finally f.Free; end; end;
procedure DummyFontChange2(Ctrl: TWinControl); var f: TFont; hf: HFONT; begin f := TFont.Create; try hf := Ctrl.Perform(WM_GETFONT, 0, 0); f.Handle := hf; f.Color := clRed; f.Style := [fsItalic]; Ctrl.Perform(WM_SETFONT, f.Handle, 1); finally f.Free; end; end; |
Nachher sieht es wie folgt aus:
Einen Teilerfolg kann ich hiermit verbuchen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure DummyFontChange3(Ctrl: TWinControl); var hf: HFONT; lf: LOGFONT; begin hf := Ctrl.Perform(WM_GETFONT, 0, 0); GetObject(hf, SizeOf(LOGFONT), @lf); lf.lfItalic := 1; hf := CreateFontIndirect(lf); Ctrl.Perform(WM_SETFONT, hf, 1); end; |
Dabei wird der Text zumindest Kursiv dargestellt, jedoch bietet die
LOGFONT-Struktur keine Möglichkeit an die Farbe anzupassen.
Eine Möglichkeit wäre z.B. die Funktion
SetTextColor() anzuwenden, jedoch benötigt diese ein HDC, sprich das Canvas-Handle. Das TEdit besitzt aber keinerlei Canvas-Objekt und daher auch nicht umsetzbar.
Wie bekomm' ich nun die Schriftart über WM_SETFONT verändert, sodass die Textausrichtung und die Textfarbe angepasst werden?
P.S.: Ob die Nachricht nun über
.Perform(),
SendMessage() oder
PostMessage() abgeschickt wird, macht hier keinen Unterschied.
Danke für's Mitdenken!
