X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ed39ff57b30a70a2395e07887a70bc01e7a3b7ec..1e3c12d77459f08076de2ca101eb660f675bbd3a:/include/wx/msw/private.h diff --git a/include/wx/msw/private.h b/include/wx/msw/private.h index a1308f5b47..7f26ece1cb 100644 --- a/include/wx/msw/private.h +++ b/include/wx/msw/private.h @@ -279,6 +279,17 @@ extern void PixelToHIMETRIC(LONG *x, LONG *y); // 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 // @@ -351,13 +362,13 @@ private: 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() { ::DeleteDC(m_hdc); } + MemoryHDC(HDC hdc = 0) { m_hdc = ::CreateCompatibleDC(hdc); } + ~MemoryHDC() { ::DeleteDC(m_hdc); } operator HDC() const { return m_hdc; } @@ -384,7 +395,46 @@ private: HDC m_hdc; HGDIOBJ m_hgdiobj; - DECLARE_NO_COPY_CLASS(SelectInHDC) + 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) }; // ---------------------------------------------------------------------------