📄 private.h
字号:
// classes for temporary bitmapsclass AutoHBITMAP : private AutoGDIObject{public: AutoHBITMAP(HBITMAP hbmp) : AutoGDIObject(hbmp) { } operator HBITMAP() const { return (HBITMAP)GetObject(); }};class CompatibleBitmap : public AutoHBITMAP{public: CompatibleBitmap(HDC hdc, int w, int h) : AutoHBITMAP(::CreateCompatibleBitmap(hdc, w, h)) { }};class MonoBitmap : public AutoHBITMAP{public: MonoBitmap(int w, int h) : AutoHBITMAP(::CreateBitmap(w, h, 1, 1, 0)) { }};// class automatically destroys the region objectclass AutoHRGN : private AutoGDIObject{public: AutoHRGN(HRGN hrgn) : AutoGDIObject(hrgn) { } operator HRGN() const { return (HRGN)GetObject(); }};// class sets the specified clipping region during its life timeclass HDCClipper{public: HDCClipper(HDC hdc, HRGN hrgn) : m_hdc(hdc) { if ( !::SelectClipRgn(hdc, hrgn) ) wxLogLastError(_T("SelectClipRgn")); } ~HDCClipper() { ::SelectClipRgn(m_hdc, NULL); }private: HDC m_hdc; DECLARE_NO_COPY_CLASS(HDCClipper)};// set the given map mode for the life time of this object//// NB: SetMapMode() is not supported by CE so we also define a helper macro// to avoid using it there#ifdef __WXWINCE__ #define wxCHANGE_HDC_MAP_MODE(hdc, mm)#else // !__WXWINCE__ class HDCMapModeChanger { public: HDCMapModeChanger(HDC hdc, int mm) : m_hdc(hdc) { m_modeOld = ::SetMapMode(hdc, mm); if ( !m_modeOld ) wxLogLastError(_T("SelectClipRgn")); } ~HDCMapModeChanger() { if ( m_modeOld ) ::SetMapMode(m_hdc, m_modeOld); } private: HDC m_hdc; int m_modeOld; DECLARE_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()class GlobalPtr{public: // allocates a block of given size GlobalPtr(size_t size, unsigned flags = GMEM_MOVEABLE) { m_hGlobal = ::GlobalAlloc(flags, size); if ( !m_hGlobal ) wxLogLastError(_T("GlobalAlloc")); } ~GlobalPtr() { if ( m_hGlobal && ::GlobalFree(m_hGlobal) ) wxLogLastError(_T("GlobalFree")); } // implicit conversion operator HGLOBAL() const { return m_hGlobal; }private: HGLOBAL m_hGlobal; DECLARE_NO_COPY_CLASS(GlobalPtr)};// 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" classclass GlobalPtrLock{public: GlobalPtrLock(HGLOBAL hGlobal) : m_hGlobal(hGlobal) { m_ptr = GlobalLock(hGlobal); if ( !m_ptr ) wxLogLastError(_T("GlobalLock")); } ~GlobalPtrLock() { 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(GlobalPtrLock)};// register the class when it is first needed and unregister it in dtorclass ClassRegistrar{public: // ctor doesn't register the class, call Initialize() for this ClassRegistrar() { m_registered = -1; } // return true if the class is already registered bool IsInitialized() const { return m_registered != -1; } // return true if the class had been already registered bool IsRegistered() const { return m_registered == 1; } // try to register the class if not done yet, return true on success bool Register(const WNDCLASS& wc) { // we should only be called if we hadn't been initialized yet wxASSERT_MSG( m_registered == -1, _T("calling ClassRegistrar::Register() twice?") ); m_registered = ::RegisterClass(&wc) ? 1 : 0; if ( !IsRegistered() ) { wxLogLastError(_T("RegisterClassEx()")); } else { m_clsname = wc.lpszClassName; } return m_registered == 1; } // get the name of the registered class (returns empty string if not // registered) const wxString& GetName() const { return m_clsname; } // unregister the class if it had been registered ~ClassRegistrar() { if ( IsRegistered() ) { if ( !::UnregisterClass(m_clsname, wxhInstance) ) { wxLogLastError(_T("UnregisterClass")); } } }private: // initial value is -1 which means that we hadn't tried registering the // class yet, it becomes true or false (1 or 0) when Initialize() is called int m_registered; // the name of the class, only non empty if it had been registered wxString m_clsname;};// ---------------------------------------------------------------------------// macros to make casting between WXFOO and FOO a bit easier: the GetFoo()// returns Foo cast to the Windows type for oruselves, while GetFooOf() takes// an argument which should be a pointer or reference to the object of the// corresponding class (this depends on the macro)// ---------------------------------------------------------------------------#define GetHwnd() ((HWND)GetHWND())#define GetHwndOf(win) ((HWND)((win)->GetHWND()))// old name#define GetWinHwnd GetHwndOf#define GetHdc() ((HDC)GetHDC())#define GetHdcOf(dc) ((HDC)(dc).GetHDC())#define GetHbitmap() ((HBITMAP)GetHBITMAP())#define GetHbitmapOf(bmp) ((HBITMAP)(bmp).GetHBITMAP())#define GetHicon() ((HICON)GetHICON())#define GetHiconOf(icon) ((HICON)(icon).GetHICON())#define GetHaccel() ((HACCEL)GetHACCEL())#define GetHaccelOf(table) ((HACCEL)((table).GetHACCEL()))#define GetHbrush() ((HBRUSH)GetResourceHandle())#define GetHbrushOf(brush) ((HBRUSH)(brush).GetResourceHandle())#define GetHmenu() ((HMENU)GetHMenu())#define GetHmenuOf(menu) ((HMENU)menu->GetHMenu())#define GetHcursor() ((HCURSOR)GetHCURSOR())#define GetHcursorOf(cursor) ((HCURSOR)(cursor).GetHCURSOR())#define GetHfont() ((HFONT)GetHFONT())#define GetHfontOf(font) ((HFONT)(font).GetHFONT())#define GetHimagelist() ((HIMAGELIST)GetHIMAGELIST())#define GetHimagelistOf(imgl) ((HIMAGELIST)imgl->GetHIMAGELIST())#define GetHpalette() ((HPALETTE)GetHPALETTE())#define GetHpaletteOf(pal) ((HPALETTE)(pal).GetHPALETTE())#define GetHpen() ((HPEN)GetResourceHandle())#define GetHpenOf(pen) ((HPEN)(pen).GetResourceHandle())#define GetHrgn() ((HRGN)GetHRGN())#define GetHrgnOf(rgn) ((HRGN)(rgn).GetHRGN())#endif // wxUSE_GUI// ---------------------------------------------------------------------------// global functions// ---------------------------------------------------------------------------extern "C"{ WXDLLIMPEXP_BASE HINSTANCE wxGetInstance();}WXDLLIMPEXP_BASE void wxSetInstance(HINSTANCE hInst);// return the full path of the given moduleinline wxString wxGetFullModuleName(HMODULE hmod){ wxString fullname; if ( !::GetModuleFileName ( hmod, wxStringBuffer(fullname, MAX_PATH), MAX_PATH ) ) { wxLogLastError(_T("GetModuleFileName")); } return fullname;}// return the full path of the program fileinline wxString wxGetFullModuleName(){ return wxGetFullModuleName((HMODULE)wxGetInstance());}// return the run-time version of the OS in a format similar to// WINVER/_WIN32_WINNT compile-time macros://// 0x0300 Windows NT 3.51// 0x0400 Windows 95, NT4// 0x0410 Windows 98// 0x0500 Windows ME, 2000// 0x0501 Windows XP// 0x0502 Windows 2003// 0x0600 Longhorn//// for the other Windows versions 0 is currently returnedenum wxWinVersion{ wxWinVersion_Unknown = 0, wxWinVersion_3 = 0x0300, wxWinVersion_NT3 = wxWinVersion_3, wxWinVersion_4 = 0x0400, wxWinVersion_95 = wxWinVersion_4, wxWinVersion_NT4 = wxWinVersion_4, wxWinVersion_98 = 0x0410, wxWinVersion_5 = 0x0500, wxWinVersion_ME = wxWinVersion_5, wxWinVersion_NT5 = wxWinVersion_5, wxWinVersion_2000 = wxWinVersion_5, wxWinVersion_XP = 0x0501, wxWinVersion_2003 = 0x0502, wxWinVersion_6 = 0x0600, wxWinVersion_NT6 = 0x0600};WXDLLIMPEXP_BASE wxWinVersion wxGetWinVersion();#if wxUSE_GUI// cursor stuffextern HCURSOR wxGetCurrentBusyCursor(); // from msw/utils.cppextern const wxCursor *wxGetGlobalCursor(); // from msw/cursor.cppWXDLLEXPORT 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);WXDLLEXPORT void wxSliderEvent(WXHWND control, WXWORD wParam, WXWORD pos);WXDLLEXPORT void wxScrollBarEvent(WXHWND hbar, WXWORD wParam, WXWORD pos);// Find maximum size of window/rectangleextern WXDLLEXPORT void wxFindMaxSize(WXHWND hwnd, RECT *rect);// Safely get the window text (i.e. without using fixed size buffer)extern WXDLLEXPORT wxString wxGetWindowText(WXHWND hWnd);// get the window class nameextern WXDLLEXPORT 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);// check if hWnd's WNDPROC is wndProc. Return true if yes, false if they are// differentextern WXDLLEXPORT 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;}// ----------------------------------------------------------------------------// 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 otherwiseextern WXDLLEXPORT 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.//// returns the wxWindow corresponding to the given HWND or NULL.extern WXDLLEXPORT wxWindow *wxGetWindowFromHWND(WXHWND hwnd);// Get the size of an iconextern WXDLLEXPORT wxSize wxGetHiconSize(HICON hicon);// Lines are drawn differently for WinCE and regular WIN32WXDLLEXPORT 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 brushinline void wxFillRect(HWND hwnd, HDC hdc, HBRUSH hbr){ RECT rc; ::GetClientRect(hwnd, &rc); ::FillRect(hdc, &rc, hbr);}// ----------------------------------------------------------------------------// 32/64 bit helpers// ----------------------------------------------------------------------------#ifdef __WIN64__inline void *wxGetWindowProc(HWND hwnd){ return (void *)::GetWindowLongPtr(hwnd, GWLP_WNDPROC);}inline void *wxGetWindowUserData(HWND hwnd){ return (void *)::GetWindowLongPtr(hwnd, GWLP_USERDATA);}inline WNDPROC wxSetWindowProc(HWND hwnd, WNDPROC func){ return (WNDPROC)::SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR)func);}inline void *wxSetWindowUserData(HWND hwnd, void *data){ return (void *)::SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)data);}#else // __WIN32__// note that the casts to LONG_PTR here are required even on 32-bit machines// for the 64-bit warning mode of later versions of MSVC (C4311/4312)inline WNDPROC wxGetWindowProc(HWND hwnd){ return (WNDPROC)(LONG_PTR)::GetWindowLong(hwnd, GWL_WNDPROC);}inline void *wxGetWindowUserData(HWND hwnd){ return (void *)(LONG_PTR)::GetWindowLong(hwnd, GWL_USERDATA);}inline WNDPROC wxSetWindowProc(HWND hwnd, WNDPROC func){ return (WNDPROC)(LONG_PTR)::SetWindowLong(hwnd, GWL_WNDPROC, (LONG_PTR)func);}inline void *wxSetWindowUserData(HWND hwnd, void *data){ return (void *)(LONG_PTR)::SetWindowLong(hwnd, GWL_USERDATA, (LONG_PTR)data);}#endif // __WIN64__/__WIN32__#endif // wxUSE_GUI#endif // _WX_PRIVATE_H_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -