使用图标时如何在视觉上识别选中的菜单项?

问题描述:

我使用TPopupMenu组件,并将图标分配给其菜单项(TMenuItem)。使用图标时如何在视觉上识别选中的菜单项?

在设计时,该图标不显示和复选标记可以判断哪个是检查项目:

enter image description here

在运行时,显示的图标,但所有项目都以同样的方式绘制和使用图标时

enter image description here

如何在视觉上识别检查项目:我可以不承认检查吗?

+0

任何项目都可以检查,迭代和要求项目的“检查”属性。 – Victoria

+0

@维多利亚:是的,我通过指定“视觉识别”更新了问题。我的意思是说,用户无法辨别被选中和未被选中的项目。 – ExDev

+3

这是设计。如果你有一组可以检查的项目,他们不应该有图标。 –

要在运行时在视觉上识别您选中的项目,您必须在设计时自定义其绘图。

如果您有此机会,请将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页面DrawCheckhttps://msdn.microsoft.com/en-us/library/windows/desktop/ms647558(v=vs.85).aspx#_win32_Using_Custom_Check_Mark_Bitmaps