2

要求に応じて、ウィンドウのコンテンツ部分内の領域を使用して OS X ウィンドウをドラッグして移動するためのサポートを実装しました。つまり、タイトル バーのドラッグ アンド ムーブ機能を別の領域に複製します。

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

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

このアプリケーションは、OS X 固有の部分に Carbon を使用したクロスプラットフォーム C++ アプリケーションです。(もちろん、Cocoa の利点についてはすべて知っていますが、これは古いコード ベースであり、現時点では Cocoa を移植する時間もお金もありません。)

TrackMouseLocation() などの Carbon API メソッドを見つけましたが、このアプリケーションでそれらをどのように使用できるか実際にはわかりません。ここのリスト 2-7 では、 http: //developer.apple.com/legacy/mac/library/documentation/Carbon/Conceptual/Carbon_Event_Manager/Tasks/CarbonEventsTasks.html マウスはキャプチャされますが、問題は TrackMouseLocation() ブロックが待機していることです。入力。ブロッキングは、このアプリケーションでは実行できないことです。これは、1 秒間に何度も呼び出さなければならない Flash Player もホストしているためです。

これを理解しようとして組み立てたプロトタイプは、基本的に次のようになります。

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;

アイデアはありますか?

4

3 に答える 3

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

それが役に立てば幸い!!

于 2009-12-25T11:00:47.987 に答える
0

私はそれがあなたにも役立つことを願っています:

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

特定の場所 (すべてのアプリケーションのすべてのウィンドウにわたって) で WindowPart 参照を取得する方法を探しています。

Carbon の特定のメソッドは機能せず、windowRef として常に 0 を返します... 何かアイデアはありますか?

于 2010-04-13T10:24:58.273 に答える
0

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

于 2010-06-25T17:30:37.627 に答える