2017-08-11 49 views
1

我使用TPopupMenu組件,並將圖標分配給其菜單項(TMenuItem)。使用圖標時如何在視覺上識別選中的菜單項?

在設計時,該圖標不顯示和複選標記可以判斷哪個是檢查項目:

enter image description here

在運行時,顯示的圖標,但所有項目都以同樣的方式繪製和使用圖標時

enter image description here

如何在視覺上識別檢查項目:我可以不承認檢查嗎?

+0

任何項目都可以檢查,迭代和要求項目的「檢查」屬性。 – Victoria

+0

@維多利亞:是的,我通過指定「視覺識別」更新了問題。我的意思是說,用戶無法辨別被選中和未被選中的項目。 – ExDev

+3

這是設計。如果你有一組可以檢查的項目,他們不應該有圖標。 –

回答

1

要在運行時在視覺上識別您選中的項目,您必須在設計時自定義其繪圖。

如果您有此機會,請將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

相關問題