场景
-
Cocoa
开发里我们使用NSButton
按钮时如何判断鼠标点击了按钮的哪个坐标? -
如何根据点击按钮的坐标位置来响应不同的内容? 比如点击的是自定义按钮里的复选框?
说明
方案一: NSButton
按钮有一个setAction
来设置按钮响应的处理函数。这个函数是在NSView
的mouseDown
函数里调用的。
这时候如果我们需要判断鼠标的点击坐标,常规做法就是在这个mouseDown
函数里根据参数event
来进行坐标转换.
- (void)mouseDown:(NSEvent *)event
{
NSPoint p = [event locationInWindow];
NSPoint local_point = [self convertPoint:p fromView:nil];
...
if(NSPointInRect(pos, rect_update_))
is_click_checkbox = YES;
[super mouseDown:event]
is_click_checkbox = NO;
}
得到的local_point
即鼠标在按钮坐标系里的坐标值。但是如果要判断是否是点击在复选框上,则需要存储一个变量is_click_checkbox
来判断当前是否点击了复选框, 之后在[super mouseDown:event];
还原这个变量值. 如果需要判断按钮不同的位置,则需要存储多个变量. 这是一个方案.
方案二: 除了在mouseDown
里判断鼠标点击位置还可以在处理函数Action
里判断,而Action
函数的唯一参数只能是sender
, 即按钮本身实例变量. Cocoa
提供了一个[NSApp currentEvent]
来获取当前事件。通过这个事件,我们也可以获取鼠标点击位置. 我们在Action
里调用按钮的isClickUpdateButton
方法来判断当前事件的点击位置. 如下:
-(BOOL)isClickUpdateButton
{
NSEvent *currentEvent = [NSApp currentEvent];
NSPoint location = [currentEvent locationInWindow];
NSPoint pos = [self convertPoint:location fromView:nil];
if(NSPointInRect(pos, rect_update_))
return YES;
return NO;
}
-(void)onClickTool:(id)sender
{
DhProductButton* button = sender;
BOOL clickDownload = [button isClickDownloadButton];
...
}
参考
转载:https://blog.csdn.net/infoworld/article/details/100889148
查看评论