[PATCH] comctl32: statusbar: test and fix SB_SETMINHEIGHT

Mikołaj Zalewski mikolaj at zalewski.pl
Tue Jul 22 14:29:19 CDT 2008


---
 dlls/comctl32/status.c       |   43 ++++++-----------------------------------
 dlls/comctl32/tests/status.c |   29 +++++++++++++++++++++++++++-
 2 files changed, 35 insertions(+), 37 deletions(-)

diff --git a/dlls/comctl32/status.c b/dlls/comctl32/status.c
index f96d2b9..b0fcc35 100644
--- a/dlls/comctl32/status.c
+++ b/dlls/comctl32/status.c
@@ -72,6 +72,7 @@ typedef struct
     HWND              Notify;
     WORD              numParts;
     UINT              height;
+    UINT              minHeight;        /* at least MIN_PANE_HEIGHT, can be increased by SB_SETMINHEIGHT */
     BOOL              simple;
     HWND              hwndToolTip;
     HFONT             hFont;
@@ -119,7 +120,7 @@ STATUSBAR_ComputeHeight(STATUS_INFO *infoPtr)
 
     COMCTL32_GetFontMetrics(infoPtr->hFont ? infoPtr->hFont : infoPtr->hDefaultFont, &tm);
     margin = (tm.tmInternalLeading ? tm.tmInternalLeading : 2);
-    height = max(tm.tmHeight + margin + 2*GetSystemMetrics(SM_CYBORDER), MIN_PANE_HEIGHT) + infoPtr->verticalBorder;
+    height = max(tm.tmHeight + margin + 2*GetSystemMetrics(SM_CYBORDER), infoPtr->minHeight) + infoPtr->verticalBorder;
 
     if ((theme = GetWindowTheme(infoPtr->Self)))
     {
@@ -128,7 +129,7 @@ STATUSBAR_ComputeHeight(STATUS_INFO *infoPtr)
         HDC hdc = GetDC(infoPtr->Self);
         RECT r;
         memset (&r, 0, sizeof (r));
-        r.bottom = tm.tmHeight;
+        r.bottom = max(infoPtr->minHeight, tm.tmHeight);
         if (SUCCEEDED(GetThemeBackgroundExtent(theme, hdc, SP_PANE, 0, &r, &r)))
         {
             height = r.bottom - r.top;
@@ -659,40 +660,9 @@ STATUSBAR_SetIcon (STATUS_INFO *infoPtr, INT nPart, HICON hIcon)
 static BOOL
 STATUSBAR_SetMinHeight (STATUS_INFO *infoPtr, INT height)
 {
-
-    TRACE("(height=%d)\n", height);
-    if (IsWindowVisible (infoPtr->Self)) {
-	INT  width, x, y;
-	RECT parent_rect;
-        HTHEME theme;
-
-	infoPtr->height = height + infoPtr->verticalBorder;
-        
-        if ((theme = GetWindowTheme (infoPtr->Self)))
-        {
-            /* Determine bar height from theme such that the content area is
-             * 'height' pixels large */
-            HDC hdc = GetDC (infoPtr->Self);
-            RECT r;
-            memset (&r, 0, sizeof (r));
-            r.bottom = height;
-            if (SUCCEEDED(GetThemeBackgroundExtent (theme, hdc, SP_PANE, 0, &r, &r)))
-            {
-                infoPtr->height = r.bottom - r.top;
-            }
-            ReleaseDC (infoPtr->Self, hdc);
-        }
-        
-        if (GetClientRect (infoPtr->Notify, &parent_rect))
-        {
-            width = parent_rect.right - parent_rect.left;
-            x = parent_rect.left;
-            y = parent_rect.bottom - infoPtr->height;
-            MoveWindow (infoPtr->Self, x, y, width, infoPtr->height, TRUE);
-            STATUSBAR_SetPartBounds (infoPtr);
-        }
-    }
-
+    infoPtr->minHeight = max(height, MIN_PANE_HEIGHT);
+    infoPtr->height = STATUSBAR_ComputeHeight(infoPtr);
+    /* like native, don't resize the control */
     return TRUE;
 }
 
@@ -962,6 +932,7 @@ STATUSBAR_WMCreate (HWND hwnd, const CREATESTRUCTA *lpCreate)
     infoPtr->horizontalBorder = HORZ_BORDER;
     infoPtr->verticalBorder = VERT_BORDER;
     infoPtr->horizontalGap = HORZ_GAP;
+    infoPtr->minHeight = MIN_PANE_HEIGHT;
 
     STATUSBAR_NotifyFormat(infoPtr, infoPtr->Notify, NF_REQUERY);
 
diff --git a/dlls/comctl32/tests/status.c b/dlls/comctl32/tests/status.c
index 178d3ed..0ca7a93 100644
--- a/dlls/comctl32/tests/status.c
+++ b/dlls/comctl32/tests/status.c
@@ -151,7 +151,7 @@ static int CALLBACK check_height_family_enumproc(ENUMLOGFONTEX *enumlf, NEWTEXTM
 static void test_height(void)
 {
     LOGFONT lf;
-    HFONT hFont;
+    HFONT hFont, hFontSm;
     RECT rc1, rc2;
     HWND hwndStatus = CreateWindow(SUBCLASS_NAME, NULL, WS_CHILD|WS_VISIBLE,
         0, 0, 300, 20, g_hMainWnd, NULL, NULL, NULL);
@@ -175,6 +175,32 @@ static void test_height(void)
     GetClientRect(hwndStatus, &rc2);
     todo_wine expect_rect(0, 0, 672, 42, rc2);
 
+    /* minheight < fontsize - no effects*/
+    SendMessage(hwndStatus, SB_SETMINHEIGHT, 12, 0);
+    SendMessage(hwndStatus, WM_SIZE, 0, 0);
+    GetClientRect(hwndStatus, &rc2);
+    todo_wine expect_rect(0, 0, 672, 42, rc2);
+
+    /* minheight > fontsize - has an effect after WM_SIZE */
+    SendMessage(hwndStatus, SB_SETMINHEIGHT, 60, 0);
+    GetClientRect(hwndStatus, &rc2);
+    todo_wine expect_rect(0, 0, 672, 42, rc2);
+    SendMessage(hwndStatus, WM_SIZE, 0, 0);
+    GetClientRect(hwndStatus, &rc2);
+    expect_rect(0, 0, 672, 62, rc2);
+
+    /* font changed to smaller than minheight - has an effect */
+    SendMessage(hwndStatus, SB_SETMINHEIGHT, 30, 0);
+    expect_rect(0, 0, 672, 62, rc2);
+    SendMessage(hwndStatus, WM_SIZE, 0, 0);
+    GetClientRect(hwndStatus, &rc2);
+    todo_wine expect_rect(0, 0, 672, 42, rc2);
+    hFontSm = CreateFont(9, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE, ANSI_CHARSET,
+        OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE, "Tahoma");
+    SendMessage(hwndStatus, WM_SETFONT, (WPARAM)hFontSm, TRUE);
+    GetClientRect(hwndStatus, &rc2);
+    expect_rect(0, 0, 672, 32, rc2);
+
     /* test the height formula */
     ZeroMemory(&lf, sizeof(lf));
     SendMessage(hwndStatus, SB_SETMINHEIGHT, 0, 0);
@@ -185,6 +211,7 @@ static void test_height(void)
 
     DestroyWindow(hwndStatus);
     DeleteObject(hFont);
+    DeleteObject(hFontSm);
 }
 
 static void test_status_control(void)
-- 
1.5.4


--------------000902000405000503050905--



More information about the wine-patches mailing list