2009-09-03 6 views
2

Sur demande, j'ai implémenté le support pour déplacer une fenêtre OS X en la faisant glisser en utilisant une zone dans la partie contenu de la fenêtre, par exemple en déplaçant la fonctionnalité glisser-déplacer de la barre de titre.Quelle API peut être utilisée pour _capture_ la souris lors du déplacement de fenêtres OS X "Carbon"?

Le problème que je n'ai pas encore résolu est le fait que si l'utilisateur fait glisser la souris rapidement, il peut quitter la zone de la fenêtre et plus aucun événement de déplacement de la souris n'est reçu.

Sur Windows, ce type de problème peut être simplement résolu en appelant la méthode win32 SetCapture(), quelle est la méthode OSX correspondante?

Cette application est une application C++ multiplateforme utilisant du carbone pour les parties spécifiques d'OS X. (Et oui, je sais tout sur les avantages de Cocoa mais c'est une base de code plus ancienne et il n'y a pas de temps ni d'argent pour un port Cocoa à ce moment.)

J'ai trouvé des méthodes API Carbon comme par exemple TrackMouseLocation () mais ne peux pas vraiment voir comment je pourrais les utiliser pour cette application. Dans la liste 2-7 ici http://developer.apple.com/legacy/mac/library/documentation/Carbon/Conceptual/Carbon_Event_Manager/Tasks/CarbonEventsTasks.html la souris est capturée mais le problème est que les blocs TrackMouseLocation() attendent l'entrée. Le blocage est quelque chose que cette application ne peut pas faire car elle héberge également un lecteur flash qui doit être appelé plusieurs fois par seconde.

Le protototype j'assemblé en essayant de comprendre cela ressemble fondamentalement ceci:

switch(GetEventKind(inEvent)) 
{ 
    case kEventMouseDown: 
    // A silly test to make parts of the window border "draggable" 
    dragging = local_loc.v < 25 || local_loc.h < 25; 
    last_screen_loc = screen_loc; 
    break; 
    case kEventMouseUp: 
    dragging = false; 
    break; 
    case kEventMouseMoved: 
    break; 
    case kEventMouseDragged: 
    if (dragging) { 
     Rect rect; 
     GetWindowBounds (windowRef, kWindowContentRgn, &rect); 
     int dx = screen_loc.h - last_screen_loc.h; 
     int dy = screen_loc.v - last_screen_loc.v; 
     rect.left += dx; 
     rect.right += dx; 
     rect.top += dy; 
     rect.bottom += dy; 
     SetWindowBounds (windowRef, kWindowContentRgn, &rect); 
    } 
    last_screen_loc = screen_loc; 
    break; 

Toutes les idées apprécié?

+0

Le problème s'est résumée à MacFindWindow() retournant null comme la fenêtre ref une fois que le curseur était en dehors de la fenêtre, en extrayant window-ref de l'événement lui-même le problème est parti. –

Répondre

1

Je pense que vous devriez suivre la souris dans Windows ainsi que hors de la fenêtre. Le code suivant devrait résoudre votre problème,

EventHandlerRef  m_ApplicationMouseDragEventHandlerRef;   
EventHandlerRef  m_MonitorMouseDragEventHandlerRef; 

{ 
    OSStatus ErrStatus; 

    static const EventTypeSpec kMouseDragEvents[] = 
     { 
     { kEventClassMouse, kEventMouseDragged } 
     }; 

    ErrStatus = InstallEventHandler(GetEventMonitorTarget(), NewEventHandlerUPP(MouseHasDragged), GetEventTypeCount(kMouseDragEvents), kMouseDragEvents, this, &m_MonitorMouseDragEventHandlerRef); 

    ErrStatus = InstallApplicationEventHandler(NewEventHandlerUPP(MouseHasDragged), GetEventTypeCount(kMouseDragEvents), kMouseDragEvents, this, &m_ApplicationMouseDragEventHandlerRef); 

    return true; 
} 

//implement these functions 
OSStatus MouseHasDragged(EventHandlerCallRef inCaller, EventRef inEvent, void *pUserData){} 

Espérons que ça aide !!

0

J'espère que vous Help's aussi:

// Get Mouse Position --> WAY 1  
printf("Get Mouse Position Way 1\n"); 

HICoordinateSpace space = 2;  

HIGetMousePosition(space, NULL, &point);  
printf("Mouse Position: %.2f %.2f \n", point.x, point.y); 


// Get Mouse Position --> WAY 2 
printf("Get Mouse Position Way 2\n"); 

CGEventRef ourEvent = CGEventCreate(NULL); 
point = CGEventGetLocation(ourEvent); 
printf("Mouse Position: %.2f, y = %.2f \n", (float)point.x, (float)point.y); 

je recherche le moyen d'obtenir une référence WindowPart à un certain endroit (sur toutes les fenêtres de tous les aplications)

Certaines méthodes dans Carbon ne fonctionne pas, retourne toujours 0 comme un windowRef ... Des idées?

0

Vous pouvez également essayer en appelant simplement DragWindow en réponse à un clic dans la zone de contenu de votre fenêtre. Je ne pense pas que vous avez besoin de mettre en œuvre le glisser vous-même.

Questions connexes