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é?
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. –