]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/msw/private.h
cleaning up problems after string changes
[wxWidgets.git] / include / wx / msw / private.h
index d76b3ae85a6beff5f81290012e27367cc5078bc6..52c924ae09e89a4d8216211a12f56a9e496343ef 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
 /////////////////////////////////////////////////////////////////////////////
-// Name:        private.h
+// Name:        wx/msw/private.h
 // Purpose:     Private declarations: as this header is only included by
 //              wxWidgets itself, it may contain identifiers which don't start
 //              with "wx".
 // Purpose:     Private declarations: as this header is only included by
 //              wxWidgets itself, it may contain identifiers which don't start
 //              with "wx".
@@ -21,9 +21,6 @@
     #include "wx/msw/microwin.h"
 #endif
 
     #include "wx/msw/microwin.h"
 #endif
 
-// Include fixes for MSLU:
-#include "wx/msw/mslu.h"
-
 #include "wx/log.h"
 
 class WXDLLEXPORT wxFont;
 #include "wx/log.h"
 
 class WXDLLEXPORT wxFont;
@@ -108,22 +105,6 @@ extern WXDLLIMPEXP_DATA_BASE(HINSTANCE) wxhInstance;
 #endif
 #endif
 
 #endif
 #endif
 
-#if wxUSE_PENWIN
-    WXDLLEXPORT void wxRegisterPenWin();
-    WXDLLEXPORT void wxCleanUpPenWin();
-    WXDLLEXPORT void wxEnablePenAppHooks (bool hook);
-#endif // wxUSE_PENWIN
-
-#if wxUSE_ITSY_BITSY
-    #define IBS_HORZCAPTION    0x4000L
-    #define IBS_VERTCAPTION    0x8000L
-
-    UINT    WINAPI ibGetCaptionSize( HWND hWnd  ) ;
-    UINT    WINAPI ibSetCaptionSize( HWND hWnd, UINT nSize ) ;
-    LRESULT WINAPI ibDefWindowProc( HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam ) ;
-    VOID    WINAPI ibAdjustWindowRect( HWND hWnd, LPRECT lprc ) ;
-#endif // wxUSE_ITSY_BITSY
-
 /*
  * Decide what window classes we're going to use
  * for this combination of CTl3D/FAFA settings
 /*
  * Decide what window classes we're going to use
  * for this combination of CTl3D/FAFA settings
@@ -182,6 +163,7 @@ extern LONG APIENTRY _EXPORT
 // Intel, Visual Age.
 #if defined(__WXWINCE__)
     #define wxGetOSFHandle(fd) ((HANDLE)fd)
 // Intel, Visual Age.
 #if defined(__WXWINCE__)
     #define wxGetOSFHandle(fd) ((HANDLE)fd)
+    #define wxOpenOSFHandle(h, flags) ((int)wxPtrToUInt(h))
 #elif defined(__CYGWIN__)
     #define wxGetOSFHandle(fd) ((HANDLE)get_osfhandle(fd))
 #elif defined(__VISUALC__) \
 #elif defined(__CYGWIN__)
     #define wxGetOSFHandle(fd) ((HANDLE)get_osfhandle(fd))
 #elif defined(__VISUALC__) \
@@ -191,12 +173,45 @@ extern LONG APIENTRY _EXPORT
    || defined(__MINGW32__) \
    || (defined(__MWERKS__) && defined(__MSL__))
     #define wxGetOSFHandle(fd) ((HANDLE)_get_osfhandle(fd))
    || defined(__MINGW32__) \
    || (defined(__MWERKS__) && defined(__MSL__))
     #define wxGetOSFHandle(fd) ((HANDLE)_get_osfhandle(fd))
+    #define wxOpenOSFHandle(h, flags) (_open_osfhandle(wxPtrToUInt(h), flags))
+    #define wx_fdopen _fdopen
 #endif
 
 #endif
 
+// close the handle in the class dtor
+class AutoHANDLE
+{
+public:
+    wxEXPLICIT AutoHANDLE(HANDLE handle) : m_handle(handle) { }
+
+    bool IsOk() const { return m_handle != INVALID_HANDLE_VALUE; }
+    operator HANDLE() const { return m_handle; }
+
+    ~AutoHANDLE() { if ( IsOk() ) ::CloseHandle(m_handle); }
+
+protected:
+    HANDLE m_handle;
+};
+
+// a template to make initializing Windows styructs less painful: it zeroes all
+// the struct fields and also sets cbSize member to the correct value (and so
+// can be only used with structures which have this member...)
+template <class T>
+struct WinStruct : public T
+{
+    WinStruct()
+    {
+        ::ZeroMemory(this, sizeof(T));
+
+        // explicit qualification is required here for this to be valid C++
+        this->cbSize = sizeof(T);
+    }
+};
+
+
 #if wxUSE_GUI
 
 #if wxUSE_GUI
 
-#include <wx/gdicmn.h>
-#include <wx/colour.h>
+#include "wx/gdicmn.h"
+#include "wx/colour.h"
 
 // make conversion from wxColour and COLORREF a bit less painful
 inline COLORREF wxColourToRGB(const wxColour& c)
 
 // make conversion from wxColour and COLORREF a bit less painful
 inline COLORREF wxColourToRGB(const wxColour& c)
@@ -320,9 +335,7 @@ inline RECT wxGetWindowRect(HWND hwnd)
     RECT rect;
 
     if ( !::GetWindowRect(hwnd, &rect) )
     RECT rect;
 
     if ( !::GetWindowRect(hwnd, &rect) )
-    {
         wxLogLastError(_T("GetWindowRect"));
         wxLogLastError(_T("GetWindowRect"));
-    }
 
     return rect;
 }
 
     return rect;
 }
@@ -332,9 +345,7 @@ inline RECT wxGetClientRect(HWND hwnd)
     RECT rect;
 
     if ( !::GetClientRect(hwnd, &rect) )
     RECT rect;
 
     if ( !::GetClientRect(hwnd, &rect) )
-    {
         wxLogLastError(_T("GetClientRect"));
         wxLogLastError(_T("GetClientRect"));
-    }
 
     return rect;
 }
 
     return rect;
 }
@@ -343,22 +354,6 @@ inline RECT wxGetClientRect(HWND hwnd)
 // small helper classes
 // ---------------------------------------------------------------------------
 
 // small helper classes
 // ---------------------------------------------------------------------------
 
-// a template to make initializing Windows styructs less painful: it zeroes all
-// the struct fields and also sets cbSize member to the correct value (and so
-// can be only used with structures which have this member...)
-template <class T>
-struct WinStruct : public T
-{
-    WinStruct()
-    {
-        ::ZeroMemory(this, sizeof(T));
-
-        // explicit qualification is required here for this to be valid C++
-        this->cbSize = sizeof(T);
-    }
-};
-
-
 // create an instance of this class and use it as the HDC for screen, will
 // automatically release the DC going out of scope
 class ScreenHDC
 // create an instance of this class and use it as the HDC for screen, will
 // automatically release the DC going out of scope
 class ScreenHDC
@@ -411,29 +406,49 @@ private:
 // dtor
 class SelectInHDC
 {
 // dtor
 class SelectInHDC
 {
+private:
+    void DoInit(HGDIOBJ hgdiobj) { m_hgdiobj = ::SelectObject(m_hdc, hgdiobj); }
+
 public:
 public:
-    SelectInHDC(HDC hdc, HGDIOBJ hgdiobj) : m_hdc(hdc)
-        { m_hgdiobj = ::SelectObject(hdc, hgdiobj); }
+    SelectInHDC() : m_hdc(NULL) { }
+    SelectInHDC(HDC hdc, HGDIOBJ hgdiobj) : m_hdc(hdc) { DoInit(hgdiobj); }
+
+    void Init(HDC hdc, HGDIOBJ hgdiobj)
+    {
+        wxASSERT_MSG( !m_hdc, _T("initializing twice?") );
+
+        m_hdc = hdc;
+
+        DoInit(hgdiobj);
+    }
 
 
-   ~SelectInHDC() { ::SelectObject(m_hdc, m_hgdiobj); }
+    ~SelectInHDC() { if ( m_hdc ) ::SelectObject(m_hdc, m_hgdiobj); }
 
 
-   // return true if the object was successfully selected
-   operator bool() const { return m_hgdiobj != 0; }
+    // return true if the object was successfully selected
+    operator bool() const { return m_hgdiobj != 0; }
 
 private:
 
 private:
-   HDC m_hdc;
-   HGDIOBJ m_hgdiobj;
+    HDC m_hdc;
+    HGDIOBJ m_hgdiobj;
 
 
-   DECLARE_NO_COPY_CLASS(SelectInHDC)
+    DECLARE_NO_COPY_CLASS(SelectInHDC)
 };
 
 // a class which cleans up any GDI object
 class AutoGDIObject
 {
 protected:
 };
 
 // a class which cleans up any GDI object
 class AutoGDIObject
 {
 protected:
+    AutoGDIObject() { m_gdiobj = NULL; }
     AutoGDIObject(HGDIOBJ gdiobj) : m_gdiobj(gdiobj) { }
     ~AutoGDIObject() { if ( m_gdiobj ) ::DeleteObject(m_gdiobj); }
 
     AutoGDIObject(HGDIOBJ gdiobj) : m_gdiobj(gdiobj) { }
     ~AutoGDIObject() { if ( m_gdiobj ) ::DeleteObject(m_gdiobj); }
 
+    void InitGdiobj(HGDIOBJ gdiobj)
+    {
+        wxASSERT_MSG( !m_gdiobj, _T("initializing twice?") );
+
+        m_gdiobj = gdiobj;
+    }
+
     HGDIOBJ GetObject() const { return m_gdiobj; }
 
 private:
     HGDIOBJ GetObject() const { return m_gdiobj; }
 
 private:
@@ -442,7 +457,7 @@ private:
 
 // TODO: all this asks for using a AutoHandler<T, CreateFunc> template...
 
 
 // TODO: all this asks for using a AutoHandler<T, CreateFunc> template...
 
-// a class for temporary pens
+// a class for temporary brushes
 class AutoHBRUSH : private AutoGDIObject
 {
 public:
 class AutoHBRUSH : private AutoGDIObject
 {
 public:
@@ -452,6 +467,22 @@ public:
     operator HBRUSH() const { return (HBRUSH)GetObject(); }
 };
 
     operator HBRUSH() const { return (HBRUSH)GetObject(); }
 };
 
+// a class for temporary fonts
+class AutoHFONT : private AutoGDIObject
+{
+private:
+public:
+    AutoHFONT()
+        : AutoGDIObject() { }
+
+    AutoHFONT(const LOGFONT& lf)
+        : AutoGDIObject(::CreateFontIndirect(&lf)) { }
+
+    void Init(const LOGFONT& lf) { InitGdiobj(::CreateFontIndirect(&lf)); }
+
+    operator HFONT() const { return (HFONT)GetObject(); }
+};
+
 // a class for temporary pens
 class AutoHPEN : private AutoGDIObject
 {
 // a class for temporary pens
 class AutoHPEN : private AutoGDIObject
 {
@@ -520,22 +551,82 @@ private:
     DECLARE_NO_COPY_CLASS(HDCClipper)
 };
 
     DECLARE_NO_COPY_CLASS(HDCClipper)
 };
 
+// set the given map mode for the life time of this object
+//
+// NB: SetMapMode() is not supported by CE so we also define a helper macro
+//     to avoid using it there
+#ifdef __WXWINCE__
+    #define wxCHANGE_HDC_MAP_MODE(hdc, mm)
+#else // !__WXWINCE__
+    class HDCMapModeChanger
+    {
+    public:
+        HDCMapModeChanger(HDC hdc, int mm)
+            : m_hdc(hdc)
+        {
+            m_modeOld = ::SetMapMode(hdc, mm);
+            if ( !m_modeOld )
+                wxLogLastError(_T("SelectClipRgn"));
+        }
+
+        ~HDCMapModeChanger()
+        {
+            if ( m_modeOld )
+                ::SetMapMode(m_hdc, m_modeOld);
+        }
+
+    private:
+        HDC m_hdc;
+        int m_modeOld;
+
+        DECLARE_NO_COPY_CLASS(HDCMapModeChanger)
+    };
+
+    #define wxCHANGE_HDC_MAP_MODE(hdc, mm) \
+        HDCMapModeChanger wxMAKE_UNIQUE_NAME(wxHDCMapModeChanger)(hdc, mm)
+#endif // __WXWINCE__/!__WXWINCE__
+
+// smart buffeer using GlobalAlloc/GlobalFree()
+class GlobalPtr
+{
+public:
+    // allocates a block of given size
+    GlobalPtr(size_t size, unsigned flags = GMEM_MOVEABLE)
+    {
+        m_hGlobal = ::GlobalAlloc(flags, size);
+        if ( !m_hGlobal )
+            wxLogLastError(_T("GlobalAlloc"));
+    }
+
+    ~GlobalPtr()
+    {
+        if ( m_hGlobal && ::GlobalFree(m_hGlobal) )
+            wxLogLastError(_T("GlobalFree"));
+    }
+
+    // implicit conversion
+    operator HGLOBAL() const { return m_hGlobal; }
+
+private:
+    HGLOBAL m_hGlobal;
+
+    DECLARE_NO_COPY_CLASS(GlobalPtr)
+};
+
 // when working with global pointers (which is unfortunately still necessary
 // sometimes, e.g. for clipboard) it is important to unlock them exactly as
 // many times as we lock them which just asks for using a "smart lock" class
 // when working with global pointers (which is unfortunately still necessary
 // sometimes, e.g. for clipboard) it is important to unlock them exactly as
 // many times as we lock them which just asks for using a "smart lock" class
-class GlobalPtr
+class GlobalPtrLock
 {
 public:
 {
 public:
-    GlobalPtr(HGLOBAL hGlobal) : m_hGlobal(hGlobal)
+    GlobalPtrLock(HGLOBAL hGlobal) : m_hGlobal(hGlobal)
     {
         m_ptr = GlobalLock(hGlobal);
         if ( !m_ptr )
     {
         m_ptr = GlobalLock(hGlobal);
         if ( !m_ptr )
-        {
             wxLogLastError(_T("GlobalLock"));
             wxLogLastError(_T("GlobalLock"));
-        }
     }
 
     }
 
-    ~GlobalPtr()
+    ~GlobalPtrLock()
     {
         if ( !GlobalUnlock(m_hGlobal) )
         {
     {
         if ( !GlobalUnlock(m_hGlobal) )
         {
@@ -556,7 +647,7 @@ private:
     HGLOBAL m_hGlobal;
     void *m_ptr;
 
     HGLOBAL m_hGlobal;
     void *m_ptr;
 
-    DECLARE_NO_COPY_CLASS(GlobalPtr)
+    DECLARE_NO_COPY_CLASS(GlobalPtrLock)
 };
 
 // register the class when it is first needed and unregister it in dtor
 };
 
 // register the class when it is first needed and unregister it in dtor
@@ -733,10 +824,11 @@ enum wxWinVersion
     wxWinVersion_2003 = 0x0502,
 
     wxWinVersion_6 = 0x0600,
     wxWinVersion_2003 = 0x0502,
 
     wxWinVersion_6 = 0x0600,
-    wxWinVersion_NT6 = 0x0600
+    wxWinVersion_Vista = wxWinVersion_6,
+    wxWinVersion_NT6 = wxWinVersion_6
 };
 
 };
 
-WXDLLEXPORT wxWinVersion wxGetWinVersion();
+WXDLLIMPEXP_BASE wxWinVersion wxGetWinVersion();
 
 #if wxUSE_GUI
 
 
 #if wxUSE_GUI
 
@@ -776,9 +868,6 @@ inline bool wxStyleHasBorder(long style)
                      wxSUNKEN_BORDER | wxDOUBLE_BORDER)) != 0;
 }
 
                      wxSUNKEN_BORDER | wxDOUBLE_BORDER)) != 0;
 }
 
-// Deferred window moving
-bool wxMoveWindowDeferred(HDWP& hdwp, wxWindowBase* win, HWND hWnd, int x, int y, int width, int height);
-
 // ----------------------------------------------------------------------------
 // functions mapping HWND to wxWindow
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // functions mapping HWND to wxWindow
 // ----------------------------------------------------------------------------
@@ -836,38 +925,28 @@ inline void *wxSetWindowUserData(HWND hwnd, void *data)
 
 #else // __WIN32__
 
 
 #else // __WIN32__
 
-#ifdef __VISUALC__
-    // strangely enough, VC++ 7.1 gives warnings about 32 -> 64 bit conversions
-    // in the functions below, even in spite of the explicit casts
-    #pragma warning(disable:4311)
-    #pragma warning(disable:4312)
-#endif
-
-inline void *wxGetWindowProc(HWND hwnd)
+// note that the casts to LONG_PTR here are required even on 32-bit machines
+// for the 64-bit warning mode of later versions of MSVC (C4311/4312)
+inline WNDPROC wxGetWindowProc(HWND hwnd)
 {
 {
-    return (void *)::GetWindowLong(hwnd, GWL_WNDPROC);
+    return (WNDPROC)(LONG_PTR)::GetWindowLong(hwnd, GWL_WNDPROC);
 }
 
 inline void *wxGetWindowUserData(HWND hwnd)
 {
 }
 
 inline void *wxGetWindowUserData(HWND hwnd)
 {
-    return (void *)::GetWindowLong(hwnd, GWL_USERDATA);
+    return (void *)(LONG_PTR)::GetWindowLong(hwnd, GWL_USERDATA);
 }
 
 inline WNDPROC wxSetWindowProc(HWND hwnd, WNDPROC func)
 {
 }
 
 inline WNDPROC wxSetWindowProc(HWND hwnd, WNDPROC func)
 {
-    return (WNDPROC)::SetWindowLong(hwnd, GWL_WNDPROC, (LONG)func);
+    return (WNDPROC)(LONG_PTR)::SetWindowLong(hwnd, GWL_WNDPROC, (LONG_PTR)func);
 }
 
 inline void *wxSetWindowUserData(HWND hwnd, void *data)
 {
 }
 
 inline void *wxSetWindowUserData(HWND hwnd, void *data)
 {
-    return (void *)::SetWindowLong(hwnd, GWL_USERDATA, (LONG)data);
+    return (void *)(LONG_PTR)::SetWindowLong(hwnd, GWL_USERDATA, (LONG_PTR)data);
 }
 
 }
 
-#ifdef __VISUALC__
-    #pragma warning(default:4311)
-    #pragma warning(default:4312)
-#endif
-
 #endif // __WIN64__/__WIN32__
 
 #endif // wxUSE_GUI
 #endif // __WIN64__/__WIN32__
 
 #endif // wxUSE_GUI