- Fix vertical position of text in single-line edit controls.
- Add tests for this.
diff --git a/dlls/user/edit.c b/dlls/user/edit.c
index ec2d7dc..a9785d5 100644
--- a/dlls/user/edit.c
+++ b/dlls/user/edit.c
@@ -2186,13 +2186,39 @@
*/
static void EDIT_SetRectNP(EDITSTATE *es, LPRECT rc)
{
+ RECT ClientRect;
+ LONG_PTR ExStyle;
+
CopyRect(&es->format_rect, rc);
- if (es->style & WS_BORDER) {
- INT bw = GetSystemMetrics(SM_CXBORDER) + 1;
- es->format_rect.left += bw;
- es->format_rect.top += bw;
- es->format_rect.right -= bw;
- es->format_rect.bottom -= bw;
+ if (es->style & ES_MULTILINE)
+ {
+ if (es->style & WS_BORDER) {
+ INT bw = GetSystemMetrics(SM_CXBORDER) + 1;
+ es->format_rect.left += bw;
+ es->format_rect.right -= bw;
+ es->format_rect.top += bw;
+ es->format_rect.bottom -= bw;
+ }
+ }
+ else
+ {
+ ExStyle = GetWindowLongPtrW(es->hwndSelf, GWL_EXSTYLE);
+ if (ExStyle & WS_EX_CLIENTEDGE) {
+ if (es->line_height + 2 <=
+ es->format_rect.bottom - es->format_rect.top) {
+ es->format_rect.top++;
+ es->format_rect.bottom--;
+ }
+ } else if (es->style & WS_BORDER) {
+ INT bw = GetSystemMetrics(SM_CXBORDER) + 1;
+ es->format_rect.left += bw;
+ es->format_rect.right -= bw;
+ if (es->line_height + 2 * bw <=
+ es->format_rect.bottom - es->format_rect.top) {
+ es->format_rect.top += bw;
+ es->format_rect.bottom -= bw;
+ }
+ }
}
es->format_rect.left += es->left_margin;
es->format_rect.right -= es->right_margin;
@@ -2224,6 +2250,10 @@
/* Windows doesn't care to fix text placement for SL controls */
es->format_rect.bottom = es->format_rect.top + es->line_height;
+ /* Always stay within the client area */
+ GetClientRect(es->hwndSelf, &ClientRect);
+ es->format_rect.bottom = min(es->format_rect.bottom, ClientRect.bottom);
+
if ((es->style & ES_MULTILINE) && !(es->style & ES_AUTOHSCROLL))
EDIT_BuildLineDefs_ML(es, 0, strlenW(es->text), 0, NULL);
}