]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/scrolbar.cpp
wxUniv compilation fixes
[wxWidgets.git] / src / msw / scrolbar.cpp
index 7c32db671ed6f320ae12326566ce1a907b362ff0..c4fbe72399dcb96597c002d4d5fc3bcef29f6c7c 100644 (file)
@@ -5,8 +5,8 @@
 // Modified by:
 // Created:     04/01/98
 // RCS-ID:      $Id$
-// Copyright:   (c) Julian Smart and Markus Holzem
-// Licence:     wxWindows license
+// Copyright:   (c) Julian Smart
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 #ifdef __GNUG__
@@ -53,6 +53,9 @@ bool wxScrollBar::Create(wxWindow *parent, wxWindowID id,
     SetValidator(validator);
 #endif // wxUSE_VALIDATORS
 
+    if ((style & wxBORDER_MASK) == wxBORDER_DEFAULT)
+        style |= wxNO_BORDER;
+
     SetBackgroundColour(parent->GetBackgroundColour()) ;
     SetForegroundColour(parent->GetForegroundColour()) ;
     m_windowStyle = style;
@@ -82,15 +85,13 @@ bool wxScrollBar::Create(wxWindow *parent, wxWindowID id,
         height = 14;
     }
 
-    DWORD wstyle = WS_VISIBLE | WS_CHILD;
-
-    if ( m_windowStyle & wxCLIP_SIBLINGS )
-      wstyle |= WS_CLIPSIBLINGS;
+    WXDWORD exStyle = 0;
+    WXDWORD wstyle = MSWGetStyle(style, & exStyle) ;
 
     // Now create scrollbar
     DWORD _direction = (style & wxHORIZONTAL) ?
                         SBS_HORZ: SBS_VERT;
-    HWND scroll_bar = CreateWindowEx(MakeExtendedStyle(style), wxT("SCROLLBAR"), wxT("scrollbar"),
+    HWND scroll_bar = CreateWindowEx(exStyle, wxT("SCROLLBAR"), wxT("scrollbar"),
                          _direction | wstyle,
                          0, 0, 0, 0, (HWND) parent->GetHWND(), (HMENU)m_windowId,
                          wxGetInstance(), NULL);
@@ -120,11 +121,44 @@ wxScrollBar::~wxScrollBar(void)
 }
 
 bool wxScrollBar::MSWOnScroll(int WXUNUSED(orientation), WXWORD wParam,
-                              WXWORD pos, WXHWND control)
+                              WXWORD pos, WXHWND WXUNUSED(control))
 {
-    int position = ::GetScrollPos((HWND) control, SB_CTL);
-    int minPos, maxPos;
-    ::GetScrollRange((HWND) control, SB_CTL, &minPos, &maxPos);
+    // current and max positions
+    int position,
+        maxPos, trackPos = pos;
+
+    // when we're dragging the scrollbar we can't use pos parameter because it
+    // is limited to 16 bits
+    // JACS: now always using GetScrollInfo, since there's no reason
+    // not to
+//    if ( wParam == SB_THUMBPOSITION || wParam == SB_THUMBTRACK )
+    {
+        SCROLLINFO scrollInfo;
+        wxZeroMemory(scrollInfo);
+        scrollInfo.cbSize = sizeof(SCROLLINFO);
+
+        // also get the range if we call GetScrollInfo() anyhow -- this is less
+        // expensive than call it once here and then call GetScrollRange()
+        // below
+        scrollInfo.fMask = SIF_RANGE | SIF_POS | SIF_TRACKPOS;
+
+        if ( !::GetScrollInfo(GetHwnd(), SB_CTL, &scrollInfo) )
+        {
+            wxLogLastError(_T("GetScrollInfo"));
+        }
+
+        trackPos = scrollInfo.nTrackPos;
+        position = scrollInfo.nPos;
+        maxPos = scrollInfo.nMax;
+    }
+#if 0
+    else
+    {
+        position = ::GetScrollPos((HWND) control, SB_CTL);
+        int minPos;
+        ::GetScrollRange((HWND) control, SB_CTL, &minPos, &maxPos);
+    }
+#endif
 
 #if defined(__WIN95__)
     // A page size greater than one has the effect of reducing the effective
@@ -170,12 +204,12 @@ bool wxScrollBar::MSWOnScroll(int WXUNUSED(orientation), WXWORD wParam,
             break;
 
         case SB_THUMBPOSITION:
-            nScrollInc = pos - position;
+            nScrollInc = trackPos - position;
             scrollEvent = wxEVT_SCROLL_THUMBRELEASE;
             break;
 
         case SB_THUMBTRACK:
-            nScrollInc = pos - position;
+            nScrollInc = trackPos - position;
             scrollEvent = wxEVT_SCROLL_THUMBTRACK;
             break;
 
@@ -208,6 +242,7 @@ bool wxScrollBar::MSWOnScroll(int WXUNUSED(orientation), WXWORD wParam,
     }
 
     wxScrollEvent event(scrollEvent, m_windowId);
+    event.SetOrientation(IsVertical() ? wxVERTICAL : wxHORIZONTAL);
     event.SetPosition(position);
     event.SetEventObject( this );
 
@@ -217,22 +252,32 @@ bool wxScrollBar::MSWOnScroll(int WXUNUSED(orientation), WXWORD wParam,
 void wxScrollBar::SetThumbPosition(int viewStart)
 {
 #if defined(__WIN95__)
-  SCROLLINFO info;
-  info.cbSize = sizeof(SCROLLINFO);
-  info.nPage = 0;
-  info.nMin = 0;
-  info.nPos = viewStart;
-  info.fMask = SIF_POS ;
-
-  ::SetScrollInfo((HWND) GetHWND(), SB_CTL, &info, TRUE);
+    SCROLLINFO info;
+    info.cbSize = sizeof(SCROLLINFO);
+    info.nPage = 0;
+    info.nMin = 0;
+    info.nPos = viewStart;
+    info.fMask = SIF_POS ;
+
+    ::SetScrollInfo((HWND) GetHWND(), SB_CTL, &info, TRUE);
 #else
-  ::SetScrollPos((HWND) GetHWND(), SB_CTL, viewStart, TRUE);
+    ::SetScrollPos((HWND) GetHWND(), SB_CTL, viewStart, TRUE);
 #endif
 }
 
 int wxScrollBar::GetThumbPosition(void) const
 {
-    return ::GetScrollPos((HWND)m_hWnd, SB_CTL);
+    SCROLLINFO scrollInfo;
+    wxZeroMemory(scrollInfo);
+    scrollInfo.cbSize = sizeof(SCROLLINFO);
+    scrollInfo.fMask = SIF_POS;
+    
+    if ( !::GetScrollInfo(GetHwnd(), SB_CTL, &scrollInfo) )
+    {
+        wxLogLastError(_T("GetScrollInfo"));
+    }
+    return scrollInfo.nPos;
+//    return ::GetScrollPos((HWND)m_hWnd, SB_CTL);
 }
 
 void wxScrollBar::SetScrollbar(int position, int thumbSize, int range, int pageSize,