[新ui/macos][坑]苹果 macos 中的鼠标事件的坐标系的坑
clq
浏览(64) -
2024-06-27 18:22:20 发表
编辑
关键字:
[新ui/macos][坑]苹果 macos 中的鼠标事件的坐标系的坑
1.
首先事件参数中的坐标是鼠标在窗口中的坐标系的位置。
要转换后才能得到在控件中的位置。
2.
即使控件的坐标系已经修改过了,转换后的坐标是正确的控件内位置。
但事件参数中的鼠标位置 y 轴,则仍然是和 window/ios 这样的坐标系相反的。除非您把 window 的坐标系也改过(没试过,还不知道 window 的坐标系能不能改)。
3.
如果鼠标已经按下了,这时候是收不到 mouseMoved 事件的。要用 mouseDragged 事件。
幸好两者的处理是一样的。
参考
https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/EventOverview/HandlingMouseEvents/HandlingMouseEvents.html
--------------------------------------------------------
//怎样得到鼠标的位置呢
//https://zhuanlan.zhihu.com/p/645289494
//https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/EventOverview/EventHandlingBasics/EventHandlingBasics.html#//apple_ref/doc/uid/10000060i-CH5-SW15
//获取鼠标事件在基坐标(locationInWindow)中的位置,然后将该位置转换为接收视图的坐标系; 有关详细信息,请参阅获取事件的位置。
NSPoint p = [event locationInWindow];
NSPoint local_point = [self convertPoint:p fromView:nil];
NSLog(@"%f, %f, %f", event.locationInWindow.x, local_point.x, local_point.y);
//-- //这里的 x_in_window, y_in_window 是用来代替 govcl 中的 ClientToScreen 的作用的
char json[512] = {};
sprintf(json, "{\"function\":\"mouse_move\", \"param_handle\":\"%lld\", \"x\":\"%f\", \"y\":\"%f\", \"x_in_window\":\"%f\", \"y_in_window\":\"%f\"}", self->on_mouse_move_param, local_point.x, local_point.y, event.locationInWindow.x, event.locationInWindow.y);
--------------------------------------------------------
调用时
View_SetOnMouseMove(form.pnlTop, func(json_param string) {
kv := DecodeJson_toMap([]byte(json_param));
//x := StrToFloat(ToString(kv["x"]));
//y := StrToFloat(ToString(kv["y"]));
x := StrToFloat(ToString(kv["x_in_window"])); //"x" 是能用的窗口内的坐标系值,而 "x_in_window" 则相当于 delphi/govcl/windows 中的 ClientToScreen 后的结果
//y := StrToFloat(ToString(kv["y_in_window"]));
y := 0-StrToFloat(ToString(kv["y_in_window"])); //对于 mscos 来说,即使窗体的坐标系已经改了,但未转换前的鼠标坐标 y 轴仍然和 windows/ios 是相反的。所以要改它的符号
f.Form_OnMouseMove(form.pnlTop, int(x), int(y));
});
本帖子属于以下条目()
NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.