Эквивалент TrackPopupMenu в OS X - PullRequest
0 голосов
/ 19 сентября 2019

В Windows есть этот изящный маленький API для создания и отображения всплывающего меню на рабочем столе даже из фонового скрытого приложения.Есть ли что-то похожее в Mac?

У меня есть фоновый процесс, запускаемый программой запуска (в контексте пользователя), и я хотел бы отобразить всплывающее меню с несколькими опциями для выбора пользователем, когда он получает командуиз сети.Возможно?

Сам фоновый процесс представляет собой простую программу командной строки C ++.

Ответы [ 2 ]

0 голосов
/ 19 сентября 2019

Для записи вот код, который я написал, который отображает меню на рабочем столе (я не программист Mac, поэтому могут быть ошибки или моя реализация не обязательно должна быть наиболее оптимальной):

// Dummy View class used to receive Menu Events
@interface DummyView : NSView
{
    NSMenuItem* nsMenuItem;
}
- (void) OnMenuSelection:(id)sender;
- (NSMenuItem*)MenuItem;
@end

@implementation DummyView
- (NSMenuItem*)MenuItem
{
    return nsMenuItem;
}

- (void)OnMenuSelection:(id)sender
{
    nsMenuItem = sender;
}
@end

static void HandleRButtonDown()
{
@autoreleasepool {
    NSRect    graphicsRect;  // contains an origin, width, height
    graphicsRect = NSMakeRect(200, 200, 50, 100);


    [NSApplication sharedApplication];
        // Style flags:
    NSUInteger windowStyle = NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskResizable;

    // Window bounds (x, y, width, height).
    NSRect windowRect = NSMakeRect(0, 0, 0, 0);
    NSWindow * window = [[NSWindow alloc] initWithContentRect:windowRect
                                          styleMask:windowStyle
                                          backing:NSBackingStoreBuffered
                                          defer:NO];

    // Window controller:
    NSWindowController * windowController = [[NSWindowController alloc] initWithWindow:window];

    DummyView *nsView = [[DummyView alloc] initWithFrame:graphicsRect];
    [window setContentView:nsView];

    // Create Menu and Dummy View
    NSMenu *nsMenu = [[NSMenu alloc] initWithTitle:@"Contextual Menu"];
    [nsMenu setAutoenablesItems:NO];

    NSMenuItem* item1 = [nsMenu addItemWithTitle:@"Menu Item #1" action:@selector(OnMenuSelection:) keyEquivalent:@""];

    [item1 setTag:100];
    [item1 setTarget:nsView];
    [item1 setEnabled:YES];

    NSMenuItem *item2 = [nsMenu addItemWithTitle:@"Menu Item #2" action:@selector(OnMenuSelection:) keyEquivalent:@""];

    [item2 setTag:200];
    [item2 setTarget:nsView];
    [item2 setEnabled:YES];

    [nsMenu popUpMenuPositioningItem:item1 atLocation:[NSEvent mouseLocation] inView:nsView];

    printf("Selected item: %d\n", (int)[[nsView MenuItem] tag]);
}

}

Вызовите HandleRButtonDown () из main, и вы должны получить всплывающее меню на экране.

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 19 сентября 2019

Вы можете попробовать использовать popUpMenuPositionItem: atLocation: inView: .

В документации сказано:

Если вид равен нулю, местоположение интерпретируется в системе координат экрана.Это позволяет вам открыть меню, отключенное от любого окна.

Так, например:

[myMenu popUpMenuPositioningItem:nil atLocation:[NSEvent mouseLocation] inView:nil];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...