⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 window.cpp

📁 很牛的GUI源码wxWidgets-2.8.0.zip 可在多种平台下运行.
💻 CPP
📖 第 1 页 / 共 4 页
字号:
/////////////////////////////////////////////////////////////////////////////// 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 + -