Autor Beitrag
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2103
Erhaltene Danke: 383

[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 08: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)
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: Sa 21.04.18 22:06 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Das TEdit besitzt aber keinerlei Canvas-Objekt und daher auch nicht umsetzbar.

Zum Beispiel so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
var
  EditCanvas : TControlCanvas;
begin
  EditCanvas := TControlCanvas.Create;
  try
    EditCanvas.Control := Edit1;
    EditCanvas.Brush.Color := clWhite;
    EditCanvas.Brush.Style := bsDiagCross;
    EditCanvas.FillRect((Rect(0020050)));
  finally
    EditCanvas.Free;
  end;
end;
Frühlingsrolle Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2103
Erhaltene Danke: 383

[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: So 22.04.18 09:03 
Guten Tag Gerd Kayser,

ein Canvas-Objekt darüber zu legen, hat keinen Nutzen. Würde der Text darauf gezeichnet werden, dann ja. Weder das TEdit, noch irgendein anderes TWinControl sollen um ein Canvas erweitert werden.
Der Text der Komponente/n soll über eine Message formatiert werden, und zwar so, wie die Komponenten gegeben sind.

_________________
„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)