]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/gauge.cpp
Ensure there is valid context for DrawRectangle
[wxWidgets.git] / src / msw / gauge.cpp
index 1045bffc6159173e493d9186b9d825fe9b06dbbc..58dc16dcb76c388cd8a0d0b65f75cd57c5d1b4df 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
-// Name:        src/msw/gauge95.cpp
+// Name:        src/msw/gauge.cpp
 // Purpose:     wxGauge class
 // Author:      Julian Smart
 // Modified by:
 // Purpose:     wxGauge class
 // Author:      Julian Smart
 // Modified by:
 // wxWin macros
 // ----------------------------------------------------------------------------
 
 // wxWin macros
 // ----------------------------------------------------------------------------
 
-#if wxUSE_EXTENDED_RTTI
-WX_DEFINE_FLAGS( wxGaugeStyle )
-
-wxBEGIN_FLAGS( wxGaugeStyle )
-    // new style border flags, we put them first to
-    // use them for streaming out
-    wxFLAGS_MEMBER(wxBORDER_SIMPLE)
-    wxFLAGS_MEMBER(wxBORDER_SUNKEN)
-    wxFLAGS_MEMBER(wxBORDER_DOUBLE)
-    wxFLAGS_MEMBER(wxBORDER_RAISED)
-    wxFLAGS_MEMBER(wxBORDER_STATIC)
-    wxFLAGS_MEMBER(wxBORDER_NONE)
-
-    // old style border flags
-    wxFLAGS_MEMBER(wxSIMPLE_BORDER)
-    wxFLAGS_MEMBER(wxSUNKEN_BORDER)
-    wxFLAGS_MEMBER(wxDOUBLE_BORDER)
-    wxFLAGS_MEMBER(wxRAISED_BORDER)
-    wxFLAGS_MEMBER(wxSTATIC_BORDER)
-    wxFLAGS_MEMBER(wxBORDER)
-
-    // standard window styles
-    wxFLAGS_MEMBER(wxTAB_TRAVERSAL)
-    wxFLAGS_MEMBER(wxCLIP_CHILDREN)
-    wxFLAGS_MEMBER(wxTRANSPARENT_WINDOW)
-    wxFLAGS_MEMBER(wxWANTS_CHARS)
-    wxFLAGS_MEMBER(wxFULL_REPAINT_ON_RESIZE)
-    wxFLAGS_MEMBER(wxALWAYS_SHOW_SB )
-    wxFLAGS_MEMBER(wxVSCROLL)
-    wxFLAGS_MEMBER(wxHSCROLL)
-
-    wxFLAGS_MEMBER(wxGA_HORIZONTAL)
-    wxFLAGS_MEMBER(wxGA_VERTICAL)
-#if WXWIN_COMPATIBILITY_2_6
-    wxFLAGS_MEMBER(wxGA_PROGRESSBAR)
-#endif // WXWIN_COMPATIBILITY_2_6
-    wxFLAGS_MEMBER(wxGA_SMOOTH)
-
-wxEND_FLAGS( wxGaugeStyle )
-
-IMPLEMENT_DYNAMIC_CLASS_XTI(wxGauge, wxControl,"wx/gauge.h")
-
-wxBEGIN_PROPERTIES_TABLE(wxGauge)
-    wxPROPERTY( Value , int , SetValue, GetValue, 0 , 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
-    wxPROPERTY( Range , int , SetRange, GetRange, 0 , 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
-    wxPROPERTY( ShadowWidth , int , SetShadowWidth, GetShadowWidth, 0 , 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
-    wxPROPERTY( BezelFace , int , SetBezelFace, GetBezelFace, 0 , 0 /*flags*/ , wxT("Helpstring") , wxT("group"))
-    wxPROPERTY_FLAGS( WindowStyle , wxGaugeStyle , long , SetWindowStyleFlag , GetWindowStyleFlag , EMPTY_MACROVALUE , 0 /*flags*/ , wxT("Helpstring") , wxT("group")) // style
-wxEND_PROPERTIES_TABLE()
-
-wxBEGIN_HANDLERS_TABLE(wxGauge)
-wxEND_HANDLERS_TABLE()
-
-wxCONSTRUCTOR_6( wxGauge , wxWindow* , Parent , wxWindowID , Id , int , Range , wxPoint , Position , wxSize , Size , long , WindowStyle )
-#else
-IMPLEMENT_DYNAMIC_CLASS(wxGauge, wxControl)
-#endif
-
 // ============================================================================
 // wxGauge implementation
 // ============================================================================
 // ============================================================================
 // wxGauge implementation
 // ============================================================================
@@ -177,12 +119,14 @@ WXDWORD wxGauge::MSWGetStyle(long style, WXDWORD *exstyle) const
 
 wxSize wxGauge::DoGetBestSize() const
 {
 
 wxSize wxGauge::DoGetBestSize() const
 {
-    // VZ: no idea where does 28 come from, it was there before my changes and
-    //     as nobody ever complained I guess we can leave it...
+    // Windows HIG (http://msdn.microsoft.com/en-us/library/aa511279.aspx)
+    // suggest progress bar size of "107 or 237 x 8 dialog units". Let's use
+    // the smaller one.
+
     if (HasFlag(wxGA_VERTICAL))
     if (HasFlag(wxGA_VERTICAL))
-        return wxSize(28, 100);
+        return ConvertDialogToPixels(wxSize(8, 107));
     else
     else
-        return wxSize(100, 28);
+        return ConvertDialogToPixels(wxSize(107, 8));
 }
 
 // ----------------------------------------------------------------------------
 }
 
 // ----------------------------------------------------------------------------
@@ -191,8 +135,9 @@ wxSize wxGauge::DoGetBestSize() const
 
 void wxGauge::SetRange(int r)
 {
 
 void wxGauge::SetRange(int r)
 {
-    // switch to determinate mode if required
-    SetDeterminateMode();
+    // Changing range implicitly means we're using determinate mode.
+    if ( IsInIndeterminateMode() )
+        SetDeterminateMode();
 
     m_rangeMax = r;
 
 
     m_rangeMax = r;
 
@@ -206,16 +151,16 @@ void wxGauge::SetRange(int r)
 
 void wxGauge::SetValue(int pos)
 {
 
 void wxGauge::SetValue(int pos)
 {
-    // Setting the (same) position produces flicker on Vista,
-    // especially noticable if ownerdrawn
-    if (GetValue() == pos) return;
-
-    // switch to determinate mode if required
-    SetDeterminateMode();
+    // Setting the value implicitly means that we're using determinate mode.
+    if ( IsInIndeterminateMode() )
+        SetDeterminateMode();
 
 
-    m_gaugePos = pos;
+    if ( GetValue() != pos )
+    {
+        m_gaugePos = pos;
 
 
-    ::SendMessage(GetHwnd(), PBM_SETPOS, pos, 0);
+        ::SendMessage(GetHwnd(), PBM_SETPOS, pos, 0);
+    }
 }
 
 bool wxGauge::SetForegroundColour(const wxColour& col)
 }
 
 bool wxGauge::SetForegroundColour(const wxColour& col)
@@ -238,24 +183,30 @@ bool wxGauge::SetBackgroundColour(const wxColour& col)
     return true;
 }
 
     return true;
 }
 
-void wxGauge::SetIndeterminateMode()
+bool wxGauge::IsInIndeterminateMode() const
 {
 {
-    // add the PBS_MARQUEE style to the progress bar
-    LONG style = ::GetWindowLong(GetHwnd(), GWL_STYLE);
-    if ((style & PBS_MARQUEE) == 0)
-        ::SetWindowLong(GetHwnd(), GWL_STYLE, style|PBS_MARQUEE);
+    return (::GetWindowLong(GetHwnd(), GWL_STYLE) & PBS_MARQUEE) != 0;
+}
 
 
-    // now the control can only run in indeterminate mode
+void wxGauge::SetIndeterminateMode()
+{
+    // Switch the control into indeterminate mode if necessary.
+    if ( !IsInIndeterminateMode() )
+    {
+        const long style = ::GetWindowLong(GetHwnd(), GWL_STYLE);
+        ::SetWindowLong(GetHwnd(), GWL_STYLE, style | PBS_MARQUEE);
+        ::SendMessage(GetHwnd(), PBM_SETMARQUEE, TRUE, 0);
+    }
 }
 
 void wxGauge::SetDeterminateMode()
 {
 }
 
 void wxGauge::SetDeterminateMode()
 {
-    // remove the PBS_MARQUEE style to the progress bar
-    LONG style = ::GetWindowLong(GetHwnd(), GWL_STYLE);
-    if ((style & PBS_MARQUEE) != 0)
+    if ( IsInIndeterminateMode() )
+    {
+        const long style = ::GetWindowLong(GetHwnd(), GWL_STYLE);
+        ::SendMessage(GetHwnd(), PBM_SETMARQUEE, FALSE, 0);
         ::SetWindowLong(GetHwnd(), GWL_STYLE, style & ~PBS_MARQUEE);
         ::SetWindowLong(GetHwnd(), GWL_STYLE, style & ~PBS_MARQUEE);
-
-    // now the control can only run in determinate mode
+    }
 }
 
 void wxGauge::Pulse()
 }
 
 void wxGauge::Pulse()
@@ -265,10 +216,7 @@ void wxGauge::Pulse()
         // switch to indeterminate mode if required
         SetIndeterminateMode();
 
         // switch to indeterminate mode if required
         SetIndeterminateMode();
 
-        // NOTE: when in indeterminate mode, the PBM_SETPOS message will just make
-        //       the bar's blocks move a bit and the WPARAM value is just ignored
-        //       so that we can safely use zero
-        SendMessage(GetHwnd(), (UINT) PBM_SETPOS, (WPARAM)0, (LPARAM)0);
+        SendMessage(GetHwnd(), PBM_STEPIT, 0, 0);
     }
     else
     {
     }
     else
     {