]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/msw/private.h
OS/2 fix
[wxWidgets.git] / include / wx / msw / private.h
index ff47704cfa483db90dc17881120aac9c76aa0e77..a2a08d8316ba96e5779684c5114ff52b0d929ca4 100644 (file)
@@ -174,6 +174,24 @@ extern LONG APIENTRY _EXPORT
 #define wxZeroMemory(obj)   memset((void*) & obj, 0, sizeof(obj))
 #endif
 
 #define wxZeroMemory(obj)   memset((void*) & obj, 0, sizeof(obj))
 #endif
 
+// This one is a macro so that it can be tested with #ifdef, it will be
+// undefined if it cannot be implemented for a given compiler.
+// Vc++, bcc, dmc, ow, mingw, codewarrior (and rsxnt) have _get_osfhandle.
+// Cygwin has get_osfhandle. Others are currently unknown, e.g. Salford,
+// Intel, Visual Age.
+#if defined(__WXWINCE__)
+    #define wxGetOSFHandle(fd) ((HANDLE)fd)
+#elif defined(__CYGWIN__)
+    #define wxGetOSFHandle(fd) ((HANDLE)get_osfhandle(fd))
+#elif defined(__VISUALC__) \
+   || defined(__BORLANDC__) \
+   || defined(__DMC__) \
+   || defined(__WATCOMC__) \
+   || (defined(__GNUWIN32__) || defined(__MINGW32__)) \
+   || (defined(__MWERKS__) && defined(__MSL__))
+    #define wxGetOSFHandle(fd) ((HANDLE)_get_osfhandle(fd))
+#endif
+
 #if wxUSE_GUI
 
 #include <wx/gdicmn.h>
 #if wxUSE_GUI
 
 #include <wx/gdicmn.h>
@@ -226,15 +244,26 @@ struct WXDLLEXPORT wxCOLORMAP
 extern wxCOLORMAP *wxGetStdColourMap();
 
 // create a wxRect from Windows RECT
 extern wxCOLORMAP *wxGetStdColourMap();
 
 // create a wxRect from Windows RECT
-inline wxRect wxRectFromRECT(const RECT& r)
+inline wxRect wxRectFromRECT(const RECT& rc)
 {
 {
-    return wxRect(r.left, r.top, r.right - r.left, r.bottom - r.top);
+    return wxRect(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top);
 }
 
 // copy Windows RECT to our wxRect
 }
 
 // copy Windows RECT to our wxRect
-inline void wxCopyRECTToRect(const RECT& r, wxRect& rect)
+inline void wxCopyRECTToRect(const RECT& rc, wxRect& rect)
+{
+    rect = wxRectFromRECT(rc);
+}
+
+// and vice versa
+inline void wxCopyRectToRECT(const wxRect& rect, RECT& rc)
 {
 {
-    rect = wxRectFromRECT(r);
+    // note that we don't use wxRect::GetRight() as it is one of compared to
+    // wxRectFromRECT() above
+    rc.top = rect.y;
+    rc.left = rect.x;
+    rc.right = rect.x + rect.width;
+    rc.bottom = rect.y + rect.height;
 }
 
 // translations between HIMETRIC units (which OLE likes) and pixels (which are
 }
 
 // translations between HIMETRIC units (which OLE likes) and pixels (which are
@@ -397,25 +426,60 @@ private:
    DECLARE_NO_COPY_CLASS(SelectInHDC)
 };
 
    DECLARE_NO_COPY_CLASS(SelectInHDC)
 };
 
+// a class which cleans up any GDI object
+class AutoGDIObject
+{
+protected:
+    AutoGDIObject(HGDIOBJ gdiobj) : m_gdiobj(gdiobj) { }
+    ~AutoGDIObject() { if ( m_gdiobj ) ::DeleteObject(m_gdiobj); }
+
+    HGDIOBJ GetObject() const { return m_gdiobj; }
+
+private:
+    HGDIOBJ m_gdiobj;
+};
+
 // a class for temporary bitmaps
 // a class for temporary bitmaps
-class CompatibleBitmap
+class CompatibleBitmap : private AutoGDIObject
 {
 public:
     CompatibleBitmap(HDC hdc, int w, int h)
 {
 public:
     CompatibleBitmap(HDC hdc, int w, int h)
+        : AutoGDIObject(::CreateCompatibleBitmap(hdc, w, h))
     {
     {
-        m_hbmp = ::CreateCompatibleBitmap(hdc, w, h);
     }
 
     }
 
-    ~CompatibleBitmap()
+    operator HBITMAP() const { return (HBITMAP)GetObject(); }
+};
+
+// class automatically destroys the region object
+class AutoHRGN : private AutoGDIObject
+{
+public:
+    AutoHRGN(HRGN hrgn) : AutoGDIObject(hrgn) { }
+
+    operator HRGN() const { return (HRGN)GetObject(); }
+};
+
+// class sets the specified clipping region during its life time
+class HDCClipper
+{
+public:
+    HDCClipper(HDC hdc, HRGN hrgn)
+        : m_hdc(hdc)
     {
     {
-        if ( m_hbmp )
-            ::DeleteObject(m_hbmp);
+        if ( !::SelectClipRgn(hdc, hrgn) )
+            wxLogLastError(_T("SelectClipRgn"));
     }
 
     }
 
-    operator HBITMAP() const { return m_hbmp; }
+    ~HDCClipper()
+    {
+        ::SelectClipRgn(m_hdc, NULL);
+    }
 
 private:
 
 private:
-    HBITMAP m_hbmp;
+    HDC m_hdc;
+
+    DECLARE_NO_COPY_CLASS(HDCClipper)
 };
 
 // when working with global pointers (which is unfortunately still necessary
 };
 
 // when working with global pointers (which is unfortunately still necessary
@@ -539,8 +603,8 @@ private:
 #define GetHaccel()             ((HACCEL)GetHACCEL())
 #define GetHaccelOf(table)      ((HACCEL)((table).GetHACCEL()))
 
 #define GetHaccel()             ((HACCEL)GetHACCEL())
 #define GetHaccelOf(table)      ((HACCEL)((table).GetHACCEL()))
 
-#define GetHbrush()             ((HPEN)GetResourceHandle())
-#define GetHbrushOf(brush)      ((HPEN)(brush).GetResourceHandle())
+#define GetHbrush()             ((HBRUSH)GetResourceHandle())
+#define GetHbrushOf(brush)      ((HBRUSH)(brush).GetResourceHandle())
 
 #define GetHmenu()              ((HMENU)GetHMenu())
 #define GetHmenuOf(menu)        ((HMENU)menu->GetHMenu())
 
 #define GetHmenu()              ((HMENU)GetHMenu())
 #define GetHmenuOf(menu)        ((HMENU)menu->GetHMenu())
@@ -551,6 +615,9 @@ private:
 #define GetHfont()              ((HFONT)GetHFONT())
 #define GetHfontOf(font)        ((HFONT)(font).GetHFONT())
 
 #define GetHfont()              ((HFONT)GetHFONT())
 #define GetHfontOf(font)        ((HFONT)(font).GetHFONT())
 
+#define GetHimagelist()         ((HIMAGELIST)GetHIMAGELIST())
+#define GetHimagelistOf(imgl)   ((HIMAGELIST)imgl->GetHIMAGELIST())
+
 #define GetHpalette()           ((HPALETTE)GetHPALETTE())
 #define GetHpaletteOf(pal)      ((HPALETTE)(pal).GetHPALETTE())
 
 #define GetHpalette()           ((HPALETTE)GetHPALETTE())
 #define GetHpaletteOf(pal)      ((HPALETTE)(pal).GetHPALETTE())
 
@@ -655,6 +722,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
 // ----------------------------------------------------------------------------
@@ -719,5 +794,4 @@ inline void *wxSetWindowUserData(HWND hwnd, void *data)
 
 #endif // wxUSE_GUI
 
 
 #endif // wxUSE_GUI
 
-#endif
-    // _WX_PRIVATE_H_
+#endif // _WX_PRIVATE_H_