From 9788ba6e54edc0c6cd8ddc9a45e9d395b3eef833 Mon Sep 17 00:00:00 2001
From: Gerard Patel <g.patel@wanadoo.fr>
Date: Sun, 16 Jul 2000 15:39:37 +0000
Subject: [PATCH] Set clipping region to client window before owner-drawn
 painting.

---
 controls/listbox.c | 22 ++++++++++++----------
 1 file changed, 12 insertions(+), 10 deletions(-)

diff --git a/controls/listbox.c b/controls/listbox.c
index befb4123202..de53175bef2 100644
--- a/controls/listbox.c
+++ b/controls/listbox.c
@@ -484,6 +484,8 @@ static void LISTBOX_PaintItem( WND *wnd, LB_DESCR *descr, HDC hdc,
     if (IS_OWNERDRAW(descr))
     {
         DRAWITEMSTRUCT dis;
+        RECT r;
+        HRGN hrgn;
 
 	if (!item)
 	{
@@ -493,6 +495,16 @@ static void LISTBOX_PaintItem( WND *wnd, LB_DESCR *descr, HDC hdc,
 	        FIXME("called with an out of bounds index %d(%d) in owner draw, Not good.\n",index,descr->nb_items);
 	    return;
 	}
+
+        /* some programs mess with the clipping region when
+        drawing the item, *and* restore the previous region
+        after they are done, so a region has better to exist
+        else everything ends clipped */
+        GetClientRect(wnd->hwndSelf, &r);
+        hrgn = CreateRectRgnIndirect(&r);
+        SelectClipRgn( hdc, hrgn);
+        DeleteObject( hrgn );
+
         dis.CtlType      = ODT_LISTBOX;
         dis.CtlID        = wnd->wIDmenu;
         dis.hwndItem     = wnd->hwndSelf;
@@ -924,16 +936,6 @@ static LRESULT LISTBOX_Paint( WND *wnd, LB_DESCR *descr, HDC hdc )
         rect.right += descr->horz_pos;
     }
 
-    if (IS_OWNERDRAW(descr))
-    {
-        RECT r;
-        HRGN hrgn;
-        GetClientRect(wnd->hwndSelf, &r);
-        hrgn = CreateRectRgnIndirect(&r);
-        SelectClipRgn( hdc, hrgn);
-        DeleteObject( hrgn );
-    }
-
     if (descr->font) oldFont = SelectObject( hdc, descr->font );
     hbrush = SendMessageA( descr->owner, WM_CTLCOLORLISTBOX,
                              hdc, (LPARAM)wnd->hwndSelf );
-- 
GitLab