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

📄 dnd.cpp

📁 很牛的GUI源码wxWidgets-2.8.0.zip 可在多种平台下运行.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
            dataPtr[ dataSize ] = 0 ;            wxString st( (wxChar*) dataPtr ) ;            wxCharBuffer buf = st.mb_str( wxConvLocal) ;            AddDragItemFlavor(theDrag, theItem, type , buf.data(), strlen(buf), 0);        }        else if (type == kDragFlavorTypeHFS )        {            HFSFlavor  theFlavor ;            OSErr err = noErr;            CInfoPBRec cat;            wxMacFilename2FSSpec( dataPtr , &theFlavor.fileSpec ) ;            cat.hFileInfo.ioNamePtr = theFlavor.fileSpec.name;            cat.hFileInfo.ioVRefNum = theFlavor.fileSpec.vRefNum;            cat.hFileInfo.ioDirID = theFlavor.fileSpec.parID;            cat.hFileInfo.ioFDirIndex = 0;            err = PBGetCatInfoSync(&cat);            if (err == noErr )            {                theFlavor.fdFlags = cat.hFileInfo.ioFlFndrInfo.fdFlags;                if (theFlavor.fileSpec.parID == fsRtParID) {                    theFlavor.fileCreator = 'MACS';                    theFlavor.fileType = 'disk';                } else if ((cat.hFileInfo.ioFlAttrib & ioDirMask) != 0) {                    theFlavor.fileCreator = 'MACS';                    theFlavor.fileType = 'fold';                } else {                    theFlavor.fileCreator = cat.hFileInfo.ioFlFndrInfo.fdCreator;                    theFlavor.fileType = cat.hFileInfo.ioFlFndrInfo.fdType;                }                AddDragItemFlavor(theDrag, theItem, type , &theFlavor, sizeof(theFlavor), 0);            }        }        else        {            AddDragItemFlavor(theDrag, theItem, type , dataPtr, dataSize, 0);        }        delete[] dataPtr ;    }    delete[] formats ;    dragRegion = NewRgn();    RgnHandle tempRgn = NewRgn() ;    EventRecord* ev = NULL ;#if !TARGET_CARBON // TODO    ev = (EventRecord*) wxTheApp->MacGetCurrentEvent() ;#else    EventRecord rec ;    ev = &rec ;    wxMacConvertEventToRecord( (EventRef) wxTheApp->MacGetCurrentEvent() , &rec ) ;#endif    const short dragRegionOuterBoundary = 10 ;    const short dragRegionInnerBoundary = 9 ;    SetRectRgn( dragRegion , ev->where.h - dragRegionOuterBoundary ,        ev->where.v  - dragRegionOuterBoundary ,        ev->where.h + dragRegionOuterBoundary ,        ev->where.v + dragRegionOuterBoundary ) ;    SetRectRgn( tempRgn , ev->where.h - dragRegionInnerBoundary ,        ev->where.v  - dragRegionInnerBoundary ,        ev->where.h + dragRegionInnerBoundary ,        ev->where.v + dragRegionInnerBoundary ) ;    DiffRgn( dragRegion , tempRgn , dragRegion ) ;    DisposeRgn( tempRgn ) ;    // TODO:work with promises in order to return data only when drag    // was successfully completed    gTrackingGlobals.m_currentSource = this ;    result = TrackDrag(theDrag, ev , dragRegion);    DisposeRgn(dragRegion);    DisposeDrag(theDrag);    gTrackingGlobals.m_currentSource = NULL ;    KeyMap keymap;    GetKeys(keymap);    bool optionDown = keymap[1] & 4;    wxDragResult dndresult = optionDown ? wxDragCopy : wxDragMove;    return dndresult;}bool wxDropSource::MacInstallDefaultCursor(wxDragResult effect){    const wxCursor& cursor = GetCursor(effect);    if ( cursor.Ok() )    {        cursor.MacInstall() ;        return true;    }    else    {        return false;    }}bool gTrackingGlobalsInstalled = false ;// passing the globals via refcon is not needed by the CFM and later architectures anymore// but I'll leave it in there, just in case...pascal OSErr wxMacWindowDragTrackingHandler(DragTrackingMessage theMessage, WindowPtr theWindow,  void *handlerRefCon, DragReference theDrag) ;pascal OSErr wxMacWindowDragReceiveHandler(WindowPtr theWindow, void *handlerRefCon,DragReference theDrag) ;void wxMacEnsureTrackingHandlersInstalled(){    if( !gTrackingGlobalsInstalled )    {        OSErr result;        result = InstallTrackingHandler(NewDragTrackingHandlerUPP(wxMacWindowDragTrackingHandler), 0L,&gTrackingGlobals);        wxASSERT( result == noErr ) ;        result = InstallReceiveHandler(NewDragReceiveHandlerUPP(wxMacWindowDragReceiveHandler), 0L, &gTrackingGlobals);        wxASSERT( result == noErr ) ;        gTrackingGlobalsInstalled = true ;    }}pascal OSErr wxMacWindowDragTrackingHandler(DragTrackingMessage theMessage, WindowPtr theWindow,  void *handlerRefCon, DragReference theDrag){    MacTrackingGlobals* trackingGlobals = (MacTrackingGlobals*) handlerRefCon;    Point mouse, localMouse;    DragAttributes attributes;    GetDragAttributes(theDrag, &attributes);    wxTopLevelWindowMac* toplevel = wxFindWinFromMacWindow( (WXWindow) theWindow ) ;    KeyMap keymap;    GetKeys(keymap);    bool optionDown = keymap[1] & 4;    wxDragResult result = optionDown ? wxDragCopy : wxDragMove;    switch(theMessage)    {        case kDragTrackingEnterHandler:            break;        case kDragTrackingLeaveHandler:            break;        case kDragTrackingEnterWindow:            trackingGlobals->m_currentTargetWindow = NULL ;            trackingGlobals->m_currentTarget = NULL ;            break;        case kDragTrackingInWindow:            if (toplevel == NULL)                break;            GetDragMouse(theDrag, &mouse, 0L);            localMouse = mouse;            GlobalToLocal(&localMouse);//            if (attributes & kDragHasLeftSenderWindow)            {                wxPoint point(localMouse.h , localMouse.v) ;                wxWindow *win = NULL ;                toplevel->MacGetWindowFromPointSub( point , &win ) ;                int localx , localy ;                localx = localMouse.h ;                localy = localMouse.v ;                //TODO : should we use client coordinates                if ( win )                    win->MacRootWindowToWindow( &localx , &localy ) ;                if ( win != trackingGlobals->m_currentTargetWindow )                {                    if ( trackingGlobals->m_currentTargetWindow )                    {                        // this window is left                        if ( trackingGlobals->m_currentTarget )                        {                            HideDragHilite(theDrag);                            trackingGlobals->m_currentTarget->SetCurrentDrag( theDrag ) ;                            trackingGlobals->m_currentTarget->OnLeave() ;                            trackingGlobals->m_currentTarget = NULL;                            trackingGlobals->m_currentTargetWindow = NULL ;                        }                    }                    if ( win )                    {                        // this window is entered                        trackingGlobals->m_currentTargetWindow = win ;                        trackingGlobals->m_currentTarget = win->GetDropTarget() ;                        {                            if ( trackingGlobals->m_currentTarget )                            {                                trackingGlobals->m_currentTarget->SetCurrentDrag( theDrag ) ;                                result = trackingGlobals->m_currentTarget->OnEnter(                                    localx , localy , result ) ;                            }                            if ( result != wxDragNone )                            {                                int x , y ;                                x = y = 0 ;                                win->MacWindowToRootWindow( &x , &y ) ;                                RgnHandle hiliteRgn = NewRgn() ;                                SetRectRgn( hiliteRgn , x , y , x+win->GetSize().x ,y+win->GetSize().y) ;                                ShowDragHilite(theDrag, hiliteRgn, true);                                DisposeRgn( hiliteRgn ) ;                            }                        }                    }                }                else                {                    if( trackingGlobals->m_currentTarget )                    {                        trackingGlobals->m_currentTarget->SetCurrentDrag( theDrag ) ;                        trackingGlobals->m_currentTarget->OnDragOver(                            localx , localy , result ) ;                    }                }                // set cursor for OnEnter and OnDragOver                if ( trackingGlobals->m_currentSource && trackingGlobals->m_currentSource->GiveFeedback( result ) == FALSE )                {                  if ( trackingGlobals->m_currentSource->MacInstallDefaultCursor( result ) == FALSE )                  {                      switch( result )                      {                          case wxDragCopy :                              {                                  wxCursor cursor(wxCURSOR_COPY_ARROW) ;                                  cursor.MacInstall() ;                              }                              break ;                          case wxDragMove :                              {                                  wxCursor cursor(wxCURSOR_ARROW) ;                                  cursor.MacInstall() ;                              }                              break ;                          case wxDragNone :                              {                                  wxCursor cursor(wxCURSOR_NO_ENTRY) ;                                  cursor.MacInstall() ;                              }                              break ;                          case wxDragError:                          case wxDragLink:                          case wxDragCancel:                              // put these here to make gcc happy                              ;                      }                  }                }          }            // MyTrackItemUnderMouse(localMouse, theWindow);            break;        case kDragTrackingLeaveWindow:            if (trackingGlobals->m_currentTarget)            {                trackingGlobals->m_currentTarget->SetCurrentDrag( theDrag ) ;                trackingGlobals->m_currentTarget->OnLeave() ;                HideDragHilite(theDrag);                trackingGlobals->m_currentTarget = NULL ;            }            trackingGlobals->m_currentTargetWindow = NULL ;            break;    }    return(noErr);}pascal OSErr wxMacWindowDragReceiveHandler(WindowPtr theWindow,                                           void *handlerRefCon,                                           DragReference theDrag){    MacTrackingGlobals* trackingGlobals = (MacTrackingGlobals*) handlerRefCon;    if ( trackingGlobals->m_currentTarget )    {        Point mouse,localMouse ;        int localx,localy ;        trackingGlobals->m_currentTarget->SetCurrentDrag( theDrag ) ;        GetDragMouse(theDrag, &mouse, 0L);        localMouse = mouse;        GlobalToLocal(&localMouse);        localx = localMouse.h ;        localy = localMouse.v ;        //TODO : should we use client coordinates        if ( trackingGlobals->m_currentTargetWindow )            trackingGlobals->m_currentTargetWindow->MacRootWindowToWindow( &localx , &localy ) ;        if ( trackingGlobals->m_currentTarget->OnDrop( localx , localy ) )        {            KeyMap keymap;            GetKeys(keymap);            bool optionDown = keymap[1] & 4;            wxDragResult result = optionDown ? wxDragCopy : wxDragMove;            trackingGlobals->m_currentTarget->OnData( localx , localy , result ) ;        }    }    return(noErr);}#endif

⌨️ 快捷键说明

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