diff --git a/dlls/comctl32/status.c b/dlls/comctl32/status.c index f96d2b90a1f..b0fcc35a0d4 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 178d3ed11be..0ca7a935b14 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)