#include <windows.h>
+
+#if defined (__WXWINCE__)
+ #include <wingdi.h> // RGB, COLORREF
+ #include <winuser.h> // Global Namespaces ::GetKeyState, ::GetWindowRect
+#endif
+
+
#ifdef __WXMICROWIN__
// Extra prototypes and symbols not defined by MicroWindows
#include "wx/msw/microwin.h"
extern LONG APIENTRY _EXPORT
wxSubclassedGenericControlProc(WXHWND hWnd, WXUINT message, WXWPARAM wParam, WXLPARAM lParam);
-// ---------------------------------------------------------------------------
-// constants which might miss from some compilers' headers
-// ---------------------------------------------------------------------------
-
-#if !defined(__WIN32__) && !defined(WS_EX_CLIENTEDGE)
- #define WS_EX_CLIENTEDGE 0
-#endif
-
-#if defined(__WIN32__) && !defined(WS_EX_CLIENTEDGE)
- #define WS_EX_CLIENTEDGE 0x00000200L
-#endif
-
-#ifndef ENDSESSION_LOGOFF
- #define ENDSESSION_LOGOFF 0x80000000
-#endif
-
// ---------------------------------------------------------------------------
// useful macros and functions
// ---------------------------------------------------------------------------
#if wxUSE_GUI
#include <wx/gdicmn.h>
+#include <wx/colour.h>
// make conversion from wxColour and COLORREF a bit less painful
inline COLORREF wxColourToRGB(const wxColour& c)
// to invert the mask each time we pass one/get one to/from Windows
extern HBITMAP wxInvertMask(HBITMAP hbmpMask, int w = 0, int h = 0);
+// Creates an icon or cursor depending from a bitmap
+//
+// The bitmap must be valid and it should have a mask. If it doesn't, a default
+// mask is created using light grey as the transparent colour.
+extern HICON wxBitmapToHICON(const wxBitmap& bmp);
+
+// Same requirments as above apply and the bitmap must also have the correct
+// size.
+extern
+HCURSOR wxBitmapToHCURSOR(const wxBitmap& bmp, int hotSpotX, int hotSpotY);
+
// get (x, y) from DWORD - notice that HI/LOWORD can *not* be used because they
// will fail on system with multiple monitors where the coords may be negative
//
// get the current state of SHIFT/CTRL keys
inline bool wxIsShiftDown()
{
- return (::GetKeyState(VK_SHIFT) & 0x100) != 0;
+// return (::GetKeyState(VK_SHIFT) & 0x100) != 0;
+ // Returns different negative values on WinME and WinNT,
+ // so simply test for negative value.
+ return ::GetKeyState(VK_SHIFT) < 0;
}
inline bool wxIsCtrlDown()
{
- return (::GetKeyState(VK_CONTROL) & 0x100) != 0;
+// return (::GetKeyState(VK_CONTROL) & 0x100) != 0;
+ // Returns different negative values on WinME and WinNT,
+ // so simply test for negative value.
+ return ::GetKeyState(VK_CONTROL) < 0;
}
// wrapper around GetWindowRect() and GetClientRect() APIs doing error checking
// 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));
+ 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
private:
HDC m_hdc;
+
+ DECLARE_NO_COPY_CLASS(ScreenHDC)
};
-// the same as ScreenHDC but for memory DCs: creates the HDC in ctor and
-// destroys it in dtor
+// 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() { m_hdc = ::CreateCompatibleDC(NULL); }
- ~MemoryHDC() { ::DeleteObject(m_hdc); }
+ 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
private:
HDC m_hdc;
HGDIOBJ m_hgdiobj;
+
+ DECLARE_NO_COPY_CLASS(SelectInHDC)
+};
+
+// 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
+{
+public:
+ GlobalPtr(HGLOBAL hGlobal) : m_hGlobal(hGlobal)
+ {
+ m_ptr = ::GlobalLock(hGlobal);
+ if ( !m_ptr )
+ {
+ wxLogLastError(_T("GlobalLock"));
+ }
+ }
+
+ ~GlobalPtr()
+ {
+ if ( !::GlobalUnlock(m_hGlobal) )
+ {
+#ifdef __WXDEBUG__
+ // this might happen simply because the block became unlocked
+ DWORD dwLastError = ::GetLastError();
+ if ( dwLastError != NO_ERROR )
+ {
+ wxLogApiError(_T("GlobalUnlock"), dwLastError);
+ }
+#endif // __WXDEBUG__
+ }
+ }
+
+ operator void *() const { return m_ptr; }
+
+private:
+ HGLOBAL m_hGlobal;
+ void *m_ptr;
+
+ DECLARE_NO_COPY_CLASS(GlobalPtr)
};
// ---------------------------------------------------------------------------