Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1822 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°954030
TigrouMeow
Vive le Rhum et les Gibsons ;)
Posté le 16-01-2005 à 18:51:20  profilanswer
 

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
mood
Publicité
Posté le 16-01-2005 à 18:51:20  profilanswer
 

n°954211
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 16-01-2005 à 22:04:11  profilanswer
 

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)
n°954227
TigrouMeow
Vive le Rhum et les Gibsons ;)
Posté le 16-01-2005 à 22:15:36  profilanswer
 

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

n°954239
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 16-01-2005 à 22:25:01  profilanswer
 

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)
n°954243
TigrouMeow
Vive le Rhum et les Gibsons ;)
Posté le 16-01-2005 à 22:32:59  profilanswer
 

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 :'(

n°954254
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 16-01-2005 à 22:53:39  profilanswer
 

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)
n°954255
TigrouMeow
Vive le Rhum et les Gibsons ;)
Posté le 16-01-2005 à 22:58:44  profilanswer
 

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

n°954262
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 16-01-2005 à 23:15:13  profilanswer
 

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)
n°954276
TigrouMeow
Vive le Rhum et les Gibsons ;)
Posté le 16-01-2005 à 23:28:17  profilanswer
 

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 :(

n°954292
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 17-01-2005 à 00:08:37  profilanswer
 

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)
mood
Publicité
Posté le 17-01-2005 à 00:08:37  profilanswer
 

n°954296
TigrouMeow
Vive le Rhum et les Gibsons ;)
Posté le 17-01-2005 à 00:22:40  profilanswer
 

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

n°954299
TigrouMeow
Vive le Rhum et les Gibsons ;)
Posté le 17-01-2005 à 01:35:54  profilanswer
 

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...)

n°954890
TigrouMeow
Vive le Rhum et les Gibsons ;)
Posté le 17-01-2005 à 17:49:35  profilanswer
 

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...)

n°954913
TigrouMeow
Vive le Rhum et les Gibsons ;)
Posté le 17-01-2005 à 18:07:58  profilanswer
 

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 ! :)


n°954948
Lam's
Profil: bas.
Posté le 17-01-2005 à 19:14:11  profilanswer
 

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.

n°954961
TigrouMeow
Vive le Rhum et les Gibsons ;)
Posté le 17-01-2005 à 19:30:04  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
[débutant] insérer un script phpQuestion de code php
Débutant ... count sur une colonneProb de débutant super nul
Débutant: remplacer un "null" par un "zero" ?débutant
[MFC/C++] Communication d'une appli a une autreVb excel : Afficher une liste deroulante ....debutant inside
[Java]Projet Débutant / faisabilitéQuestion sur les fonctions??
Plus de sujets relatifs à : [MFC] Questions de débutant... (1 question résolue sur 2)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR