📄 toplevel.cpp
字号:
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 + -