class WXDLLEXPORT wxFont;
class WXDLLEXPORT wxWindow;
+class WXDLLEXPORT wxWindowBase;
// ---------------------------------------------------------------------------
// private constants
|| defined(__BORLANDC__) \
|| defined(__DMC__) \
|| defined(__WATCOMC__) \
- || (defined(__GNUWIN32__) || defined(__MINGW32__)) \
+ || defined(__MINGW32__) \
|| (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>
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)
- : 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
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
-class GlobalPtr
+class GlobalPtrLock
{
public:
- GlobalPtr(HGLOBAL hGlobal) : m_hGlobal(hGlobal)
+ GlobalPtrLock(HGLOBAL hGlobal) : m_hGlobal(hGlobal)
{
m_ptr = GlobalLock(hGlobal);
if ( !m_ptr )
}
}
- ~GlobalPtr()
+ ~GlobalPtrLock()
{
if ( !GlobalUnlock(m_hGlobal) )
{
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
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
// 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
// ----------------------------------------------------------------------------