Ich verwende die setView:
Methode auf eine NSMenuItem
, um eine benutzerdefinierte Ansicht festzulegen. In dieser benutzerdefinierten Ansicht befindet sich ein Bild, das die gesamte Ansicht erfasst. Die NSMenuItem
mit dieser benutzerdefinierten Ansicht der ersten im Menü ist aber das Problem ist es nicht mit dem oberen Rande des Menüs bündig nicht sitzt, gibt es eine große Lücke, wie Sie hier sehen können:Gap über NSMenuItem benutzerdefinierte Ansicht
Warum passiert das und wie kann ich es stoppen?
EDIT
ich diesen Code jetzt bin mit aber ich bin immer EXC_BAD_ACCESS
auf der Linie InstallControlEventHandler
.
-(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;
}
beachten Sie auch die Linie metrics.top = 0
das ist die Linie, die die Lücke an der Spitze entfernen sollte. Aber ich kann es nicht so weit bringen. Weiß jemand, warum ich dort eine EXC_BAD_ACCESS
erhalten würde. Ich habe bereits statusMenu
erstellt und zugewiesen, also sollte es sicher funktionieren?
Es sieht aus wie ein weißer Abstandshalter an der Ober- und Unterseite jeden Menüs ist. Ich würde auch gerne wissen, ob es möglich ist, es zu vermeiden. –
Ich nehme an, der schwarze Teil ist das Bild, nicht die Lücke? Zwischen den oberen und unteren Bereichen des Menüs gibt es zusätzlich zu den Separator-Elementen eine Füllung, die aus ästhetischen Gründen besteht. Ich bin mir nicht sicher, ob dies getan wird, ist NSMenu oder NSMenuItem, aber Sie müssen möglicherweise die eine oder andere Unterklasse, um es zu verhindern. – d11wtq
Ich habe etwas recherchiert und diese http://www.mail-archive.com/[email protected]/msg26997.html aufgedeckt. Es sieht so aus, als würde ein benutzerdefiniertes NSMenu benötigt werden und ein paar private API-Basteleien . –