Aric Stewart : user32: Make sure our vertical line count is at least 1 even if there is an oversized font in the edit control .

Alexandre Julliard julliard at winehq.org
Wed Oct 15 10:08:50 CDT 2008


Module: wine
Branch: master
Commit: 7b9e827a75e871a90e36844976e9ae1180119056
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=7b9e827a75e871a90e36844976e9ae1180119056

Author: Aric Stewart <aric at codeweavers.com>
Date:   Wed Oct 15 07:30:22 2008 -0500

user32: Make sure our vertical line count is at least 1 even if there is an oversized font in the edit control.

---

 dlls/user32/edit.c       |   29 +++++++++++++++++----------
 dlls/user32/tests/edit.c |   48 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 66 insertions(+), 11 deletions(-)

diff --git a/dlls/user32/edit.c b/dlls/user32/edit.c
index 4b4e286..ba76786 100644
--- a/dlls/user32/edit.c
+++ b/dlls/user32/edit.c
@@ -430,6 +430,12 @@ static inline LRESULT DefWindowProcT(HWND hwnd, UINT msg, WPARAM wParam, LPARAM
 		return DefWindowProcA(hwnd, msg, wParam, lParam);
 }
 
+static inline INT get_vertical_line_count(EDITSTATE *es)
+{
+	INT vlc = (es->format_rect.bottom - es->format_rect.top) / es->line_height;
+	return max(1,vlc);
+}
+
 /*********************************************************************
  *
  *	EditWndProc_common
@@ -1807,7 +1813,7 @@ static void EDIT_SL_InvalidateText(EDITSTATE *es, INT start, INT end)
  */
 static void EDIT_ML_InvalidateText(EDITSTATE *es, INT start, INT end)
 {
-	INT vlc = (es->format_rect.bottom - es->format_rect.top) / es->line_height;
+	INT vlc = get_vertical_line_count(es);
 	INT sl = EDIT_EM_LineFromChar(es, start);
 	INT el = EDIT_EM_LineFromChar(es, end);
 	INT sc;
@@ -2234,7 +2240,8 @@ static void EDIT_PaintLine(EDITSTATE *es, HDC dc, INT line, BOOL rev)
 	LRESULT pos;
 
 	if (es->style & ES_MULTILINE) {
-		INT vlc = (es->format_rect.bottom - es->format_rect.top) / es->line_height;
+		INT vlc = get_vertical_line_count(es);
+
 		if ((line < es->y_offset) || (line > es->y_offset + vlc) || (line >= es->line_count))
 			return;
 	} else if (line)
@@ -2361,8 +2368,8 @@ static void EDIT_AdjustFormatRect(EDITSTATE *es)
 	{
 	    INT fw, vlc, max_x_offset, max_y_offset;
 
-	    vlc = (es->format_rect.bottom - es->format_rect.top) / es->line_height;
-	    es->format_rect.bottom = es->format_rect.top + max(1, vlc) * es->line_height;
+	    vlc = get_vertical_line_count(es);
+	    es->format_rect.bottom = es->format_rect.top + vlc * es->line_height;
 
 	    /* correct es->x_offset */
 	    fw = es->format_rect.right - es->format_rect.left;
@@ -3256,7 +3263,7 @@ static void EDIT_EM_ReplaceSel(EDITSTATE *es, BOOL can_undo, LPCWSTR lpsz_replac
 	if (es->style & ES_MULTILINE)
 	{
 		INT st = min(es->selection_start, es->selection_end);
-		INT vlc = (es->format_rect.bottom - es->format_rect.top) / es->line_height;
+		INT vlc = get_vertical_line_count(es);
 
 		hrgn = CreateRectRgn(0, 0, 0, 0);
 		EDIT_BuildLineDefs_ML(es, st, st + strl,
@@ -3420,7 +3427,7 @@ static LRESULT EDIT_EM_Scroll(EDITSTATE *es, INT action)
 		return (LRESULT)FALSE;
 	}
 	if (dy) {
-	    INT vlc = (es->format_rect.bottom - es->format_rect.top) / es->line_height;
+	    INT vlc = get_vertical_line_count(es);
 	    /* check if we are going to move too far */
 	    if(es->y_offset + dy > es->line_count - vlc)
 		dy = es->line_count - vlc - es->y_offset;
@@ -3451,7 +3458,7 @@ static void EDIT_EM_ScrollCaret(EDITSTATE *es)
 
 		l = EDIT_EM_LineFromChar(es, es->selection_end);
 		x = (short)LOWORD(EDIT_EM_PosFromChar(es, es->selection_end, es->flags & EF_AFTER_WRAP));
-		vlc = (es->format_rect.bottom - es->format_rect.top) / es->line_height;
+		vlc = get_vertical_line_count(es);
 		if (l >= es->y_offset + vlc)
 			dy = l - vlc + 1 - es->y_offset;
 		if (l < es->y_offset)
@@ -4956,7 +4963,7 @@ static void EDIT_WM_Paint(EDITSTATE *es, HDC hdc)
 		SetTextColor(dc, GetSysColor(COLOR_GRAYTEXT));
 	GetClipBox(dc, &rcRgn);
 	if (es->style & ES_MULTILINE) {
-		INT vlc = (es->format_rect.bottom - es->format_rect.top) / es->line_height;
+		INT vlc = get_vertical_line_count(es);
 		for (i = es->y_offset ; i <= min(es->y_offset + vlc, es->y_offset + es->line_count - 1) ; i++) {
 			EDIT_GetLineRect(es, i, 0, -1, &rcLine);
 			if (IntersectRect(&rc, &rcRgn, &rcLine))
@@ -5301,7 +5308,7 @@ static LRESULT EDIT_WM_VScroll(EDITSTATE *es, INT action, INT pos)
 		    INT vlc, new_y;
 		    /* Sanity check */
 		    if(pos < 0 || pos > 100) return 0;
-		    vlc = (es->format_rect.bottom - es->format_rect.top) / es->line_height;
+		    vlc = get_vertical_line_count(es);
 		    new_y = pos * (es->line_count - vlc) / 100;
 		    dy = es->line_count ? (new_y - es->y_offset) : 0;
 		    TRACE("line_count=%d, y_offset=%d, pos=%d, dy = %d\n",
@@ -5319,7 +5326,7 @@ static LRESULT EDIT_WM_VScroll(EDITSTATE *es, INT action, INT pos)
 		    INT vlc, new_y;
 		    /* Sanity check */
 		    if(pos < 0 || pos > 100) return 0;
-		    vlc = (es->format_rect.bottom - es->format_rect.top) / es->line_height;
+		    vlc = get_vertical_line_count(es);
 		    new_y = pos * (es->line_count - vlc) / 100;
 		    dy = es->line_count ? (new_y - es->y_offset) : 0;
 		    TRACE("line_count=%d, y_offset=%d, pos=%d, dy = %d\n",
@@ -5350,7 +5357,7 @@ static LRESULT EDIT_WM_VScroll(EDITSTATE *es, INT action, INT pos)
 		else
 		{
 		    /* Assume default scroll range 0-100 */
-		    INT vlc = (es->format_rect.bottom - es->format_rect.top) / es->line_height;
+		    INT vlc = get_vertical_line_count(es);
 		    ret = es->line_count ? es->y_offset * 100 / (es->line_count - vlc) : 0;
 		}
 		TRACE("EM_GETTHUMB: returning %ld\n", ret);
diff --git a/dlls/user32/tests/edit.c b/dlls/user32/tests/edit.c
index 0c5a678..b70dae5 100644
--- a/dlls/user32/tests/edit.c
+++ b/dlls/user32/tests/edit.c
@@ -1989,6 +1989,53 @@ static void UnregisterWindowClasses (void)
     UnregisterClassA(szEditTextPositionClass, hinst);
 }
 
+void test_fontsize(void)
+{
+    HWND hwEdit;
+    HFONT hfont;
+    LOGFONT lf;
+    LONG r;
+    char szLocalString[MAXLEN];
+
+    memset(&lf,0,sizeof(LOGFONTA));
+    strcpy(lf.lfFaceName,"Arial");
+    lf.lfHeight = -300; /* taller than the edit box */
+    lf.lfWeight = 500;
+    hfont = CreateFontIndirect(&lf);
+
+    trace("EDIT: Oversized font (Multi line)\n");
+    hwEdit= CreateWindow("EDIT", NULL, ES_MULTILINE|ES_AUTOHSCROLL,
+                           0, 0, 150, 50, NULL, NULL, hinst, NULL);
+
+    SendMessage(hwEdit,WM_SETFONT,(WPARAM)hfont,0);
+
+    if (winetest_interactive)
+        ShowWindow (hwEdit, SW_SHOW);
+
+    r = SendMessage(hwEdit, WM_CHAR, 'A', 1);
+    ok(1 == r, "Expected: %d, got: %d\n", 1, r);
+    r = SendMessage(hwEdit, WM_CHAR, 'B', 1);
+    ok(1 == r, "Expected: %d, got: %d\n", 1, r);
+    r = SendMessage(hwEdit, WM_CHAR, 'C', 1);
+    ok(1 == r, "Expected: %d, got: %d\n", 1, r);
+
+    GetWindowText(hwEdit, szLocalString, MAXLEN);
+    ok(lstrcmp(szLocalString, "ABC")==0,
+       "Wrong contents of edit: %s\n", szLocalString);
+
+    r = SendMessage(hwEdit, EM_POSFROMCHAR,0,0);
+    ok(r != -1,"EM_POSFROMCHAR failed index 0\n");
+    r = SendMessage(hwEdit, EM_POSFROMCHAR,1,0);
+    ok(r != -1,"EM_POSFROMCHAR failed index 1\n");
+    r = SendMessage(hwEdit, EM_POSFROMCHAR,2,0);
+    ok(r != -1,"EM_POSFROMCHAR failed index 2\n");
+    r = SendMessage(hwEdit, EM_POSFROMCHAR,3,0);
+    ok(r == -1,"EM_POSFROMCHAR succeeded index 3\n");
+
+    DestroyWindow (hwEdit);
+    DeleteObject(hfont);
+}
+
 START_TEST(edit)
 {
     hinst = GetModuleHandleA(NULL);
@@ -2012,6 +2059,7 @@ START_TEST(edit)
     test_wantreturn_edit_dialog();
     test_singleline_wantreturn_edit_dialog();
     test_child_edit_wmkeydown();
+    test_fontsize();
 
     UnregisterWindowClasses();
 }




More information about the wine-cvs mailing list