使用图标时如何在视觉上识别选中的菜单项?
问题描述:
我使用TPopupMenu
组件,并将图标分配给其菜单项(TMenuItem
)。使用图标时如何在视觉上识别选中的菜单项?
在设计时,该图标不显示和复选标记可以判断哪个是检查项目:
在运行时,显示的图标,但所有项目都以同样的方式绘制和使用图标时
如何在视觉上识别检查项目:我可以不承认检查吗?
答
要在运行时在视觉上识别您选中的项目,您必须在设计时自定义其绘图。
如果您有此机会,请将TPopupMenu.OwnerDraw
属性设置为True
。然后对于每个涉及TMenuItem
,您必须为其OnDrawItem
事件编写一个行为。例如下面的代码(快速读写的不稳健的话)可以处理每TMenuItem在一个单一的方法呈现:
procedure TForm1.MyMenuItemDrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Selected: Boolean);
var
_item: TMenuItem;
const
MARGIN = 4;
INDEX_CHECKMARK = 3; // Add a checkmark image in your TImageList
begin
// Get current item
_item := (Sender as TMenuItem);
// Set then fill background color depending on selected state
if Selected then
ACanvas.Brush.Color := clGreen
else
ACanvas.Brush.Color := clMenu;
ACanvas.FillRect(ARect);
ARect.Left := MARGIN;
// Draw a mark if item is checked
if _item.Checked then
AnImageList.Draw(ACanvas, ARect.Left, ARect.Top + 2, INDEX_CHECKMARK);
// Inflate left position even for unchecked items, to keep text left alignement
ARect.Left := ARect.Left + AnImageList.Width + MARGIN;
// Draw image if available
if _item.ImageIndex <> -1 then
AnImageList.Draw(ACanvas, ARect.Left, ARect.Top + 2, _item.ImageIndex);
ARect.Left := ARect.Left + AnImageList.Width + MARGIN;
// Draw caption
DrawText(ACanvas.Handle, PChar(_item.Caption), -1, ARect, DT_LEFT or DT_VCENTER or DT_SINGLELINE or DT_NOCLIP);
end;
我想,而不是使用自定义形象,为您对号,有一些系统的方法,一快速搜索带我到以下提到的MSDN页面DrawCheck
: https://msdn.microsoft.com/en-us/library/windows/desktop/ms647558(v=vs.85).aspx#_win32_Using_Custom_Check_Mark_Bitmaps
任何项目都可以检查,迭代和要求项目的“检查”属性。 – Victoria
@维多利亚:是的,我通过指定“视觉识别”更新了问题。我的意思是说,用户无法辨别被选中和未被选中的项目。 – ExDev
这是设计。如果你有一组可以检查的项目,他们不应该有图标。 –