要求に応じて、ウィンドウのコンテンツ部分内の領域を使用して 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;
アイデアはありますか?