macOS 开发 NSView添加鼠标监控
一、鼠标点击事件响应流程简述:
1.鼠标硬件先接收到用户点击;
2.然后交给鼠标驱动来处理,这个驱动是在Mac OS X内核运行的;
3.处理完就通过I/O Kit传递给window sever的事件队列。
4.而window server则负责分派这些事件到对应进程的run-loop.
二、步骤
1.自定义VC1 继承自NSView ;
2.在VC1.m的drawRect方法中添加监控区域NSTrackingArea和监控样式
- 如果VC1不添加NSTrackingArea,即使实现了监控方法,也不会调用。
- 监控区域要使用dirtyRect,而非self.frame,否则位置会错误。
鸣谢KeyboardLife
左边打印监听的位置点击事件等的数据,右边有颜色的就是监听鼠标的区域。
ViewController.m中
#import "ViewController.h"
#import "VC1.h" @interface ViewController () @end @implementation ViewController -(void)viewDidLoad {
[super viewDidLoad]; VC1 * view = [[VC1 alloc] initWithFrame:NSMakeRect(100, 100, 300, 300)];
[view setWantsLayer:YES];//开启layer支持,不然设置背景色无用
view.layer.backgroundColor = [NSColor blueColor].CGColor;
[self.view addSubview:view]; } - (void)setRepresentedObject:(id)representedObject {
[super setRepresentedObject:representedObject]; // Update the view, if already loaded.
} @end
新建的VC1继承NSView
VC1.h
#import <Cocoa/Cocoa.h> NS_ASSUME_NONNULL_BEGIN @interface VC1 : NSView @end NS_ASSUME_NONNULL_END
VC1.m
#import "VC1.h" @interface VC1 () @end @implementation VC1 //鼠标进入追踪区域
-(void)mouseEntered:(NSEvent *)event {
NSLog(@"mouseEntered =========");
} //mouserEntered之后调用
-(void)cursorUpdate:(NSEvent *)event {
NSLog(@"cursorUpdate =========="); //更改鼠标光标样式
[[NSCursor pointingHandCursor] set];
} //鼠标退出追踪区域
-(void)mouseExited:(NSEvent *)event {
NSLog(@"mouseExited ========");
} //鼠标左键按下
-(void)mouseDown:(NSEvent *)event {
//event.clickCount 不是累计数。双击时调用mouseDown两次,clickCount第一次=1,第二次 = 2.
if ([event clickCount] > 1) {
//双击相关处理
} NSLog(@"mouseDown ==== clickCount: %ld buttonNumber: %ld",event.clickCount,event.buttonNumber); self.layer.backgroundColor = [NSColor redColor].CGColor; //获取鼠标点击位置坐标:先获取event发生的window中的坐标,在转换成view视图坐标系坐标。
NSPoint eventLocation = [event locationInWindow];
NSPoint center = [self convertPoint:eventLocation fromView:nil]; NSLog(@"center: %@",NSStringFromPoint(center)); //判断是否按下了Command键
if ([event modifierFlags] & NSEventModifierFlagCommand) {
[self setFrameRotation:[self frameRotation] + 90.0];
[self setNeedsDisplay:YES]; NSLog(@"按下了Command键 ---- ");
} } //鼠标左键起来
-(void)mouseUp:(NSEvent *)event {
NSLog(@"mouseUp ======"); self.layer.backgroundColor = [NSColor greenColor].CGColor;
} //鼠标右键按下
- (void)rightMouseDown:(NSEvent *)event {
NSLog(@"rightMouseDown =======");
} //鼠标右键起来
- (void)rightMouseUp:(NSEvent *)event {
NSLog(@"rightMouseUp ======= ");
} //鼠标移动
- (void)mouseMoved:(NSEvent *)event {
NSLog(@"mouseMoved ========= ");
} //鼠标按住左键进行拖拽
- (void)mouseDragged:(NSEvent *)event {
NSLog(@"mouseDragged ======== ");
} //鼠标按住右键进行拖拽
- (void)rightMouseDragged:(NSEvent *)event {
NSLog(@"rightMouseDragged ======= ");
} #pragma mark 监控区域要使用dirtyRect,而非self.frame,否则位置会错误。
- (void)drawRect:(NSRect)dirtyRect {
[super drawRect:dirtyRect]; // Drawing code here. [self addTrackingArea:[[NSTrackingArea alloc] initWithRect:dirtyRect options:NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved |
NSTrackingCursorUpdate |
NSTrackingActiveWhenFirstResponder |
NSTrackingActiveInKeyWindow |
NSTrackingActiveInActiveApp |
NSTrackingActiveAlways |
NSTrackingAssumeInside |
NSTrackingInVisibleRect |
NSTrackingEnabledDuringMouseDrag
owner:self userInfo:nil]]; [self becomeFirstResponder]; }
@end
macOS 开发 NSView添加鼠标监控的更多相关文章
- AI应用开发实战 - 从零开始搭建macOS开发环境
AI应用开发实战 - 从零开始搭建macOS开发环境 本视频配套的视频教程请访问:https://www.bilibili.com/video/av24368929/ 建议和反馈,请发送到 https ...
- 转:Loadrunner添加服务器监控
一.监控windows系统:1.监视连接前的准备 1)进入被监视windows系统,开启以下二个服务Remote Procedure Call(RPC) 和Remote Registry ...
- zabbix实现自动发现功能添加磁盘监控
zabbix实现对磁盘动态监控 - Lenwood 原文 http://www.cnblogs.com/baizhantang/p/3253246.html 主题 Linux命令 zabbix 前言 ...
- OpenGl读取导入3D模型并且添加鼠标移动旋转显示
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11543828.html 最近实习要用到opengl库就是跟opencv 有点像的那个,然后下了 ...
- OpenGl 导入读取多个3D模型 并且添加鼠标控制移动旋转
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11627508.html 前言: 因为接下来的项目需求是要读取多个3D模型,并且移动拼接,那么我 ...
- 分布式监控系统Zabbix-3.0.3-完整安装记录(2)-添加mysql监控
Zabbix3.0 Server以后就自带了MySQL插件来监控mysql数据库的模板,只需要配置好agent客户端,然后在web端给主机增加模板就行了. 以下是公司线上的zabbix3.0环境下添加 ...
- Openstack Murano(kilo)二次开发之添加Volume
Openstack Murano(kilo)二次开发之添加Volume 欢迎转载,转载请注明出处:http://www.cnblogs.com/fmnisme/p/openstack_murano_a ...
- 李洪强iOS开发之添加手势
李洪强iOS开发之添加手势 02 - 添加手势
- 【C#】添加鼠标管轮事件
对FlowLayoutPanel添加鼠标滚轮事件 在mainform中添加事件 his.flowLayoutPanel1.MouseWheel += new System.Windows.Forms. ...
- 如何在C#添加鼠标右键菜单
C#添加鼠标右键方法步骤: 1 选中要添加右键功能的Form或者控件,打开控件的设计页面. 2 从工具箱中找到ContextMenuStrip控件,将这个控件拖曳到Form或者控件的设计页面上.这时系 ...
随机推荐
- JS常用默认行为
form下表示: var forms =document.forms[0]; var forms =document.myform; 找input:var txtName = form.element ...
- c# 使用 Redis
1.安装Redis 我是在Windows上安装redis的,Redis官网我只看到linux版本的,得使用别人提供的windows版本 菜鸟教程提供的redis下载地址:https://github. ...
- 第三章-标准SQL语句
3.1 SQL概述: SQL:结构化查询语言,是关系数据库的标准语言,SQL是一个通用的.功能极强的关系数据库语言 结构化查询:理解:就是只要告诉数据库我要干什么,怎么干就可以了 3.1.2 SQL的 ...
- C# DevExpress GridControl下动态创建列的方法
这里是把在表格中创建控件的方法封装成一个类,然后在创建列的时候实例化"创建控件"的方法 1.在列中使用一些按钮 1 using Common; 2 using DevExpress ...
- 【python操作Excel的常见方法汇总】 xlrd pandas xlwings
用python处理Excel数据,实现Excel的功能:分列.透视等功能 1. Excel 解压文件 #解压tar_path中的压缩文件到uzipPath def unzip_archive(tar_ ...
- python通过接口执行shell命令
需求:通过网站url方式直接执行服务器的shell命令 实现: 1.安装依赖 pip3 install falsk 2.python脚本 [root@localhost tmp]# more fals ...
- .NetCore2.0引用DLL报System.InvalidOperationException: Can not find compilation library location for package 'XXX'
.NET CORE 2.0 MVC项目引用类库出现:System.InvalidOperationException: Can not find compilation library locatio ...
- Ansible scp Python脚本
import osimport paramiko def RemoteScp(host_ip, host_port, host_username, host_password, remote_path ...
- 安卓调试打包错误Error executing aapt: Return code -1073741819 Error while running zipalign
之前开发完的安卓app项目,再次打开,突然抽风报错. 1.调试运行报错:Error executing aapt: Return code -1073741819 2.打包失败报错: Error wh ...
- Kubernetes部署的10个注意事项
摘要 容器开发有望在云中实现前所未有的可移植性和可扩展 性.此外,DevOps 开发和文化实践也有助于提升业务价 值和响应能力.但是,在开始第一个容器开发项目之前, 有一些问题需要考虑清楚:我们应该使 ...