Ajout d'un clic / événements double-cliquez pour les commandes de boîte de groupe statique

StackOverflow https://stackoverflow.com/questions/2541714

Question

Après avoir réalisé mes propres raisons étaient trop douteux, je suis maintenant allé de cette façon différente. Mais je suis toujours curieux ...

Pour des raisons de nostalgie, la familiarité et la paresse, je coder une interface utilisateur avec MFC. Pour des raisons douteuses (comme si ce ne sont pas assez), je voulais ajouter un (double) cliquez sur l'événement dans une zone de groupe. Bien entendu, la zone de groupe contient des choses - en fait, il contient un autre élément statique, auquel je peux ajouter avec succès un (double) cliquez sur Gestionnaire d'événements

.

Y at-il une raison quelconque, je ne peux pas obtenir un gestionnaire d'événements pour travailler pour les clics sur ma boîte de groupe de la même manière que je peux faire pour l'élément statique texte simple? Aucun montant de cliquer sur, dans ou à proximité des feux de contrôle de l'événement.

Note - Je l'ai lu http://www.codeproject.com/ KB / statique / staticctrl_tut.aspx et avons essayé de répondre aux deux événements ON_STN _... et ON_BN _... messages, définir le style notify (BS_NOTIFY apparaît dans le fichier rc) ... et encore je manque quelque chose - qu'Est-ce que c'est? Est-il même possible? La plupart de ce que j'ai googlé suggère qu'il est ... mais sans réponses claires pour C ++ / MFC.

Depuis la première publication de cette question, j'ai trouvé référence à un message WM_NCHITTEST et astuces que vous devez créer un gestionnaire pour ce message pour remplacer le comportement par défaut de la boîte de groupe de répondre avec HT_TRANSPARENT ... malgré sa propriété transparente dans ClassWizard défini sur false. Hmmm. Quelqu'un peut-il confirmer que c'est en effet la clé?

Était-ce utile?

La solution

Je pense que WM_NCHHITTEST / HT_TRANSPARENT est en effet la clé ici.

boîtes de groupe sont une drôle de contrôle: alors on dirait qu'ils contiennent d'autres contrôles, ils sont en réalité les frères et sœurs de ces contrôles dans l'arborescence HWND. Ainsi, une zone de groupe qui ressemble contient deux boutons est en fait un frère de ces boutons -. Et pourrait venir avant ou après dans la hiérarchie HWND

boîtes groupe répondent à WM_NCHITTEST avec HT_TRANSPARENT, de sorte que les clics de souris vont à travers eux. L'un des avantages est que peu importe si la zone de groupe vient avant ou après les contrôles qu'il semble contenir dans l'ordre de la fenêtre; les clics finiront par être acheminés à ces contrôles, pas groupbox.

Pour obtenir un double-clic (ou tout simplement en cliquant simplement) sur la zone de groupe de travail, vous aurez besoin de faire deux choses:

  • remplacer le comportement par défaut WM_NCHITTEST et au lieu revenir HT_CLIENT, comme un contrôle régulier
  • ; à ce stade, il devrait être en mesure d'obtenir WM_LBUTTONDOWN et les événements connexes qui autrement auraient été ailleurs (à un frère ou à la boîte de dialogue lui-même).
  • assurer que le contenu de la zone de groupe viennent * avant * dans le HWND ordre z, de sorte qu'ils ne sont plus sur les clics comptent aller 'à travers la zone de groupe. (Au moins, je pense que vous voulez qu'ils soient avant;. De toute façon, vous devrez peut-être jouer avec la commande HWND maintenant qu'il est encore important)

Notez que ceci est un autre type de transparence à nouveau de la WS_EX_TRANSPARENT, ce qui pourrait être ce que les cartes de propriété de l'assistant de classe Transparent pour. Grossièrement simplifiée, HT_TRANSPARENT doit faire d'être transparent à la souris; WS_EX_TRANSPARENT est plus d'être peint dernier afin que les frères et sœurs « à travers ».

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top