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@outlook.com --- 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 e676a35ede2..1c3ba2ad225 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 %d\n", exstyle); else ok(exstyle == 0, "expected 0, got %d\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 %d\n", rcClient.right); else ok(rcClient.right > 0, "expected non-zero width, got %d\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 %d\n", rcClient.bottom); else ok(rcClient.bottom > 0, "expected non-zero height, got %d\n", rcClient.bottom);