comctl32: Fix rebar autosize behaviour.
Allow autoresizing rebar by PostMessage(hwndRebar, WM_SIZE, 0, 0) like
native does, taking as few rows as possible and using the parent
window client area size for the other dimension (width for horizontal
rebars or height for vertical ones).
diff --git a/dlls/comctl32/rebar.c b/dlls/comctl32/rebar.c
index 468fe24..81633d6 100644
--- a/dlls/comctl32/rebar.c
+++ b/dlls/comctl32/rebar.c
@@ -1492,10 +1492,11 @@
cxsep = (cntonrow == 0) ? 0 : SEP_WIDTH;
cx = lpBand->lcx;
+ /* In native, 0 as one of the coordinates means no limit */
if (infoPtr->dwStyle & CCS_VERT)
- dobreak = (y + cx + cxsep > adjcy);
+ dobreak = (adjcy && (y + cx + cxsep > adjcy));
else
- dobreak = (x + cx + cxsep > adjcx);
+ dobreak = (adjcx && (x + cx + cxsep > adjcx));
/* This is the check for whether we need to start a new row */
if ( ( (lpBand->fStyle & RBBS_BREAK) && (i != 0) ) ||
@@ -1537,14 +1538,14 @@
/* if boundary rect specified then limit mcy */
if (lpRect) {
if (infoPtr->dwStyle & CCS_VERT) {
- if (x+mcy > adjcx) {
+ if (adjcx && (x+mcy > adjcx)) {
mcy = adjcx - x;
TRACE("P1 row %u limiting mcy=%d, adjcx=%d, x=%d\n",
i, mcy, adjcx, x);
}
}
else {
- if (y+mcy > adjcy) {
+ if (adjcy && (y+mcy > adjcy)) {
mcy = adjcy - y;
TRACE("P1 row %u limiting mcy=%d, adjcy=%d, y=%d\n",
i, mcy, adjcy, y);
@@ -1656,8 +1657,9 @@
/* ******* Start Phase 2 - split rows till adjustment height full ******* */
/* assumes that the following variables contain: */
- /* y/x current height/width of all rows */
- if (lpRect) {
+ /* y/x current height/width of all rows */
+ /* adjcy/adjcx adjustment height/width or 0 (as small as possible) */
+ if (lpRect && ((infoPtr->dwStyle & CCS_VERT) ? adjcx : adjcy)) {
INT i, prev_rh, new_rh, adj_rh, prev_idx, current_idx;
REBAR_BAND *prev, *current, *walk;
UINT j;
@@ -4501,9 +4503,14 @@
if ((lParam == 0) && (rcClient.right + rcClient.bottom != 0) &&
(infoPtr->dwStyle & RBS_AUTOSIZE)) {
/* on a WM_SIZE to zero and current client not zero and AUTOSIZE */
- /* native seems to use the current client rect for the size */
+ /* native seems to use the current parent width for the size */
infoPtr->fStatus |= BAND_NEEDS_LAYOUT;
- TRACE("sizing rebar to client (%ld,%ld) size is zero but AUTOSIZE set\n",
+ GetClientRect (GetParent(infoPtr->hwndSelf), &rcClient);
+ if (infoPtr->dwStyle & CCS_VERT)
+ rcClient.right = 0;
+ else
+ rcClient.bottom = 0;
+ TRACE("sizing rebar to parent (%ld,%ld) size is zero but AUTOSIZE set\n",
rcClient.right, rcClient.bottom);
}
else {