2017-08-11 5 views
1

J'utilise un composant TPopupMenu avec des icônes affectées à ses éléments de menu (TMenuItem).Comment reconnaître visuellement l'élément de menu coché lorsque vous utilisez des icônes?

A designtime, les icônes ne sont pas montré et la coche permet de détecter ce qui est l'élément vérifié:

enter image description here

Lors de l'exécution, les icônes sont affichées, mais tous les éléments sont tirés de la même manière et Je ne peux pas reconnaître le vérifier un:

enter image description here

Comment reconnaître visuellement l'élément vérifié lors de l'utilisation des icônes?

+0

Tout article peut être vérifié, itéré et demandé la propriété 'Checked' de l'article. – Victoria

+0

@Victoria: Oui, j'ai mis à jour la question en spécifiant "reconnaître visuellement". Je veux dire que l'utilisateur ne peut pas discerner entre un élément coché et un élément non coché. – ExDev

+3

Ceci est voulu. Si vous avez un groupe d'éléments qui peuvent être vérifiés, ils ne devraient pas avoir d'icônes. –

Répondre

1

Pour reconnaître visuellement les éléments cochés lors de l'exécution, vous devez personnaliser leur dessin au moment du design.

Si vous avez cette opportunité, définissez votre propriété TPopupMenu.OwnerDraw sur True. Ensuite, pour chaque TMenuItem concerné, vous devrez écrire un comportement pour son événement OnDrawItem. Par exemple le code ci-dessous (rapidement écrit et non robuste du tout) peut gérer toutes les TMenuItem rendent dans une seule méthode:

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; 

Je suppose qu'au lieu d'utiliser une image personnalisée pour votre coche il y a quelques méthodes du système, un la recherche rapide m'amène à la page MSDN suivante qui mentionne DrawCheck: https://msdn.microsoft.com/en-us/library/windows/desktop/ms647558(v=vs.85).aspx#_win32_Using_Custom_Check_Mark_Bitmaps