]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/msw/private.h
add support for custom controls in file dialog in wxGTK and generic versions; also...
[wxWidgets.git] / include / wx / msw / private.h
index f31355f2cbc7f5356053d5c0884fde0e8435aeb5..4bed1f04b88e43d6cbf03126a16e47de99bc3523 100644 (file)
@@ -597,7 +597,7 @@ private:
         HDCMapModeChanger wxMAKE_UNIQUE_NAME(wxHDCMapModeChanger)(hdc, mm)
 #endif // __WXWINCE__/!__WXWINCE__
 
         HDCMapModeChanger wxMAKE_UNIQUE_NAME(wxHDCMapModeChanger)(hdc, mm)
 #endif // __WXWINCE__/!__WXWINCE__
 
-// smart buffeer using GlobalAlloc/GlobalFree()
+// smart pointer using GlobalAlloc/GlobalFree()
 class GlobalPtr
 {
 public:
 class GlobalPtr
 {
 public:
@@ -630,16 +630,36 @@ private:
 class GlobalPtrLock
 {
 public:
 class GlobalPtrLock
 {
 public:
-    GlobalPtrLock(HGLOBAL hGlobal) : m_hGlobal(hGlobal)
+    // default ctor, use Init() later -- should only be used if the HGLOBAL can
+    // be NULL (in which case Init() shouldn't be called)
+    GlobalPtrLock()
     {
     {
+        m_hGlobal = NULL;
+        m_ptr = NULL;
+    }
+
+    // initialize the object, may be only called if we were created using the
+    // default ctor; HGLOBAL must not be NULL
+    void Init(HGLOBAL hGlobal)
+    {
+        m_hGlobal = hGlobal;
+
+        // NB: GlobalLock() is a macro, not a function, hence don't use the
+        //     global scope operator with it (and neither with GlobalUnlock())
         m_ptr = GlobalLock(hGlobal);
         if ( !m_ptr )
             wxLogLastError(_T("GlobalLock"));
     }
 
         m_ptr = GlobalLock(hGlobal);
         if ( !m_ptr )
             wxLogLastError(_T("GlobalLock"));
     }
 
+    // initialize the object, HGLOBAL must not be NULL
+    GlobalPtrLock(HGLOBAL hGlobal)
+    {
+        Init(hGlobal);
+    }
+
     ~GlobalPtrLock()
     {
     ~GlobalPtrLock()
     {
-        if ( !GlobalUnlock(m_hGlobal) )
+        if ( m_hGlobal && !GlobalUnlock(m_hGlobal) )
         {
 #ifdef __WXDEBUG__
             // this might happen simply because the block became unlocked
         {
 #ifdef __WXDEBUG__
             // this might happen simply because the block became unlocked
@@ -652,6 +672,7 @@ public:
         }
     }
 
         }
     }
 
+    void *Get() const { return m_ptr; }
     operator void *() const { return m_ptr; }
 
 private:
     operator void *() const { return m_ptr; }
 
 private:
@@ -883,9 +904,15 @@ inline bool wxStyleHasBorder(long style)
 // functions mapping HWND to wxWindow
 // ----------------------------------------------------------------------------
 
 // functions mapping HWND to wxWindow
 // ----------------------------------------------------------------------------
 
-// this function simply checks whether the given hWnd corresponds to a wxWindow
+// this function simply checks whether the given hwnd corresponds to a wxWindow
 // and returns either that window if it does or NULL otherwise
 // and returns either that window if it does or NULL otherwise
-extern WXDLLEXPORT wxWindow* wxFindWinFromHandle(WXHWND hWnd);
+extern WXDLLEXPORT wxWindow* wxFindWinFromHandle(HWND hwnd);
+
+// without STRICT WXHWND is the same as HWND anyhow
+inline wxWindow* wxFindWinFromHandle(WXHWND hWnd)
+{
+    return wxFindWinFromHandle(wx_static_cast(HWND, hWnd));
+}
 
 // find the window for HWND which is part of some wxWindow, i.e. unlike
 // wxFindWinFromHandle() above it will also work for "sub controls" of a
 
 // find the window for HWND which is part of some wxWindow, i.e. unlike
 // wxFindWinFromHandle() above it will also work for "sub controls" of a