]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/msw/subwin.h
fixes for __WINCE_NET__ build (slightly modified patch 1892654)
[wxWidgets.git] / include / wx / msw / subwin.h
index cf149b7382e7f5de1323b218385a6acdd50ba328..06ba1433e59b40f291406820a8f808b09319c1c6 100644 (file)
@@ -32,6 +32,7 @@ public:
 
         m_count = n;
         m_hwnds = (HWND *)calloc(n, sizeof(HWND));
+        m_ids = new wxWindowIDRef[n];
     }
 
     // non-virtual dtor, this class is not supposed to be used polymorphically
@@ -39,10 +40,12 @@ public:
     {
         for ( size_t n = 0; n < m_count; n++ )
         {
-            ::DestroyWindow(m_hwnds[n]);
+            if ( m_hwnds[n] )
+                ::DestroyWindow(m_hwnds[n]);
         }
 
         free(m_hwnds);
+        delete [] m_ids;
     }
 
     // get the number of subwindows
@@ -56,12 +59,21 @@ public:
         return m_hwnds[n];
     }
 
-    HWND& operator[](size_t n) { return Get(n); }
     HWND operator[](size_t n) const
     {
         return wx_const_cast(wxSubwindows *, this)->Get(n);
     }
 
+    // initialize the given window: id will be stored in wxWindowIDRef ensuring
+    // that it is not reused while this object exists
+    void Set(size_t n, HWND hwnd, wxWindowID id)
+    {
+        wxASSERT_MSG( n < m_count, _T("subwindow index out of range") );
+
+        m_hwnds[n] = hwnd;
+        m_ids[n] = id;
+    }
+
     // check if we have this window
     bool HasWindow(HWND hwnd)
     {
@@ -84,7 +96,8 @@ public:
         int sw = show ? SW_SHOW : SW_HIDE;
         for ( size_t n = 0; n < m_count; n++ )
         {
-            ::ShowWindow(m_hwnds[n], sw);
+            if ( m_hwnds[n] )
+                ::ShowWindow(m_hwnds[n], sw);
         }
     }
 
@@ -93,7 +106,8 @@ public:
     {
         for ( size_t n = 0; n < m_count; n++ )
         {
-            ::EnableWindow(m_hwnds[n], enable);
+            if ( m_hwnds[n] )
+                ::EnableWindow(m_hwnds[n], enable);
         }
     }
 
@@ -105,10 +119,13 @@ public:
 
         for ( size_t n = 0; n < m_count; n++ )
         {
-            ::SendMessage(m_hwnds[n], WM_SETFONT, (WPARAM)hfont, 0);
+            if ( m_hwnds[n] )
+            {
+                ::SendMessage(m_hwnds[n], WM_SETFONT, (WPARAM)hfont, 0);
 
-            // otherwise the window might not be redrawn correctly
-            ::InvalidateRect(m_hwnds[n], NULL, FALSE /* don't erase bg */);
+                // otherwise the window might not be redrawn correctly
+                ::InvalidateRect(m_hwnds[n], NULL, FALSE /* don't erase bg */);
+            }
         }
     }
 
@@ -118,10 +135,14 @@ public:
         wxRect r;
         for ( size_t n = 0; n < m_count; n++ )
         {
-            RECT rc;
-            ::GetWindowRect(m_hwnds[n], &rc);
+            if ( m_hwnds[n] )
+            {
+                RECT rc;
+
+                ::GetWindowRect(m_hwnds[n], &rc);
 
-            r.Union(wxRectFromRECT(rc));
+                r.Union(wxRectFromRECT(rc));
+            }
         }
 
         return r;
@@ -140,6 +161,9 @@ private:
     // the HWNDs we contain
     HWND *m_hwnds;
 
+    // the IDs of the windows
+    wxWindowIDRef *m_ids;
+
 
     DECLARE_NO_COPY_CLASS(wxSubwindows)
 };