+#ifdef WIN32
+
+#include <commctrl.h>
+
+/*
+** On win32, clicking on the slider channel causes the thumb to jump up or down a page size
+** like a scrollbar. This is not particularily useful for a movie track, where we'd rather
+** see the thumb to jump where the mouse is.
+** Therefore, we replace the slider (TRACKBAR control) window proc with our, which intercept
+** the mouse down event, and move the thumb accordingly
+*/
+static LRESULT CALLBACK MovieSliderWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ switch( uMsg )
+ {
+ case WM_LBUTTONDOWN:
+ {
+ POINT click = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };
+ RECT tRect = {0, 0, 0, 0};
+ SendMessage(hWnd, TBM_GETTHUMBRECT, 0, (LPARAM)&tRect);
+
+ /* check whether click is not in thumb */
+ if( ! PtInRect(&tRect, click) )
+ {
+ LONG min = SendMessage(hWnd, TBM_GETRANGEMIN, 0, 0);
+ LONG max = SendMessage(hWnd, TBM_GETRANGEMAX, 0, 0);
+ LONG thumb = tRect.right-tRect.left;
+ LONG newpos;
+
+ SendMessage(hWnd, TBM_GETCHANNELRECT, 0, (LPARAM)&tRect);
+
+ /* following is only valid for horizontal a trackbar */
+ newpos = ((click.x-tRect.left-(thumb/2))*(max-min)+((tRect.right-tRect.left-thumb)/2))
+ /(tRect.right-tRect.left-thumb);
+
+ /* set new postion */
+ SendMessage(hWnd, TBM_SETPOS, TRUE, min+newpos);
+ /* notify parent of change */
+ SendMessage(GetParent(hWnd), WM_HSCROLL, TB_ENDTRACK, (LPARAM)hWnd);
+
+ return 0;
+ }
+ }
+
+ default:
+ return CallWindowProc((WNDPROC)GetWindowLongPtr(hWnd, GWLP_USERDATA),
+ hWnd, uMsg, wParam, lParam);
+ }
+}
+
+#endif
+