Fix setting size of tab control for good. Vitaliy Margolen changelog: * dlls/comctrl32/tab.c Fix setting size of tab control Index: tab.c =================================================================== RCS file: /home/wine/wine/dlls/comctl32/tab.c,v retrieving revision 1.84 diff -u -r1.84 tab.c --- tab.c 22 Sep 2003 21:32:33 -0000 1.84 +++ tab.c 11 Oct 2003 20:07:18 -0000 @@ -79,7 +79,7 @@ BOOL DoRedraw; /* flag for redrawing when tab contents is changed*/ BOOL needsScrolling; /* TRUE if the size of the tabs is greater than * the size of the control */ - BOOL fSizeSet; /* was the size of the tabs explicitly set? */ + BOOL fHeightSet; /* was the height of the tabs explicitly set? */ BOOL bUnicode; /* Unicode control? */ HWND hwndUpDown; /* Updown control used for scrolling */ } TAB_INFO; @@ -1102,7 +1102,7 @@ curItemLeftPos = 0; curItemRowCount = infoPtr->uNumItem ? 1 : 0; - if (!(lStyle & TCS_FIXEDWIDTH) && !((lStyle & TCS_OWNERDRAWFIXED) && infoPtr->fSizeSet) ) + if (!(infoPtr->fHeightSet)) { int item_height; int icon_height = 0; @@ -1139,7 +1139,7 @@ /* Set the leftmost position of the tab. */ infoPtr->items[curItem].rect.left = curItemLeftPos; - if ( (lStyle & TCS_FIXEDWIDTH) || ((lStyle & TCS_OWNERDRAWFIXED) && infoPtr->fSizeSet)) + if ( lStyle & (TCS_FIXEDWIDTH | TCS_OWNERDRAWFIXED) ) { infoPtr->items[curItem].rect.right = infoPtr->items[curItem].rect.left + infoPtr->tabWidth + @@ -1793,7 +1793,7 @@ if (iItem == infoPtr->iSelected) { /* Background color */ - if (!((lStyle & TCS_OWNERDRAWFIXED) && infoPtr->fSizeSet)) + if (!(lStyle & TCS_OWNERDRAWFIXED)) { DeleteObject(hbr); hbr = GetSysColorBrush(COLOR_SCROLLBAR); @@ -2385,15 +2385,20 @@ HDC hdc; PAINTSTRUCT ps; - hdc = wParam== 0 ? BeginPaint (hwnd, &ps) : (HDC)wParam; - - TRACE("erase %d, rect=(%ld,%ld)-(%ld,%ld)\n", - ps.fErase, - ps.rcPaint.left,ps.rcPaint.top,ps.rcPaint.right,ps.rcPaint.bottom); + if (wParam == 0) + { + hdc = BeginPaint (hwnd, &ps); + TRACE("erase %d, rect=(%ld,%ld)-(%ld,%ld)\n", + ps.fErase, + ps.rcPaint.left,ps.rcPaint.top,ps.rcPaint.right,ps.rcPaint.bottom); - if (ps.fErase) + if (ps.fErase) TAB_EraseBackground (hwnd, hdc); + } else { + hdc = (HDC)wParam; + } + TAB_Refresh (hwnd, hdc); if(!wParam) @@ -2557,20 +2562,34 @@ TAB_INFO *infoPtr = TAB_GetInfoPtr(hwnd); LONG lStyle = GetWindowLongA(hwnd, GWL_STYLE); LONG lResult = 0; + BOOL bNeedPaint = FALSE; - TRACE("\n"); - if ((lStyle & TCS_FIXEDWIDTH) || (lStyle & TCS_OWNERDRAWFIXED)) + lResult = MAKELONG(infoPtr->tabWidth, infoPtr->tabHeight); + + /* UNDOCUMENTED: If requested Width or Height is 0 this means that program wants to use auto size. */ + if ((lStyle & (TCS_FIXEDWIDTH | TCS_OWNERDRAWFIXED)) && + (infoPtr->tabWidth != (INT)LOWORD(lParam))) { - lResult = MAKELONG(infoPtr->tabWidth, infoPtr->tabHeight); - /* UNDOCUMENTED: If requested Width or Height is 0 this means that program wants to use default. */ - if (LOWORD(lParam)) infoPtr->tabWidth = max((INT)LOWORD(lParam), infoPtr->tabMinWidth); - if (HIWORD(lParam)) infoPtr->tabHeight = (INT)HIWORD(lParam); - TRACE("was h=%d,w=%d, now h=%d,w=%d\n", - HIWORD(lResult), LOWORD(lResult), - infoPtr->tabHeight, infoPtr->tabWidth); + infoPtr->tabWidth = max((INT)LOWORD(lParam), infoPtr->tabMinWidth); + bNeedPaint = TRUE; } - infoPtr->fSizeSet = TRUE; + if (infoPtr->tabHeight != (INT)HIWORD(lParam)) + { + if (infoPtr->fHeightSet = (INT)HIWORD(lParam) != 0) + infoPtr->tabHeight = (INT)HIWORD(lParam); + else + TAB_SetItemBounds(hwnd); + + bNeedPaint = TRUE; + } + TRACE("was h=%d,w=%d, now h=%d,w=%d\n", + HIWORD(lResult), LOWORD(lResult), + infoPtr->tabHeight, infoPtr->tabWidth); + + if (bNeedPaint) + RedrawWindow(hwnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_UPDATENOW); + return lResult; } @@ -2966,7 +2985,7 @@ infoPtr->needsScrolling = FALSE; infoPtr->hwndUpDown = 0; infoPtr->leftmostVisible = 0; - infoPtr->fSizeSet = FALSE; + infoPtr->fHeightSet = FALSE; infoPtr->bUnicode = IsWindowUnicode (hwnd); TRACE("Created tab control, hwnd [%p]\n", hwnd);