X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6756a5f8ee77cf9c77e99bd3b50857df9e41c058..8ba1d512d3dfc1b61ab24bde52ea0689db798a49:/include/wx/msw/private.h diff --git a/include/wx/msw/private.h b/include/wx/msw/private.h index f31355f2cb..63010bf4c5 100644 --- a/include/wx/msw/private.h +++ b/include/wx/msw/private.h @@ -23,6 +23,10 @@ #include "wx/log.h" +#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; @@ -42,13 +46,13 @@ class WXDLLIMPEXP_FWD_CORE 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 @@ -58,6 +62,13 @@ extern WXDLLEXPORT_DATA(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 // --------------------------------------------------------------------------- @@ -251,7 +262,7 @@ enum wxSTD_COLOUR wxSTD_COL_MAX }; -struct WXDLLEXPORT wxCOLORMAP +struct WXDLLIMPEXP_CORE wxCOLORMAP { COLORREF from, to; }; @@ -285,7 +296,9 @@ inline void wxCopyRectToRECT(const wxRect& rect, RECT& rc) // translations between HIMETRIC units (which OLE likes) and pixels (which are // liked by all the others) - implemented in msw/utilsexc.cpp extern void HIMETRICToPixel(LONG *x, LONG *y); +extern void HIMETRICToPixel(LONG *x, LONG *y, HDC hdcRef); extern void PixelToHIMETRIC(LONG *x, LONG *y); +extern void PixelToHIMETRIC(LONG *x, LONG *y, HDC hdcRef); // Windows convention of the mask is opposed to the wxWidgets one, so we need // to invert the mask each time we pass one/get one to/from Windows @@ -302,6 +315,22 @@ extern HICON wxBitmapToHICON(const wxBitmap& bmp); extern HCURSOR wxBitmapToHCURSOR(const wxBitmap& bmp, int hotSpotX, int hotSpotY); + +#if wxUSE_OWNER_DRAWN + +// Draw the bitmap in specified state (this is used by owner drawn controls) +enum wxDSBStates +{ + wxDSB_NORMAL = 0, + wxDSB_SELECTED, + wxDSB_DISABLED +}; + +extern +BOOL wxDrawStateBitmap(HDC hDC, HBITMAP hBitmap, int x, int y, UINT uState); + +#endif // wxUSE_OWNER_DRAWN + // 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 // @@ -346,7 +375,9 @@ inline RECT wxGetWindowRect(HWND hwnd) RECT rect; if ( !::GetWindowRect(hwnd, &rect) ) - wxLogLastError(_T("GetWindowRect")); + { + wxLogLastError(wxT("GetWindowRect")); + } return rect; } @@ -356,7 +387,9 @@ inline RECT wxGetClientRect(HWND hwnd) RECT rect; if ( !::GetClientRect(hwnd, &rect) ) - wxLogLastError(_T("GetClientRect")); + { + wxLogLastError(wxT("GetClientRect")); + } return rect; } @@ -378,7 +411,7 @@ public: private: HDC m_hdc; - DECLARE_NO_COPY_CLASS(ScreenHDC) + wxDECLARE_NO_COPY_CLASS(ScreenHDC); }; // the same as ScreenHDC but for window DCs @@ -394,7 +427,7 @@ private: HWND m_hwnd; HDC m_hdc; - DECLARE_NO_COPY_CLASS(WindowHDC) + wxDECLARE_NO_COPY_CLASS(WindowHDC); }; // the same as ScreenHDC but for memory DCs: creates the HDC compatible with @@ -410,7 +443,7 @@ public: private: HDC m_hdc; - DECLARE_NO_COPY_CLASS(MemoryHDC) + wxDECLARE_NO_COPY_CLASS(MemoryHDC); }; // a class which selects a GDI object into a DC in its ctor and deselects in @@ -421,12 +454,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; @@ -442,7 +475,7 @@ private: HDC m_hdc; HGDIOBJ m_hgdiobj; - DECLARE_NO_COPY_CLASS(SelectInHDC) + wxDECLARE_NO_COPY_CLASS(SelectInHDC); }; // a class which cleans up any GDI object @@ -455,7 +488,7 @@ protected: void InitGdiobj(HGDIOBJ gdiobj) { - wxASSERT_MSG( !m_gdiobj, _T("initializing twice?") ); + wxASSERT_MSG( !m_gdiobj, wxT("initializing twice?") ); m_gdiobj = gdiobj; } @@ -508,8 +541,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(); } }; @@ -548,7 +586,9 @@ public: : m_hdc(hdc) { if ( !::SelectClipRgn(hdc, hrgn) ) - wxLogLastError(_T("SelectClipRgn")); + { + wxLogLastError(wxT("SelectClipRgn")); + } } ~HDCClipper() @@ -559,7 +599,7 @@ public: private: HDC m_hdc; - DECLARE_NO_COPY_CLASS(HDCClipper) + wxDECLARE_NO_COPY_CLASS(HDCClipper); }; // set the given map mode for the life time of this object @@ -577,7 +617,9 @@ private: { m_modeOld = ::SetMapMode(hdc, mm); if ( !m_modeOld ) - wxLogLastError(_T("SelectClipRgn")); + { + wxLogLastError(wxT("SelectClipRgn")); + } } ~HDCMapModeChanger() @@ -590,29 +632,44 @@ private: HDC m_hdc; int m_modeOld; - DECLARE_NO_COPY_CLASS(HDCMapModeChanger) + wxDECLARE_NO_COPY_CLASS(HDCMapModeChanger); }; #define wxCHANGE_HDC_MAP_MODE(hdc, mm) \ HDCMapModeChanger wxMAKE_UNIQUE_NAME(wxHDCMapModeChanger)(hdc, mm) #endif // __WXWINCE__/!__WXWINCE__ -// smart buffeer using GlobalAlloc/GlobalFree() +// smart pointer using GlobalAlloc/GlobalFree() class GlobalPtr { public: + // default ctor, call Init() later + GlobalPtr() + { + m_hGlobal = NULL; + } + // allocates a block of given size - GlobalPtr(size_t size, unsigned flags = GMEM_MOVEABLE) + void Init(size_t size, unsigned flags = GMEM_MOVEABLE) { m_hGlobal = ::GlobalAlloc(flags, size); if ( !m_hGlobal ) - wxLogLastError(_T("GlobalAlloc")); + { + wxLogLastError(wxT("GlobalAlloc")); + } + } + + GlobalPtr(size_t size, unsigned flags = GMEM_MOVEABLE) + { + Init(size, flags); } ~GlobalPtr() { if ( m_hGlobal && ::GlobalFree(m_hGlobal) ) - wxLogLastError(_T("GlobalFree")); + { + wxLogLastError(wxT("GlobalFree")); + } } // implicit conversion @@ -621,7 +678,7 @@ public: private: HGLOBAL m_hGlobal; - DECLARE_NO_COPY_CLASS(GlobalPtr) + wxDECLARE_NO_COPY_CLASS(GlobalPtr); }; // when working with global pointers (which is unfortunately still necessary @@ -630,35 +687,56 @@ 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")); + { + wxLogLastError(wxT("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 DWORD dwLastError = ::GetLastError(); if ( dwLastError != NO_ERROR ) { - wxLogApiError(_T("GlobalUnlock"), dwLastError); + wxLogApiError(wxT("GlobalUnlock"), dwLastError); } -#endif // __WXDEBUG__ } } + void *Get() const { return m_ptr; } operator void *() const { return m_ptr; } private: HGLOBAL m_hGlobal; void *m_ptr; - DECLARE_NO_COPY_CLASS(GlobalPtrLock) + wxDECLARE_NO_COPY_CLASS(GlobalPtrLock); }; // register the class when it is first needed and unregister it in dtor @@ -679,12 +757,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 { @@ -703,9 +781,9 @@ public: { if ( IsRegistered() ) { - if ( !::UnregisterClass(m_clsname.wx_str(), wxhInstance) ) + if ( !::UnregisterClass(m_clsname.wx_str(), wxGetInstance()) ) { - wxLogLastError(_T("UnregisterClass")); + wxLogLastError(wxT("UnregisterClass")); } } } @@ -747,7 +825,7 @@ private: #define GetHbrushOf(brush) ((HBRUSH)(brush).GetResourceHandle()) #define GetHmenu() ((HMENU)GetHMenu()) -#define GetHmenuOf(menu) ((HMENU)menu->GetHMenu()) +#define GetHmenuOf(menu) ((HMENU)(menu)->GetHMenu()) #define GetHcursor() ((HCURSOR)GetHCURSOR()) #define GetHcursorOf(cursor) ((HCURSOR)(cursor).GetHCURSOR()) @@ -756,7 +834,7 @@ private: #define GetHfontOf(font) ((HFONT)(font).GetHFONT()) #define GetHimagelist() ((HIMAGELIST)GetHIMAGELIST()) -#define GetHimagelistOf(imgl) ((HIMAGELIST)imgl->GetHIMAGELIST()) +#define GetHimagelistOf(imgl) ((HIMAGELIST)(imgl)->GetHIMAGELIST()) #define GetHpalette() ((HPALETTE)GetHPALETTE()) #define GetHpaletteOf(pal) ((HPALETTE)(pal).GetHPALETTE()) @@ -773,13 +851,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) { @@ -791,7 +862,7 @@ inline wxString wxGetFullModuleName(HMODULE hmod) MAX_PATH ) ) { - wxLogLastError(_T("GetModuleFileName")); + wxLogLastError(wxT("GetModuleFileName")); } return fullname; @@ -810,9 +881,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 @@ -832,11 +904,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(); @@ -847,30 +923,33 @@ 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); +// GetCursorPos can fail without populating the POINT. This falls back to GetMessagePos. +WXDLLIMPEXP_CORE void wxGetCursorPosMSW(POINT* pt); -WXDLLEXPORT void wxSliderEvent(WXHWND control, WXWORD wParam, WXWORD pos); -WXDLLEXPORT void wxScrollBarEvent(WXHWND hbar, WXWORD wParam, WXWORD pos); +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); + +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 int 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) @@ -879,26 +958,41 @@ 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); // 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)