2009-10-19 5 views
1

J'ai actuellement quelques boutons de barre d'outils avec une petite flèche sur le côté (TBSTYLE_EX_DRAWDDARROWS) qui, lorsqu'on clique dessus, font apparaître un menu contextuel sous le bouton. Ceci est fait en construisant un menu contextuel personnalisé et en appelant le TrackPopupMenu.Menu contextuel MFC "collant"

Le client souhaite maintenant pouvoir sélectionner plusieurs options dans le menu avant de les fermer, de sorte que plusieurs options puissent être modifiées sans avoir besoin de rouvrir le menu et d'attendre un rafraîchissement intermédiaire entre chaque changement.

Par exemple:

  1. utilisateur clique sur le bouton déroulant
  2. menu déroulant apparaît (modal, attend indéfiniment pour une action de l'utilisateur)
  3. utilisateur clique sur un certain élément (par exemple, passer d'une coche)
  4. minuterie (par exemple 500 ms) démarre
  5. Si la temporisation expire, le menu est fermé et toutes les actions sélectionnées sont exécutées.
  6. utilisateur clique sur un autre élément avant que la minuterie arrive à expiration, revenir à 4.

Le meilleur que je peux trouver est de réafficher le menu en appelant TrackPopupMenu plusieurs fois. Cela rend le menu "flicker" lorsque vous sélectionnez un élément, et me demandera probablement de démarrer un thread afin de faire les délais d'attente, que je préfère éviter.

Répondre

2

Plutôt qu'un menu, affichez une boîte de dialogue avec les options correspondantes. Un dialogue peut facilement faire tout ce qui est requis.

Un menu qui ne se ferme pas lorsque vous cliquez dessus vous semblera incorrect. Un dialogue qui se ferme par lui-même semblera faux aussi, mais c'est probablement le moindre de deux maux.

Editer: S'il y a quelque chose que j'ai appris avec Microsoft, ce n'est pas essayer de combattre le comportement par défaut. Vous demandez des ennuis si vous le faites. Si vous construisez votre menu dynamiquement, je peux voir comment le dimensionnement automatique peut être pratique, mais ce n'est pas difficile à faire dans un dialogue non plus - rendre le dialogue vraiment grand et avant qu'il devienne visible, énumérer les enfants et prendre un union de tous leurs rectangles, puis redimensionner à cela. Vérification des limites pour s'assurer qu'ils sont à l'écran est juste quelques déclarations if avec OffsetRect. Les cases à cocher sont triviales; les icônes moins, mais toujours pas mal.

Une amélioration supplémentaire qui serait facile à ajouter est de fermer la boîte de dialogue immédiatement après un double-clic.

+0

Je ne suis pas totalement convaincu par l'idée, l'intention est raisonnable. Avoir à ré-ouvrir le menu pour chaque changement est fastidieux, au moins dans cette application. J'ai envisagé d'utiliser autre chose qu'un menu, et c'est une option, mais un menu fournit des fonctionnalités considérables, telles que le redimensionnement automatique pour s'adapter à son contenu, se placer sur l'écran pour être visible, afficher les icônes des cases à cocher icônes, etc., que je devrais construire manuellement. –

1

Après la réponse de @Mark Ransom, vous devriez afficher une boîte de dialogue. Mais vous pouvez rendre le dialogue modèle et le faire se fermer lorsque vous cliquez en dehors de celui-ci (c'est-à-dire, le dialogue perd le focus). De cette façon, il pourrait se comporter plus comme un menu.

Notez que les menus normaux ne disparaissent jamais d'eux-mêmes, vous devez toujours cliquer quelque part en dehors du menu (ou l'une de ses options) pour le faire disparaître.

+0

Merci d'avoir soulevé un aspect que j'ai oublié. Je devrais vous avertir qu'il y a des cas de bord difficiles quand vous faites cela, et se fier aux messages quand vous perdez la focalisation pourrait ne pas suffire. Désolé, je ne me souviens pas des détails, mais j'ai dû passer par là une fois et c'était douloureux. –

Questions connexes