根据要求,我已经实现了对移动OS X窗口的支持,方法是使用窗口内容部分内的区域拖动它,即复制标题栏的拖动和移动功能,但在另一个区域中。
我还没有解决的问题是,如果用户快速拖动鼠标,它可以离开窗口区域,然后不再接收鼠标移动事件。
在Windows上,可以通过调用win32方法SetCapture()来解决这类问题,对应的OSX方法是什么?
此应用程序是一个跨平台的C ++应用程序,使用Carbon作为OS X特定部分。 (是的,我知道所有关于Cocoa的好处,但这是一个较旧的代码库,此时Cocoa端口没有时间和金钱。)
我找到了Carbon API方法,比如TrackMouseLocation(),但是我无法真正看到如何将它们用于此应用程序。在这里列出2-7 http://developer.apple.com/legacy/mac/library/documentation/Carbon/Conceptual/Carbon_Event_Manager/Tasks/CarbonEventsTasks.html 捕获鼠标但问题是TrackMouseLocation()阻止等待输入。阻止是这个应用程序无法做到的事情,因为它还拥有一个必须每秒多次调用的flash播放器。
我试图解决这个原型的原型基本上是这样的:
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 :(得分:1)
我觉得你应该在Window和窗外跟踪鼠标。以下代码可以解决您的问题,
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){}
希望它有所帮助!!
答案 1 :(得分: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中的某些方法不起作用,总是返回0作为windowRef ...有什么想法吗?
答案 2 :(得分:0)
您也可以尝试调用DragWindow
来响应窗口内容区域中的点击。我认为你不需要自己实施拖动。