⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 private.h

📁 很牛的GUI源码wxWidgets-2.8.0.zip 可在多种平台下运行.
💻 H
📖 第 1 页 / 共 2 页
字号:
// 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 + -