Rafał Harabień : comctl32: Fix handling of SS_ETCHEDHORZ/SS_ETCHEDVERT static control styles.
Alexandre Julliard
julliard at winehq.org
Thu Apr 7 16:19:08 CDT 2022
Module: wine
Branch: master
Commit: 4e8277e633ed9392f6d33388f0c7c7d9ec511861
URL: https://source.winehq.org/git/wine.git/?a=commit;h=4e8277e633ed9392f6d33388f0c7c7d9ec511861
Author: Rafał Harabień <rafalh92 at outlook.com>
Date: Sun Apr 3 01:37:34 2022 +0200
comctl32: Fix handling of SS_ETCHEDHORZ/SS_ETCHEDVERT static control styles.
Instead of drawing the frame in WM_PAINT use WS_EX_STATICEDGE style that
adds the frame outside of the client rect and change control size after
creation to make it look like a line.
Signed-off-by: Rafał Harabień <rafalh92 at outlook.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/comctl32/static.c | 30 +++++++++++++++---------------
dlls/comctl32/tests/static.c | 6 +++---
2 files changed, 18 insertions(+), 18 deletions(-)
diff --git a/dlls/comctl32/static.c b/dlls/comctl32/static.c
index 9b20e6a8b66..0d50c2fe31c 100644
--- a/dlls/comctl32/static.c
+++ b/dlls/comctl32/static.c
@@ -84,8 +84,8 @@ static const pfPaint staticPaintFunc[SS_TYPEMASK+1] =
STATIC_PaintOwnerDrawfn, /* SS_OWNERDRAW */
STATIC_PaintBitmapfn, /* SS_BITMAP */
STATIC_PaintEnhMetafn, /* SS_ENHMETAFILE */
- STATIC_PaintEtchedfn, /* SS_ETCHEDHORZ */
- STATIC_PaintEtchedfn, /* SS_ETCHEDVERT */
+ NULL, /* SS_ETCHEDHORZ */
+ NULL, /* SS_ETCHEDVERT */
STATIC_PaintEtchedfn, /* SS_ETCHEDFRAME */
};
@@ -530,10 +530,21 @@ static LRESULT CALLBACK STATIC_WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam,
{
CREATESTRUCTW *cs = (CREATESTRUCTW *)lParam;
- if (full_style & SS_SUNKEN)
+ if (full_style & SS_SUNKEN || style == SS_ETCHEDHORZ || style == SS_ETCHEDVERT)
SetWindowLongW( hwnd, GWL_EXSTYLE,
GetWindowLongW( hwnd, GWL_EXSTYLE ) | WS_EX_STATICEDGE );
+ if (style == SS_ETCHEDHORZ || style == SS_ETCHEDVERT) {
+ RECT rc;
+ GetClientRect(hwnd, &rc);
+ if (style == SS_ETCHEDHORZ)
+ rc.bottom = rc.top;
+ else
+ rc.right = rc.left;
+ AdjustWindowRectEx(&rc, full_style, FALSE, GetWindowLongW(hwnd, GWL_EXSTYLE));
+ SetWindowPos(hwnd, NULL, 0, 0, rc.right - rc.left, rc.bottom - rc.top, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER);
+ }
+
switch (style)
{
case SS_ICON:
@@ -915,18 +926,7 @@ static void STATIC_PaintEtchedfn( HWND hwnd, HDC hdc, DWORD style )
/* FIXME: sometimes (not always) sends WM_CTLCOLORSTATIC */
GetClientRect( hwnd, &rc );
- switch (style & SS_TYPEMASK)
- {
- case SS_ETCHEDHORZ:
- DrawEdge(hdc, &rc, EDGE_ETCHED, BF_TOP | BF_BOTTOM);
- break;
- case SS_ETCHEDVERT:
- DrawEdge(hdc, &rc, EDGE_ETCHED, BF_LEFT | BF_RIGHT);
- break;
- case SS_ETCHEDFRAME:
- DrawEdge(hdc, &rc, EDGE_ETCHED, BF_RECT);
- break;
- }
+ DrawEdge(hdc, &rc, EDGE_ETCHED, BF_RECT);
}
void STATIC_Register(void)
diff --git a/dlls/comctl32/tests/static.c b/dlls/comctl32/tests/static.c
index a8f8612747a..c78cf0d80b2 100644
--- a/dlls/comctl32/tests/static.c
+++ b/dlls/comctl32/tests/static.c
@@ -91,17 +91,17 @@ static void test_updates(int style, int flags)
exstyle = GetWindowLongW(hStatic, GWL_EXSTYLE);
if (style == SS_ETCHEDHORZ || style == SS_ETCHEDVERT || style == SS_SUNKEN)
- todo_wine_if(style == SS_ETCHEDHORZ || style == SS_ETCHEDVERT) ok(exstyle == WS_EX_STATICEDGE, "expected WS_EX_STATICEDGE, got %d\n", exstyle);
+ ok(exstyle == WS_EX_STATICEDGE, "expected WS_EX_STATICEDGE, got %ld\n", exstyle);
else
ok(exstyle == 0, "expected 0, got %ld\n", exstyle);
GetClientRect(hStatic, &rcClient);
if (style == SS_ETCHEDVERT)
- todo_wine ok(rcClient.right == 0, "expected zero width, got %d\n", rcClient.right);
+ ok(rcClient.right == 0, "expected zero width, got %ld\n", rcClient.right);
else
ok(rcClient.right > 0, "expected non-zero width, got %ld\n", rcClient.right);
if (style == SS_ETCHEDHORZ)
- todo_wine ok(rcClient.bottom == 0, "expected zero height, got %d\n", rcClient.bottom);
+ ok(rcClient.bottom == 0, "expected zero height, got %ld\n", rcClient.bottom);
else
ok(rcClient.bottom > 0, "expected non-zero height, got %ld\n", rcClient.bottom);
More information about the wine-cvs
mailing list