+ ScreenHDC() { m_hdc = ::GetDC(NULL); }
+ ~ScreenHDC() { ::ReleaseDC(NULL, m_hdc); }
+
+ operator HDC() const { return m_hdc; }
+
+private:
+ HDC m_hdc;
+
+ DECLARE_NO_COPY_CLASS(ScreenHDC)
+};
+
+// the same as ScreenHDC but for window DCs
+class WindowHDC
+{
+public:
+ WindowHDC(HWND hwnd) { m_hdc = ::GetDC(m_hwnd = hwnd); }
+ ~WindowHDC() { ::ReleaseDC(m_hwnd, m_hdc); }
+
+ operator HDC() const { return m_hdc; }
+
+private:
+ HWND m_hwnd;
+ HDC m_hdc;
+
+ DECLARE_NO_COPY_CLASS(WindowHDC)
+};
+
+// the same as ScreenHDC but for memory DCs: creates the HDC compatible with
+// the given one (screen by default) in ctor and destroys it in dtor
+class MemoryHDC
+{
+public:
+ MemoryHDC(HDC hdc = 0) { m_hdc = ::CreateCompatibleDC(hdc); }
+ ~MemoryHDC() { ::DeleteDC(m_hdc); }
+
+ operator HDC() const { return m_hdc; }
+
+private:
+ HDC m_hdc;
+
+ DECLARE_NO_COPY_CLASS(MemoryHDC)
+};
+
+// a class which selects a GDI object into a DC in its ctor and deselects in
+// dtor
+class SelectInHDC
+{
+public:
+ SelectInHDC(HDC hdc, HGDIOBJ hgdiobj) : m_hdc(hdc)
+ { m_hgdiobj = ::SelectObject(hdc, hgdiobj); }
+
+ ~SelectInHDC() { ::SelectObject(m_hdc, m_hgdiobj); }
+
+ // return true if the object was successfully selected
+ operator bool() const { return m_hgdiobj != 0; }
+
+private:
+ HDC m_hdc;
+ HGDIOBJ m_hgdiobj;
+
+ 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
+class CompatibleBitmap : private AutoGDIObject
+{
+public:
+ CompatibleBitmap(HDC hdc, int w, int h)
+ : AutoGDIObject(::CreateCompatibleBitmap(hdc, w, h))
+ {
+ }
+
+ 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 ( !::SelectClipRgn(hdc, hrgn) )
+ wxLogLastError(_T("SelectClipRgn"));
+ }
+
+ ~HDCClipper()
+ {
+ ::SelectClipRgn(m_hdc, NULL);
+ }