X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/28ac82bf0444ba664a4740393fde133058c0e3d3..7344108e8a129a3f9b4df5ab0f98a1713db03b89:/include/wx/msw/private.h diff --git a/include/wx/msw/private.h b/include/wx/msw/private.h index f33d38372f..6c10cfa60d 100644 --- a/include/wx/msw/private.h +++ b/include/wx/msw/private.h @@ -62,6 +62,13 @@ extern WXDLLIMPEXP_DATA_CORE(HFONT) wxSTATUS_LINE_FONT; extern WXDLLIMPEXP_DATA_BASE(HINSTANCE) wxhInstance; +extern "C" +{ + WXDLLIMPEXP_BASE HINSTANCE wxGetInstance(); +} + +WXDLLIMPEXP_BASE void wxSetInstance(HINSTANCE hInst); + // --------------------------------------------------------------------------- // define things missing from some compilers' headers // --------------------------------------------------------------------------- @@ -162,9 +169,9 @@ extern LONG APIENTRY _EXPORT // 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. +// Vc++, bcc, dmc, ow, mingw akk have _get_osfhandle() and Cygwin has +// get_osfhandle. Others are currently unknown, e.g. Salford, Intel, Visual +// Age. #if defined(__WXWINCE__) #define wxGetOSFHandle(fd) ((HANDLE)fd) #define wxOpenOSFHandle(h, flags) ((int)wxPtrToUInt(h)) @@ -174,8 +181,7 @@ extern LONG APIENTRY _EXPORT || defined(__BORLANDC__) \ || defined(__DMC__) \ || defined(__WATCOMC__) \ - || defined(__MINGW32__) \ - || (defined(__MWERKS__) && defined(__MSL__)) + || defined(__MINGW32__) #define wxGetOSFHandle(fd) ((HANDLE)_get_osfhandle(fd)) #define wxOpenOSFHandle(h, flags) (_open_osfhandle(wxPtrToUInt(h), flags)) #define wx_fdopen _fdopen @@ -212,6 +218,21 @@ struct WinStruct : public T }; +// Macros for converting wxString to the type expected by API functions. +// +// Normally it is enough to just use wxString::t_str() which is implicitly +// convertible to LPCTSTR, but in some cases an explicit conversion is required. +// +// In such cases wxMSW_CONV_LPCTSTR() should be used. But if an API function +// takes a non-const pointer, wxMSW_CONV_LPTSTR() which casts away the +// constness (but doesn't make it possible to really modify the returned +// pointer, of course) should be used. And if a string is passed as LPARAM, use +// wxMSW_CONV_LPARAM() which does the required ugly reinterpret_cast<> too. +#define wxMSW_CONV_LPCTSTR(s) static_cast((s).t_str()) +#define wxMSW_CONV_LPTSTR(s) const_cast(wxMSW_CONV_LPCTSTR(s)) +#define wxMSW_CONV_LPARAM(s) reinterpret_cast(wxMSW_CONV_LPCTSTR(s)) + + #if wxUSE_GUI #include "wx/gdicmn.h" @@ -368,7 +389,9 @@ inline RECT wxGetWindowRect(HWND hwnd) RECT rect; if ( !::GetWindowRect(hwnd, &rect) ) - wxLogLastError(_T("GetWindowRect")); + { + wxLogLastError(wxT("GetWindowRect")); + } return rect; } @@ -378,7 +401,9 @@ inline RECT wxGetClientRect(HWND hwnd) RECT rect; if ( !::GetClientRect(hwnd, &rect) ) - wxLogLastError(_T("GetClientRect")); + { + wxLogLastError(wxT("GetClientRect")); + } return rect; } @@ -407,8 +432,9 @@ private: class WindowHDC { public: + WindowHDC() : m_hwnd(NULL), m_hdc(NULL) { } WindowHDC(HWND hwnd) { m_hdc = ::GetDC(m_hwnd = hwnd); } - ~WindowHDC() { ::ReleaseDC(m_hwnd, m_hdc); } + ~WindowHDC() { if ( m_hwnd && m_hdc ) { ::ReleaseDC(m_hwnd, m_hdc); } } operator HDC() const { return m_hdc; } @@ -443,12 +469,12 @@ private: void DoInit(HGDIOBJ hgdiobj) { m_hgdiobj = ::SelectObject(m_hdc, hgdiobj); } public: - SelectInHDC() : m_hdc(NULL) { } + SelectInHDC() : m_hdc(NULL), m_hgdiobj(NULL) { } SelectInHDC(HDC hdc, HGDIOBJ hgdiobj) : m_hdc(hdc) { DoInit(hgdiobj); } void Init(HDC hdc, HGDIOBJ hgdiobj) { - wxASSERT_MSG( !m_hdc, _T("initializing twice?") ); + wxASSERT_MSG( !m_hdc, wxT("initializing twice?") ); m_hdc = hdc; @@ -477,7 +503,7 @@ protected: void InitGdiobj(HGDIOBJ gdiobj) { - wxASSERT_MSG( !m_gdiobj, _T("initializing twice?") ); + wxASSERT_MSG( !m_gdiobj, wxT("initializing twice?") ); m_gdiobj = gdiobj; } @@ -530,8 +556,13 @@ public: class AutoHBITMAP : private AutoGDIObject { public: + AutoHBITMAP() + : AutoGDIObject() { } + AutoHBITMAP(HBITMAP hbmp) : AutoGDIObject(hbmp) { } + void Init(HBITMAP hbmp) { InitGdiobj(hbmp); } + operator HBITMAP() const { return (HBITMAP)GetObject(); } }; @@ -570,7 +601,9 @@ public: : m_hdc(hdc) { if ( !::SelectClipRgn(hdc, hrgn) ) - wxLogLastError(_T("SelectClipRgn")); + { + wxLogLastError(wxT("SelectClipRgn")); + } } ~HDCClipper() @@ -599,7 +632,9 @@ private: { m_modeOld = ::SetMapMode(hdc, mm); if ( !m_modeOld ) - wxLogLastError(_T("SelectClipRgn")); + { + wxLogLastError(wxT("SelectClipRgn")); + } } ~HDCMapModeChanger() @@ -634,7 +669,9 @@ public: { m_hGlobal = ::GlobalAlloc(flags, size); if ( !m_hGlobal ) - wxLogLastError(_T("GlobalAlloc")); + { + wxLogLastError(wxT("GlobalAlloc")); + } } GlobalPtr(size_t size, unsigned flags = GMEM_MOVEABLE) @@ -645,7 +682,9 @@ public: ~GlobalPtr() { if ( m_hGlobal && ::GlobalFree(m_hGlobal) ) - wxLogLastError(_T("GlobalFree")); + { + wxLogLastError(wxT("GlobalFree")); + } } // implicit conversion @@ -681,7 +720,9 @@ public: // global scope operator with it (and neither with GlobalUnlock()) m_ptr = GlobalLock(hGlobal); if ( !m_ptr ) - wxLogLastError(_T("GlobalLock")); + { + wxLogLastError(wxT("GlobalLock")); + } } // initialize the object, HGLOBAL must not be NULL @@ -698,7 +739,7 @@ public: DWORD dwLastError = ::GetLastError(); if ( dwLastError != NO_ERROR ) { - wxLogApiError(_T("GlobalUnlock"), dwLastError); + wxLogApiError(wxT("GlobalUnlock"), dwLastError); } } } @@ -731,12 +772,12 @@ public: { // we should only be called if we hadn't been initialized yet wxASSERT_MSG( m_registered == -1, - _T("calling ClassRegistrar::Register() twice?") ); + wxT("calling ClassRegistrar::Register() twice?") ); m_registered = ::RegisterClass(&wc) ? 1 : 0; if ( !IsRegistered() ) { - wxLogLastError(_T("RegisterClassEx()")); + wxLogLastError(wxT("RegisterClassEx()")); } else { @@ -755,9 +796,9 @@ public: { if ( IsRegistered() ) { - if ( !::UnregisterClass(m_clsname.wx_str(), wxhInstance) ) + if ( !::UnregisterClass(m_clsname.t_str(), wxGetInstance()) ) { - wxLogLastError(_T("UnregisterClass")); + wxLogLastError(wxT("UnregisterClass")); } } } @@ -825,13 +866,6 @@ private: // global functions // --------------------------------------------------------------------------- -extern "C" -{ - WXDLLIMPEXP_BASE HINSTANCE wxGetInstance(); -} - -WXDLLIMPEXP_BASE void wxSetInstance(HINSTANCE hInst); - // return the full path of the given module inline wxString wxGetFullModuleName(HMODULE hmod) { @@ -843,7 +877,7 @@ inline wxString wxGetFullModuleName(HMODULE hmod) MAX_PATH ) ) { - wxLogLastError(_T("GetModuleFileName")); + wxLogLastError(wxT("GetModuleFileName")); } return fullname; @@ -862,9 +896,10 @@ inline wxString wxGetFullModuleName() // 0x0400 Windows 95, NT4 // 0x0410 Windows 98 // 0x0500 Windows ME, 2000 -// 0x0501 Windows XP -// 0x0502 Windows 2003 -// 0x0600 Longhorn +// 0x0501 Windows XP, 2003 +// 0x0502 Windows XP SP2, 2003 SP1 +// 0x0600 Windows Vista, 2008 +// 0x0601 Windows 7 // // for the other Windows versions 0 is currently returned enum wxWinVersion @@ -884,11 +919,15 @@ enum wxWinVersion wxWinVersion_NT5 = wxWinVersion_5, wxWinVersion_2000 = wxWinVersion_5, wxWinVersion_XP = 0x0501, - wxWinVersion_2003 = 0x0502, + wxWinVersion_2003 = 0x0501, + wxWinVersion_XP_SP2 = 0x0502, + wxWinVersion_2003_SP1 = 0x0502, wxWinVersion_6 = 0x0600, wxWinVersion_Vista = wxWinVersion_6, - wxWinVersion_NT6 = wxWinVersion_6 + wxWinVersion_NT6 = wxWinVersion_6, + + wxWinVersion_7 = 0x601 }; WXDLLIMPEXP_BASE wxWinVersion wxGetWinVersion(); @@ -899,6 +938,9 @@ WXDLLIMPEXP_BASE wxWinVersion wxGetWinVersion(); extern HCURSOR wxGetCurrentBusyCursor(); // from msw/utils.cpp extern const wxCursor *wxGetGlobalCursor(); // from msw/cursor.cpp +// GetCursorPos can fail without populating the POINT. This falls back to GetMessagePos. +WXDLLIMPEXP_CORE void wxGetCursorPosMSW(POINT* pt); + 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); @@ -954,12 +996,6 @@ inline long wxSetWindowExStyle(const wxWindowMSW *win, long style) // and returns either that window if it does or NULL otherwise 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.