📄 toplevel.cpp
字号:
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)
{
WindowRef handle = GetControlOwner((OpaqueControlRef*)GetHandle());
OSStatus result = SetWindowAlpha(handle, 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_macUsesCompositing && 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
wxASSERT_MSG( m_macUsesCompositing ,
wxT("Cannot set metal appearance on a non-compositing window") ) ;
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 TARGET_API_MAC_OSX
if ( m_macUsesCompositing )
{
#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 ;
UInt32 currentEventKind = 0 ;
if ( currentEvent != NULL )
{
currentEventClass = ::GetEventClass( currentEvent ) ;
currentEventKind = ::GetEventKind( currentEvent ) ;
}
if ( currentEventClass != kEventClassMenu )
{
// when tracking a menu, strange redraw errors occur if we flush now, so leave..
EventRef theEvent;
OSStatus status = noErr ;
status = ReceiveNextEvent( 0 , NULL , kEventDurationNoWait , false , &theEvent ) ;
}
}
}
else
#endif
{
BeginUpdate( (WindowRef) m_macWindow ) ;
RgnHandle updateRgn = NewRgn();
if ( updateRgn )
{
GetPortVisibleRegion( GetWindowPort( (WindowRef)m_macWindow ), updateRgn );
UpdateControls( (WindowRef)m_macWindow , updateRgn ) ;
// if ( !EmptyRgn( updateRgn ) )
// MacDoRedraw( updateRgn , 0 , true) ;
DisposeRgn( updateRgn );
}
EndUpdate( (WindowRef)m_macWindow ) ;
QDFlushPortBuffer( GetWindowPort( (WindowRef)m_macWindow ) , NULL ) ;
}
}
// 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(), (SInt32)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->left, inRect->top };
QDLocalToGlobalPoint( GetWindowPort(window), &pt ) ;
inRect->top = pt.v;
inRect->left = pt.h;
inRect->bottom += pt.v;
inRect->right += 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 + -