WM_SETREDRAW should repaint the listbox when set to on if something
has been changed.

diff --git a/controls/listbox.c b/controls/listbox.c
index 24f6ea8..1150ede 100644
--- a/controls/listbox.c
+++ b/controls/listbox.c
@@ -41,6 +41,9 @@
 /* Listbox system timer id */
 #define LB_TIMER_ID  2
 
+/* flag listbox changed while setredraw false - internal style */
+#define LBS_DISPLAYCHANGED 0x80000000 
+
 /* Item structure */
 typedef struct
 {
@@ -569,6 +572,16 @@
     {
         if (!(descr->style & LBS_NOREDRAW)) return;
         descr->style &= ~LBS_NOREDRAW;
+        if (descr->style & LBS_DISPLAYCHANGED)
+        {     /* page was changed while setredraw false, refresh automatically */
+            InvalidateRect(wnd->hwndSelf, NULL, TRUE);
+            if ((descr->top_item + descr->page_size) > descr->nb_items)
+            {      /* reset top of page if less than number of items/page */ 
+                descr->top_item = descr->nb_items - descr->page_size;
+                if (descr->top_item < 0) descr->top_item = 0;
+            }
+            descr->style &= ~LBS_DISPLAYCHANGED;
+        }
         LISTBOX_UpdateScroll( wnd, descr );
     }
     else descr->style |= LBS_NOREDRAW;
@@ -589,8 +602,12 @@
     HBRUSH hbrush, oldBrush = 0;
 
     /* Do not repaint the item if the item is not visible */
-    if ((descr->style & LBS_NOREDRAW) || !IsWindowVisible(wnd->hwndSelf)) return;
-
+    if (!IsWindowVisible(wnd->hwndSelf)) return;
+    if (descr->style & LBS_NOREDRAW)
+       {
+       descr->style |= LBS_DISPLAYCHANGED;
+       return;
+       }
     if (LISTBOX_GetItemRect( wnd, descr, index, &rect ) != 1) return;
     if (!(hdc = GetDCEx( wnd->hwndSelf, 0, DCX_CACHE ))) return;
     if (descr->font) oldFont = SelectObject( hdc, descr->font );
@@ -1017,6 +1034,11 @@
 
     if (LISTBOX_GetItemRect( wnd, descr, index, &rect ) == 1)
     {
+        if (descr->style & LBS_NOREDRAW)
+        {
+            descr->style |= LBS_DISPLAYCHANGED;
+            return;
+        }
         rect.bottom = descr->height;
         InvalidateRect( wnd->hwndSelf, &rect, TRUE );
         if (descr->style & LBS_MULTICOLUMN)
@@ -2765,7 +2787,7 @@
     case WM_SYSTIMER:
         return LISTBOX_HandleSystemTimer( wnd, descr );
     case WM_ERASEBKGND:
-        if (IS_OWNERDRAW(descr))
+        if ((IS_OWNERDRAW(descr)) && !(descr->style & LBS_DISPLAYCHANGED))
         {
             RECT rect;
             HBRUSH hbrush = SendMessageA( descr->owner, WM_CTLCOLORLISTBOX,