1

ステータス アイテムをシステム ステータス バーに挿入するコードを Delphi で作成しました。コードは正常に機能し、ステータス アイテムが表示されます。私は透明なアイコンを使用しました。メニューを開くには、アイコン (アイコンの四角形ではなく) を正確にクリックする必要があります。しかし、アイコンの透明部分をクリックしても何も起こりません! 私は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 に答える