]> git.saurik.com Git - wxWidgets.git/commitdiff
1. more (minor) wxCaret bug fixes
authorVadim Zeitlin <vadim@wxwidgets.org>
Thu, 3 Jun 1999 23:17:01 +0000 (23:17 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Thu, 3 Jun 1999 23:17:01 +0000 (23:17 +0000)
2. try to enforce wxPaintDC usage only inside EVT_PAINT handler (only in
   debug mode)
3. warnings removed from pnghand.cpp and dibuitls.cpp

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@2664 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/msw/caret.cpp
src/msw/dcclient.cpp
src/msw/dibutils.cpp
src/msw/pnghand.cpp
src/msw/window.cpp

index a6fbf355255bbc2067cd26b6e63ce820512cdffe..9d72d6bae02276c622bb0e1e98caf6062327408e 100644 (file)
@@ -140,11 +140,12 @@ void wxCaret::DoShow()
 
 void wxCaret::DoHide()
 {
 
 void wxCaret::DoHide()
 {
-    wxASSERT_MSG( m_hasCaret, "cannot hide non existent caret" );
-
-    if ( !::HideCaret(GetWinHwnd(GetWindow())) )
+    if ( m_hasCaret )
     {
     {
-        wxLogLastError("HideCaret");
+        if ( !::HideCaret(GetWinHwnd(GetWindow())) )
+        {
+            wxLogLastError("HideCaret");
+        }
     }
 }
 
     }
 }
 
index 50fd1ad86e647a5dc506b00ed0cd587bc717b2f4..81dac38ce83201f5afc1bd8feaf399bc9a4c55a1 100644 (file)
@@ -6,39 +6,66 @@
 // Created:     01/02/97
 // RCS-ID:      $Id$
 // Copyright:   (c) Julian Smart and Markus Holzem
 // Created:     01/02/97
 // RCS-ID:      $Id$
 // Copyright:   (c) Julian Smart and Markus Holzem
-// Licence:    wxWindows licence
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 /////////////////////////////////////////////////////////////////////////////
 
+// ===========================================================================
+// declarations
+// ===========================================================================
+
+// ----------------------------------------------------------------------------
+// headers
+// ----------------------------------------------------------------------------
+
 #ifdef __GNUG__
 #ifdef __GNUG__
-#pragma implementation "dcclient.h"
+    #pragma implementation "dcclient.h"
 #endif
 
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
 #endif
 
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 #ifdef __BORLANDC__
-#pragma hdrstop
-#endif
-
-#ifndef WX_PRECOMP
+    #pragma hdrstop
 #endif
 
 #include "wx/dcclient.h"
 #include "wx/log.h"
 
 #endif
 
 #include "wx/dcclient.h"
 #include "wx/log.h"
 
-#include <windows.h>
+#include "wx/msw/private.h"
+
+// ----------------------------------------------------------------------------
+// macros
+// ----------------------------------------------------------------------------
 
 #if !USE_SHARED_LIBRARY
 
 #if !USE_SHARED_LIBRARY
-IMPLEMENT_DYNAMIC_CLASS(wxWindowDC, wxDC)
-IMPLEMENT_DYNAMIC_CLASS(wxClientDC, wxWindowDC)
-IMPLEMENT_DYNAMIC_CLASS(wxPaintDC, wxWindowDC)
+    IMPLEMENT_DYNAMIC_CLASS(wxWindowDC, wxDC)
+    IMPLEMENT_DYNAMIC_CLASS(wxClientDC, wxWindowDC)
+    IMPLEMENT_DYNAMIC_CLASS(wxPaintDC, wxWindowDC)
 #endif
 
 #endif
 
-/*
- * wxWindowDC
- */
+// ----------------------------------------------------------------------------
+// global variables
+// ----------------------------------------------------------------------------
+
+static PAINTSTRUCT g_paintStruct;
+
+#ifdef __WXDEBUG__
+    // a global variable which we check to verify that wxPaintDC are only
+    // created in resopnse to WM_PAINT message - doing this from elsewhere is a
+    // common programming error among wxWindows programmers and might lead to
+    // very subtle and difficult to debug refresh/repaint bugs.
+    extern bool g_isPainting = FALSE;
+#endif // __WXDEBUG__
+
+// ===========================================================================
+// implementation
+// ===========================================================================
 
 
-wxWindowDC::wxWindowDC(void)
+// ----------------------------------------------------------------------------
+// wxWindowDC
+// ----------------------------------------------------------------------------
+
+wxWindowDC::wxWindowDC()
 {
   m_canvas = NULL;
 }
 {
   m_canvas = NULL;
 }
@@ -46,30 +73,30 @@ wxWindowDC::wxWindowDC(void)
 wxWindowDC::wxWindowDC(wxWindow *the_canvas)
 {
   m_canvas = the_canvas;
 wxWindowDC::wxWindowDC(wxWindow *the_canvas)
 {
   m_canvas = the_canvas;
-//  m_hDC = (WXHDC) ::GetDCEx((HWND) the_canvas->GetHWND(), NULL, DCX_WINDOW);
-  m_hDC = (WXHDC) ::GetWindowDC((HWND) the_canvas->GetHWND() );
-  m_hDCCount ++;
+  m_hDC = (WXHDC) ::GetWindowDC(GetWinHwnd(the_canvas) );
+  m_hDCCount++;
 
   SetBackground(wxBrush(m_canvas->GetBackgroundColour(), wxSOLID));
 }
 
 
   SetBackground(wxBrush(m_canvas->GetBackgroundColour(), wxSOLID));
 }
 
-wxWindowDC::~wxWindowDC(void)
+wxWindowDC::~wxWindowDC()
 {
   if (m_canvas && m_hDC)
   {
     SelectOldObjects(m_hDC);
 
 {
   if (m_canvas && m_hDC)
   {
     SelectOldObjects(m_hDC);
 
-    ::ReleaseDC((HWND) m_canvas->GetHWND(), (HDC) m_hDC);
-       m_hDC = 0;
+    ::ReleaseDC(GetWinHwnd(m_canvas), GetHdc());
+    m_hDC = 0;
   }
   }
-  m_hDCCount --;
+
+  m_hDCCount--;
 }
 
 }
 
-/*
- * wxClientDC
- */
+// ----------------------------------------------------------------------------
+// wxClientDC
+// ----------------------------------------------------------------------------
 
 
-wxClientDC::wxClientDC(void)
+wxClientDC::wxClientDC()
 {
   m_canvas = NULL;
 }
 {
   m_canvas = NULL;
 }
@@ -77,47 +104,49 @@ wxClientDC::wxClientDC(void)
 wxClientDC::wxClientDC(wxWindow *the_canvas)
 {
   m_canvas = the_canvas;
 wxClientDC::wxClientDC(wxWindow *the_canvas)
 {
   m_canvas = the_canvas;
-//  BeginDrawing();
-  m_hDC = (WXHDC) ::GetDC((HWND) the_canvas->GetHWND());
+  m_hDC = (WXHDC) ::GetDC(GetWinHwnd(the_canvas));
 
   SetBackground(wxBrush(m_canvas->GetBackgroundColour(), wxSOLID));
 }
 
 
   SetBackground(wxBrush(m_canvas->GetBackgroundColour(), wxSOLID));
 }
 
-wxClientDC::~wxClientDC(void)
+wxClientDC::~wxClientDC()
 {
 {
-//  EndDrawing();
-
-  if (m_canvas && (HDC) m_hDC)
+  if ( m_canvas && GetHdc() )
   {
     SelectOldObjects(m_hDC);
 
   {
     SelectOldObjects(m_hDC);
 
-    ::ReleaseDC((HWND) m_canvas->GetHWND(), (HDC) m_hDC);
-       m_hDC = 0;
+    ::ReleaseDC(GetWinHwnd(m_canvas), GetHdc());
+    m_hDC = 0;
   }
 }
 
   }
 }
 
-/*
- * wxPaintDC
- */
+// ----------------------------------------------------------------------------
+// wxPaintDC
+// ----------------------------------------------------------------------------
 
 
-wxPaintDC::wxPaintDC(void)
-{
-  m_canvas = NULL;
-}
-
-static PAINTSTRUCT g_paintStruct;
-
-// Don't call Begin/EndPaint if it's already been called:
-// for example, if calling a base class OnPaint.
+// TODO (VZ) I have still some doubts about this hack and I still think that we
+//           should store pairs of (hwnd, hdc) and not just the DC - what if
+//           BeginPaint() was called on other window? It seems to work like
+//           this, but to be sure about it we'd need to store hwnd too...
 
 WXHDC  wxPaintDC::ms_PaintHDC = 0;
 size_t wxPaintDC::ms_PaintCount = 0; // count of ms_PaintHDC usage
 
 
 WXHDC  wxPaintDC::ms_PaintHDC = 0;
 size_t wxPaintDC::ms_PaintCount = 0; // count of ms_PaintHDC usage
 
+wxPaintDC::wxPaintDC()
+{
+  m_canvas = NULL;
+}
+
 wxPaintDC::wxPaintDC(wxWindow *canvas)
 {
   wxCHECK_RET( canvas, "NULL canvas in wxPaintDC ctor" );
 wxPaintDC::wxPaintDC(wxWindow *canvas)
 {
   wxCHECK_RET( canvas, "NULL canvas in wxPaintDC ctor" );
+  wxCHECK_RET( g_isPainting,
+               _T("wxPaintDC may be created only in EVT_PAINT handler!") );
 
   m_canvas = canvas;
 
   m_canvas = canvas;
+
+  // Don't call Begin/EndPaint if it's already been called: for example, if
+  // calling a base class OnPaint.
   if ( ms_PaintCount > 0 ) {
     // it means that we've already called BeginPaint and so we must just
     // reuse the same HDC (BeginPaint shouldn't be called more than once)
   if ( ms_PaintCount > 0 ) {
     // it means that we've already called BeginPaint and so we must just
     // reuse the same HDC (BeginPaint shouldn't be called more than once)
@@ -145,7 +174,7 @@ wxPaintDC::~wxPaintDC()
       m_hDC = (WXHDC) NULL;
       ms_PaintHDC = (WXHDC) NULL;
     }
       m_hDC = (WXHDC) NULL;
       ms_PaintHDC = (WXHDC) NULL;
     }
-    else { }//: ms_PaintHDC still in use
+    //else: ms_PaintHDC still in use
   }
 }
 
   }
 }
 
index d1f3e95c77a72d77c8a0373bdd8648392088fcbc..10a61b9249bf8b2e89688567c38447fcbca6bdae 100644 (file)
@@ -243,7 +243,6 @@ PDIB DibOpenFile(LPSTR szFile)
 PDIB DibReadBitmapInfo(HFILE fh)
 {
     DWORD     off;
 PDIB DibReadBitmapInfo(HFILE fh)
 {
     DWORD     off;
-    HANDLE    hbi = NULL;
     int       size;
     int       i;
     int       nNumColors;
     int       size;
     int       i;
     int       nNumColors;
index 01309d2b84dd749beef4e5734b7e078712bd11ba..ec8bbd781d6513f23be19e1462fac555fccdb32a 100644 (file)
@@ -38,7 +38,7 @@
 #include <wx/msw/dibutils.h>
 
 extern "C" {
 #include <wx/msw/dibutils.h>
 
 extern "C" {
-#include "png.h"
+#include "../png/png.h"
 }
 
 extern "C" void png_read_init PNGARG((png_structp png_ptr));
 }
 
 extern "C" void png_read_init PNGARG((png_structp png_ptr));
@@ -130,7 +130,8 @@ wxPNGReader::Create(int width, int height, int depth, int colortype)
   }
   RawImage = 0;
   Palette = 0;
   }
   RawImage = 0;
   Palette = 0;
-  if (lpbi = DibCreate(Depth, Width, Height))  {
+  lpbi = DibCreate(Depth, Width, Height);
+  if (lpbi)  {
     RawImage = (ImagePointerType)DibPtr(lpbi);
     EfeWidth = (long)(((long)Width*Depth + 31) / 32) * 4;
         imageOK = TRUE;
     RawImage = (ImagePointerType)DibPtr(lpbi);
     EfeWidth = (long)(((long)Width*Depth + 31) / 32) * 4;
         imageOK = TRUE;
@@ -291,7 +292,7 @@ bool wxPNGReader::InstantiateBitmap(wxBitmap *bitmap)
 
         if ( Palette )
         {
 
         if ( Palette )
         {
-            HPALETTE oldPal = ::SelectPalette(dc, (HPALETTE) Palette->GetHPALETTE(), FALSE);
+            ::SelectPalette(dc, (HPALETTE) Palette->GetHPALETTE(), FALSE);
         ::RealizePalette(dc);
         }
 
         ::RealizePalette(dc);
         }
 
index a1423f78e7e89103db81c26606cfd11a8571d619..78b7232946753c65711a0d47df87e3f6ba32da6d 100644 (file)
 
 // standard macros missing from some compilers headers
 #ifndef GET_X_LPARAM
 
 // standard macros missing from some compilers headers
 #ifndef GET_X_LPARAM
-        #define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp))
-        #define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp))
+    #define GET_X_LPARAM(lp) ((int)(short)LOWORD(lp))
+    #define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp))
 #endif // GET_X_LPARAM
 
 // ---------------------------------------------------------------------------
 #endif // GET_X_LPARAM
 
 // ---------------------------------------------------------------------------
@@ -117,6 +117,17 @@ wxMenu *wxCurrentPopupMenu = NULL;
 extern wxList WXDLLEXPORT wxPendingDelete;
 extern char wxCanvasClassName[];
 
 extern wxList WXDLLEXPORT wxPendingDelete;
 extern char wxCanvasClassName[];
 
+#ifdef __WXDEBUG__
+    // see comments in dcclient.cpp where g_isPainting is defined
+    extern bool g_isPainting;
+
+    inline static void wxStartPainting() { g_isPainting = TRUE; }
+    inline static void wxEndPainting() { g_isPainting = FALSE; }
+#else // !debug
+    inline static void wxStartPainting() { }
+    inline static void wxEndPainting() { }
+#endif // debug/!debug
+
 // ---------------------------------------------------------------------------
 // private functions
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
 // private functions
 // ---------------------------------------------------------------------------
@@ -1674,7 +1685,9 @@ long wxWindow::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam)
             break;
 
         case WM_PAINT:
             break;
 
         case WM_PAINT:
+            wxStartPainting();
             processed = HandlePaint();
             processed = HandlePaint();
+            wxEndPainting();
             break;
 
         case WM_CLOSE:
             break;
 
         case WM_CLOSE: