Schrift und Text auslesen, veraendern und setzen

03/12/2008 - 17:00 von Thomas Steinbach | Report spam
Hallo NG,

wie komme ich mit der WinAPI
an den in eienm Dialog genutzten Font heran?

Ich versuche nun mit

hf = SendDlgItemMessage(hWnd, IDC_STATIC_SYSLNK, WM_GETFONT, 0, 0);

den font zu bekommen (Das sollte ja so gehen). Aber nun
kann ich diesem font und seinen Attributen nicht wirklich neue
Eigenschaften zuweisen, bzw. weiss nicht wie ich die
bestehenden Werte aendern kann.

Wenn ich spaeter ein CreateFont nutze, dann weiss ich nicht
wie die uebrigen Parameter in einem Dialog ausschauen.

Mir gelingt es zwar mit

hDc = GetWindowDC(hDlg);

GetTextFace(hDc, sizeof(ffn), (LPSTR)lpFfn); /* LPTSTR lpFfn */

an den FontFaceNamen
und mit:

GetTextMetrics(hDc, &lpTm); /* TEXTMETRIC lpTm; */

an gewisse Dialogbasierte Eigenschaften heranzukommen,
aber interessanterweise steht da im lpFfn nicht "MS Shell Dlg" drin,
sondern "System" und ich vermute es sind die Eigenschaften
des Dialogs, aber nicht des Static TextControls.
btw: Fest eincodieren willich "MS Shell Dlg" und Groesse nicht,
da diese sich ja von System zu System aendern koennen.

Wenn ich aber diese ermittelten Werte nehme, dann sieht beim

hf = CreateFont((int)lpTm.tmHeight,0,0,0,0,0,TRUE,
0,0,0,0,0,lpTm.tmPitchAndFamily,lpFfn);
SendDlgItemMessage(hWnd, IDC_STATIC_SYSLNK,
WM_SETFONT, (WPARAM)hf, MAKELPARAM(TRUE, 0));

das betreffende Static TextControl ganz anders aus. als die
uebrigen. Zwar unterstrichen, aber anders. Ziel ist es aber nur
die Eigenschaft _unterstrichen_ zuzuordnen, aber alle andere
Werte wie die von den anderen Static TextControls zu uebernehmen.
Auch ein Weg mit:

lpLf.lfHeight = lpTm.tmHeight; /* LOGFONT lpLf; */
lpLf.lfUnderline = TRUE;
hf = CreateFontIndirect(&lpLf);

bringt mich nicht weiter.

ich muesste also irgenwie an das Handle bzw. HDC vom
TextControl, herankommen, um dessen "erste" Font Werte
auszulesen und dann
dem StaticText wieder zuzuordnen. Komme da aber nicht weiter.

GetModuleHandle() gibt ja bei 0 nur das Handle der Instance
zurueck und was aehnliches fuer ein DialogItem habe ich
nicht gefunen. Also sowas wie ein
GetHandle(MAKEINTREOSURCE(IDC_STATIC))
gibt es nicht.

Ich hoffe hier hat jemand eine Idee wie ich das loesen kann
oder wo mein Gedankefehler liegt.

Thomas
 

Lesen sie die antworten

#1 René König
03/12/2008 - 19:09 | Warnen spam
Hallo!

Thomas Steinbach schrieb:
wie komme ich mit der WinAPI
an den in eienm Dialog genutzten Font heran?



Das geht per WM_GETFONT.

Ich versuche nun mit

hf = SendDlgItemMessage(hWnd, IDC_STATIC_SYSLNK, WM_GETFONT, 0, 0);



So ist's richtig. :-)

den font zu bekommen (Das sollte ja so gehen). Aber nun
kann ich diesem font und seinen Attributen nicht wirklich neue
Eigenschaften zuweisen, bzw. weiss nicht wie ich die
bestehenden Werte aendern kann.



Die Eigenschaften eine FONTs sind fix, sozusagen in Stein gehauen. Da
kannst Du nichts dran àndern. Du kannst aber die Eigenschaften des FONTs
ermitteln und dann auf Basis dieser einen neuen Font erzeugen. Also
irgendwie in dieser Art:

LOGFONT lf;
GetObject(hf, sizeof(lf), &lf);

// lf modifizieren
.
.
.

hfNew = CreateFontIndirect(&lf);
SendDlgItemMessage(hWnd, IDC_STATIC_SYSLNK, WM_SETFONT, (WPARAM)hfNew,
MAKELPARAM(TRUE, 0));

Gruß,
René

Ähnliche fragen