- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 NSMenuItem
上使用 setView:
方法来设置自定义 View 。在这个自定义 View 中,有一个图像占据了整个 View 。具有此自定义 View 的 NSMenuItem
是菜单中的第一个,但问题是它没有与菜单顶部齐平,如您在此处看到的那样,存在很大差距:
为什么会发生这种情况,我该如何阻止它?
编辑
我现在正在使用此代码,但我在 InstallControlEventHandler
行上收到了 EXC_BAD_ACCESS
。
-(void)applicationDidFinishLaunching:(NSNotification *)aNotification {
HIViewRef contentView;
MenuRef menuRef = [statusMenu carbonMenuRef];
HIMenuGetContentView(menuRef, kThemeMenuTypePullDown, &contentView);
EventTypeSpec hsEventSpec[1] = {
{ kEventClassMenu, kEventMenuCreateFrameView }
};
InstallControlEventHandler(contentView,
NewEventHandlerUPP((EventHandlerProcPtr)hsMenuCreationEventHandler),
GetEventTypeCount(hsEventSpec),
hsEventSpec,
NULL,
NULL); // Get EXC_BAD_ACCESS here.
}
static OSStatus hsMenuContentEventHandler( EventHandlerCallRef caller, EventRef event, void* refcon )
{
OSStatus err;
check( GetEventClass( event ) == kEventClassControl );
check( GetEventKind( event ) == kEventControlGetFrameMetrics );
err = CallNextEventHandler( caller, event );
if ( err == noErr )
{
HIViewFrameMetrics metrics;
verify_noerr( GetEventParameter( event, kEventParamControlFrameMetrics, typeControlFrameMetrics, NULL,
sizeof( metrics ), NULL, &metrics ) );
metrics.top = 0;
verify_noerr( SetEventParameter( event, kEventParamControlFrameMetrics, typeControlFrameMetrics,
sizeof( metrics ), &metrics ) );
}
return err;
}
static OSStatus hsMenuCreationEventHandler( EventHandlerCallRef caller, EventRef event, void* refcon )
{
OSStatus err = eventNotHandledErr;
if ( GetEventKind( event ) == kEventMenuCreateFrameView)
{
err = CallNextEventHandler( caller, event );
if ( err == noErr )
{
static const EventTypeSpec kContentEvents[] =
{
{ kEventClassControl, kEventControlGetFrameMetrics }
};
HIViewRef frame;
HIViewRef content;
verify_noerr( GetEventParameter( event, kEventParamMenuFrameView, typeControlRef, NULL,
sizeof( frame ), NULL, &frame ) );
verify_noerr( HIViewFindByID( frame, kHIViewWindowContentID, &content ) );
InstallControlEventHandler( content, hsMenuContentEventHandler, GetEventTypeCount( kContentEvents ),
kContentEvents, 0, NULL );
}
}
return err;
}
另请注意 metrics.top = 0
行,这是应该删除顶部间隙的行。但是我无法让它工作那么远。有谁知道为什么我会在那里收到 EXC_BAD_ACCESS
。我已经创建并分配了 statusMenu
,所以它肯定可以工作吗?
最佳答案
尽管您的示例代码是 C 和 Carbon,但您的帖子被标记为“Objective-C”和“Cocoa”。我假设您更喜欢 Cocoa 解决方案?
在 Cocoa 中实际上非常简单。唯一的技巧是学习如何画线外。 :-)
@interface FullMenuItemView : NSView
@end
@implementation FullMenuItemView
- (void) drawRect:(NSRect)dirtyRect
{
NSRect fullBounds = [self bounds];
fullBounds.size.height += 4;
[[NSBezierPath bezierPathWithRect:fullBounds] setClip];
// Then do your drawing, for example...
[[NSColor blueColor] set];
NSRectFill( fullBounds );
}
@end
像这样使用它:
CGFloat menuItemHeight = 32;
NSRect viewRect = NSMakeRect(0, 0, /* width autoresizes */ 1, menuItemHeight);
NSView *menuItemView = [[[FullMenuItemView alloc] initWithFrame:viewRect] autorelease];
menuItemView.autoresizingMask = NSViewWidthSizable;
yourMenuItem.view = menuItemView;
关于objective-c - NSMenuItem 自定义 View 上方的间隙,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4533816/
我想执行绑定(bind)到 NSMenuItem 的操作,我正在为 osx 应用程序开发一个插件。因此我不知道菜单项的目标方法。 (菜单项的目标返回 nil) 如何以编程方式按下 NSMenuItem
我可以使用商品的标签属性来存储特殊的 key /ID 还是用于其他用途? 预期用途示例: - (void)awakeFromNib { [self.popup addItemWithTit
我正在开发一个基于 Cocoa 文档的应用程序。我的文件菜单中有一个名为“Export Things...”的菜单项。此菜单项连接到第一响应者,并调用MyDocument中的选择器。到目前为止一切顺利
当您在 Mac 上按下 NSMenuItem 键盘快捷键时,菜单本身会突出显示,以指示该菜单中的操作已被激活。 如果您不熟悉该效果,请立即尝试选择一些文本,然后按 CMD-C,观看“编辑”菜单。它将闪
我想在 NSMenuItem 自定义 View 中放置一个动画进度条。这在 Apple 的 MenuItemView 示例中得到了演示,但它没有动画(至少在 10.5 中没有,并且该示例显然来自 10
我正在创建一个状态栏应用程序,它需要在文本字段中输入 URL。文本字段是 NSMenuItem 的 subview 。我面临的问题是,文本字段的值无法更改,只能“间接突出显示”(它不是正常的蓝色突出显
我有对最外层菜单的引用,但我试图获取对嵌套在子菜单中的 NSMenuItem 的引用: NSMenuItem* file_menu = [menu itemWithTitle:@"File]; fil
我有一个 NSMenuItem,我想为其使用等效的 Command-Option-C 键。但是,当我在 IB 中设置等效键时,应用程序实际运行时它不会与菜单项关联。该条目没有可见的等效键,并且该命令不
我试图理解 Cocoa 中的一些东西,但我陷入了一件事。我正在关注Minimalistic Cocoa Programming ,其中有一个 NSMenuItem 负责终止应用程序。现在,我想创建另一
我有一个 NSMenuItem,我需要更新它以显示进度(就像时间机器对其备份所做的那样)。问题是,当我在该 NSMenuItem 上设置新的 title 时,title 没有改变。 当我关闭并重新打开
我见过这样的事情: 在菜单项右侧的 Menulet 中,我不知道该怎么做。 谁能详细说明一下吗?谢谢! 最佳答案 您只能在 Cocoa 中使用 NSMenuItem 的自定义 View 行为来执行此操
我正在我的应用程序上创建一个状态栏,菜单显示正常,但它似乎无法访问我为其设置的操作。 我通过 C 函数添加状态栏: void MyFunction(CefRefPtr browser) { M
我有一个 NSMenuItem,我需要更新它以显示进度(就像时间机器对其备份所做的那样)。问题是,当我在该 NSMenuItem 上设置新的 title 时,title 没有改变。 当我关闭并重新打开
我以编程方式创建一个 NSMenuItem,但它被禁用。如果我重写 validateMenuItem: 方法并为所有项目返回 YES,则菜单项工作正常。 当我告诉菜单 autoEnableItems
我对 NSMenu 进行了子类化,并通过 Interface Builder 连接了一堆 NSMenuItem。我已经通过调试器进行了测试,看看它们确实得到了初始化。 菜单设置为不自动启用项目。尽管如
我在 Swift 1.2 中有一个基于文档的应用程序。我想以编程方式生成对当前 NSDocument 有操作的 NSMenuItem,然后检查该选择。这是我到目前为止所拥有的: AppDelegate
假设我有一个 menuBar 应用,子菜单上有 3 个项目: let delaySubMenu = NSMenu() delaySubMenu.addItem(NSMenuItem(title: "5
我能够使用以下代码以编程方式创建菜单项。 primaryMenu.addItem(NSMenuItem(title: "MenuTitle", action: nil, keyEquivalent:
我目前正在向我的 NSMenu 添加一个 NSMenuItem,并且我能够成功检测并处理点击事件。但是,我想添加第二个选项并检测用户是否在按住 SHIFT 的同时单击了 menuItem let me
我的项目中有一个 NSMenuItem: var statusBar = NSStatusBar.systemStatusBar() var statusItem : NSStatusItem = N
我是一名优秀的程序员,十分优秀!