Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 如何使自定义NSView中的按钮在鼠标上方更改颜色?_Cocoa_Mouseevent_Nsview - Fatal编程技术网

Cocoa 如何使自定义NSView中的按钮在鼠标上方更改颜色?

Cocoa 如何使自定义NSView中的按钮在鼠标上方更改颜色?,cocoa,mouseevent,nsview,Cocoa,Mouseevent,Nsview,这是一款用Cocoa和Objective-C编写的Mac应用程序 我有一个定制的NSView类,它本质上是一个按钮集合,并存储所选按钮的值。有点像NSSlider,它捕捉到刻度线,但使用按钮而不是滑块。下面左边的图片就是它的样子 现在我想做的是,当鼠标移动到每个按钮上时,它会用半透明的蓝色覆盖该按钮,然后在单击按钮时,它会停留在那里。我做了一些尝试,您可以在右侧的图像中看到最新的结果: 这是鼠标滑过所有按钮后发生的情况。出于某种原因,它使用窗口的原点绘制,而不是在MyButtonView中绘制

这是一款用Cocoa和Objective-C编写的Mac应用程序

我有一个定制的NSView类,它本质上是一个按钮集合,并存储所选按钮的值。有点像NSSlider,它捕捉到刻度线,但使用按钮而不是滑块。下面左边的图片就是它的样子

现在我想做的是,当鼠标移动到每个按钮上时,它会用半透明的蓝色覆盖该按钮,然后在单击按钮时,它会停留在那里。我做了一些尝试,您可以在右侧的图像中看到最新的结果:

这是鼠标滑过所有按钮后发生的情况。出于某种原因,它使用窗口的原点绘制,而不是在MyButtonView中绘制。而且,它不是半透明的。我还没有担心鼠标离开矩形时会重新绘制普通按钮,因为这部分还不能正常工作

下面是相关的代码

在MyButtonView类的initWithFrame方法中:

for (int i = 0; i < 12; i++) {
        yOrigin = kBorderSize + (buttonHeight * i) + (kSeparatorSize * i);
        NSRect newRect = { {xOrigin, yOrigin}, {buttonWidth, buttonHeight} };
        [buttonRectangles addObject:NSStringFromRect(newRect)];
        [self addTrackingRect:newRect owner:self userData:NULL assumeInside:NO];
    }

我不知道怎么做。我花了几个小时仔细阅读苹果的文档,但还是弄不明白。显然,我不是Cocoa或Objective-C的老手,所以我希望能得到一些帮助。

您遇到的一个基本问题是,您绕过了正常的绘图机制,试图自己强制绘图。这是初来乍到者常犯的错误。在继续之前,您应该阅读Apple的View编程指南:

如果您在这方面有困难,那么您可能需要备份一些更基本的Objective-C/Cocoa指南和文档,并从它们开始

回到您的实际视图,在这个视图中您必须做的一件事是使用drawRect:方法完成所有的绘图。您应该通过某种数据结构跟踪鼠标移动的状态,然后根据drawRect:方法中的数据结构进行绘图。你会打电话的

[自我设置需要显示:是]

在鼠标跟踪方法中,在记录数据结构中发生的任何更改之后。如果您一次只想画一个高亮显示的按钮,那么您的数据结构可以像NSInteger一样简单,您可以将其值设置为所选按钮的索引(或-1或任何表示未选择的值)


为了便于学习,蓝色框当前从窗口原点绘制的原因是,当系统调用drawRect:时,您在通常为视图设置的“上下文”之外调用绘制代码。“上下文”将包括将当前原点移动到视图原点的转换,而不是窗口原点。

谢谢harrisg,我能够让它完全按照我想要的方式工作。
- (void)mouseEntered:(NSEvent *)theEvent {
    NSRect rect = [[theEvent trackingArea] rect];
    [self drawHoverRect:rect withColor:hoverBlue];
}

- (void)drawHoverRect:(NSRect)rect withColor:(NSColor *)color {
    [color set];
    NSRectFill(rect);
    [self displayRect:rect];
}