Implemented Mousewheel support.

diff --git a/controls/combo.c b/controls/combo.c
index f297845..731c9b7 100644
--- a/controls/combo.c
+++ b/controls/combo.c
@@ -1936,6 +1936,14 @@
 		if( lphc->wState & CBF_CAPTURE ) 
 		    COMBO_MouseMove( lphc, wParam, lParam );
 		return  TRUE;
+
+        case WM_MOUSEWHEEL:
+                if (wParam & (MK_SHIFT | MK_CONTROL))
+                    return DefWindowProcA( hwnd, message, wParam, lParam );
+                if ((short) HIWORD(wParam) > 0) return SendMessageA(hwnd,WM_KEYDOWN,VK_UP,0);
+                if ((short) HIWORD(wParam) < 0) return SendMessageA(hwnd,WM_KEYDOWN,VK_DOWN,0);
+                return TRUE;
+
 	/* Combo messages */
 
 	case CB_ADDSTRING16:
diff --git a/controls/edit.c b/controls/edit.c
index 29cf1ee..284b18a 100644
--- a/controls/edit.c
+++ b/controls/edit.c
@@ -870,6 +870,25 @@
 		result = EDIT_WM_VScroll(wnd, es, LOWORD(wParam), SHIWORD(wParam), (HWND)(lParam));
 		break;
 
+        case WM_MOUSEWHEEL:
+                {
+                    short gcWheelDelta = 0;
+                    UINT pulScrollLines = 3;
+                    SystemParametersInfoW(SPI_GETWHEELSCROLLLINES,0, &pulScrollLines, 0);
+
+                    if (wParam & (MK_SHIFT | MK_CONTROL)) {
+                        result = DefWindowProcA(hwnd, msg, wParam, lParam);
+                        break;
+                    }
+                    gcWheelDelta -= (short) HIWORD(wParam);
+                    if (abs(gcWheelDelta) >= WHEEL_DELTA && pulScrollLines)
+                    {
+                        int cLineScroll= (int) min((UINT) es->line_count, pulScrollLines);
+                        cLineScroll *= (gcWheelDelta / WHEEL_DELTA);
+                    result = EDIT_EM_LineScroll(wnd, es, 0, cLineScroll);
+                    }
+                }
+                break;
 	default:
 		result = DefWindowProcA(hwnd, msg, wParam, lParam);
 		break;
diff --git a/controls/listbox.c b/controls/listbox.c
index 6c697bb..fa13ba7 100644
--- a/controls/listbox.c
+++ b/controls/listbox.c
@@ -1767,6 +1767,23 @@
     return 0;
 }
 
+static LRESULT LISTBOX_HandleMouseWheel(WND *wnd, LB_DESCR *descr,WPARAM wParam, LPARAM lParam )
+{
+    short gcWheelDelta = 0;
+    UINT pulScrollLines = 3;
+
+    SystemParametersInfoW(SPI_GETWHEELSCROLLLINES,0, &pulScrollLines, 0);
+
+    gcWheelDelta -= (short) HIWORD(wParam);
+
+    if (abs(gcWheelDelta) >= WHEEL_DELTA && pulScrollLines)
+    {
+        int cLineScroll = (int) min((UINT) descr->page_size, pulScrollLines);
+        cLineScroll *= (gcWheelDelta / WHEEL_DELTA);
+        LISTBOX_SetTopItem( wnd, descr, descr->top_item + cLineScroll, TRUE );
+    }
+    return 0;
+}
 
 /***********************************************************************
  *           LISTBOX_HandleLButtonDown
@@ -2668,6 +2685,10 @@
         return LISTBOX_HandleHScroll( wnd, descr, wParam, lParam );
     case WM_VSCROLL:
         return LISTBOX_HandleVScroll( wnd, descr, wParam, lParam );
+    case WM_MOUSEWHEEL:
+        if (wParam & (MK_SHIFT | MK_CONTROL))
+            return DefWindowProcA( hwnd, msg, wParam, lParam );
+        return LISTBOX_HandleMouseWheel( wnd, descr, wParam, lParam );
     case WM_LBUTTONDOWN:
         return LISTBOX_HandleLButtonDown( wnd, descr, wParam,
                                           (INT16)LOWORD(lParam),