当显示弹出菜单时,我需要检查/取消选中项目,但我不希望弹出菜单关闭并重新打开。 它会引起烦人的闪烁。
到目前为止,这是我的代码:
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.Checked
(Item.Click;
方法)之后立即设置MenuSelectID
- 项目未通知,并且在我离开之前不会进行检查项目区域并输入回...
我也尝试过:CheckMenuItem(Menu.Handle, ItemID, MF_BYCOMMAND or MF_CHECKED);
- 效果相同。
所以,我回到了零,因为我的主要目标是检查/取消选中菜单项。与Microsoft Office中的status bar context menu相同(至少2010年):
编辑2:在设置InvalidateRect(FPopupWindowHandle, nil, False);
后立即添加Checked
修复了无效问题。