+ 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 ( !::SelectClipRgn(hdc, hrgn) )
+ wxLogLastError(_T("SelectClipRgn"));
+ }
+
+ ~HDCClipper()
+ {
+ ::SelectClipRgn(m_hdc, NULL);
+ }
+
+private:
+ HDC m_hdc;
+
+ 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; }