📄 toplevel.cpp
字号:
case kEventWindowShown :
toplevelWindow->Refresh() ;
result = noErr ;
break ;
case kEventWindowClose :
toplevelWindow->Close() ;
result = noErr ;
break ;
case kEventWindowBoundsChanged :
err = GetEventParameter( event, kEventParamAttributes, typeUInt32,
NULL, sizeof( UInt32 ), NULL, &attributes );
if ( err == noErr )
{
Rect newContentRect ;
GetEventParameter( event, kEventParamCurrentBounds, typeQDRectangle, NULL,
sizeof( newContentRect ), NULL, &newContentRect );
toplevelWindow->SetSize( newContentRect.left , newContentRect.top ,
newContentRect.right - newContentRect.left ,
newContentRect.bottom - newContentRect.top, wxSIZE_USE_EXISTING);
result = noErr;
}
break ;
case kEventWindowBoundsChanging :
err = GetEventParameter( event, kEventParamAttributes, typeUInt32,
NULL, sizeof( UInt32 ), NULL, &attributes );
if ( err == noErr )
{
Rect newContentRect ;
GetEventParameter( event, kEventParamCurrentBounds, typeQDRectangle, NULL,
sizeof( newContentRect ), NULL, &newContentRect );
wxSize formerSize = toplevelWindow->GetSize() ;
if ( (attributes & kWindowBoundsChangeSizeChanged ) ||
( attributes & kWindowBoundsChangeOriginChanged ) )
toplevelWindow->SetSize( newContentRect.left , newContentRect.top ,
newContentRect.right - newContentRect.left ,
newContentRect.bottom - newContentRect.top, wxSIZE_USE_EXISTING);
int x , y , w , h ;
toplevelWindow->GetPosition( &x , &y ) ;
toplevelWindow->GetSize( &w , &h ) ;
Rect adjustedRect = { y , x , y + h , x + w } ;
if ( !EqualRect( &newContentRect , &adjustedRect ) )
{
SetEventParameter( event , kEventParamCurrentBounds , typeQDRectangle, sizeof( adjustedRect ) , &adjustedRect ) ;
}
if ( toplevelWindow->GetSize() != formerSize )
toplevelWindow->Update() ;
result = noErr ;
}
break ;
default :
break ;
}
return result ;
}
pascal OSStatus wxMacWindowEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
{
OSStatus result = eventNotHandledErr ;
switch ( GetEventClass( event ) )
{
case kEventClassKeyboard :
result = KeyboardEventHandler( handler, event , data ) ;
break ;
case kEventClassTextInput :
result = TextInputEventHandler( handler, event , data ) ;
break ;
case kEventClassWindow :
result = WindowEventHandler( handler, event , data ) ;
break ;
case kEventClassMouse :
result = MouseEventHandler( handler, event , data ) ;
break ;
default :
break ;
}
return result ;
}
DEFINE_ONE_SHOT_HANDLER_GETTER( wxMacWindowEventHandler )
#endif
// ---------------------------------------------------------------------------
// wxWindowMac utility functions
// ---------------------------------------------------------------------------
// Find an item given the Macintosh Window Reference
wxList *wxWinMacWindowList = NULL;
wxTopLevelWindowMac *wxFindWinFromMacWindow(WXWindow inWindowRef)
{
if ( wxWinMacWindowList == NULL )
return NULL ;
wxNode *node = wxWinMacWindowList->Find((long)inWindowRef);
if (!node)
return NULL;
return (wxTopLevelWindowMac *)node->GetData();
}
void wxAssociateWinWithMacWindow(WindowRef inWindowRef, wxTopLevelWindowMac *win);
void wxAssociateWinWithMacWindow(WindowRef inWindowRef, wxTopLevelWindowMac *win)
{
// adding NULL WindowRef is (first) surely a result of an error and
// (secondly) breaks menu command processing
wxCHECK_RET( inWindowRef != (WindowRef) NULL, wxT("attempt to add a NULL WindowRef to window list") );
if ( !wxWinMacWindowList->Find((long)inWindowRef) )
wxWinMacWindowList->Append((long)inWindowRef, win);
}
void wxRemoveMacWindowAssociation(wxTopLevelWindowMac *win)
{
wxWinMacWindowList->DeleteObject(win);
}
// ----------------------------------------------------------------------------
// wxTopLevelWindowMac creation
// ----------------------------------------------------------------------------
WXWindow wxTopLevelWindowMac::s_macWindowInUpdate = NULL;
wxTopLevelWindowMac *wxTopLevelWindowMac::s_macDeactivateWindow = NULL;
bool wxTopLevelWindowMac::s_macWindowCompositing = false;
void wxTopLevelWindowMac::Init()
{
m_iconized =
m_maximizeOnShow = false;
m_macNoEraseUpdateRgn = NewRgn() ;
m_macNeedsErasing = false ;
m_macWindow = NULL ;
m_macUsesCompositing = false ;
#if TARGET_CARBON
m_macEventHandler = NULL ;
#endif
}
class wxMacDeferredWindowDeleter : public wxObject
{
public :
wxMacDeferredWindowDeleter( WindowRef windowRef )
{
m_macWindow = windowRef ;
}
virtual ~wxMacDeferredWindowDeleter()
{
UMADisposeWindow( (WindowRef) m_macWindow ) ;
}
protected :
WindowRef m_macWindow ;
} ;
bool wxTopLevelWindowMac::Create(wxWindow *parent,
wxWindowID id,
const wxString& title,
const wxPoint& pos,
const wxSize& size,
long style,
const wxString& name)
{
// init our fields
Init();
m_windowStyle = style;
SetName(name);
m_windowId = id == -1 ? NewControlId() : id;
wxTopLevelWindows.Append(this);
if ( parent )
parent->AddChild(this);
return true;
}
wxTopLevelWindowMac::~wxTopLevelWindowMac()
{
if ( m_macWindow )
{
wxToolTip::NotifyWindowDelete(m_macWindow) ;
wxPendingDelete.Append( new wxMacDeferredWindowDeleter( (WindowRef) m_macWindow ) ) ;
}
#if TARGET_CARBON
if ( m_macEventHandler )
{
::RemoveEventHandler((EventHandlerRef) m_macEventHandler);
m_macEventHandler = NULL ;
}
#endif
wxRemoveMacWindowAssociation( this ) ;
if ( wxModelessWindows.Find(this) )
wxModelessWindows.DeleteObject(this);
DisposeRgn( (RgnHandle) m_macNoEraseUpdateRgn ) ;
}
// ----------------------------------------------------------------------------
// wxTopLevelWindowMac maximize/minimize
// ----------------------------------------------------------------------------
void wxTopLevelWindowMac::Maximize(bool maximize)
{
wxMacPortStateHelper help( (GrafPtr) GetWindowPort( (WindowRef) m_macWindow) ) ;
wxMacWindowClipper clip (this);
ZoomWindow( (WindowRef)m_macWindow , maximize ? inZoomOut : inZoomIn , false ) ;
Rect tempRect ;
GrafPtr port ;
GetPort( &port ) ;
Point pt = { 0, 0 } ;
SetPortWindowPort((WindowRef)m_macWindow) ;
LocalToGlobal( &pt ) ;
SetPort( port ) ;
GetWindowPortBounds((WindowRef)m_macWindow, &tempRect ) ;
SetSize( pt.h , pt.v , tempRect.right-tempRect.left ,
tempRect.bottom-tempRect.top, wxSIZE_USE_EXISTING);
}
bool wxTopLevelWindowMac::IsMaximized() const
{
return IsWindowInStandardState( (WindowRef)m_macWindow , NULL , NULL ) ;
}
void wxTopLevelWindowMac::Iconize(bool iconize)
{
if ( IsWindowCollapsable((WindowRef)m_macWindow) )
CollapseWindow((WindowRef)m_macWindow , iconize ) ;
}
bool wxTopLevelWindowMac::IsIconized() const
{
return IsWindowCollapsed((WindowRef)m_macWindow ) ;
}
void wxTopLevelWindowMac::Restore()
{
// not available on mac
}
// ----------------------------------------------------------------------------
// wxTopLevelWindowMac misc
// ----------------------------------------------------------------------------
void wxTopLevelWindowMac::SetIcon(const wxIcon& icon)
{
// this sets m_icon
wxTopLevelWindowBase::SetIcon(icon);
}
void wxTopLevelWindowMac::MacCreateRealWindow( const wxString& title,
const wxPoint& pos,
const wxSize& size,
long style,
const wxString& name )
{
OSStatus err = noErr ;
SetName(name);
m_windowStyle = style;
m_isShown = false;
// create frame.
Rect theBoundsRect;
m_x = (int)pos.x;
m_y = (int)pos.y;
if ( m_y < 50 )
m_y = 50 ;
if ( m_x < 20 )
m_x = 20 ;
m_width = WidthDefault(size.x);
m_height = HeightDefault(size.y);
::SetRect(&theBoundsRect, m_x, m_y , m_x + m_width, m_y + m_height);
// translate the window attributes in the appropriate window class and attributes
WindowClass wclass = 0;
WindowAttributes attr = kWindowNoAttributes ;
if ( HasFlag( wxFRAME_TOOL_WINDOW) )
{
if (
HasFlag( wxMINIMIZE_BOX ) || HasFlag( wxMAXIMIZE_BOX ) ||
HasFlag( wxSYSTEM_MENU ) || HasFlag( wxCAPTION ) ||
HasFlag(wxTINY_CAPTION_HORIZ) || HasFlag(wxTINY_CAPTION_VERT)
)
{
wclass = kFloatingWindowClass ;
if ( HasFlag(wxTINY_CAPTION_VERT) )
{
attr |= kWindowSideTitlebarAttribute ;
}
}
else
{
#if TARGET_CARBON
wclass = kPlainWindowClass ;
#else
wclass = kFloatingWindowClass ;
#endif
}
}
else if ( HasFlag( wxCAPTION ) )
{
wclass = kDocumentWindowClass ;
}
else
{
if ( HasFlag( wxMINIMIZE_BOX ) || HasFlag( wxMAXIMIZE_BOX ) ||
HasFlag( wxCLOSE_BOX ) || HasFlag( wxSYSTEM_MENU ) )
{
wclass = kDocumentWindowClass ;
}
else
{
#if TARGET_CARBON
wclass = kPlainWindowClass ;
#else
wclass = kModalWindowClass ;
#endif
}
}
if ( HasFlag( wxMINIMIZE_BOX ) )
{
attr |= kWindowCollapseBoxAttribute ;
}
if ( HasFlag( wxMAXIMIZE_BOX ) )
{
attr |= kWindowFullZoomAttribute ;
}
if ( HasFlag( wxRESIZE_BORDER ) )
{
attr |= kWindowResizableAttribute ;
}
if ( HasFlag( wxCLOSE_BOX) )
{
attr |= kWindowCloseBoxAttribute ;
}
if (UMAGetSystemVersion() >= 0x1000)
{
//turn on live resizing (OS X only)
attr |= kWindowLiveResizeAttribute;
}
#if TARGET_CARBON
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -