[MFC] Questions de débutant... (1 question résolue sur 2)

Questions de débutant... (1 question résolue sur 2) [MFC] - C++ - Programmation

Marsh Posté le 16-01-2005 à 18:51:20    

Bonjour :)
 
Je débute en programmation Windows avec les MFC, je rencontre des problèmes, et j'ai des questions :)
 
Voici premièrement ma question de conception :
 
Tout d'abord une question de conception. Je dois faire un programme qui permet l'édition graphique d'une table de jeu, de dame, d'échecs, bref la technique est la même.
Pour l'instant, je pense faire une fonction qui dessine tout, et ensuite, quand il y a un clic sur une case, je fais des divisions sur les coordonnées du clic pour savoir quel case a été cliquée... je trouve ça bourrin, mais je connais pas de technique "propre"... et ensuite, une fois que je connais la case, je peux aller la colorier... est-ce la BONNE technique ?
 
Et voici mon problème :
 
Je développe une appli Document/View. Dans ma classe View j'ai créé une méthode onFresh qui correspond à un clic sur le bouton Fresh (j'ai fait un ON_COMMAND dessus pour le linker avec la méthode bien sur et ça ça marche).
 
Dans cette méthode onFresh, donc quand on clique sur ce bouton je veux lui donner un aspect enfoncé. J'imagine qu'il faut faire un SetCheck dessus donc je fais un SetCheck, voici la méthode:
 

Code :
  1. void CHeatDiffusionView::OnFresh()
  2. {
  3. CButton *fresh = (CButton *) GetDlgItem (ID_FRESH);
  4. fresh->SetCheck(BST_CHECKED);
  5. TRACE("OnFresh !\n" );
  6. }


 
Là plantage direct après le SetCheck... j'ai vu qu'il y avait une autre
solution pour associer directement une variable à une ressource, ça
serait plus simple? En tout cas j'ai pas réussi à le faire.
 
Merci pour l'aide que vous pourrez m'apporter ! :)


Message édité par TigrouMeow le 17-01-2005 à 17:48:15
Reply

Marsh Posté le 16-01-2005 à 18:51:20   

Reply

Marsh Posté le 16-01-2005 à 22:04:11    

ton erreur provient de l'utilisation de GetDlgItem(). déjà que les MFC sont crades, inutile de les crader encore plus avec l'utilisation de ce truc !!
créé donc une variable membre de type CButton pour ton bouton (que tu nommeras "fresh" ), et utilise un truc genre

Code :
  1. fresh.SetCheck(BST_CHECKED);


ça marchera beaucoup mieux. par pitié, vire moi au plus vite ce GetDlgItem()


Message édité par Harkonnen le 16-01-2005 à 22:07:33

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 16-01-2005 à 22:15:36    

Oui c'est ce que je voulais préféré faire, je suis tombé sur un article où il expliquait en tapant "avoid getdlgitem" sur google... mais ils se servent des propriétés des resources avec un vieux visual studio et sur le 2003 on trouve pas du tout... tu peux m'indiquer la marche à suivre ? Je te remercie beaucoup :p

Reply

Marsh Posté le 16-01-2005 à 22:25:01    

clic droit sur le bouton -> Ajouter une variable. dans le masque qui apparait, indique "fresh" dans la zone du nom de variable, et laisse les autres valeurs par défaut. ta variable membre est automatiquement créée (tu peux le vérifier dans le .h de ta classe)


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 16-01-2005 à 22:32:59    

Ah pardon je crois que j'ai oublié un détail... c pas un cdialog ou rien de ce genre, c'est une un toolbar ... et y'a pas d'ajouter une variable :'(

Reply

Marsh Posté le 16-01-2005 à 22:53:39    

je comprends rien... quand tu ajoutes un nouveau bouton à la toolbar, il se comporte comme les autres, ie il prend un aspect enfoncé quand on clique dessus... pourquoi réinventer la roue ? [:heink]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 16-01-2005 à 22:58:44    

Non mais moi je veux que ça reste enfoncé même après avoir relaché le bouton de la souris :)

Reply

Marsh Posté le 16-01-2005 à 23:15:13    

OK, dans ce cas, pour chacun des boutons de ta toolbar, tu dois créer un handler pour les messages COMMAND et UPDATE_COMMAND_UI
 
pour COMMAND, ça serait un truc du genre

Code :
  1. void CMainFrame::OnButton1()
  2. {
  3.    fresh = ID_FRESH;
  4. }


 
et pour UPDATE_COMMAND_UI

Code :
  1. void CMainFrame::OnUpdateButton1(CCmdUI* pCmdUI)
  2. {
  3.    pCmdUI->SetCheck(fresh == pCmdUI->m_nID);
  4. }


fresh sera une variable membre contenant l'ID du bouton. initialise là à 0 dans le constructeur (ça signifie qu'aucun bouton n'est seléctionné)


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 16-01-2005 à 23:28:17    

Rhalala je suis désolé... j'ai essayé de comprendre 10 minutes mais je comprends pas du tout... je n'ai jamais entendu parler de UPDATE_COMMAND_UI :(  
 
pCmdUI... ça me dépasse...
 
Et il faut vraiment mettre ça dans CMainFrame ? Moi je le mettais les trucs liés au bouton dans le CDocument...  
 
Je suis vraiment perdu moi :(

Reply

Marsh Posté le 17-01-2005 à 00:08:37    

j'ai pas le courage de me lancer sur une explication des messages et des macros des MFC à minuit...
je te renvoie vers ces pages :
http://www.codeguru.com/Cpp/W-D/di [...] php/c1919/
http://msdn.microsoft.com/library/ [...] ccmdui.asp
http://msdn.microsoft.com/library/ [...] and_ui.asp
si tu comprends pas, je tacherais de clarifier


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 17-01-2005 à 00:08:37   

Reply

Marsh Posté le 17-01-2005 à 00:22:40    

Ok merci beaucoup je dirai si j'ai réussi ou pas très bientôt :)

Reply

Marsh Posté le 17-01-2005 à 01:35:54    

Ahhhhhhhhhhh ça y est j'ai compris :) C'est pas si compliqué....  
En fait dès que j'ai vu comment il fallait implémenter void OnUpdateFresh(CCmdUI* pCmdUI) j'ai tout compris :)
Merci beaucoup pour ton aide ! :)
 
Par contre pour ma première question... pas de p'tit tip ? :) (bonne nuit aussi...)

Reply

Marsh Posté le 17-01-2005 à 17:49:35    

Un p'tit UP :) On m'a aidé à résoudre mon problème, mais il reste une question sur la conception, merci de votre aide :) (Je veux bien relancer un second thread mais je sais pas si c'est bien vu...)

Reply

Marsh Posté le 17-01-2005 à 18:07:58    

TigrouMeow a écrit :

Bonjour :)
 
Je débute en programmation Windows avec les MFC, je rencontre des problèmes, et j'ai des questions :)
 
Voici premièrement ma question de conception :
 
Tout d'abord une question de conception. Je dois faire un programme qui permet l'édition graphique d'une table de jeu, de dame, d'échecs, bref la technique est la même.
Pour l'instant, je pense faire une fonction qui dessine tout, et ensuite, quand il y a un clic sur une case, je fais des divisions sur les coordonnées du clic pour savoir quel case a été cliquée... je trouve ça bourrin, mais je connais pas de technique "propre"... et ensuite, une fois que je connais la case, je peux aller la colorier... est-ce la BONNE technique ?
 
EDIT : Sachant qu'une solution pourrait être une grid mais je sais pas si ça existe avec les MFC, en tout cas j'ai pas trouvé (sauf des librairies non standard mais je veux pas...)
 
Et voici mon problème :
 
Je développe une appli Document/View. Dans ma classe View j'ai créé une méthode onFresh qui correspond à un clic sur le bouton Fresh (j'ai fait un ON_COMMAND dessus pour le linker avec la méthode bien sur et ça ça marche).
 
Dans cette méthode onFresh, donc quand on clique sur ce bouton je veux lui donner un aspect enfoncé. J'imagine qu'il faut faire un SetCheck dessus donc je fais un SetCheck, voici la méthode:
 

Code :
  1. void CHeatDiffusionView::OnFresh()
  2. {
  3. CButton *fresh = (CButton *) GetDlgItem (ID_FRESH);
  4. fresh->SetCheck(BST_CHECKED);
  5. TRACE("OnFresh !\n" );
  6. }


 
Là plantage direct après le SetCheck... j'ai vu qu'il y avait une autre
solution pour associer directement une variable à une ressource, ça
serait plus simple? En tout cas j'ai pas réussi à le faire.
 
Merci pour l'aide que vous pourrez m'apporter ! :)


Reply

Marsh Posté le 17-01-2005 à 19:14:11    

Personne ne te répond, parce qu'il n'y a pas de commentaires... Ta solution est effectivement la bonne. Tu peux éventuellement encapsuler ça dans la classe qui va bien si tu veux avoir un peu d'abstraction. Mais bon.
 
L'autre solution, c'est de créer une collection (un tableau par exemple) de "cases", puis de tester chacune pour voir si elle correspond aux coordonnées du click, mais c'est vraiment suboptimal.

Reply

Marsh Posté le 17-01-2005 à 19:30:04    

Merci beaucoup de confirmer, je vais faire une sorte de collection :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed