在不关闭TPopupMenu的情况下检查/取消选中TMenuItem

时间:2013-01-06 12:51:11

标签: delphi delphi-7

  

可能重复:
  How to select a Menu Item without closing the Menu?

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

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

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:重复接受的答案How to select a Menu Item without closing the Menu存在一个小问题:

如果我在Item.Checked := not Item.CheckedItem.Click;方法)之后立即设置MenuSelectID - 项目未通知,并且在我离开之前不会进行检查项目区域并输入回... 我也尝试过:CheckMenuItem(Menu.Handle, ItemID, MF_BYCOMMAND or MF_CHECKED); - 效果相同。

所以,我回到了零,因为我的主要目标是检查/取消选中菜单项。与Microsoft Office中的status bar context menu相同(至少2010年):


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

0 个答案:

没有答案