]> git.saurik.com Git - wxWidgets.git/blobdiff - include/wx/msw/private.h
Provide NSAutoreleasePool instances during initialization
[wxWidgets.git] / include / wx / msw / private.h
index 334db2efe73526d06ef870cce63c033ac22f4553..3cda5809f9d459a5f88bf5c9bc5fee4f2bf16024 100644 (file)
 #ifndef _WX_PRIVATE_H_
 #define _WX_PRIVATE_H_
 
+#ifndef STRICT
+    #define STRICT 1
+#endif
+
 #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"
+#endif
+
 // undefine conflicting symbols which were defined in windows.h
 #include "wx/msw/winundef.h"
 
+// Include fixes for MSLU:
+#include "wx/msw/mslu.h"
+
+#include "wx/log.h"
+
 class WXDLLEXPORT wxFont;
 class WXDLLEXPORT wxWindow;
 
@@ -67,17 +88,16 @@ WXDLLEXPORT_DATA(extern HFONT) wxSTATUS_LINE_FONT;
 
 // this defines a CASTWNDPROC macro which casts a pointer to the type of a
 // window proc
-
-#if defined(__GNUWIN32_OLD__) && !defined(__CYGWIN10__)
-    #define CASTWNDPROC (long unsigned)
+#if defined(__WXWINCE__)
+    typedef FARPROC WndProcCast;
+#elif defined(STRICT) || defined(__GNUC__)
+    typedef WNDPROC WndProcCast;
 #else
-    #if defined(STRICT) || defined(__GNUC__)
-        typedef WNDPROC WndProcCast;
-    #else
-        typedef FARPROC WndProcCast;
-    #endif
-    #define CASTWNDPROC (WndProcCast)
-#endif // __GNUWIN32_OLD__
+    typedef FARPROC WndProcCast;
+#endif
+
+
+#define CASTWNDPROC (WndProcCast)
 
 // ---------------------------------------------------------------------------
 // some stuff for old Windows versions (FIXME: what does it do here??)
@@ -163,28 +183,12 @@ WXDLLEXPORT_DATA(extern HFONT) wxSTATUS_LINE_FONT;
 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
 // ---------------------------------------------------------------------------
 
 // a wrapper macro for ZeroMemory()
-#ifdef __WIN32__
+#if defined(__WIN32__) && !defined(__WXMICROWIN__)
 #define wxZeroMemory(obj)   ::ZeroMemory(&obj, sizeof(obj))
 #else
 #define wxZeroMemory(obj)   memset((void*) & obj, 0, sizeof(obj))
@@ -193,6 +197,7 @@ extern LONG APIENTRY _EXPORT
 #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)
@@ -200,11 +205,46 @@ inline COLORREF wxColourToRGB(const wxColour& c)
     return RGB(c.Red(), c.Green(), c.Blue());
 }
 
+inline COLORREF wxColourToPalRGB(const wxColour& c)
+{
+    return PALETTERGB(c.Red(), c.Green(), c.Blue());
+}
+
+inline wxColour wxRGBToColour(COLORREF rgb)
+{
+    return wxColour(GetRValue(rgb), GetGValue(rgb), GetBValue(rgb));
+}
+
 inline void wxRGBToColour(wxColour& c, COLORREF rgb)
 {
     c.Set(GetRValue(rgb), GetGValue(rgb), GetBValue(rgb));
 }
 
+// get the standard colour map for some standard colours - see comment in this
+// function to understand why is it needed and when should it be used
+//
+// it returns a wxCOLORMAP (can't use COLORMAP itself here as comctl32.dll
+// might be not included/available) array of size wxSTD_COLOUR_MAX
+//
+// NB: if you change these colours, update wxBITMAP_STD_COLOURS in the
+//     resources as well: it must have the same number of pixels!
+enum wxSTD_COLOUR
+{
+    wxSTD_COL_BTNTEXT,
+    wxSTD_COL_BTNSHADOW,
+    wxSTD_COL_BTNFACE,
+    wxSTD_COL_BTNHIGHLIGHT,
+    wxSTD_COL_MAX,
+};
+
+struct WXDLLEXPORT wxCOLORMAP
+{
+    COLORREF from, to;
+};
+
+// this function is implemented in src/msw/window.cpp
+extern wxCOLORMAP *wxGetStdColourMap();
+
 // copy Windows RECT to our wxRect
 inline void wxCopyRECTToRect(const RECT& r, wxRect& rect)
 {
@@ -223,6 +263,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
 //
@@ -235,29 +286,159 @@ extern HBITMAP wxInvertMask(HBITMAP hbmpMask, int w = 0, int h = 0);
 // 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
+// for Win32
+inline RECT wxGetWindowRect(HWND hwnd)
+{
+    RECT rect;
+#ifdef __WIN16__
+    ::GetWindowRect(hwnd, &rect);
+#else // Win32
+    if ( !::GetWindowRect(hwnd, &rect) )
+    {
+        wxLogLastError(_T("GetWindowRect"));
+    }
+#endif // Win16/32
+
+    return rect;
+}
+
+inline RECT wxGetClientRect(HWND hwnd)
+{
+    RECT rect;
+#ifdef __WIN16__
+    ::GetClientRect(hwnd, &rect);
+#else // Win32
+    if ( !::GetClientRect(hwnd, &rect) )
+    {
+        wxLogLastError(_T("GetClientRect"));
+    }
+#endif // Win16/32
+
+    return rect;
 }
 
 // ---------------------------------------------------------------------------
 // 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
 {
 public:
-    ScreenHDC() { m_hdc = GetDC(NULL);    }
-   ~ScreenHDC() { ReleaseDC(NULL, m_hdc); }
-    operator HDC() const { return m_hdc;  }
+    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 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)
+};
+
+// 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)
 };
 
 // ---------------------------------------------------------------------------
@@ -293,6 +474,9 @@ private:
 #define GetHfont()              ((HFONT)GetHFONT())
 #define GetHfontOf(font)        ((HFONT)(font).GetHFONT())
 
+#define GetHpalette()           ((HPALETTE)GetHPALETTE())
+#define GetHpaletteOf(pal)      ((HPALETTE)(pal).GetHPALETTE())
+
 #define GetHrgn()               ((HRGN)GetHRGN())
 #define GetHrgnOf(rgn)          ((HRGN)(rgn).GetHRGN())
 
@@ -302,9 +486,7 @@ private:
 // global data
 // ---------------------------------------------------------------------------
 
-WXDLLEXPORT_DATA(extern wxChar*) wxBuffer;
-
-WXDLLEXPORT_DATA(extern HINSTANCE) wxhInstance;
+WXDLLIMPEXP_DATA_BASE(extern HINSTANCE) wxhInstance;
 
 // ---------------------------------------------------------------------------
 // global functions
@@ -323,8 +505,6 @@ WXDLLEXPORT void wxSetInstance(HINSTANCE hInst);
 extern HCURSOR wxGetCurrentBusyCursor();    // from msw/utils.cpp
 extern const wxCursor *wxGetGlobalCursor(); // from msw/cursor.cpp
 
-WXDLLEXPORT wxWindow* wxFindWinFromHandle(WXHWND hWnd);
-
 WXDLLEXPORT void wxGetCharSize(WXHWND wnd, int *x, int *y, const wxFont *the_font);
 WXDLLEXPORT void wxFillLogFont(LOGFONT *logFont, const wxFont *font);
 WXDLLEXPORT wxFont wxCreateFontFromLogFont(const LOGFONT *logFont);
@@ -336,9 +516,6 @@ WXDLLEXPORT void wxScrollBarEvent(WXHWND hbar, WXWORD wParam, WXWORD pos);
 // Find maximum size of window/rectangle
 WXDLLEXPORT extern void wxFindMaxSize(WXHWND hwnd, RECT *rect);
 
-WXDLLEXPORT wxWindow* wxFindControlFromHandle(WXHWND hWnd);
-WXDLLEXPORT void wxAddControlHandle(WXHWND hWnd, wxWindow *item);
-
 // Safely get the window text (i.e. without using fixed size buffer)
 WXDLLEXPORT extern wxString wxGetWindowText(WXHWND hWnd);
 
@@ -349,18 +526,35 @@ WXDLLEXPORT extern wxString wxGetWindowClass(WXHWND hWnd);
 // is, for mainly historical reasons, signed)
 WXDLLEXPORT extern WXWORD wxGetWindowId(WXHWND hWnd);
 
+// check if hWnd's WNDPROC is wndProc. Return true if yes, false if they are
+// different
+WXDLLEXPORT extern bool wxCheckWindowWndProc(WXHWND hWnd, WXFARPROC wndProc);
+
 // Does this window style specify any border?
 inline bool wxStyleHasBorder(long style)
 {
-  return (style & (wxSIMPLE_BORDER | wxRAISED_BORDER |
-                   wxSUNKEN_BORDER | wxDOUBLE_BORDER)) != 0;
+    return (style & (wxSIMPLE_BORDER | wxRAISED_BORDER |
+                     wxSUNKEN_BORDER | wxDOUBLE_BORDER)) != 0;
 }
 
-// find the window for HWND which is part of some wxWindow, returns just the
-// corresponding wxWindow for HWND which just is one
+// ----------------------------------------------------------------------------
+// functions mapping HWND to wxWindow
+// ----------------------------------------------------------------------------
+
+// this function simply checks whether the given hWnd corresponds to a wxWindow
+// and returns either that window if it does or NULL otherwise
+WXDLLEXPORT extern wxWindow* wxFindWinFromHandle(WXHWND hWnd);
+
+// find the window for HWND which is part of some wxWindow, i.e. unlike
+// wxFindWinFromHandle() above it will also work for "sub controls" of a
+// wxWindow.
 //
-// may return NULL
-extern wxWindow *wxGetWindowFromHWND(WXHWND hwnd);
+// returns the wxWindow corresponding to the given HWND or NULL.
+WXDLLEXPORT extern wxWindow *wxGetWindowFromHWND(WXHWND hwnd);
+
+
+// Get the size of an icon
+WXDLLEXPORT extern wxSize wxGetHiconSize(HICON hicon);
 
 #endif // wxUSE_GUI