2017-08-11 4 views
1

TPopupMenuコンポーネントのアイコンをメニュー項目(TMenuItem)に割り当てています。設計時にアイコンを使用しているときにチェックされたメニュー項目を視覚的に認識する方法は?

、アイコンが示されていないと、チェックマークがチェックされた項目であるかを検出することができます:実行時に

enter image description here

、アイコンが表示されますが、すべての項目が同じように描かれており、私がチェック1を認識することはできません。

enter image description here

アイコンを使用した場合、視覚的にチェックされた項目を認識するためにどのように?

+0

項目のチェック、繰り返し、アイテムの「Checked」プロパティの確認ができます。 – Victoria

+0

@Victoria:はい、「視覚的に認識」を指定して質問を更新しました。つまり、チェックされたアイテムとチェックされていないアイテムを区別することはできません。 – ExDev

+3

これは仕様です。チェックできるアイテムのグループがある場合は、アイコンを持たないでください。 –

答えて

1

チェックしたアイテムを実行時に視覚的に認識するには、デザイン時に図面をカスタマイズする必要があります。

TPopupMenu.OwnerDrawプロパティをTrueに設定してください。その後、それぞれの関係者のために、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

関連する問題