Comment gérer les messages de créer dynamiquement des contrôles dans une MFC application?
Imaginer que j'ai un CDialog qui crée des contrôles dynamiquement lorsque l'utilisateur clique sur un bouton. Il pourrait être comme ceci:
//We don't know which is the first id for the new buttons until runtime (!)
MyDialog::MyDialog(/*whatever parameters needed*/, first_id)
: next_id_(first_id)
{ /*...*/ }
BOOL MyDialog::OnSomeButtonClicked()
{
CButton* new_button = new CButton;
new_button->Create("Caption", WS_CHILD | WS_VISIBLE, this->new_button_rect_,
this, this->next_id_++);
}
Alors ma question serait: Comment pourrais-je gérer les messages à partir de ce bouton? Est-il possible d'utiliser le MFC message de la carte de la facilité?
La solution devrait fonctionner dans les deux vs6 et vs2005.
Merci!
OriginalL'auteur David A. | 2009-05-13
Vous devez vous connecter pour publier un commentaire.
Ce sont les solutions que j'ai trouvé jusqu'à présent dans l'ordre de pertinence:
Utilisation
ON_COMMAND_RANGE
si vous pouvez définir la portée de l'Id de contrôle que vous souhaitez gérer.Surcharge
CWnd::PreTranslateMessage()
et de faire tout les trucs que vous voulez avec les messages reçus. REMARQUE: Lorsque vous traitez avec des boutons, de prendre en compte le fait que l'événement BN_CLICKED n'est PAS envoyé à PreTranslateMessage mais directement envoyé à la procédure de fenêtre.Surcharge
CWnd::WindowProc()
et de faire tout les trucs que vous voulez avec les messages reçus. NOTEZ que lorsque vous traitez avec des boutons, c'est le SEUL MOYEN que j'ai trouvé pour gérer l'événement BN_CLICKED.Liens intéressants:
J'espère que cela aide... merci à tous pour vos contributions.
OriginalL'auteur David A.
Même si vous ne connaissez pas les valeurs exactes de l'id, si vous connaissez la gamme possible des Id puis la macro suivante peut être utilisée.
Cela fonctionne pour les id dans la plage de 1000 à 5000.
OriginalL'auteur Shino C G
Je suis quelques années de retard pour cette partie, mais la solution à ce problème consiste à attribuer le même id de contrôle pour chaque bouton (pas besoin de "réserve" de l'id de la ressource.h, et rien d'artificiel, de restrictions sur le nombre de contrôles qui peuvent être créés), pour sauver la poignée de la fenêtre et utiliser GetCurrentMessage() dans le gestionnaire de bouton:
OriginalL'auteur Roel
Je crois que cet article explique assez bien et a le code source. Je n'ai pas essayé donc je ne peux pas garantir qu'il fonctionne, mais dans le temps, j'ai pensé qu'elle pourrait aider.
L'Article
OriginalL'auteur brader24
Vous pouvez trouver plus de détails (+ beaucoup plus) sur les boîtes de dialogue non modales il y.
OriginalL'auteur Ryan
insérer l'entrée de l'ID du gestionnaire de Ressource.h
Ensuite, insérez l'entrée dans la table des messages du gestionnaire ON_BN_CLICKED(IDC_BTNCREATE, OnBnClickedrunCreated)
ou vous pouvez utiliser directement l'ID de type entier comme ON_BN_CLICKED(1200, OnBnClickedrunCreated). Si vous utilisez la version 2 puis il y a
pas besoin d'insérer une entrée dans la ressource.h. Donner defination et la déclaration de la gestionnaire .h et .fichier cpp. vous aurez votre réponse.
OriginalL'auteur Gurmeet
Utiliser de cette façon: ON_CONTROL_RANGE(wNotifyCode, id1, id2, memberFxn ).
par exemple:
OriginalL'auteur 林高煌