📄 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 ;
}
// Destructor
wxWindowMac::~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
}
// Constructor
bool 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_DROP
void 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&drop
void wxWindowMac::DragAcceptFiles(bool accept)
{
// TODO
}
// Get total size
void 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_MENUS
bool 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;
}
#endif
void 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -