📄 window.cpp
字号:
RgnHandle rgn = NewRgn() ;
if ( m_peer->GetRegion( kControlContentMetaPart , rgn ) == noErr )
{
Rect content, structure ;
GetRegionBounds( rgn , &content ) ;
m_peer->GetRect( &structure ) ;
// structure is in parent coordinates, but we only need width and height, so it's ok
sizeTotal.x += (structure.right - structure.left) - (content.right - content.left) ;
sizeTotal.y += (structure.bottom - structure.top) - (content.bottom - content.top) ;
}
DisposeRgn( rgn ) ;
sizeTotal.x += MacGetLeftBorderSize() + MacGetRightBorderSize() ;
sizeTotal.y += MacGetTopBorderSize() + MacGetBottomBorderSize() ;
return sizeTotal;
}
// Get size *available for subwindows* i.e. excluding menu bar etc.
void wxWindowMac::DoGetClientSize( int *x, int *y ) const
{
int ww, hh;
RgnHandle rgn = NewRgn() ;
Rect content ;
if ( m_peer->GetRegion( kControlContentMetaPart , rgn ) == noErr )
GetRegionBounds( rgn , &content ) ;
else
m_peer->GetRect( &content ) ;
DisposeRgn( rgn ) ;
ww = content.right - content.left ;
hh = content.bottom - content.top ;
if (m_hScrollBar && m_hScrollBar->IsShown() )
hh -= m_hScrollBar->GetSize().y ;
if (m_vScrollBar && m_vScrollBar->IsShown() )
ww -= m_vScrollBar->GetSize().x ;
if (x)
*x = ww;
if (y)
*y = hh;
}
bool wxWindowMac::SetCursor(const wxCursor& cursor)
{
if (m_cursor == cursor)
return false;
if (wxNullCursor == cursor)
{
if ( ! wxWindowBase::SetCursor( *wxSTANDARD_CURSOR ) )
return false ;
}
else
{
if ( ! wxWindowBase::SetCursor( cursor ) )
return false ;
}
wxASSERT_MSG( m_cursor.Ok(),
wxT("cursor must be valid after call to the base version"));
wxWindowMac *mouseWin = 0 ;
{
wxTopLevelWindowMac *tlw = MacGetTopLevelWindow() ;
WindowRef window = (WindowRef) ( tlw ? tlw->MacGetWindowRef() : 0 ) ;
CGrafPtr savePort ;
Boolean swapped = QDSwapPort( GetWindowPort( window ) , &savePort ) ;
// TODO: If we ever get a GetCurrentEvent... replacement
// for the mouse position, use it...
Point pt ;
ControlPartCode part ;
ControlRef control ;
GetMouse( &pt ) ;
control = wxMacFindControlUnderMouse( tlw , pt , window , &part ) ;
if ( control )
mouseWin = wxFindControlFromMacControl( control ) ;
if ( swapped )
QDSwapPort( savePort , NULL ) ;
}
if ( mouseWin == this && !wxIsBusy() )
m_cursor.MacInstall() ;
return true ;
}
#if wxUSE_MENUS
bool wxWindowMac::DoPopupMenu(wxMenu *menu, int x, int y)
{
menu->SetInvokingWindow(this);
menu->UpdateUI();
if ( x == wxDefaultCoord && y == wxDefaultCoord )
{
wxPoint mouse = wxGetMousePosition();
x = mouse.x;
y = mouse.y;
}
else
{
ClientToScreen( &x , &y ) ;
}
menu->MacBeforeDisplay( true ) ;
long menuResult = ::PopUpMenuSelect((MenuHandle) menu->GetHMenu() , y, x, 0) ;
if ( HiWord(menuResult) != 0 )
{
MenuCommand macid;
GetMenuItemCommandID( GetMenuHandle(HiWord(menuResult)) , LoWord(menuResult) , &macid );
int id = wxMacCommandToId( macid );
wxMenuItem* item = NULL ;
wxMenu* realmenu ;
item = menu->FindItem( id, &realmenu ) ;
if ( item )
{
if (item->IsCheckable())
item->Check( !item->IsChecked() ) ;
menu->SendEvent( id , item->IsCheckable() ? item->IsChecked() : -1 ) ;
}
}
menu->MacAfterDisplay( true ) ;
menu->SetInvokingWindow( NULL );
return true;
}
#endif
// ----------------------------------------------------------------------------
// tooltips
// ----------------------------------------------------------------------------
#if wxUSE_TOOLTIPS
void wxWindowMac::DoSetToolTip(wxToolTip *tooltip)
{
wxWindowBase::DoSetToolTip(tooltip);
if ( m_tooltip )
m_tooltip->SetWindow(this);
}
#endif
void wxWindowMac::MacInvalidateBorders()
{
if ( m_peer == NULL )
return ;
bool vis = MacIsReallyShown() ;
if ( !vis )
return ;
int outerBorder = MacGetLeftBorderSize() ;
if ( m_peer->NeedsFocusRect() && m_peer->HasFocus() )
outerBorder += 4 ;
if ( outerBorder == 0 )
return ;
// now we know that we have something to do at all
// as the borders are drawn on the parent we have to properly invalidate all these areas
RgnHandle updateInner , updateOuter;
Rect rect ;
// this rectangle is in HIViewCoordinates under OSX and in Window Coordinates under Carbon
updateInner = NewRgn() ;
updateOuter = NewRgn() ;
m_peer->GetRect( &rect ) ;
RectRgn( updateInner, &rect ) ;
InsetRect( &rect , -outerBorder , -outerBorder ) ;
RectRgn( updateOuter, &rect ) ;
DiffRgn( updateOuter, updateInner , updateOuter ) ;
#ifdef __WXMAC_OSX__
GetParent()->m_peer->SetNeedsDisplay( updateOuter ) ;
#else
WindowRef tlw = (WindowRef) MacGetTopLevelWindowRef() ;
if ( tlw )
InvalWindowRgn( tlw , updateOuter ) ;
#endif
DisposeRgn( updateOuter ) ;
DisposeRgn( updateInner ) ;
}
void wxWindowMac::DoMoveWindow(int x, int y, int width, int height)
{
// this is never called for a toplevel window, so we know we have a parent
int former_x , former_y , former_w, former_h ;
// Get true coordinates of former position
DoGetPosition( &former_x , &former_y ) ;
DoGetSize( &former_w , &former_h ) ;
wxWindow *parent = GetParent();
if ( parent )
{
wxPoint pt(parent->GetClientAreaOrigin());
former_x += pt.x ;
former_y += pt.y ;
}
int actualWidth = width ;
int actualHeight = height ;
int actualX = x;
int actualY = y;
if ((m_minWidth != -1) && (actualWidth < m_minWidth))
actualWidth = m_minWidth;
if ((m_minHeight != -1) && (actualHeight < m_minHeight))
actualHeight = m_minHeight;
if ((m_maxWidth != -1) && (actualWidth > m_maxWidth))
actualWidth = m_maxWidth;
if ((m_maxHeight != -1) && (actualHeight > m_maxHeight))
actualHeight = m_maxHeight;
bool doMove = false, doResize = false ;
if ( actualX != former_x || actualY != former_y )
doMove = true ;
if ( actualWidth != former_w || actualHeight != former_h )
doResize = true ;
if ( doMove || doResize )
{
// as the borders are drawn outside the native control, we adjust now
wxRect bounds( wxPoint( actualX + MacGetLeftBorderSize() ,actualY + MacGetTopBorderSize() ),
wxSize( actualWidth - (MacGetLeftBorderSize() + MacGetRightBorderSize()) ,
actualHeight - (MacGetTopBorderSize() + MacGetBottomBorderSize()) ) ) ;
Rect r ;
wxMacRectToNative( &bounds , &r ) ;
if ( !GetParent()->IsTopLevel() )
wxMacWindowToNative( GetParent() , &r ) ;
MacInvalidateBorders() ;
m_cachedClippedRectValid = false ;
m_peer->SetRect( &r ) ;
wxWindowMac::MacSuperChangedPosition() ; // like this only children will be notified
MacInvalidateBorders() ;
MacRepositionScrollBars() ;
if ( doMove )
{
wxPoint point(actualX, actualY);
wxMoveEvent event(point, m_windowId);
event.SetEventObject(this);
GetEventHandler()->ProcessEvent(event) ;
}
if ( doResize )
{
MacRepositionScrollBars() ;
wxSize size(actualWidth, actualHeight);
wxSizeEvent event(size, m_windowId);
event.SetEventObject(this);
GetEventHandler()->ProcessEvent(event);
}
}
}
wxSize wxWindowMac::DoGetBestSize() const
{
if ( m_macIsUserPane || IsTopLevel() )
return wxWindowBase::DoGetBestSize() ;
Rect bestsize = { 0 , 0 , 0 , 0 } ;
int bestWidth, bestHeight ;
m_peer->GetBestRect( &bestsize ) ;
if ( EmptyRect( &bestsize ) )
{
bestsize.left =
bestsize.top = 0 ;
bestsize.right =
bestsize.bottom = 16 ;
if ( IsKindOf( CLASSINFO( wxScrollBar ) ) )
{
bestsize.bottom = 16 ;
}
#if wxUSE_SPINBTN
else if ( IsKindOf( CLASSINFO( wxSpinButton ) ) )
{
bestsize.bottom = 24 ;
}
#endif
else
{
// return wxWindowBase::DoGetBestSize() ;
}
}
bestWidth = bestsize.right - bestsize.left ;
bestHeight = bestsize.bottom - bestsize.top ;
if ( bestHeight < 10 )
bestHeight = 13 ;
return wxSize(bestWidth, bestHeight);
}
// set the size of the window: if the dimensions are positive, just use them,
// but if any of them is equal to -1, it means that we must find the value for
// it ourselves (unless sizeFlags contains wxSIZE_ALLOW_MINUS_ONE flag, in
// which case -1 is a valid value for x and y)
//
// If sizeFlags contains wxSIZE_AUTO_WIDTH/HEIGHT flags (default), we calculate
// the width/height to best suit our contents, otherwise we reuse the current
// width/height
void wxWindowMac::DoSetSize(int x, int y, int width, int height, int sizeFlags)
{
// get the current size and position...
int currentX, currentY;
int currentW, currentH;
GetPosition(¤tX, ¤tY);
GetSize(¤tW, ¤tH);
// ... and don't do anything (avoiding flicker) if it's already ok
if ( x == currentX && y == currentY &&
width == currentW && height == currentH && ( height != -1 && width != -1 ) )
{
// TODO: REMOVE
MacRepositionScrollBars() ; // we might have a real position shift
return;
}
if ( !(sizeFlags & wxSIZE_ALLOW_MINUS_ONE) )
{
if ( x == wxDefaultCoord )
x = currentX;
if ( y == wxDefaultCoord )
y = currentY;
}
AdjustForParentClientOrigin( x, y, sizeFlags );
wxSize size = wxDefaultSize;
if ( width == wxDefaultCoord )
{
if ( sizeFlags & wxSIZE_AUTO_WIDTH )
{
size = DoGetBestSize();
width = size.x;
}
else
{
// just take the current one
width = currentW;
}
}
if ( height == wxDefaultCoord )
{
if ( sizeFlags & wxSIZE_AUTO_HEIGHT )
{
if ( size.x == wxDefaultCoord )
size = DoGetBestSize();
// else: already called DoGetBestSize() above
height = size.y;
}
else
{
// just take the current one
height = currentH;
}
}
DoMoveWindow( x, y, width, height );
}
wxPoint wxWindowMac::GetClientAreaOrigin() const
{
RgnHandle rgn = NewRgn() ;
Rect content ;
if ( m_peer->GetRegion( kControlContentMetaPart , rgn ) == noErr )
{
GetRegionBounds( rgn , &content ) ;
}
else
{
content.left =
content.top = 0 ;
}
DisposeRgn( rgn ) ;
return wxPoint( content.left + MacGetLeftBorderSize() , conte
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -