]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/msw/private.h
define wxUSE_MFC as 0 if it's not defined (fixes gcc -Wundef warning)
[wxWidgets.git] / include / wx / msw / private.h
index 86cc595d89b9f45269e43200a5c64ad5b470cd51..840642a60c461b632fefc71ffedf2d13ef06acd1 100644 (file)
@@ -28,6 +28,7 @@
 
 class WXDLLEXPORT wxFont;
 class WXDLLEXPORT wxWindow;
 
 class WXDLLEXPORT wxFont;
 class WXDLLEXPORT wxWindow;
+class WXDLLEXPORT wxWindowBase;
 
 // ---------------------------------------------------------------------------
 // private constants
 
 // ---------------------------------------------------------------------------
 // private constants
@@ -187,11 +188,26 @@ extern LONG APIENTRY _EXPORT
    || defined(__BORLANDC__) \
    || defined(__DMC__) \
    || defined(__WATCOMC__) \
    || defined(__BORLANDC__) \
    || defined(__DMC__) \
    || defined(__WATCOMC__) \
-   || (defined(__GNUWIN32__) || defined(__MINGW32__)) \
+   || defined(__MINGW32__) \
    || (defined(__MWERKS__) && defined(__MSL__))
     #define wxGetOSFHandle(fd) ((HANDLE)_get_osfhandle(fd))
 #endif
 
    || (defined(__MWERKS__) && defined(__MSL__))
     #define wxGetOSFHandle(fd) ((HANDLE)_get_osfhandle(fd))
 #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;
+};
+
 #if wxUSE_GUI
 
 #include <wx/gdicmn.h>
 #if wxUSE_GUI
 
 #include <wx/gdicmn.h>
@@ -439,16 +455,53 @@ private:
     HGDIOBJ m_gdiobj;
 };
 
     HGDIOBJ m_gdiobj;
 };
 
-// a class for temporary bitmaps
-class CompatibleBitmap : private AutoGDIObject
+// TODO: all this asks for using a AutoHandler<T, CreateFunc> template...
+
+// a class for temporary pens
+class AutoHBRUSH : private AutoGDIObject
+{
+public:
+    AutoHBRUSH(COLORREF col)
+        : AutoGDIObject(::CreateSolidBrush(col)) { }
+
+    operator HBRUSH() const { return (HBRUSH)GetObject(); }
+};
+
+// a class for temporary pens
+class AutoHPEN : private AutoGDIObject
+{
+public:
+    AutoHPEN(COLORREF col)
+        : AutoGDIObject(::CreatePen(PS_SOLID, 0, col)) { }
+
+    operator HPEN() const { return (HPEN)GetObject(); }
+};
+
+// classes for temporary bitmaps
+class AutoHBITMAP : private AutoGDIObject
+{
+public:
+    AutoHBITMAP(HBITMAP hbmp) : AutoGDIObject(hbmp) { }
+
+    operator HBITMAP() const { return (HBITMAP)GetObject(); }
+};
+
+class CompatibleBitmap : public AutoHBITMAP
 {
 public:
     CompatibleBitmap(HDC hdc, int w, int h)
 {
 public:
     CompatibleBitmap(HDC hdc, int w, int h)
-        : AutoGDIObject(::CreateCompatibleBitmap(hdc, w, h))
+        : AutoHBITMAP(::CreateCompatibleBitmap(hdc, w, h))
     {
     }
     {
     }
+};
 
 
-    operator HBITMAP() const { return (HBITMAP)GetObject(); }
+class MonoBitmap : public AutoHBITMAP
+{
+public:
+    MonoBitmap(int w, int h)
+        : AutoHBITMAP(::CreateBitmap(w, h, 1, 1, 0))
+    {
+    }
 };
 
 // class automatically destroys the region object
 };
 
 // class automatically destroys the region object
@@ -482,13 +535,40 @@ private:
     DECLARE_NO_COPY_CLASS(HDCClipper)
 };
 
     DECLARE_NO_COPY_CLASS(HDCClipper)
 };
 
+// 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 )
@@ -497,7 +577,7 @@ public:
         }
     }
 
         }
     }
 
-    ~GlobalPtr()
+    ~GlobalPtrLock()
     {
         if ( !GlobalUnlock(m_hGlobal) )
         {
     {
         if ( !GlobalUnlock(m_hGlobal) )
         {
@@ -518,7 +598,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
@@ -663,6 +743,43 @@ inline wxString wxGetFullModuleName()
     return wxGetFullModuleName((HMODULE)wxGetInstance());
 }
 
     return wxGetFullModuleName((HMODULE)wxGetInstance());
 }
 
+// return the run-time version of the OS in a format similar to
+// WINVER/_WIN32_WINNT compile-time macros:
+//
+//      0x0300      Windows NT 3.51
+//      0x0400      Windows 95, NT4
+//      0x0410      Windows 98
+//      0x0500      Windows ME, 2000
+//      0x0501      Windows XP
+//      0x0502      Windows 2003
+//      0x0600      Longhorn
+//
+// for the other Windows versions 0 is currently returned
+enum wxWinVersion
+{
+    wxWinVersion_Unknown = 0,
+
+    wxWinVersion_3 = 0x0300,
+    wxWinVersion_NT3 = wxWinVersion_3,
+
+    wxWinVersion_4 = 0x0400,
+    wxWinVersion_95 = wxWinVersion_4,
+    wxWinVersion_NT4 = wxWinVersion_4,
+    wxWinVersion_98 = 0x0410,
+
+    wxWinVersion_5 = 0x0500,
+    wxWinVersion_ME = wxWinVersion_5,
+    wxWinVersion_NT5 = wxWinVersion_5,
+    wxWinVersion_2000 = wxWinVersion_5,
+    wxWinVersion_XP = 0x0501,
+    wxWinVersion_2003 = 0x0502,
+
+    wxWinVersion_6 = 0x0600,
+    wxWinVersion_NT6 = 0x0600
+};
+
+WXDLLIMPEXP_BASE wxWinVersion wxGetWinVersion();
+
 #if wxUSE_GUI
 
 // cursor stuff
 #if wxUSE_GUI
 
 // cursor stuff
@@ -722,6 +839,14 @@ extern WXDLLEXPORT wxSize wxGetHiconSize(HICON hicon);
 // Lines are drawn differently for WinCE and regular WIN32
 WXDLLEXPORT void wxDrawLine(HDC hdc, int x1, int y1, int x2, int y2);
 
 // Lines are drawn differently for WinCE and regular WIN32
 WXDLLEXPORT void wxDrawLine(HDC hdc, int x1, int y1, int x2, int y2);
 
+// fill the client rect of the given window on the provided dc using this brush
+inline void wxFillRect(HWND hwnd, HDC hdc, HBRUSH hbr)
+{
+    RECT rc;
+    ::GetClientRect(hwnd, &rc);
+    ::FillRect(hdc, &rc, hbr);
+}
+
 // ----------------------------------------------------------------------------
 // 32/64 bit helpers
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // 32/64 bit helpers
 // ----------------------------------------------------------------------------