Piotr Caban : comctl32: Compute border size from client and window rectangles.
Alexandre Julliard
julliard at winehq.org
Fri Jul 17 16:30:47 CDT 2020
Module: wine
Branch: master
Commit: 659b0d7017cc899a4858cc5d3bd3c63befdc180d
URL: https://source.winehq.org/git/wine.git/?a=commit;h=659b0d7017cc899a4858cc5d3bd3c63befdc180d
Author: Piotr Caban <piotr at codeweavers.com>
Date: Fri Jul 17 16:17:24 2020 +0200
comctl32: Compute border size from client and window rectangles.
Fixes toolbar size when WS_EX_DLGMODALFRAME is used.
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/comctl32/tests/toolbar.c | 26 ++++++++++++++++++++++----
dlls/comctl32/toolbar.c | 22 ++++++++++++----------
2 files changed, 34 insertions(+), 14 deletions(-)
diff --git a/dlls/comctl32/tests/toolbar.c b/dlls/comctl32/tests/toolbar.c
index 3688394d71..f973d9cfff 100644
--- a/dlls/comctl32/tests/toolbar.c
+++ b/dlls/comctl32/tests/toolbar.c
@@ -434,18 +434,23 @@ static void basic_test(void)
DestroyWindow(hToolbar);
}
-static void rebuild_toolbar(HWND *hToolbar)
+static void rebuild_toolbar_ex(HWND *hToolbar, DWORD exstyle)
{
if (*hToolbar)
DestroyWindow(*hToolbar);
- *hToolbar = CreateWindowExA(0, TOOLBARCLASSNAMEA, NULL, WS_CHILD | WS_VISIBLE, 0, 0, 0, 0,
- hMainWnd, (HMENU)5, GetModuleHandleA(NULL), NULL);
+ *hToolbar = CreateWindowExA(exstyle, TOOLBARCLASSNAMEA, NULL, WS_CHILD | WS_VISIBLE,
+ 0, 0, 0, 0, hMainWnd, (HMENU)5, GetModuleHandleA(NULL), NULL);
ok(*hToolbar != NULL, "Toolbar creation problem\n");
ok(SendMessageA(*hToolbar, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0) == 0, "TB_BUTTONSTRUCTSIZE failed\n");
ok(SendMessageA(*hToolbar, TB_AUTOSIZE, 0, 0) == 0, "TB_AUTOSIZE failed\n");
ok(SendMessageA(*hToolbar, WM_SETFONT, (WPARAM)GetStockObject(SYSTEM_FONT), 0)==1, "WM_SETFONT\n");
}
+static void rebuild_toolbar(HWND *hToolbar)
+{
+ rebuild_toolbar_ex(hToolbar, 0);
+}
+
static void rebuild_toolbar_with_buttons(HWND *hToolbar)
{
TBBUTTON buttons[5];
@@ -1022,7 +1027,7 @@ static void tbsize_addbutton(tbsize_result_t *tbsr, int left, int top, int right
static tbsize_result_t *tbsize_results;
-#define tbsize_results_num 28
+#define tbsize_results_num 29
static void init_tbsize_results(void) {
int fontheight = system_font_height();
@@ -1277,6 +1282,9 @@ static void init_tbsize_results(void) {
tbsize_results[27] = init_tbsize_result(1, 0, 0, 672, 42, 67, 40);
tbsize_addbutton(&tbsize_results[27], 0, 2, 40, 24);
+
+ tbsize_results[28] = init_tbsize_result(1, 0, 0, 672, 42, 67, 40);
+ tbsize_addbutton(&tbsize_results[28], 0, 2, 23, 24);
}
static void free_tbsize_results(void) {
@@ -1360,6 +1368,7 @@ static void test_sizes(void)
int style;
int i;
int fontheight = system_font_height();
+ RECT rect;
init_tbsize_results();
@@ -1631,6 +1640,15 @@ static void test_sizes(void)
SendMessageA(hToolbar, TB_AUTOSIZE, 0, 0 );
check_sizes();
+ /* Toolbar with borders around client area */
+ rebuild_toolbar_ex(&hToolbar, WS_EX_DLGMODALFRAME);
+ SetWindowLongA(hToolbar, GWL_STYLE, CCS_NODIVIDER | GetWindowLongA(hToolbar, GWL_STYLE));
+ SendMessageA(hToolbar, TB_ADDBUTTONSA, 1, (LPARAM)buttons1);
+ check_sizes();
+ GetClientRect(hToolbar, &rect);
+ ok(rect.top == 0, "rect.top = %d\n", rect.top);
+ ok(rect.bottom == 26, "rect.bottom = %d\n", rect.bottom);
+
free_tbsize_results();
DestroyWindow(hToolbar);
}
diff --git a/dlls/comctl32/toolbar.c b/dlls/comctl32/toolbar.c
index b869cc4d7b..b2711a3eb8 100644
--- a/dlls/comctl32/toolbar.c
+++ b/dlls/comctl32/toolbar.c
@@ -3069,7 +3069,7 @@ TOOLBAR_AutoSize (TOOLBAR_INFO *infoPtr)
if (!(infoPtr->dwStyle & CCS_NORESIZE))
{
- RECT window_rect, parent_rect;
+ RECT window_rect, client_rect, parent_rect, border;
UINT uPosFlags = SWP_NOZORDER | SWP_NOACTIVATE;
HWND parent;
INT x, y, cx, cy;
@@ -3079,6 +3079,13 @@ TOOLBAR_AutoSize (TOOLBAR_INFO *infoPtr)
if (!parent || !infoPtr->bDoRedraw)
return 0;
+ GetWindowRect(infoPtr->hwndSelf, &window_rect);
+ GetClientRect(infoPtr->hwndSelf, &client_rect);
+ border = window_rect;
+ MapWindowPoints(0, infoPtr->hwndSelf, (POINT *)&border, 2);
+ border.right -= border.left + client_rect.right - client_rect.left;
+ border.bottom -= border.top + client_rect.bottom - client_rect.top;
+
GetClientRect(parent, &parent_rect);
x = parent_rect.left;
@@ -3089,15 +3096,11 @@ TOOLBAR_AutoSize (TOOLBAR_INFO *infoPtr)
if ((infoPtr->dwStyle & CCS_BOTTOM) == CCS_NOMOVEY)
{
- GetWindowRect(infoPtr->hwndSelf, &window_rect);
MapWindowPoints( 0, parent, (POINT *)&window_rect, 2 );
y = window_rect.top;
}
if ((infoPtr->dwStyle & CCS_BOTTOM) == CCS_BOTTOM)
- {
- GetWindowRect(infoPtr->hwndSelf, &window_rect);
y = parent_rect.bottom - ( window_rect.bottom - window_rect.top);
- }
if (infoPtr->dwStyle & CCS_NOPARENTALIGN)
uPosFlags |= SWP_NOMOVE;
@@ -3105,11 +3108,10 @@ TOOLBAR_AutoSize (TOOLBAR_INFO *infoPtr)
if (!(infoPtr->dwStyle & CCS_NODIVIDER))
cy += GetSystemMetrics(SM_CYEDGE);
- if (infoPtr->dwStyle & WS_BORDER)
- {
- cx += 2 * GetSystemMetrics(SM_CXBORDER);
- cy += 2 * GetSystemMetrics(SM_CYBORDER);
- }
+ x += border.left;
+ y += border.top;
+ cx += border.right;
+ cy += border.bottom;
SetWindowPos(infoPtr->hwndSelf, NULL, x, y, cx, cy, uPosFlags);
}
More information about the wine-cvs
mailing list