4

可能重复:
如何在不关闭菜单的情况下选择菜单项?

当弹出菜单显示时,我需要选中/取消选中项目,但我不希望弹出菜单关闭并重新打开。它会导致烦人的闪烁。

到目前为止,这是我的代码:

type
  TForm1 = class(TForm)
    PopupMenu1: TPopupMenu;
    N11: TMenuItem;
    N21: TMenuItem;
    N31: TMenuItem;
    procedure PopupMenu1Popup(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    PopupPt: TPoint;
    procedure OptionClick(Sender: TObject);
  public
  end;

implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
  Self.PopupMenu := PopupMenu1;
  PopupMenu1.OnPopup := PopupMenu1Popup;
  N11.OnClick := OptionClick;
  N21.OnClick := OptionClick;
  N31.OnClick := OptionClick;
end;

procedure TForm1.OptionClick(Sender: TObject);
begin
  PopupMenu1.Tag := 1;
  try
    (Sender as TMenuItem).Checked := not (Sender as TMenuItem).Checked;
    PopupMenu1.Popup(PopupPt.x, PopupPt.y);
  finally
    PopupMenu1.Tag := 0;
  end;
end;

procedure TForm1.PopupMenu1Popup(Sender: TObject);
begin
  if PopupMenu1.Tag = 0 then
    PopupPt := Mouse.CursorPos;
end;

我的问题,这可以做得更好吗?


编辑1:重复接受的答案有一个小问题如何在不关闭菜单的情况下选择菜单项

如果我Item.Checked := not Item.CheckedItem.Click;MenuSelectID方法)之后立即设置 - 项目没有失效,并且在我离开项目区域并回车之前不会绘制支票......我也尝试过:CheckMenuItem(Menu.Handle, ItemID, MF_BYCOMMAND or MF_CHECKED);- 效果相同。

所以,我回到零基础,因为我的主要目标是检查/取消选中菜单项。与 Microsoft Office 中的状态栏上下文菜单相同(至少 2010):


编辑 2:InvalidateRect(FPopupWindowHandle, nil, False);在设置Checked修复失效问题后立即添加。

4

0 回答 0