/////////////////////////////////////////////////////////////////////////////
-// Name: private.h
+// Name: wx/msw/private.h
// Purpose: Private declarations: as this header is only included by
// wxWidgets itself, it may contain identifiers which don't start
// with "wx".
class WXDLLEXPORT wxFont;
class WXDLLEXPORT wxWindow;
+class WXDLLEXPORT wxWindowBase;
// ---------------------------------------------------------------------------
// private constants
#endif
#endif
-#if wxUSE_PENWIN
- WXDLLEXPORT void wxRegisterPenWin();
- WXDLLEXPORT void wxCleanUpPenWin();
- WXDLLEXPORT void wxEnablePenAppHooks (bool hook);
-#endif // wxUSE_PENWIN
-
-#if wxUSE_ITSY_BITSY
- #define IBS_HORZCAPTION 0x4000L
- #define IBS_VERTCAPTION 0x8000L
-
- UINT WINAPI ibGetCaptionSize( HWND hWnd ) ;
- UINT WINAPI ibSetCaptionSize( HWND hWnd, UINT nSize ) ;
- LRESULT WINAPI ibDefWindowProc( HWND hWnd, UINT uiMsg, WPARAM wParam, LPARAM lParam ) ;
- VOID WINAPI ibAdjustWindowRect( HWND hWnd, LPRECT lprc ) ;
-#endif // wxUSE_ITSY_BITSY
-
/*
* Decide what window classes we're going to use
* for this combination of CTl3D/FAFA settings
#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(__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;
+};
+
+// a template to make initializing Windows styructs less painful: it zeroes all
+// the struct fields and also sets cbSize member to the correct value (and so
+// can be only used with structures which have this member...)
+template <class T>
+struct WinStruct : public T
+{
+ WinStruct()
+ {
+ ::ZeroMemory(this, sizeof(T));
+
+ // explicit qualification is required here for this to be valid C++
+ this->cbSize = sizeof(T);
+ }
+};
+
+
#if wxUSE_GUI
-#include <wx/gdicmn.h>
-#include <wx/colour.h>
+#include "wx/gdicmn.h"
+#include "wx/colour.h"
// make conversion from wxColour and COLORREF a bit less painful
inline COLORREF wxColourToRGB(const wxColour& c)
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
-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
// small helper classes
// ---------------------------------------------------------------------------
-// a template to make initializing Windows styructs less painful: it zeroes all
-// the struct fields and also sets cbSize member to the correct value (and so
-// can be only used with structures which have this member...)
-template <class T>
-struct WinStruct : public T
-{
- WinStruct()
- {
- ::ZeroMemory(this, sizeof(T));
-
- // explicit qualification is required here for this to be valid C++
- this->cbSize = sizeof(T);
- }
-};
-
-
// create an instance of this class and use it as the HDC for screen, will
// automatically release the DC going out of scope
class ScreenHDC
DECLARE_NO_COPY_CLASS(SelectInHDC)
};
-// a class for temporary bitmaps
-class CompatibleBitmap
+// 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;
+};
+
+// 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)
+ : AutoHBITMAP(::CreateCompatibleBitmap(hdc, w, h))
{
- m_hbmp = ::CreateCompatibleBitmap(hdc, w, h);
}
+};
+
+class MonoBitmap : public AutoHBITMAP
+{
+public:
+ MonoBitmap(int w, int h)
+ : AutoHBITMAP(::CreateBitmap(w, h, 1, 1, 0))
+ {
+ }
+};
+
+// class automatically destroys the region object
+class AutoHRGN : private AutoGDIObject
+{
+public:
+ AutoHRGN(HRGN hrgn) : AutoGDIObject(hrgn) { }
+
+ operator HRGN() const { return (HRGN)GetObject(); }
+};
- ~CompatibleBitmap()
+// 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:
- HBITMAP m_hbmp;
+ 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; }
+
+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
#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 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())
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
// ----------------------------------------------------------------------------
#else // __WIN32__
-#ifdef __VISUALC__
- // strangely enough, VC++ 7.1 gives warnings about 32 -> 64 bit conversions
- // in the functions below, even in spite of the explicit casts
- #pragma warning(disable:4311)
- #pragma warning(disable:4312)
-#endif
-
-inline void *wxGetWindowProc(HWND hwnd)
+// note that the casts to LONG_PTR here are required even on 32-bit machines
+// for the 64-bit warning mode of later versions of MSVC (C4311/4312)
+inline WNDPROC wxGetWindowProc(HWND hwnd)
{
- return (void *)::GetWindowLong(hwnd, GWL_WNDPROC);
+ return (WNDPROC)(LONG_PTR)::GetWindowLong(hwnd, GWL_WNDPROC);
}
inline void *wxGetWindowUserData(HWND hwnd)
{
- return (void *)::GetWindowLong(hwnd, GWL_USERDATA);
+ return (void *)(LONG_PTR)::GetWindowLong(hwnd, GWL_USERDATA);
}
inline WNDPROC wxSetWindowProc(HWND hwnd, WNDPROC func)
{
- return (WNDPROC)::SetWindowLong(hwnd, GWL_WNDPROC, (LONG)func);
+ return (WNDPROC)(LONG_PTR)::SetWindowLong(hwnd, GWL_WNDPROC, (LONG_PTR)func);
}
inline void *wxSetWindowUserData(HWND hwnd, void *data)
{
- return (void *)::SetWindowLong(hwnd, GWL_USERDATA, (LONG)data);
+ return (void *)(LONG_PTR)::SetWindowLong(hwnd, GWL_USERDATA, (LONG_PTR)data);
}
-#ifdef __VISUALC__
- #pragma warning(default:4311)
- #pragma warning(default:4312)
-#endif
-
#endif // __WIN64__/__WIN32__
#endif // wxUSE_GUI
-#endif
- // _WX_PRIVATE_H_
+#endif // _WX_PRIVATE_H_