Tôi đang sử dụng phương pháp setView:
trên NSMenuItem
để đặt chế độ xem tùy chỉnh. Trong chế độ xem tùy chỉnh này, có một hình ảnh chụp toàn bộ khung nhìn. Các NSMenuItem
với giao diện tùy chỉnh này là lần đầu tiên trong menu nhưng vấn đề là nó không ngồi ngang bằng với đỉnh của menu, có một khoảng cách lớn như bạn có thể xem tại đây:Khoảng cách phía trên chế độ xem tùy chỉnh NSMenuItem
Tại sao điều này có xảy ra không và làm thế nào tôi có thể ngăn chặn nó?
EDIT
Tôi đang sử dụng mã này, nhưng bây giờ tôi nhận được EXC_BAD_ACCESS
trên dòng 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;
}
Cũng lưu ý dòng metrics.top = 0
đây là dòng nên loại bỏ khoảng trống ở trên cùng. Tuy nhiên tôi không thể làm cho nó hoạt động xa đến thế. Có ai biết tại sao tôi sẽ nhận được một EXC_BAD_ACCESS
ở đó. Tôi đã tạo và phân bổ statusMenu
vì vậy chắc chắn nó sẽ hoạt động?
Dường như có một spacer trắng ở đầu và cuối mỗi menu. Tôi cũng muốn biết nếu nó có thể tránh được nó. –
Tôi cho rằng phần màu đen là hình ảnh chứ không phải khoảng cách? Có một số phần đệm giữa đầu và cuối trình đơn, ngoài các mục phân cách, vì lý do thẩm mỹ. Tôi không chắc chắn nếu điều này được thực hiện là NSMenu hoặc NSMenuItem, nhưng bạn có thể cần phải phân lớp hoặc một hoặc khác để ngăn chặn nó. – d11wtq
Tôi đã thực hiện một số nghiên cứu và đã bật http://www.mail-archive.com/[email protected]/msg26997.html Dường như NSMenu tùy chỉnh sẽ là cần thiết và một số tin nhắn API riêng tư . –