1

我在delphi中编写了一个代码来将状态项插入系统状态栏,代码运行良好并显示状态项。我使用了一个透明图标,我应该完全点击图标(而不是图标 rect)来打开菜单。但是如果我点击图标的透明区域,什么都不会发生!我用 XCode 编写了相同的代码,一切都很好。

有没有人对这个案子有想法?我想通过单击状态图标的任意点(彩色和透明点)打开菜单。

编码:

procedure createStatusItem;
var
    app_delg: AppDelegate;
    statusBar: NSStatusBar;
    statusItem: NSStatusItem;
    menu: NSMenu;
    pImage: Pointer;
    nsImage: NSImage;
begin
    app_delg := TAppDelegate.Create;
    TNSApplication.Wrap(TNSApplication.OCClass.sharedApplication()).setDelegate(AppDelegate(app_delg));
    statusBar := TNSStatusBar.Wrap(TNSStatusBar.OCClass.systemStatusBar);
    menu := TNSMenu.Wrap(TNSMenu.Alloc.initWithTitle(NSSTR('')));
    statusItem := statusBar.statusItemWithLength(NSVariableStatusItemLength);
    statusItem.retain;
    statusItem.setHighlightMode(true);
    statusItem.setAction(sel_getUid('onMenuClicked:'));
    statusItem.setMenu(menu);

    pImage := TNSImage.Alloc.initWithContentsOfFile(NSSTR('icon.ico'));
    nsImage := TNSImage.Wrap(pImage);
    statusItem.setImage(nsImage);
    nsImage.release;
end;

谢谢。

4

1 回答 1

0

设置菜单属性时,不会触发该操作。所以删除 setmenu 行。然后你需要一个目标。为其创建一个委托并将其设置为目标。

type
  IStatusBarDelegate = interface(NSObject)
    ['{5D8BF7A3-C695-45F8-A447-948524718E5F}']
    procedure StatusbarItemClick; cdecl;
  end;

  TStatusbarDelegate = class(TOCLocal)
  protected
    { TOCLocal }
    function GetObjectiveCClass: PTypeInfo; override;
  public
    procedure StatusbarItemClick; cdecl;
  end;

implementation

function TStatusbarDelegate.GetObjectiveCClass: PTypeInfo;
begin
  Result := TypeInfo(IStatusBarDelegate);
end;

procedure TStatusbarDelegate.StatusbarItemClick;
begin
  Showmessage('click');
end;

procedure TForm1.Button4Click(Sender: TObject);
var
  statusBar: NSStatusBar;
  statusItem: NSStatusItem;
  statusBarDelegate : TStatusbarDelegate;
begin
  StatusBarDelegate := TStatusbarDelegate.Create;
  StatusBar := TNSStatusBar.Wrap(TNSStatusBar.OCClass.systemStatusBar);
  StatusBarItem := FStatusBar.statusItemWithLength(NSVariableStatusItemLength);
  StatusBarItem.retain;
  Statusbaritem.setHighlightMode(True);
  Statusbaritem.setTitle(StrToNSStr('test'));
  Statusbaritem.setEnabled(true);
  Statusbaritem.setToolTip(StrToNSStr('test tooltip'));
  Statusbaritem.setTarget(FStatusBarDelegate.GetObjectID);
  Statusbaritem.setAction(sel_getUid('StatusbarItemClick'));
 end;
于 2016-01-26T19:47:13.533 回答