X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e6113e3a52d1c1c486b3a31cb22b59e2d9555b2d..f0fbbe236452ae27a7577deafbbc44ace2c209e7:/include/wx/msw/private.h diff --git a/include/wx/msw/private.h b/include/wx/msw/private.h index 3d9a48d18a..146d2d3a37 100644 --- a/include/wx/msw/private.h +++ b/include/wx/msw/private.h @@ -21,14 +21,15 @@ #include "wx/msw/microwin.h" #endif -// Include fixes for MSLU: -#include "wx/msw/mslu.h" - #include "wx/log.h" -class WXDLLEXPORT wxFont; -class WXDLLEXPORT wxWindow; -class WXDLLEXPORT wxWindowBase; +#if wxUSE_GUI + #include "wx/window.h" +#endif // wxUSE_GUI + +class WXDLLIMPEXP_FWD_CORE wxFont; +class WXDLLIMPEXP_FWD_CORE wxWindow; +class WXDLLIMPEXP_FWD_CORE wxWindowBase; // --------------------------------------------------------------------------- // private constants @@ -45,13 +46,13 @@ class WXDLLEXPORT wxWindowBase; #if wxUSE_GUI -extern WXDLLEXPORT_DATA(HICON) wxSTD_FRAME_ICON; -extern WXDLLEXPORT_DATA(HICON) wxSTD_MDIPARENTFRAME_ICON; -extern WXDLLEXPORT_DATA(HICON) wxSTD_MDICHILDFRAME_ICON; -extern WXDLLEXPORT_DATA(HICON) wxDEFAULT_FRAME_ICON; -extern WXDLLEXPORT_DATA(HICON) wxDEFAULT_MDIPARENTFRAME_ICON; -extern WXDLLEXPORT_DATA(HICON) wxDEFAULT_MDICHILDFRAME_ICON; -extern WXDLLEXPORT_DATA(HFONT) wxSTATUS_LINE_FONT; +extern WXDLLIMPEXP_DATA_CORE(HICON) wxSTD_FRAME_ICON; +extern WXDLLIMPEXP_DATA_CORE(HICON) wxSTD_MDIPARENTFRAME_ICON; +extern WXDLLIMPEXP_DATA_CORE(HICON) wxSTD_MDICHILDFRAME_ICON; +extern WXDLLIMPEXP_DATA_CORE(HICON) wxDEFAULT_FRAME_ICON; +extern WXDLLIMPEXP_DATA_CORE(HICON) wxDEFAULT_MDIPARENTFRAME_ICON; +extern WXDLLIMPEXP_DATA_CORE(HICON) wxDEFAULT_MDICHILDFRAME_ICON; +extern WXDLLIMPEXP_DATA_CORE(HFONT) wxSTATUS_LINE_FONT; #endif // wxUSE_GUI @@ -166,6 +167,7 @@ extern LONG APIENTRY _EXPORT // Intel, Visual Age. #if defined(__WXWINCE__) #define wxGetOSFHandle(fd) ((HANDLE)fd) + #define wxOpenOSFHandle(h, flags) ((int)wxPtrToUInt(h)) #elif defined(__CYGWIN__) #define wxGetOSFHandle(fd) ((HANDLE)get_osfhandle(fd)) #elif defined(__VISUALC__) \ @@ -175,6 +177,8 @@ extern LONG APIENTRY _EXPORT || defined(__MINGW32__) \ || (defined(__MWERKS__) && defined(__MSL__)) #define wxGetOSFHandle(fd) ((HANDLE)_get_osfhandle(fd)) + #define wxOpenOSFHandle(h, flags) (_open_osfhandle(wxPtrToUInt(h), flags)) + #define wx_fdopen _fdopen #endif // close the handle in the class dtor @@ -251,7 +255,7 @@ enum wxSTD_COLOUR wxSTD_COL_MAX }; -struct WXDLLEXPORT wxCOLORMAP +struct WXDLLIMPEXP_CORE wxCOLORMAP { COLORREF from, to; }; @@ -311,21 +315,32 @@ HCURSOR wxBitmapToHCURSOR(const wxBitmap& bmp, int hotSpotX, int hotSpotY); #define GET_Y_LPARAM(lp) ((int)(short)HIWORD(lp)) #endif // GET_X_LPARAM -// get the current state of SHIFT/CTRL keys -inline bool wxIsShiftDown() +// get the current state of SHIFT/CTRL/ALT keys +inline bool wxIsModifierDown(int vk) { -// return (::GetKeyState(VK_SHIFT) & 0x100) != 0; - // Returns different negative values on WinME and WinNT, + // GetKeyState() returns different negative values on WinME and WinNT, // so simply test for negative value. - return ::GetKeyState(VK_SHIFT) < 0; + return ::GetKeyState(vk) < 0; +} + +inline bool wxIsShiftDown() +{ + return wxIsModifierDown(VK_SHIFT); } inline bool wxIsCtrlDown() { -// 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; + return wxIsModifierDown(VK_CONTROL); +} + +inline bool wxIsAltDown() +{ + return wxIsModifierDown(VK_MENU); +} + +inline bool wxIsAnyModifierDown() +{ + return wxIsShiftDown() || wxIsCtrlDown() || wxIsAltDown(); } // wrapper around GetWindowRect() and GetClientRect() APIs doing error checking @@ -335,9 +350,7 @@ inline RECT wxGetWindowRect(HWND hwnd) RECT rect; if ( !::GetWindowRect(hwnd, &rect) ) - { wxLogLastError(_T("GetWindowRect")); - } return rect; } @@ -347,9 +360,7 @@ inline RECT wxGetClientRect(HWND hwnd) RECT rect; if ( !::GetClientRect(hwnd, &rect) ) - { wxLogLastError(_T("GetClientRect")); - } return rect; } @@ -410,29 +421,49 @@ private: // dtor class SelectInHDC { +private: + void DoInit(HGDIOBJ hgdiobj) { m_hgdiobj = ::SelectObject(m_hdc, hgdiobj); } + public: - SelectInHDC(HDC hdc, HGDIOBJ hgdiobj) : m_hdc(hdc) - { m_hgdiobj = ::SelectObject(hdc, hgdiobj); } + SelectInHDC() : m_hdc(NULL) { } + SelectInHDC(HDC hdc, HGDIOBJ hgdiobj) : m_hdc(hdc) { DoInit(hgdiobj); } + + void Init(HDC hdc, HGDIOBJ hgdiobj) + { + wxASSERT_MSG( !m_hdc, _T("initializing twice?") ); + + m_hdc = hdc; + + DoInit(hgdiobj); + } - ~SelectInHDC() { ::SelectObject(m_hdc, m_hgdiobj); } + ~SelectInHDC() { if ( m_hdc ) ::SelectObject(m_hdc, m_hgdiobj); } - // return true if the object was successfully selected - operator bool() const { return m_hgdiobj != 0; } + // return true if the object was successfully selected + operator bool() const { return m_hgdiobj != 0; } private: - HDC m_hdc; - HGDIOBJ m_hgdiobj; + HDC m_hdc; + HGDIOBJ m_hgdiobj; - DECLARE_NO_COPY_CLASS(SelectInHDC) + DECLARE_NO_COPY_CLASS(SelectInHDC) }; // a class which cleans up any GDI object class AutoGDIObject { protected: + AutoGDIObject() { m_gdiobj = NULL; } AutoGDIObject(HGDIOBJ gdiobj) : m_gdiobj(gdiobj) { } ~AutoGDIObject() { if ( m_gdiobj ) ::DeleteObject(m_gdiobj); } + void InitGdiobj(HGDIOBJ gdiobj) + { + wxASSERT_MSG( !m_gdiobj, _T("initializing twice?") ); + + m_gdiobj = gdiobj; + } + HGDIOBJ GetObject() const { return m_gdiobj; } private: @@ -441,7 +472,7 @@ private: // TODO: all this asks for using a AutoHandler template... -// a class for temporary pens +// a class for temporary brushes class AutoHBRUSH : private AutoGDIObject { public: @@ -451,6 +482,22 @@ public: operator HBRUSH() const { return (HBRUSH)GetObject(); } }; +// a class for temporary fonts +class AutoHFONT : private AutoGDIObject +{ +private: +public: + AutoHFONT() + : AutoGDIObject() { } + + AutoHFONT(const LOGFONT& lf) + : AutoGDIObject(::CreateFontIndirect(&lf)) { } + + void Init(const LOGFONT& lf) { InitGdiobj(::CreateFontIndirect(&lf)); } + + operator HFONT() const { return (HFONT)GetObject(); } +}; + // a class for temporary pens class AutoHPEN : private AutoGDIObject { @@ -505,9 +552,7 @@ public: : m_hdc(hdc) { if ( !::SelectClipRgn(hdc, hrgn) ) - { wxLogLastError(_T("SelectClipRgn")); - } } ~HDCClipper() @@ -536,9 +581,7 @@ private: { m_modeOld = ::SetMapMode(hdc, mm); if ( !m_modeOld ) - { wxLogLastError(_T("SelectClipRgn")); - } } ~HDCMapModeChanger() @@ -558,7 +601,7 @@ private: HDCMapModeChanger wxMAKE_UNIQUE_NAME(wxHDCMapModeChanger)(hdc, mm) #endif // __WXWINCE__/!__WXWINCE__ -// smart buffeer using GlobalAlloc/GlobalFree() +// smart pointer using GlobalAlloc/GlobalFree() class GlobalPtr { public: @@ -567,17 +610,13 @@ public: { m_hGlobal = ::GlobalAlloc(flags, size); if ( !m_hGlobal ) - { wxLogLastError(_T("GlobalAlloc")); - } } ~GlobalPtr() { if ( m_hGlobal && ::GlobalFree(m_hGlobal) ) - { wxLogLastError(_T("GlobalFree")); - } } // implicit conversion @@ -595,18 +634,36 @@ private: class GlobalPtrLock { public: - GlobalPtrLock(HGLOBAL hGlobal) : m_hGlobal(hGlobal) + // default ctor, use Init() later -- should only be used if the HGLOBAL can + // be NULL (in which case Init() shouldn't be called) + GlobalPtrLock() { + m_hGlobal = NULL; + m_ptr = NULL; + } + + // initialize the object, may be only called if we were created using the + // default ctor; HGLOBAL must not be NULL + void Init(HGLOBAL hGlobal) + { + m_hGlobal = hGlobal; + + // NB: GlobalLock() is a macro, not a function, hence don't use the + // global scope operator with it (and neither with GlobalUnlock()) m_ptr = GlobalLock(hGlobal); if ( !m_ptr ) - { wxLogLastError(_T("GlobalLock")); - } + } + + // initialize the object, HGLOBAL must not be NULL + GlobalPtrLock(HGLOBAL hGlobal) + { + Init(hGlobal); } ~GlobalPtrLock() { - if ( !GlobalUnlock(m_hGlobal) ) + if ( m_hGlobal && !GlobalUnlock(m_hGlobal) ) { #ifdef __WXDEBUG__ // this might happen simply because the block became unlocked @@ -619,6 +676,7 @@ public: } } + void *Get() const { return m_ptr; } operator void *() const { return m_ptr; } private: @@ -670,7 +728,7 @@ public: { if ( IsRegistered() ) { - if ( !::UnregisterClass(m_clsname, wxhInstance) ) + if ( !::UnregisterClass(m_clsname.wx_str(), wxhInstance) ) { wxLogLastError(_T("UnregisterClass")); } @@ -802,7 +860,8 @@ enum wxWinVersion wxWinVersion_2003 = 0x0502, wxWinVersion_6 = 0x0600, - wxWinVersion_NT6 = 0x0600 + wxWinVersion_Vista = wxWinVersion_6, + wxWinVersion_NT6 = wxWinVersion_6 }; WXDLLIMPEXP_BASE wxWinVersion wxGetWinVersion(); @@ -813,30 +872,30 @@ WXDLLIMPEXP_BASE wxWinVersion wxGetWinVersion(); extern HCURSOR wxGetCurrentBusyCursor(); // from msw/utils.cpp extern const wxCursor *wxGetGlobalCursor(); // from msw/cursor.cpp -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); -WXDLLEXPORT wxFontEncoding wxGetFontEncFromCharSet(int charset); +WXDLLIMPEXP_CORE void wxGetCharSize(WXHWND wnd, int *x, int *y, const wxFont& the_font); +WXDLLIMPEXP_CORE void wxFillLogFont(LOGFONT *logFont, const wxFont *font); +WXDLLIMPEXP_CORE wxFont wxCreateFontFromLogFont(const LOGFONT *logFont); +WXDLLIMPEXP_CORE wxFontEncoding wxGetFontEncFromCharSet(int charset); -WXDLLEXPORT void wxSliderEvent(WXHWND control, WXWORD wParam, WXWORD pos); -WXDLLEXPORT void wxScrollBarEvent(WXHWND hbar, WXWORD wParam, WXWORD pos); +WXDLLIMPEXP_CORE void wxSliderEvent(WXHWND control, WXWORD wParam, WXWORD pos); +WXDLLIMPEXP_CORE void wxScrollBarEvent(WXHWND hbar, WXWORD wParam, WXWORD pos); // Find maximum size of window/rectangle -extern WXDLLEXPORT void wxFindMaxSize(WXHWND hwnd, RECT *rect); +extern WXDLLIMPEXP_CORE void wxFindMaxSize(WXHWND hwnd, RECT *rect); // Safely get the window text (i.e. without using fixed size buffer) -extern WXDLLEXPORT wxString wxGetWindowText(WXHWND hWnd); +extern WXDLLIMPEXP_CORE wxString wxGetWindowText(WXHWND hWnd); // get the window class name -extern WXDLLEXPORT wxString wxGetWindowClass(WXHWND hWnd); +extern WXDLLIMPEXP_CORE wxString wxGetWindowClass(WXHWND hWnd); // get the window id (should be unsigned, hence this is not wxWindowID which // is, for mainly historical reasons, signed) -extern WXDLLEXPORT WXWORD wxGetWindowId(WXHWND hWnd); +extern WXDLLIMPEXP_CORE int wxGetWindowId(WXHWND hWnd); // check if hWnd's WNDPROC is wndProc. Return true if yes, false if they are // different -extern WXDLLEXPORT bool wxCheckWindowWndProc(WXHWND hWnd, WXFARPROC wndProc); +extern WXDLLIMPEXP_CORE bool wxCheckWindowWndProc(WXHWND hWnd, WXFARPROC wndProc); // Does this window style specify any border? inline bool wxStyleHasBorder(long style) @@ -845,26 +904,47 @@ inline bool wxStyleHasBorder(long style) wxSUNKEN_BORDER | wxDOUBLE_BORDER)) != 0; } +inline long wxGetWindowExStyle(const wxWindowMSW *win) +{ + return ::GetWindowLong(GetHwndOf(win), GWL_EXSTYLE); +} + +inline bool wxHasWindowExStyle(const wxWindowMSW *win, long style) +{ + return (wxGetWindowExStyle(win) & style) != 0; +} + +inline long wxSetWindowExStyle(const wxWindowMSW *win, long style) +{ + return ::SetWindowLong(GetHwndOf(win), GWL_EXSTYLE, style); +} + // ---------------------------------------------------------------------------- // functions mapping HWND to wxWindow // ---------------------------------------------------------------------------- -// this function simply checks whether the given hWnd corresponds to a wxWindow +// this function simply checks whether the given hwnd corresponds to a wxWindow // and returns either that window if it does or NULL otherwise -extern WXDLLEXPORT wxWindow* wxFindWinFromHandle(WXHWND hWnd); +extern WXDLLIMPEXP_CORE wxWindow* wxFindWinFromHandle(HWND hwnd); + +// without STRICT WXHWND is the same as HWND anyhow +inline wxWindow* wxFindWinFromHandle(WXHWND hWnd) +{ + return wxFindWinFromHandle(static_cast(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. // // returns the wxWindow corresponding to the given HWND or NULL. -extern WXDLLEXPORT wxWindow *wxGetWindowFromHWND(WXHWND hwnd); +extern WXDLLIMPEXP_CORE wxWindow *wxGetWindowFromHWND(WXHWND hwnd); // Get the size of an icon -extern WXDLLEXPORT wxSize wxGetHiconSize(HICON hicon); +extern WXDLLIMPEXP_CORE wxSize wxGetHiconSize(HICON hicon); // Lines are drawn differently for WinCE and regular WIN32 -WXDLLEXPORT void wxDrawLine(HDC hdc, int x1, int y1, int x2, int y2); +WXDLLIMPEXP_CORE 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)