Fix resizing of wizards.
diff --git a/dlls/comctl32/propsheet.c b/dlls/comctl32/propsheet.c
index 463b260..a2af8c8 100644
--- a/dlls/comctl32/propsheet.c
+++ b/dlls/comctl32/propsheet.c
@@ -97,8 +97,6 @@
PropPageInfo* proppage;
HFONT hFont;
HFONT hFontBold;
- int x;
- int y;
int width;
int height;
HIMAGELIST hImageList;
@@ -125,6 +123,10 @@
#define INTRNL_ANY_WIZARD (PSH_WIZARD | PSH_WIZARD97_OLD | PSH_WIZARD97_NEW | PSH_WIZARD_LITE)
+/* Wizard metrics specified in DLUs */
+#define WIZARD_PADDING 7
+#define WIZARD_HEADER_HEIGHT 36
+
/******************************************************************************
* Prototypes
*/
@@ -232,13 +234,43 @@
*
* Retrieve rect from tab control and map into the dialog for SetWindowPos
*/
-static void PROPSHEET_GetPageRect(const PropSheetInfo * psInfo, HWND hwndDlg, RECT *rc)
+static void PROPSHEET_GetPageRect(const PropSheetInfo * psInfo, HWND hwndDlg,
+ RECT *rc, LPCPROPSHEETPAGEW ppshpage)
{
- HWND hwndTabCtrl = GetDlgItem(hwndDlg, IDC_TABCONTROL);
+ if (psInfo->ppshheader.dwFlags & INTRNL_ANY_WIZARD) {
+ HWND hwndChild;
+ RECT r;
- GetClientRect(hwndTabCtrl, rc);
- SendMessageW(hwndTabCtrl, TCM_ADJUSTRECT, FALSE, (LPARAM)rc);
- MapWindowPoints(hwndTabCtrl, hwndDlg, (LPPOINT)rc, 2);
+ if (((psInfo->ppshheader.dwFlags & (PSH_WIZARD97_NEW | PSH_WIZARD97_OLD)) &&
+ (psInfo->ppshheader.dwFlags & PSH_HEADER) &&
+ !(ppshpage->dwFlags & PSP_HIDEHEADER)) ||
+ (psInfo->ppshheader.dwFlags & PSH_WIZARD))
+ {
+ rc->left = rc->top = WIZARD_PADDING;
+ }
+ else
+ {
+ rc->left = rc->top = 0;
+ }
+ rc->right = psInfo->width - rc->left;
+ rc->bottom = psInfo->height - rc->top;
+ MapDialogRect(hwndDlg, rc);
+
+ if ((psInfo->ppshheader.dwFlags & (PSH_WIZARD97_NEW | PSH_WIZARD97_OLD)) &&
+ (psInfo->ppshheader.dwFlags & PSH_HEADER) &&
+ !(ppshpage->dwFlags & PSP_HIDEHEADER))
+ {
+ hwndChild = GetDlgItem(hwndDlg, IDC_SUNKEN_LINEHEADER);
+ GetClientRect(hwndChild, &r);
+ MapWindowPoints(hwndChild, hwndDlg, (LPPOINT) &r, 2);
+ rc->top += r.bottom + 1;
+ }
+ } else {
+ HWND hwndTabCtrl = GetDlgItem(hwndDlg, IDC_TABCONTROL);
+ GetClientRect(hwndTabCtrl, rc);
+ SendMessageW(hwndTabCtrl, TCM_ADJUSTRECT, FALSE, (LPARAM)rc);
+ MapWindowPoints(hwndTabCtrl, hwndDlg, (LPPOINT)rc, 2);
+ }
}
/******************************************************************************
@@ -474,6 +506,23 @@
width = (WORD)*p; p++;
height = (WORD)*p; p++;
+ /* Special calculation for interior wizard pages so the largest page is
+ * calculated correctly. We need to add all the padding and space occupied
+ * by the header so the width and height sums up to the whole wizard client
+ * area. */
+ if ((psInfo->ppshheader.dwFlags & (PSH_WIZARD97_OLD | PSH_WIZARD97_NEW)) &&
+ (psInfo->ppshheader.dwFlags & PSH_HEADER) &&
+ !(dwFlags & PSP_HIDEHEADER))
+ {
+ height += 2 * WIZARD_PADDING + WIZARD_HEADER_HEIGHT;
+ width += 2 * WIZARD_PADDING;
+ }
+ if (psInfo->ppshheader.dwFlags & PSH_WIZARD)
+ {
+ height += 2 * WIZARD_PADDING;
+ width += 2 * WIZARD_PADDING;
+ }
+
/* remember the largest width and height */
if (width > psInfo->width)
psInfo->width = width;
@@ -681,8 +730,8 @@
/*
* Biggest page size.
*/
- rcPage.left = psInfo->x;
- rcPage.top = psInfo->y;
+ rcPage.left = 0;
+ rcPage.top = 0;
rcPage.right = psInfo->width;
rcPage.bottom = psInfo->height;
@@ -699,49 +748,6 @@
}
/******************************************************************************
- * PROPSHEET_IsTooSmallWizard
- *
- * Verify that the default property sheet is big enough.
- */
-static BOOL PROPSHEET_IsTooSmallWizard(HWND hwndDlg, PropSheetInfo* psInfo)
-{
- RECT rcSheetRect, rcPage, rcLine, rcSheetClient;
- HWND hwndLine = GetDlgItem(hwndDlg, IDC_SUNKEN_LINE);
- PADDING_INFO padding = PROPSHEET_GetPaddingInfoWizard(hwndDlg, psInfo);
-
- GetClientRect(hwndDlg, &rcSheetClient);
- GetWindowRect(hwndDlg, &rcSheetRect);
- GetWindowRect(hwndLine, &rcLine);
-
- /* Remove the space below the sunken line */
- rcSheetClient.bottom -= (rcSheetRect.bottom - rcLine.top);
-
- /* Remove the buffer zone all around the edge */
- rcSheetClient.bottom -= (padding.y * 2);
- rcSheetClient.right -= (padding.x * 2);
-
- /*
- * Biggest page size.
- */
- rcPage.left = psInfo->x;
- rcPage.top = psInfo->y;
- rcPage.right = psInfo->width;
- rcPage.bottom = psInfo->height;
-
- MapDialogRect(hwndDlg, &rcPage);
- TRACE("biggest page %ld %ld %ld %ld\n", rcPage.left, rcPage.top,
- rcPage.right, rcPage.bottom);
-
- if (rcPage.right > rcSheetClient.right)
- return TRUE;
-
- if (rcPage.bottom > rcSheetClient.bottom)
- return TRUE;
-
- return FALSE;
-}
-
-/******************************************************************************
* PROPSHEET_AdjustSize
*
* Resizes the property sheet and the tab control to fit the largest page.
@@ -762,8 +768,8 @@
/*
* Biggest page size.
*/
- rc.left = psInfo->x;
- rc.top = psInfo->y;
+ rc.left = 0;
+ rc.top = 0;
rc.right = psInfo->width;
rc.bottom = psInfo->height;
@@ -830,69 +836,33 @@
*/
static BOOL PROPSHEET_AdjustSizeWizard(HWND hwndDlg, PropSheetInfo* psInfo)
{
- HWND hwndButton = GetDlgItem(hwndDlg, IDCANCEL);
HWND hwndLine = GetDlgItem(hwndDlg, IDC_SUNKEN_LINE);
- HWND hwndTabCtrl = GetDlgItem(hwndDlg, IDC_TABCONTROL);
- RECT rc,tabRect;
- int buttonHeight, lineHeight;
- PADDING_INFO padding = PROPSHEET_GetPaddingInfoWizard(hwndDlg, psInfo);
- RECT units;
+ RECT rc, lineRect, dialogRect;
- /* Get the height of buttons */
- GetClientRect(hwndButton, &rc);
- buttonHeight = rc.bottom;
-
- GetClientRect(hwndLine, &rc);
- lineHeight = rc.bottom;
-
- /* retrieve the dialog units */
- units.left = units.right = 4;
- units.top = units.bottom = 8;
- MapDialogRect(hwndDlg, &units);
-
- /*
- * Biggest page size.
- */
- rc.left = psInfo->x;
- rc.top = psInfo->y;
+ /* Biggest page size */
+ rc.left = 0;
+ rc.top = 0;
rc.right = psInfo->width;
rc.bottom = psInfo->height;
-
MapDialogRect(hwndDlg, &rc);
- GetClientRect(hwndTabCtrl,&tabRect);
-
- if ((rc.bottom - rc.top) < (tabRect.bottom - tabRect.top))
- {
- rc.bottom = rc.top + tabRect.bottom - tabRect.top;
- psInfo->height = MulDiv((rc.bottom - rc.top), 8, units.top);
- }
-
- if ((rc.right - rc.left) < (tabRect.right - tabRect.left))
- {
- rc.right = rc.left + tabRect.right - tabRect.left;
- psInfo->width = MulDiv((rc.right - rc.left), 4, units.left);
- }
-
TRACE("Biggest page %ld %ld %ld %ld\n", rc.left, rc.top, rc.right, rc.bottom);
- TRACE(" constants padx=%d, pady=%d, butH=%d, lH=%d\n",
- padding.x, padding.y, buttonHeight, lineHeight);
- /* Make room */
- rc.right += (padding.x * 2);
- rc.bottom += (buttonHeight + lineHeight);
- if (psInfo->ppshheader.dwFlags & (PSH_WIZARD97_OLD | PSH_WIZARD97_NEW))
- rc.bottom += (4 * padding.y);
- else
- rc.bottom += (5 * padding.y);
+ /* Add space for the buttons row */
+ GetWindowRect(hwndLine, &lineRect);
+ MapWindowPoints(NULL, hwndDlg, (LPPOINT)&lineRect, 2);
+ GetClientRect(hwndDlg, &dialogRect);
+ rc.bottom += dialogRect.bottom - lineRect.top - 1;
- /*
- * Resize the property sheet.
- */
+ /* Convert the client coordinates to window coordinates */
+ AdjustWindowRect(&rc, GetWindowLongW(hwndDlg, GWL_STYLE), FALSE);
+
+ /* Resize the property sheet */
TRACE("setting dialog %08lx, rc (0,0)-(%ld,%ld)\n",
(DWORD)hwndDlg, rc.right, rc.bottom);
- SetWindowPos(hwndDlg, 0, 0, 0, rc.right, rc.bottom,
+ SetWindowPos(hwndDlg, 0, 0, 0, rc.right - rc.left, rc.bottom - rc.top,
SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
+
return TRUE;
}
@@ -1086,7 +1056,8 @@
else
ShowWindow(hwndButton, SW_HIDE);
- if (psInfo->ppshheader.dwFlags & (PSH_WIZARD97_OLD | PSH_WIZARD97_NEW))
+ if (psInfo->ppshheader.dwFlags &
+ (PSH_WIZARD97_OLD | PSH_WIZARD97_NEW | PSH_WIZARD_LITE))
padding.x = 0;
/*
@@ -1096,7 +1067,6 @@
y = rcSheet.bottom - ((padding.y * 2) + buttonHeight + lineHeight);
lineWidth = rcSheet.right - (padding.x * 2);
-
SetWindowPos(hwndLine, 0, x, y, lineWidth, 2,
SWP_NOZORDER | SWP_NOACTIVATE);
@@ -1418,9 +1388,6 @@
{
DLGTEMPLATE* pTemplate;
HWND hwndPage;
- RECT rc;
- PADDING_INFO padding;
- UINT pageWidth,pageHeight;
DWORD resSize;
LPVOID temp = NULL;
@@ -1490,7 +1457,7 @@
if (((MyDLGTEMPLATEEX*)pTemplate)->signature == 0xFFFF)
{
- ((MyDLGTEMPLATEEX*)pTemplate)->style |= WS_CHILD | DS_CONTROL;
+ ((MyDLGTEMPLATEEX*)pTemplate)->style |= WS_CHILD | WS_TABSTOP | DS_CONTROL;
((MyDLGTEMPLATEEX*)pTemplate)->style &= ~DS_MODALFRAME;
((MyDLGTEMPLATEEX*)pTemplate)->style &= ~WS_CAPTION;
((MyDLGTEMPLATEEX*)pTemplate)->style &= ~WS_SYSMENU;
@@ -1503,7 +1470,7 @@
}
else
{
- pTemplate->style |= WS_CHILD | DS_CONTROL;
+ pTemplate->style |= WS_CHILD | WS_TABSTOP | DS_CONTROL;
pTemplate->style &= ~DS_MODALFRAME;
pTemplate->style &= ~WS_CAPTION;
pTemplate->style &= ~WS_SYSMENU;
@@ -1537,44 +1504,6 @@
psInfo->proppage[index].hwndPage = hwndPage;
- /* NOTE: This code should be most probably moved to PROPSHEET_SetCurSel,
- * but until it will be proved with test case it's left here. */
- if (psInfo->ppshheader.dwFlags & INTRNL_ANY_WIZARD) {
- int offsety = 0;
- HWND hwndChild;
- RECT r;
-
- rc.left = psInfo->x;
- rc.top = psInfo->y;
- rc.right = psInfo->width;
- rc.bottom = psInfo->height;
-
- MapDialogRect(hwndParent, &rc);
-
- pageWidth = rc.right - rc.left;
- pageHeight = rc.bottom - rc.top;
-
- padding = PROPSHEET_GetPaddingInfoWizard(hwndParent, psInfo);
- TRACE("setting page %08lx, rc (%ld,%ld)-(%ld,%ld) w=%d, h=%d, padx=%d, pady=%d\n",
- (DWORD)hwndPage, rc.left, rc.top, rc.right, rc.bottom,
- pageWidth, pageHeight, padding.x, padding.y);
-
- if (psInfo->ppshheader.dwFlags & (PSH_WIZARD97_NEW | PSH_WIZARD97_OLD) &&
- psInfo->ppshheader.dwFlags & PSH_HEADER)
- {
- hwndChild = GetDlgItem(hwndParent, IDC_SUNKEN_LINEHEADER);
-
- GetClientRect(hwndChild, &r);
- MapWindowPoints(hwndChild, hwndParent, (LPPOINT) &r, 2);
- offsety = (ppshpage->dwFlags & PSP_HIDEHEADER)?0:r.bottom + 1;
- }
-
- SetWindowPos(hwndPage, HWND_TOP,
- rc.left + padding.x/2,
- rc.top + padding.y/2 + offsety,
- pageWidth, pageHeight - offsety, 0);
- }
-
/* Subclass exterior wizard pages */
if((psInfo->ppshheader.dwFlags & (PSH_WIZARD97_NEW | PSH_WIZARD97_OLD)) &&
(psInfo->ppshheader.dwFlags & PSH_WATERMARK) &&
@@ -2104,6 +2033,7 @@
int result;
PSHNOTIFY psn;
RECT rc;
+ LPCPROPSHEETPAGEW ppshpage = (LPCPROPSHEETPAGEW)psInfo->proppage[index].hpage;
if (hwndTabControl)
SendMessageW(hwndTabControl, TCM_SETCURSEL, index, 0);
@@ -2114,25 +2044,21 @@
psn.lParam = 0;
if (!psInfo->proppage[index].hwndPage) {
- LPCPROPSHEETPAGEW ppshpage = (LPCPROPSHEETPAGEW)psInfo->proppage[index].hpage;
PROPSHEET_CreatePage(hwndDlg, index, psInfo, ppshpage);
}
- /* NOTE: The resizing happens every time the page is selected and
+ /* Resize the property sheet page to the fit in the Tab control
+ * (for regular property sheets) or to fit in the client area (for
+ * wizards).
+ * NOTE: The resizing happens every time the page is selected and
* not only when it's created (some applications depend on it). */
- if (!(psInfo->ppshheader.dwFlags & INTRNL_ANY_WIZARD)) {
- /*
- * Ask the Tab control to reduce the client rectangle to that
- * it has available.
- */
- PROPSHEET_GetPageRect(psInfo, hwndDlg, &rc);
- TRACE("setting page %p, rc (%ld,%ld)-(%ld,%ld) w=%ld, h=%ld\n",
- psInfo->proppage[index].hwndPage, rc.left, rc.top, rc.right, rc.bottom,
- rc.right - rc.left, rc.bottom - rc.top);
- SetWindowPos(psInfo->proppage[index].hwndPage, HWND_TOP,
- rc.left, rc.top,
- rc.right - rc.left, rc.bottom - rc.top, 0);
- }
+ PROPSHEET_GetPageRect(psInfo, hwndDlg, &rc, ppshpage);
+ TRACE("setting page %p, rc (%ld,%ld)-(%ld,%ld) w=%ld, h=%ld\n",
+ psInfo->proppage[index].hwndPage, rc.left, rc.top, rc.right, rc.bottom,
+ rc.right - rc.left, rc.bottom - rc.top);
+ SetWindowPos(psInfo->proppage[index].hwndPage, HWND_TOP,
+ rc.left, rc.top,
+ rc.right - rc.left, rc.bottom - rc.top, 0);
result = SendMessageW(psInfo->proppage[index].hwndPage, WM_NOTIFY, 0, (LPARAM) &psn);
if (!result)
@@ -2958,7 +2884,7 @@
HeapFree(GetProcessHeap(), 0, (LPVOID)psp->u2.pszIcon);
if ((psp->dwFlags & PSP_USETITLE) && HIWORD( psp->pszTitle ))
- HeapFree(GetProcessHeap(), 0, (LPVOID)psp->pszTitle);
+ HeapFree(GetProcessHeap(), 0, (LPVOID)psp->pszTitle);
Free(hPropPage);
@@ -3361,11 +3287,8 @@
if (psInfo->ppshheader.dwFlags & INTRNL_ANY_WIZARD)
{
ShowWindow(hwndTabCtrl, SW_HIDE);
- if (PROPSHEET_IsTooSmallWizard(hwnd, psInfo))
- {
- PROPSHEET_AdjustSizeWizard(hwnd, psInfo);
- PROPSHEET_AdjustButtonsWizard(hwnd, psInfo);
- }
+ PROPSHEET_AdjustSizeWizard(hwnd, psInfo);
+ PROPSHEET_AdjustButtonsWizard(hwnd, psInfo);
}
else
{