📄 window.cpp
字号:
/////////////////////////////////////////////////////////////////////////////// Name: src/mac/classic/window.cpp// Purpose: wxWindowMac// Author: Stefan Csomor// Modified by:// Created: 1998-01-01// RCS-ID: $Id: window.cpp,v 1.31 2006/06/19 07:12:39 ABX Exp $// Copyright: (c) Stefan Csomor// Licence: wxWindows licence/////////////////////////////////////////////////////////////////////////////#include "wx/wxprec.h"#include "wx/window.h"#ifndef WX_PRECOMP #include "wx/log.h" #include "wx/app.h" #include "wx/utils.h" #include "wx/panel.h" #include "wx/frame.h" #include "wx/dc.h" #include "wx/dcclient.h" #include "wx/button.h" #include "wx/menu.h" #include "wx/dialog.h" #include "wx/settings.h" #include "wx/msgdlg.h" #include "wx/scrolbar.h" #include "wx/statbox.h" #include "wx/listbox.h" #include "wx/layout.h" #include "wx/statusbr.h" #include "wx/menuitem.h"#endif#include "wx/notebook.h"#include "wx/tabctrl.h"#include "wx/tooltip.h"#include "wx/spinctrl.h"#include "wx/geometry.h"#if wxUSE_CARET #include "wx/caret.h"#endif // wxUSE_CARET#define wxWINDOW_HSCROLL 5998#define wxWINDOW_VSCROLL 5997#define MAC_SCROLLBAR_SIZE 16#include "wx/mac/uma.h"#ifndef __DARWIN__#include <Windows.h>#include <ToolUtils.h>#endif#if wxUSE_DRAG_AND_DROP#include "wx/dnd.h"#endif#include <string.h>wxWindowMac* gFocusWindow = NULL ;#ifdef __WXUNIVERSAL__ IMPLEMENT_ABSTRACT_CLASS(wxWindowMac, wxWindowBase)#else // __WXMAC__ IMPLEMENT_DYNAMIC_CLASS(wxWindow, wxWindowBase)#endif // __WXUNIVERSAL__/__WXMAC__BEGIN_EVENT_TABLE(wxWindowMac, wxWindowBase) EVT_NC_PAINT(wxWindowMac::OnNcPaint) EVT_ERASE_BACKGROUND(wxWindowMac::OnEraseBackground) EVT_SET_FOCUS(wxWindowMac::OnSetFocus) EVT_MOUSE_EVENTS(wxWindowMac::OnMouseEvent)END_EVENT_TABLE()#define wxMAC_DEBUG_REDRAW 0#ifndef wxMAC_DEBUG_REDRAW#define wxMAC_DEBUG_REDRAW 0#endif#define wxMAC_USE_THEME_BORDER 0// ===========================================================================// implementation// ===========================================================================// ----------------------------------------------------------------------------// constructors and such// ----------------------------------------------------------------------------void wxWindowMac::Init(){ m_backgroundTransparent = false; // as all windows are created with WS_VISIBLE style... m_isShown = true; m_x = 0; m_y = 0 ; m_width = 0 ; m_height = 0 ; m_hScrollBar = NULL ; m_vScrollBar = NULL ;}// DestructorwxWindowMac::~wxWindowMac(){ SendDestroyEvent(); // deleting a window while it is shown invalidates the region if ( IsShown() ) { wxWindowMac* iter = this ; while( iter ) { if ( iter->IsTopLevel() ) { Refresh() ; break ; } iter = iter->GetParent() ; } } m_isBeingDeleted = true;#ifndef __WXUNIVERSAL__ // VS: make sure there's no wxFrame with last focus set to us: for ( wxWindow *win = GetParent(); win; win = win->GetParent() ) { wxFrame *frame = wxDynamicCast(win, wxFrame); if ( frame ) { if ( frame->GetLastFocus() == this ) { frame->SetLastFocus((wxWindow*)NULL); } break; } }#endif // __WXUNIVERSAL__ if ( s_lastMouseWindow == this ) { s_lastMouseWindow = NULL ; } wxFrame* frame = wxDynamicCast( wxGetTopLevelParent( this ) , wxFrame ) ; if ( frame ) { if ( frame->GetLastFocus() == this ) frame->SetLastFocus( NULL ) ; } if ( gFocusWindow == this ) { gFocusWindow = NULL ; } DestroyChildren(); // delete our drop target if we've got one#if wxUSE_DRAG_AND_DROP if ( m_dropTarget != NULL ) { delete m_dropTarget; m_dropTarget = NULL; }#endif // wxUSE_DRAG_AND_DROP}// Constructorbool wxWindowMac::Create(wxWindowMac *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name){ wxCHECK_MSG( parent, false, wxT("can't create wxWindowMac without parent") );#if wxUSE_STATBOX // wxGTK doesn't allow to create controls with static box as the parent so // this will result in a crash when the program is ported to wxGTK - warn // about it // // the correct solution is to create the controls as siblings of the // static box wxASSERT_MSG( !wxDynamicCast(parent, wxStaticBox), _T("wxStaticBox can't be used as a window parent!") );#endif // wxUSE_STATBOX if ( !CreateBase(parent, id, pos, size, style, wxDefaultValidator, name) ) return false; parent->AddChild(this); m_x = (int)pos.x; m_y = (int)pos.y; AdjustForParentClientOrigin(m_x, m_y, wxSIZE_USE_EXISTING); m_width = WidthDefault( size.x ); m_height = HeightDefault( size.y ) ;#ifndef __WXUNIVERSAL__ // Don't give scrollbars to wxControls unless they ask for them if ( (! IsKindOf(CLASSINFO(wxControl)) && ! IsKindOf(CLASSINFO(wxStatusBar))) || (IsKindOf(CLASSINFO(wxControl)) && ( style & wxHSCROLL || style & wxVSCROLL))) { MacCreateScrollBars( style ) ; }#endif wxWindowCreateEvent event(this); GetEventHandler()->AddPendingEvent(event); return true;}void wxWindowMac::SetFocus(){ if ( gFocusWindow == this ) return ; if ( AcceptsFocus() ) { if (gFocusWindow ) {#if wxUSE_CARET // Deal with caret if ( gFocusWindow->m_caret ) { gFocusWindow->m_caret->OnKillFocus(); }#endif // wxUSE_CARET#ifndef __WXUNIVERSAL__ wxControl* control = wxDynamicCast( gFocusWindow , wxControl ) ; if ( control && control->GetMacControl() ) { UMASetKeyboardFocus( (WindowRef) gFocusWindow->MacGetRootWindow() , (ControlHandle) control->GetMacControl() , kControlFocusNoPart ) ; control->MacRedrawControl() ; }#endif // Without testing the window id, for some reason // a kill focus event can still be sent to // the control just being focussed. int thisId = this->m_windowId; int gFocusWindowId = gFocusWindow->m_windowId; if (gFocusWindowId != thisId) { wxFocusEvent event(wxEVT_KILL_FOCUS, gFocusWindow->m_windowId); event.SetEventObject(gFocusWindow); gFocusWindow->GetEventHandler()->ProcessEvent(event) ; } } gFocusWindow = this ; { #if wxUSE_CARET // Deal with caret if ( m_caret ) { m_caret->OnSetFocus(); } #endif // wxUSE_CARET // panel wants to track the window which was the last to have focus in it wxChildFocusEvent eventFocus(this); GetEventHandler()->ProcessEvent(eventFocus);#ifndef __WXUNIVERSAL__ wxControl* control = wxDynamicCast( gFocusWindow , wxControl ) ; if ( control && control->GetMacControl() ) { UMASetKeyboardFocus( (WindowRef) gFocusWindow->MacGetRootWindow() , (ControlHandle) control->GetMacControl() , kControlFocusNextPart ) ; }#endif wxFocusEvent event(wxEVT_SET_FOCUS, m_windowId); event.SetEventObject(this); GetEventHandler()->ProcessEvent(event) ; } }}bool wxWindowMac::Enable(bool enable){ if ( !wxWindowBase::Enable(enable) ) return false; MacSuperEnabled( enable ) ; return true;}void wxWindowMac::DoCaptureMouse(){ wxTheApp->s_captureWindow = this ;}wxWindow* wxWindowBase::GetCapture(){ return wxTheApp->s_captureWindow ;}void wxWindowMac::DoReleaseMouse(){ wxTheApp->s_captureWindow = NULL ;}#if wxUSE_DRAG_AND_DROPvoid wxWindowMac::SetDropTarget(wxDropTarget *pDropTarget){ if ( m_dropTarget != 0 ) { delete m_dropTarget; } m_dropTarget = pDropTarget; if ( m_dropTarget != 0 ) { // TODO }}#endif// Old style file-manager drag&dropvoid wxWindowMac::DragAcceptFiles(bool accept){ // TODO}// Get total sizevoid wxWindowMac::DoGetSize(int *x, int *y) const{ if(x) *x = m_width ; if(y) *y = m_height ;}void wxWindowMac::DoGetPosition(int *x, int *y) const{ int xx,yy; xx = m_x ; yy = m_y ; if ( !IsTopLevel() && GetParent()) { wxPoint pt(GetParent()->GetClientAreaOrigin()); xx -= pt.x; yy -= pt.y; } if(x) *x = xx; if(y) *y = yy;}#if wxUSE_MENUSbool wxWindowMac::DoPopupMenu(wxMenu *menu, int x, int y){ menu->SetInvokingWindow(this); menu->UpdateUI(); if ( x == -1 && y == -1 ) { 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 id ; GetMenuItemCommandID( GetMenuHandle(HiWord(menuResult)) , LoWord(menuResult) , &id ) ; wxMenuItem* item = NULL ; wxMenu* realmenu ; item = menu->FindItem(id, &realmenu) ; if (item->IsCheckable()) { item->Check( !item->IsChecked() ) ; } menu->SendEvent( id , item->IsCheckable() ? item->IsChecked() : -1 ) ; } menu->MacAfterDisplay( true ) ; menu->SetInvokingWindow(NULL); return true;}#endifvoid wxWindowMac::DoScreenToClient(int *x, int *y) const{ WindowRef window = (WindowRef) MacGetRootWindow() ; Point localwhere = {0,0} ; if(x) localwhere.h = * x ; if(y) localwhere.v = * y ; GrafPtr port ; ::GetPort( &port ) ; ::SetPort( UMAGetWindowPort( window ) ) ; ::GlobalToLocal( &localwhere ) ; ::SetPort( port ) ; if(x) *x = localwhere.h ; if(y) *y = localwhere.v ; MacRootWindowToWindow( x , y ) ; if ( x ) *x -= MacGetLeftBorderSize() ; if ( y ) *y -= MacGetTopBorderSize() ;}void wxWindowMac::DoClientToScreen(int *x, int *y) const{ WindowRef window = (WindowRef) MacGetRootWindow() ; if ( x ) *x += MacGetLeftBorderSize() ; if ( y ) *y += MacGetTopBorderSize() ; MacWindowToRootWindow( x , y ) ; Point localwhere = { 0,0 }; if(x) localwhere.h = * x ; if(y) localwhere.v = * y ; GrafPtr port ; ::GetPort( &port ) ; ::SetPort( UMAGetWindowPort( window ) ) ; ::LocalToGlobal( &localwhere ) ; ::SetPort( port ) ; if(x) *x = localwhere.h ; if(y) *y = localwhere.v ;}void wxWindowMac::MacClientToRootWindow( int *x , int *y ) const{ wxPoint origin = GetClientAreaOrigin() ; if(x) *x += origin.x ; if(y) *y += origin.y ; MacWindowToRootWindow( x , y ) ;}void wxWindowMac::MacRootWindowToClient( int *x , int *y ) const{ wxPoint origin = GetClientAreaOrigin() ; MacRootWindowToWindow( x , y ) ; if(x) *x -= origin.x ; if(y) *y -= origin.y ;}void wxWindowMac::MacWindowToRootWindow( int *x , int *y ) const{ if ( !IsTopLevel() ) { if(x) *x += m_x ; if(y) *y += m_y ; GetParent()->MacWindowToRootWindow( x , y ) ; }}void wxWindowMac::MacRootWindowToWindow( int *x , int *y ) const{ if ( !IsTopLevel() ) { if(x) *x -= m_x ; if(y) *y -= m_y ; GetParent()->MacRootWindowToWindow( x , y ) ; }}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")); Point pt ; wxWindowMac *mouseWin ; GetMouse( &pt ) ; // Change the cursor NOW if we're within the correct window if ( MacGetWindowFromPoint( wxPoint( pt.h , pt.v ) , &mouseWin ) ) { if ( mouseWin == this && !wxIsBusy() ) { m_cursor.MacInstall() ; } } return true ;}// Get size *available for subwindows* i.e. excluding menu bar etc.void wxWindowMac::DoGetClientSize(int *x, int *y) const{ int ww, hh; ww = m_width ; hh = m_height ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -