border berechnen eines edit control
-
hallo leute
wie kann ich die border-dicke des edit controls berechnen/abfragen ?
ich erstelle ein edit control mit WS_VISIBLE|WS_TABSTOP|WS_CHILD|WS_BORDER.
danach bekommt das control einen neuen font zugewiesen.
wenn ich die hoehe des edits auf tmHeight des fonts setze dann ist das zu klein fuer WS_BORDER. wenn ich ins edit feld klicke
verschwinden oben und unten die border. wenn ich oben und unten 2 pixel dazu nehme dann passt das.
hab es mit AdjustWindowRectEx propiert, aber da bleibt RECT gleich.AdjustWindowRectEx(&rc, GetWindowLongPtr(h, GWL_STYLE), FALSE, GetWindowLongPtr(h, GWL_EXSTYLE));
wie mach ich das richtig ?
dachte mir ich les einfach mal WindowRect und ClientRect aus und berechne halt die differenz und korrigiere mit dem wert die hoehe.
aberGetClientRect
undGetWindowRect
liefern auch die selbe groesse.
gehoert der gezeichnete border zum clientbereich ?Meep Meep
-
Du kannst mal schauen, ob es für
GetSystemMetrics
eine Konstante gibt, die dir die Rahmendicke eines Fensters zurückgibt (vllt.SM_CXBORDER
o.Ä.). Möglicherweise hängt die zu benutzende Konstante für denGetSystemMetrics
auch noch von den verwendeten Fensterstilen ab.
-
bei mir liefert folgender Code folgendes:
GetTextMetrics(GetDC(GetDlgItem(hWnd, DLG_EDIT1)), &tm); HELP(va("tm.tmHeight: %i\r\n\r\n", tm.tmHeight)); //=16 GetWindowRect(GetDlgItem(hWnd, DLG_EDIT1), &rc); HELP(va("GetWindowRect: %i\r\n\r\n", (rc.bottom - rc.top))); //=20 GetClientRect(GetDlgItem(hWnd, DLG_EDIT1), &rc); HELP(va("GetClientRect: %i\r\n\r\n", (rc.bottom - rc.top))); //=16
Die Strichstärke des Rahmens ist 1 Pixel (mit Paintshop nachgemessen) d.h. der Clientbereich ist im inneren des Editfelds oben wie unten je nochmals einen Pixel kleiner. Sieht für mich plausibel aus.
Ich denke du solltest tm.height (alter font) bestimmen, dann tm.height (neuer font) und das Editfeld um die Differenz vergrößern.
-
Bei WS_BORDER baut das Edit Control einen eigenen Rahmen. (Siehe EM_GETRECT)
Wenn man mit DLUs rechnet ist es ganz einfachDie Höhe ist immer 12 DLUs in anderen Woeten, der Rahmen ist immer die normale Font-Höhe mal 1,5. Das heißt der Rahmen oben und unten ist 1/4 Font Höhe.
Der Rahmen rechts und links sind zusammen 4 DLUs (oder evtl. 8 ich weiß es nicht mehr ganau). Also eine durchschnitliche Zeichenbreite, davon also 2 rechts 2 Links.
-
Martin Richter schrieb:
Bei WS_BORDER baut das Edit Control einen eigenen Rahmen. (Siehe EM_GETRECT)
Wenn man mit DLUs rechnet ist es ganz einfachDie Höhe ist immer 12 DLUs in anderen Woeten, der Rahmen ist immer die normale Font-Höhe mal 1,5. Das heißt der Rahmen oben und unten ist 1/4 Font Höhe.
Der Rahmen rechts und links sind zusammen 4 DLUs (oder evtl. 8 ich weiß es nicht mehr ganau). Also eine durchschnitliche Zeichenbreite, davon also 2 rechts 2 Links.
mal ne dumme frage:
angenommen die durchschnittliche zeichenbreite ist 7 pixel und angenommen der rechte und linke ergeben zusammen 4DLUs.
1 DLU = 7/4 = 1
ist das der rechte und linke rand jeweils 2 pixel ?
oder: 7 pixel /2 = 2 DLUs = 3 pixel
dann waere jeweils rechts und links ein rand von 3 pixel
oder werden die kompletten 7 pixel auf links und rechts aufgeteilt: z.b. 3 rechts und 4 pixel linksoder sollte man bis zum ende immer mit floats rechnen und dann am ende erst runden ? wobei das obere beispiel mit 3.5 pixel eh nicht geht. also verschwindet ein pixel. richtig ?
Meep Meep
-
Darum kümmere ich mich gar nicht.
Ich dividiere und erhalte linken und rechten rand. D.h. i.a. den kleineren Wert wenn es ungerade ist. Die Höhe/Breite ist fix und damit ist der untere und rechte Rand auch gegeben.
So macht es auch IMHO das Edit Control. Allerdings habe ich das zuletzt geprüft als es noch Windows 3.1 gab.