2009-09-03 7 views
2

私はOS Xウィンドウをウィンドウのコンテンツ部分内の領域を使用してドラッグすることにより、つまりタイトルバーのドラッグ&ドロップ機能を複製して別の領域に移動するサポートを実装しました。OS Xの「Carbon」ウィンドウを移動するときに、マウスを_キャプチャするために使用できるAPIはどれですか?

私がまだ解決していない問題は、ユーザーがマウスをすばやくドラッグすると、ウィンドウ領域を離れてマウス移動イベントが受信されなくなることです。

このタイプの問題は、Win32メソッドのSetCapture()を呼び出すことによって簡単に修正できます。対応するOSXメソッドは何ですか?

このアプリケーションは、OS Xの特定の部品にCarbonを使用するクロスプラットフォームのC++アプリケーションです。 (そして、はい、私はCocoaのメリットについてすべて知っていますが、これは古いコードベースであり、現時点ではCocoaポートの時間もコストもありません)。 )私はこのアプリケーションのためにそれらを使用する方法を実際に見ることができません。リスト2-7では、http://developer.apple.com/legacy/mac/library/documentation/Carbon/Conceptual/Carbon_Event_Manager/Tasks/CarbonEventsTasks.html マウスがキャプチャされますが、TrackMouseLocation()ブロックは入力を待っているという問題があります。ブロッキングは、1秒間に何度も呼び出さなければならないフラッシュプレーヤーをホストしているため、このアプリケーションでは実行できないものです。

基本的にこれを理解しようとしたとき、私が組み立てているprotototypeは次のようになります。

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; 

任意のアイデアを高く評価しますか?

+0

MacFindWindow()の問題は、カーソルが一度ウィンドウの外に出たときにウィンドウrefをヌルに戻し、問題自体が消えたイベント自体からwindow-refを抽出することで解消されました。 –

答えて

1

ウィンドウ内とウィンドウ外でマウスを追跡する必要があります。次のコードで問題を解決する必要があります。

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){} 

希望します!

私はそれがあまりにもあなたをHelp'sホープ
0

:(すべてのaplicationsのすべてのウィンドウの上に)一定の場所でWindowPartリファレンスを取得する方法を探して

// 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); 

- 私

特定の方法Carbonでは、常に0をwindowRefとして返します...何か考えですか?

0

また、ウィンドウのコンテンツ領域のクリックに応答してDragWindowを呼び出すこともできます。私は自分でドラッグを実装する必要はないと思う。

関連する問題