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

📄 toplevel.cpp

📁 很牛的GUI源码wxWidgets-2.8.0.zip 可在多种平台下运行.
💻 CPP
📖 第 1 页 / 共 4 页
字号:
        if ( plainTransition )           ::HideWindow( (WindowRef)m_macWindow );        else           ::TransitionWindow( (WindowRef)m_macWindow, kWindowZoomTransitionEffect, kWindowHideTransitionAction, NULL );    }    MacPropagateVisibilityChanged() ;    return true ;}bool wxTopLevelWindowMac::ShowFullScreen(bool show, long style){    if ( show )    {        FullScreenData *data = (FullScreenData *)m_macFullScreenData ;        delete data ;        data = new FullScreenData() ;        m_macFullScreenData = data ;        data->m_position = GetPosition() ;        data->m_size = GetSize() ;        data->m_wasResizable = MacGetWindowAttributes() & kWindowResizableAttribute ;        if ( style & wxFULLSCREEN_NOMENUBAR )            HideMenuBar() ;        wxRect client = wxGetClientDisplayRect() ;        int left , top , right , bottom ;        int x, y, w, h ;        x = client.x ;        y = client.y ;        w = client.width ;        h = client.height ;        MacGetContentAreaInset( left , top , right , bottom ) ;        if ( style & wxFULLSCREEN_NOCAPTION )        {            y -= top ;            h += top ;        }        if ( style & wxFULLSCREEN_NOBORDER )        {            x -= left ;            w += left + right ;            h += bottom ;        }        if ( style & wxFULLSCREEN_NOTOOLBAR )        {            // TODO        }        if ( style & wxFULLSCREEN_NOSTATUSBAR )        {            // TODO        }        SetSize( x , y , w, h ) ;        if ( data->m_wasResizable )            MacChangeWindowAttributes( kWindowNoAttributes , kWindowResizableAttribute ) ;    }    else    {        ShowMenuBar() ;        FullScreenData *data = (FullScreenData *) m_macFullScreenData ;        if ( data->m_wasResizable )            MacChangeWindowAttributes( kWindowResizableAttribute ,  kWindowNoAttributes ) ;        SetPosition( data->m_position ) ;        SetSize( data->m_size ) ;        delete data ;        m_macFullScreenData = NULL ;    }    return false;}bool wxTopLevelWindowMac::IsFullScreen() const{    return m_macFullScreenData != NULL ;}bool wxTopLevelWindowMac::SetTransparent(wxByte alpha){    OSStatus result = SetWindowAlpha((WindowRef)m_macWindow, float(alpha)/255.0);    return result == noErr;}bool wxTopLevelWindowMac::CanSetTransparent(){    return true;}void wxTopLevelWindowMac::SetExtraStyle(long exStyle){    if ( GetExtraStyle() == exStyle )        return ;    wxTopLevelWindowBase::SetExtraStyle( exStyle ) ;#if TARGET_API_MAC_OSX    if ( m_macWindow != NULL )    {        bool metal = GetExtraStyle() & wxFRAME_EX_METAL ;        if ( MacGetMetalAppearance() != metal )            MacSetMetalAppearance( metal ) ;    }#endif}// TODO: switch to structure bounds -// we are still using coordinates of the content view//void wxTopLevelWindowMac::MacGetContentAreaInset( int &left , int &top , int &right , int &bottom ){    Rect content, structure ;    GetWindowBounds( (WindowRef) m_macWindow, kWindowStructureRgn , &structure ) ;    GetWindowBounds( (WindowRef) m_macWindow, kWindowContentRgn , &content ) ;    left = content.left - structure.left ;    top = content.top  - structure.top ;    right = structure.right - content.right ;    bottom = structure.bottom - content.bottom ;}void wxTopLevelWindowMac::DoMoveWindow(int x, int y, int width, int height){    m_cachedClippedRectValid = false ;    Rect bounds = { y , x , y + height , x + width } ;    verify_noerr(SetWindowBounds( (WindowRef) m_macWindow, kWindowStructureRgn , &bounds )) ;    wxWindowMac::MacSuperChangedPosition() ; // like this only children will be notified}void wxTopLevelWindowMac::DoGetPosition( int *x, int *y ) const{    Rect bounds ;    verify_noerr(GetWindowBounds((WindowRef) m_macWindow, kWindowStructureRgn , &bounds )) ;    if (x)       *x = bounds.left ;    if (y)       *y = bounds.top ;}void wxTopLevelWindowMac::DoGetSize( int *width, int *height ) const{    Rect bounds ;    verify_noerr(GetWindowBounds((WindowRef) m_macWindow, kWindowStructureRgn , &bounds )) ;    if (width)       *width = bounds.right - bounds.left ;    if (height)       *height = bounds.bottom - bounds.top ;}void wxTopLevelWindowMac::DoGetClientSize( int *width, int *height ) const{    Rect bounds ;    verify_noerr(GetWindowBounds((WindowRef) m_macWindow, kWindowContentRgn , &bounds )) ;    if (width)       *width = bounds.right - bounds.left ;    if (height)       *height = bounds.bottom - bounds.top ;}void wxTopLevelWindowMac::MacSetMetalAppearance( bool set ){#if TARGET_API_MAC_OSX    MacChangeWindowAttributes( set ? kWindowMetalAttribute : kWindowNoAttributes ,        set ? kWindowNoAttributes : kWindowMetalAttribute ) ;#endif}bool wxTopLevelWindowMac::MacGetMetalAppearance() const{#if TARGET_API_MAC_OSX    return MacGetWindowAttributes() & kWindowMetalAttribute ;#else    return false ;#endif}void wxTopLevelWindowMac::MacChangeWindowAttributes( wxUint32 attributesToSet , wxUint32 attributesToClear ){    ChangeWindowAttributes( (WindowRef)m_macWindow, attributesToSet, attributesToClear ) ;}wxUint32 wxTopLevelWindowMac::MacGetWindowAttributes() const{    UInt32 attr = 0 ;    GetWindowAttributes( (WindowRef) m_macWindow, &attr ) ;    return attr ;}void wxTopLevelWindowMac::MacPerformUpdates(){#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3    // for composited windows this also triggers a redraw of all    // invalid views in the window    if ( UMAGetSystemVersion() >= 0x1030 )        HIWindowFlush((WindowRef) m_macWindow) ;    else#endif    {        // the only way to trigger the redrawing on earlier systems is to call        // ReceiveNextEvent        EventRef currentEvent = (EventRef) wxTheApp->MacGetCurrentEvent() ;        UInt32 currentEventClass = 0 ;        if ( currentEvent != NULL )        {            currentEventClass = ::GetEventClass( currentEvent ) ;            ::GetEventKind( currentEvent ) ;        }        if ( currentEventClass != kEventClassMenu )        {            // when tracking a menu, strange redraw errors occur if we flush now, so leave..            EventRef theEvent;            ReceiveNextEvent( 0 , NULL , kEventDurationNoWait , false , &theEvent ) ;        }    }}// Attracts the users attention to this window if the application is// inactive (should be called when a background event occurs)static pascal void wxMacNMResponse( NMRecPtr ptr ){    NMRemove( ptr ) ;    DisposePtr( (Ptr)ptr ) ;}void wxTopLevelWindowMac::RequestUserAttention(int flags ){    NMRecPtr notificationRequest = (NMRecPtr) NewPtr( sizeof( NMRec) ) ;    static wxMacNMUPP nmupp( wxMacNMResponse );    memset( notificationRequest , 0 , sizeof(*notificationRequest) ) ;    notificationRequest->qType = nmType ;    notificationRequest->nmMark = 1 ;    notificationRequest->nmIcon = 0 ;    notificationRequest->nmSound = 0 ;    notificationRequest->nmStr = NULL ;    notificationRequest->nmResp = nmupp ;    verify_noerr( NMInstall( notificationRequest ) ) ;}// ---------------------------------------------------------------------------// Shape implementation// ---------------------------------------------------------------------------bool wxTopLevelWindowMac::SetShape(const wxRegion& region){    wxCHECK_MSG( HasFlag(wxFRAME_SHAPED), false,                 _T("Shaped windows must be created with the wxFRAME_SHAPED style."));    // The empty region signifies that the shape    // should be removed from the window.    if ( region.IsEmpty() )    {        wxSize sz = GetClientSize();        wxRegion rgn(0, 0, sz.x, sz.y);        if ( rgn.IsEmpty() )            return false ;        else            return SetShape(rgn);    }    // Make a copy of the region    RgnHandle  shapeRegion = NewRgn();    CopyRgn( (RgnHandle)region.GetWXHRGN(), shapeRegion );    // Dispose of any shape region we may already have    RgnHandle oldRgn = (RgnHandle)GetWRefCon( (WindowRef)MacGetWindowRef() );    if ( oldRgn )        DisposeRgn(oldRgn);    // Save the region so we can use it later    SetWRefCon((WindowRef)MacGetWindowRef(), (URefCon)shapeRegion);    // inform the window manager that the window has changed shape    ReshapeCustomWindow((WindowRef)MacGetWindowRef());    return true;}// ---------------------------------------------------------------------------// Support functions for shaped windows, based on Apple's CustomWindow sample at// http://developer.apple.com/samplecode/Sample_Code/Human_Interface_Toolbox/Mac_OS_High_Level_Toolbox/CustomWindow.htm// ---------------------------------------------------------------------------static void wxShapedMacWindowGetPos(WindowRef window, Rect* inRect){    GetWindowPortBounds(window, inRect);    Point pt = { inRect->top ,inRect->left };    wxMacLocalToGlobal( window, &pt ) ;    inRect->bottom += pt.v - inRect->top;    inRect->right += pt.h - inRect->left;    inRect->top = pt.v;    inRect->left = pt.h;}static SInt32 wxShapedMacWindowGetFeatures(WindowRef window, SInt32 param){    /*------------------------------------------------------        Define which options your custom window supports.    --------------------------------------------------------*/    //just enable everything for our demo    *(OptionBits*)param =        //kWindowCanGrow |        //kWindowCanZoom |        //kWindowCanCollapse |        //kWindowCanGetWindowRegion |        //kWindowHasTitleBar |        //kWindowSupportsDragHilite |        kWindowCanDrawInCurrentPort |        //kWindowCanMeasureTitle |        kWindowWantsDisposeAtProcessDeath |        kWindowSupportsGetGrowImageRegion |        kWindowDefSupportsColorGrafPort;    return 1;}// The content region is left as a rectangle matching the window size, this is// so the origin in the paint event, and etc. still matches what the// programmer expects.static void wxShapedMacWindowContentRegion(WindowRef window, RgnHandle rgn){    SetEmptyRgn(rgn);    wxTopLevelWindowMac* win = wxFindWinFromMacWindow(window);    if (win)    {        Rect r ;        wxShapedMacWindowGetPos( window, &r ) ;        RectRgn( rgn , &r ) ;    }}// The structure region is set to the shape given to the SetShape method.static void wxShapedMacWindowStructureRegion(WindowRef window, RgnHandle rgn){    RgnHandle cachedRegion = (RgnHandle) GetWRefCon(window);    SetEmptyRgn(rgn);    if (cachedRegion)    {        Rect windowRect;        wxShapedMacWindowGetPos(window, &windowRect);    // how big is the window        CopyRgn(cachedRegion, rgn);                      // make a copy of our cached region        OffsetRgn(rgn, windowRect.left, windowRect.top); // position it over window        //MapRgn(rgn, &mMaskSize, &windowRect);          //scale it to our actual window size    }}static SInt32 wxShapedMacWindowGetRegion(WindowRef window, SInt32 param){    GetWindowRegionPtr rgnRec = (GetWindowRegionPtr)param;    if (rgnRec == NULL)        return paramErr;    switch (rgnRec->regionCode)    {        case kWindowStructureRgn:            wxShapedMacWindowStructureRegion(window, rgnRec->winRgn);            break;        case kWindowContentRgn:            wxShapedMacWindowContentRegion(window, rgnRec->winRgn);            break;        default:            SetEmptyRgn(rgnRec->winRgn);            break;    }    return noErr;}// Determine the region of the window which was hit//static SInt32 wxShapedMacWindowHitTest(WindowRef window, SInt32 param){    Point hitPoint;    static RgnHandle tempRgn = NULL;    if (tempRgn == NULL)        tempRgn = NewRgn();    // get the point clicked    SetPt( &hitPoint, LoWord(param), HiWord(param) );     // Mac OS 8.5 or later    wxShapedMacWindowStructureRegion(window, tempRgn);    if (PtInRgn( hitPoint, tempRgn )) //in window content region?        return wInContent;    // no significant area was hit    return wNoHit;}static pascal long wxShapedMacWindowDef(short varCode, WindowRef window, SInt16 message, SInt32 param){    switch (message)    {        case kWindowMsgHitTest:            return wxShapedMacWindowHitTest(window, param);        case kWindowMsgGetFeatures:            return wxShapedMacWindowGetFeatures(window, param);        // kWindowMsgGetRegion is sent during CreateCustomWindow and ReshapeCustomWindow        case kWindowMsgGetRegion:            return wxShapedMacWindowGetRegion(window, param);        default:            break;    }    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -