Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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 NSString*文本到NSString*图标?_Cocoa_Macos_Menubar - Fatal编程技术网

Cocoa NSString*文本到NSString*图标?

Cocoa NSString*文本到NSString*图标?,cocoa,macos,menubar,Cocoa,Macos,Menubar,我正在制作一个应用程序,它是一个独立的菜单项,代码的基础是我在网站上找到的示例代码。示例代码使用数字作为菜单图标,但我想将其更改为图像 我希望它像其他应用一样,在未单击时显示icon.png,在单击时显示icon active.png 当前代码如下: - (void)drawRect:(NSRect)rect { // Draw background if appropriate. if (clicked) { [[NSColor selectedMenuItemColor] set];

我正在制作一个应用程序,它是一个独立的菜单项,代码的基础是我在网站上找到的示例代码。示例代码使用数字作为菜单图标,但我想将其更改为图像

我希望它像其他应用一样,在未单击时显示
icon.png
,在单击时显示
icon active.png

当前代码如下:

- (void)drawRect:(NSRect)rect {
// Draw background if appropriate.
if (clicked) {
    [[NSColor selectedMenuItemColor] set];
    NSRectFill(rect);
}

// Draw some text, just to show how it's done.
NSString *text = @"3"; // whatever you want

NSColor *textColor = [NSColor controlTextColor];
if (clicked) {
    textColor = [NSColor selectedMenuItemTextColor];
}

NSFont *msgFont = [NSFont menuBarFontOfSize:15.0];
NSMutableParagraphStyle *paraStyle = [[NSMutableParagraphStyle alloc] init];
[paraStyle setParagraphStyle:[NSParagraphStyle defaultParagraphStyle]];
[paraStyle setAlignment:NSCenterTextAlignment];
[paraStyle setLineBreakMode:NSLineBreakByTruncatingTail];
NSMutableDictionary *msgAttrs = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                 msgFont, NSFontAttributeName,
                                 textColor, NSForegroundColorAttributeName,
                                 paraStyle, NSParagraphStyleAttributeName,
                                 nil];
[paraStyle release];

NSSize msgSize = [text sizeWithAttributes:msgAttrs];
NSRect msgRect = NSMakeRect(0, 0, msgSize.width, msgSize.height);
msgRect.origin.x = ([self frame].size.width - msgSize.width) / 2.0;
msgRect.origin.y = ([self frame].size.height - msgSize.height) / 2.0;

[text drawInRect:msgRect withAttributes:msgAttrs];
}
此外,我还发现了一篇文章,描述了一种如何做到这一点的方法,但它对我并不适用。指向的url为:


谢谢

使用
NSImage
并在需要的地方绘制它。例如:

NSString *name = clicked? @"icon-active" : @"icon";
NSImage *image = [NSImage imageNamed:name];
NSPoint p = [self bounds].origin;
[image drawAtPoint:p fromRect:NSZeroRect
         operation:NSCompositeSourceOver fraction:1.0];

使用
NSImage
并根据需要绘制它。例如:

NSString *name = clicked? @"icon-active" : @"icon";
NSImage *image = [NSImage imageNamed:name];
NSPoint p = [self bounds].origin;
[image drawAtPoint:p fromRect:NSZeroRect
         operation:NSCompositeSourceOver fraction:1.0];


如果这是一个状态项,而您只需要一个没有编程图形的图标,请删除视图并设置状态项的
image
alternateImage
。前者是状态项通常使用的;当用户打开菜单时,状态项将切换到备用图像(如果有)。

如果这是一个状态项,而您只需要一个没有编程图形的图标,请删除视图,并设置状态项的
图像
备用图像
。前者是状态项通常使用的;当用户打开菜单时,状态项切换到备用图像(如果有)。

您的问题是什么?你的文章的正文似乎与标题完全无关。现在,菜单栏图标是一个数字。我想把它变成一个图标,但我不知道怎么做。我贴了号码的密码。你的问题是什么?你的文章的正文似乎与标题完全无关。现在,菜单栏图标是一个数字。我想把它变成一个图标,但我不知道怎么做。我贴了号码的密码好的,有个问题。单击时,它不会切换到第二个图标。它停留在第二个图标上,
:@“icon”始终存在。@Charlie我假设,因为您的示例代码依赖于此
单击的
布尔值,所以我也可以。但是当点击图标时,它听起来好像并没有被更新。应该有一种方法来获取信息以更新单击的
;您发布的
-drawRect:
代码属于什么类型的对象?如果它是
NSMenuItem
子类,则类似于
clicked=[self-ishighlight]
的功能可能会起作用。我通过将此行中的“否”更改为“是”(位于我发布的代码下方)
[self-setNeedsDisplay:YES]
但是现在图标后面会显示一个蓝色背景,这就是我将其设置为否的原因。有没有办法将其关闭?@Charlie:它不会“将void与
设置HighlightMode
一起使用”。那没有道理。它显示签名,其中包括返回类型,即
void
。不,那是行不通的。您需要将消息发送到您的状态项实例,而不是NSStatusItem类。@Charlie:您似乎对语法感到困惑,因此我建议您阅读(或重读)Objective-C编程语言文档:如果您没有C背景,您可能还需要先复习C。斯科特·史蒂文森(Scott Stevenson)的《可可与目标C:启动与运行》(Cocoa and Objective-C:Up and Running)很好地概括了您需要了解的内容。同样值得一读的是“使用Objective-C进行面向对象编程”:好的,一个问题。单击时,它不会切换到第二个图标。它停留在第二个图标上,
:@“icon”始终存在。@Charlie我假设,因为您的示例代码依赖于此
单击的
布尔值,所以我也可以。但是当点击图标时,它听起来好像并没有被更新。应该有一种方法来获取信息以更新单击的
;您发布的
-drawRect:
代码属于什么类型的对象?如果它是
NSMenuItem
子类,则类似于
clicked=[self-ishighlight]
的功能可能会起作用。我通过将此行中的“否”更改为“是”(位于我发布的代码下方)
[self-setNeedsDisplay:YES]
但是现在图标后面会显示一个蓝色背景,这就是我将其设置为否的原因。有没有办法将其关闭?@Charlie:它不会“将void与
设置HighlightMode
一起使用”。那没有道理。它显示签名,其中包括返回类型,即
void
。不,那是行不通的。您需要将消息发送到您的状态项实例,而不是NSStatusItem类。@Charlie:您似乎对语法感到困惑,因此我建议您阅读(或重读)Objective-C编程语言文档:如果您没有C背景,您可能还需要先复习C。斯科特·史蒂文森(Scott Stevenson)的《可可与目标C:启动与运行》(Cocoa and Objective-C:Up and Running)很好地概括了您需要了解的内容。同样值得一读的(甚至可能在语言之前)是“使用Objective-C进行面向对象编程”:@Charlie使用类提供的配置点通常比重写超类方法更可取。如果使用的是
NSStatusItem
,则设置
image
alternateImage
将比自定义图形简单得多。您甚至可以从Interface Builder执行此操作。好的,谢谢您的提示!但是,我无法在interface builder中执行任何操作,因为我正在使用的代码没有显示。我的意思是,它不是菜单栏项,而是某种工具提示。@Charlie使用类提供的配置点通常比重写超类方法更可取。如果使用的是
NSStatusItem
,则设置
image
alternateImage
将比自定义图形简单得多。您甚至可以从Interface Builder执行此操作。好的,谢谢您的提示!但是,我无法在interface builder中执行任何操作,因为我正在使用的代码没有显示。我所说的