Autor Beitrag
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1948
Erhaltene Danke: 357

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Mo 16.04.18 09:28 
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:

ausblenden 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, 00);
    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:

delphi_edit_setfont

Einen Teilerfolg kann ich hiermit verbuchen:

ausblenden 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, 00);
  GetObject(hf, SizeOf(LOGFONT), @lf);
  lf.lfItalic := 1// 1 = true
  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! :zustimm:
Einloggen, um Attachments anzusehen!
_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)