1
我使用TPopupMenu
組件,並將圖標分配給其菜單項(TMenuItem
)。使用圖標時如何在視覺上識別選中的菜單項?
在設計時,該圖標不顯示和複選標記可以判斷哪個是檢查項目:
在運行時,顯示的圖標,但所有項目都以同樣的方式繪製和使用圖標時
如何在視覺上識別檢查項目:我可以不承認檢查嗎?
我使用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
這是設計。如果你有一組可以檢查的項目,他們不應該有圖標。 –