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

📄 app.cpp

📁 很牛的GUI源码wxWidgets-2.8.0.zip 可在多种平台下运行.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
/////////////////////////////////////////////////////////////////////////////// Name:        src/mac/classic/app.cpp// Purpose:     wxApp// Author:      Stefan Csomor// Modified by:// Created:     1998-01-01// RCS-ID:      $Id: app.cpp,v 1.34 2006/08/31 19:30:49 ABX Exp $// Copyright:   (c) Stefan Csomor// Licence:     wxWindows licence/////////////////////////////////////////////////////////////////////////////#include "wx/wxprec.h"#ifdef __BORLANDC__    #pragma hdrstop#endif#include "wx/app.h"#ifndef WX_PRECOMP    #include "wx/intl.h"    #include "wx/log.h"    #include "wx/utils.h"    #include "wx/window.h"    #include "wx/frame.h"    #include "wx/dc.h"    #include "wx/button.h"    #include "wx/menu.h"    #include "wx/pen.h"    #include "wx/brush.h"    #include "wx/palette.h"    #include "wx/icon.h"    #include "wx/cursor.h"    #include "wx/dialog.h"    #include "wx/msgdlg.h"    #include "wx/textctrl.h"    #include "wx/memory.h"    #include "wx/gdicmn.h"    #include "wx/module.h"#endif#include "wx/tooltip.h"#include "wx/docview.h"#include "wx/filename.h"#include <string.h>// mac#ifndef __DARWIN__    #if __option(profile)        #include <profiler.h>    #endif#endif#include "apprsrc.h"#include "wx/mac/uma.h"#include "wx/mac/macnotfy.h"#ifdef __DARWIN__#  include <CoreServices/CoreServices.h>#  if defined(WXMAKINGDLL_CORE)#    include <mach-o/dyld.h>#  endif#else#  include <Sound.h>#  include <Threads.h>#  include <ToolUtils.h>#  include <DiskInit.h>#  include <Devices.h>#endifextern wxList wxPendingDelete;extern wxList *wxWinMacWindowList;extern wxList *wxWinMacControlList;#if wxUSE_THREADSextern size_t g_numberOfThreads;#endif // wxUSE_THREADS// statics for implementationstatic bool s_inYield = false;#if TARGET_CARBONstatic bool s_inReceiveEvent = false ;static EventTime sleepTime = kEventDurationNoWait ;#elsestatic long sleepTime = 0 ;#endifIMPLEMENT_DYNAMIC_CLASS(wxApp, wxEvtHandler)BEGIN_EVENT_TABLE(wxApp, wxEvtHandler)    EVT_IDLE(wxApp::OnIdle)    EVT_END_SESSION(wxApp::OnEndSession)    EVT_QUERY_END_SESSION(wxApp::OnQueryEndSession)END_EVENT_TABLE()const short    kMacMinHeap = (29 * 1024) ;// platform specific static variablesconst short kwxMacMenuBarResource = 1 ;const short kwxMacAppleMenuId = 1 ;WXHRGN    wxApp::s_macCursorRgn = NULL;wxWindow* wxApp::s_captureWindow = NULL ;int       wxApp::s_lastMouseDown = 0 ;long      wxApp::sm_lastMessageTime = 0;long      wxApp::s_lastModifiers = 0 ;bool      wxApp::s_macSupportPCMenuShortcuts = true ;long      wxApp::s_macAboutMenuItemId = wxID_ABOUT ;long      wxApp::s_macPreferencesMenuItemId = wxID_PREFERENCES ;long      wxApp::s_macExitMenuItemId = wxID_EXIT ;wxString  wxApp::s_macHelpMenuTitleName = wxT("&Help") ;// Normally we're not a pluginbool      wxApp::sm_isEmbedded = false;//----------------------------------------------------------------------// Core Apple Event Support//----------------------------------------------------------------------pascal OSErr AEHandleODoc( const AppleEvent *event , AppleEvent *reply , long refcon ) ;pascal OSErr AEHandleOApp( const AppleEvent *event , AppleEvent *reply , long refcon ) ;pascal OSErr AEHandlePDoc( const AppleEvent *event , AppleEvent *reply , long refcon ) ;pascal OSErr AEHandleQuit( const AppleEvent *event , AppleEvent *reply , long refcon ) ;pascal OSErr AEHandleRApp( const AppleEvent *event , AppleEvent *reply , long refcon ) ;pascal OSErr AEHandleODoc( const AppleEvent *event , AppleEvent *reply , long WXUNUSED(refcon) ){    return wxTheApp->MacHandleAEODoc( (AppleEvent*) event , reply) ;}pascal OSErr AEHandleOApp( const AppleEvent *event , AppleEvent *reply , long WXUNUSED(refcon) ){    return wxTheApp->MacHandleAEOApp( (AppleEvent*) event , reply ) ;}pascal OSErr AEHandlePDoc( const AppleEvent *event , AppleEvent *reply , long WXUNUSED(refcon) ){    return wxTheApp->MacHandleAEPDoc( (AppleEvent*) event , reply ) ;}pascal OSErr AEHandleQuit( const AppleEvent *event , AppleEvent *reply , long WXUNUSED(refcon) ){    return wxTheApp->MacHandleAEQuit( (AppleEvent*) event , reply) ;}pascal OSErr AEHandleRApp( const AppleEvent *event , AppleEvent *reply , long WXUNUSED(refcon) ){    return wxTheApp->MacHandleAERApp( (AppleEvent*) event , reply) ;}// AEODoc Calls MacOpenFile on each of the files passedshort wxApp::MacHandleAEODoc(const WXEVENTREF event, WXEVENTREF WXUNUSED(reply)){    AEDescList docList;    AEKeyword keywd;    DescType returnedType;    Size actualSize;    long itemsInList;    FSSpec theSpec;    OSErr err;    short i;    err = AEGetParamDesc((AppleEvent *)event, keyDirectObject, typeAEList,&docList);    if (err != noErr)        return err;    err = AECountItems(&docList, &itemsInList);    if (err != noErr)        return err;    ProcessSerialNumber PSN ;    PSN.highLongOfPSN = 0 ;    PSN.lowLongOfPSN = kCurrentProcess ;    SetFrontProcess( &PSN ) ;    for (i = 1; i <= itemsInList; i++) {        AEGetNthPtr(&docList, i, typeFSS, &keywd, &returnedType,        (Ptr) & theSpec, sizeof(theSpec), &actualSize);        wxString fName = wxMacFSSpec2MacFilename(&theSpec);        MacOpenFile(fName);    }    return noErr;}// AEPDoc Calls MacPrintFile on each of the files passedshort wxApp::MacHandleAEPDoc(const WXEVENTREF event , WXEVENTREF WXUNUSED(reply)){    AEDescList docList;    AEKeyword keywd;    DescType returnedType;    Size actualSize;    long itemsInList;    FSSpec theSpec;    OSErr err;    short i;    err = AEGetParamDesc((AppleEvent *)event, keyDirectObject, typeAEList,&docList);    if (err != noErr)        return err;    err = AECountItems(&docList, &itemsInList);    if (err != noErr)        return err;    ProcessSerialNumber PSN ;    PSN.highLongOfPSN = 0 ;    PSN.lowLongOfPSN = kCurrentProcess ;    SetFrontProcess( &PSN ) ;    for (i = 1; i <= itemsInList; i++) {        AEGetNthPtr(&docList, i, typeFSS, &keywd, &returnedType,        (Ptr) & theSpec, sizeof(theSpec), &actualSize);        wxString fName = wxMacFSSpec2MacFilename(&theSpec);        MacPrintFile(fName);    }    return noErr;}// AEOApp calls MacNewFileshort wxApp::MacHandleAEOApp(const WXEVENTREF WXUNUSED(event) , WXEVENTREF WXUNUSED(reply)){    MacNewFile() ;    return noErr ;}// AEQuit attempts to quit the applicationshort wxApp::MacHandleAEQuit(const WXEVENTREF WXUNUSED(event) , WXEVENTREF WXUNUSED(reply)){    wxWindow* win = GetTopWindow() ;    if ( win )    {        wxCommandEvent exitEvent(wxEVT_COMMAND_MENU_SELECTED, s_macExitMenuItemId);        if (!win->ProcessEvent(exitEvent))            win->Close(true) ;    }    else    {        ExitMainLoop() ;    }    return noErr ;}// AEROApp calls MacReopenAppshort wxApp::MacHandleAERApp(const WXEVENTREF WXUNUSED(event) , WXEVENTREF WXUNUSED(reply)){    MacReopenApp() ;    return noErr ;}//----------------------------------------------------------------------// Support Routines linking the Mac...File Calls to the Document Manager//----------------------------------------------------------------------void wxApp::MacOpenFile(const wxString & fileName ){    wxDocManager* dm = wxDocManager::GetDocumentManager() ;    if ( dm )        dm->CreateDocument(fileName , wxDOC_SILENT ) ;}void wxApp::MacPrintFile(const wxString & fileName ){    wxDocManager* dm = wxDocManager::GetDocumentManager() ;    if ( dm )    {        wxDocument *doc = dm->CreateDocument(fileName , wxDOC_SILENT ) ;        if ( doc )        {            wxView* view = doc->GetFirstView() ;            if( view )            {                wxPrintout *printout = view->OnCreatePrintout();                if (printout)                {                    wxPrinter printer;                    printer.Print(view->GetFrame(), printout, true);                    delete printout;                }            }            if (doc->Close())            {                doc->DeleteAllViews();                dm->RemoveDocument(doc) ;            }        }    }}void wxApp::MacNewFile(){}void wxApp::MacReopenApp(){    // eventually check for open docs, if none, call MacNewFile}//----------------------------------------------------------------------// Carbon Event Handler//----------------------------------------------------------------------#if TARGET_CARBON    static const EventTypeSpec eventList[] =    {        { kEventClassCommand, kEventProcessCommand } ,        { kEventClassCommand, kEventCommandUpdateStatus } ,        { kEventClassMenu, kEventMenuOpening },        { kEventClassMenu, kEventMenuClosed },        { kEventClassMenu, kEventMenuTargetItem },        { kEventClassApplication , kEventAppActivated } ,        { kEventClassApplication , kEventAppDeactivated } ,        // handling the quit event is not recommended by apple        // rather using the quit apple event - which we do        { kEventClassAppleEvent , kEventAppleEvent } ,        { kEventClassMouse , kEventMouseDown } ,        { kEventClassMouse , kEventMouseMoved } ,        { kEventClassMouse , kEventMouseUp } ,        { kEventClassMouse , kEventMouseDragged } ,        { 'WXMC' , 'WXMC' }    } ;static pascal OSStatusMenuEventHandler( EventHandlerCallRef handler , EventRef event , void *data ){    wxMenuBar* mbar = wxMenuBar::MacGetInstalledMenuBar();    if ( mbar )    {        wxFrame* win = mbar->GetFrame();        if ( win )        {            // VZ: we could find the menu from its handle here by examining all            //     the menus in the menu bar recursively but knowing that neither            //     wxMSW nor wxGTK do it why bother...#if 0            MenuRef menuRef;            GetEventParameter(event,                              kEventParamDirectObject,                              typeMenuRef, NULL,                              sizeof(menuRef), NULL,                              &menuRef);#endif // 0            wxEventType type=0;            MenuCommand cmd=0;            switch (GetEventKind(event))            {                case kEventMenuOpening:                    type = wxEVT_MENU_OPEN;                    break;                case kEventMenuClosed:                    type = wxEVT_MENU_CLOSE;                    break;                case kEventMenuTargetItem:                    type = wxEVT_MENU_HIGHLIGHT;                    GetEventParameter(event, kEventParamMenuCommand,                                      typeMenuCommand, NULL,                                      sizeof(cmd), NULL, &cmd);                    if (cmd == 0) return eventNotHandledErr;                    break;                default:                    wxFAIL_MSG(wxT("Unexpected menu event kind"));                    break;            }            wxMenuEvent wxevent(type, cmd);            wxevent.SetEventObject(win);            (void)win->GetEventHandler()->ProcessEvent(wxevent);        }    }    return eventNotHandledErr;}// due to the rather low-level event API of wxWidgets, we cannot use RunApplicationEventLoop// but have to use ReceiveNextEvent dealing with events manually, therefore we also have// to deal with clicks in the menu bar explicitlypascal OSStatus wxMacWindowEventHandler( EventHandlerCallRef handler , EventRef event , void *data ) ;static pascal OSStatus MouseEventHandler( EventHandlerCallRef handler , EventRef event , void *data ){    OSStatus result = eventNotHandledErr ;    Point point ;    UInt32 modifiers = 0;    EventMouseButton button = 0 ;    UInt32 click = 0 ;    GetEventParameter( event, kEventParamMouseLocation, typeQDPoint, NULL,        sizeof( Point ), NULL, &point );    GetEventParameter( event, kEventParamKeyModifiers, typeUInt32, NULL,        sizeof( UInt32 ), NULL, &modifiers );    GetEventParameter( event, kEventParamMouseButton, typeMouseButton, NULL,        sizeof( EventMouseButton ), NULL, &button );    GetEventParameter( event, kEventParamClickCount, typeUInt32, NULL,        sizeof( UInt32 ), NULL, &click );    if ( button == 0 || GetEventKind( event ) == kEventMouseUp )        modifiers += btnState ;    switch( GetEventKind(event) )    {        case kEventMouseDown :        {            WindowRef window ;            short windowPart = ::FindWindow(point, &window);            if ( windowPart == inMenuBar )            {                MenuSelect( point ) ;                result = noErr ;            }        }        break ;        case kEventMouseDragged :

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -