Gestion clavier sous mfc

dambeaufort Messages postés 60 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 17 septembre 2004 - 2 mars 2004 à 09:57
dambeaufort Messages postés 60 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 17 septembre 2004 - 3 mars 2004 à 10:15
bonjour a tous,
j'ai regarder les messages deja preent dans le forum mais je n'arrive pas a efectuer la chose suivante:

J'aimerais sous une application mfc avoir une boucle du type:

while (i>0) {if (touche 'Y' enfoncee) {i=i-1}}

explication: une fois entrer dans la boucle, je veux gerer un deplacement que lorsque une touche est enfoncee. Si la touche est relachee, le deplacement se met en pause jusqu'a un nouvelle appui sur la touche en qst.

c donc tout simple mais je n'arrive pas a gerer le clavier dans mon application mfc
Pourriez vous m'aider.

Merci encore

11 réponses

PunkDude424 Messages postés 117 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 24 avril 2006
2 mars 2004 à 14:16
Il faut que tu catch les message envoyer par le clavier dans defwindowproc ou pretranslatemessage

BOOL CWindowsDisplay::PreTranslateMessage(MSG* pMsg)
{
switch(pMsg->message)
{
case WM_KEYDOWN:
break;
}
return CDialog::PreTranslateMessage(pMsg);
}
0
dambeaufort Messages postés 60 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 17 septembre 2004
2 mars 2004 à 14:33
ok je te remercie, ta solutions est excellente. Seul petit probleme ou plutot interrogation, est il possible de faire la meme chose suivant tel ou tel touche de clavier enfonce.

ex actuellement le message"message" s'affiche lorsque je j'appui sur une touche quelquonque. est il possible de limiter son affichage que lorsque la touche entree est pressé?

BOOL CAppliDlg::PreTranslateMessage(MSG* pMsg)
{
switch(pMsg->message)
{
case WM_KEYDOWN: m_consigne.ReplaceSel("message");
break;
}
return CDialog::PreTranslateMessage(pMsg);
}

Merci encore
0
PunkDude424 Messages postés 117 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 24 avril 2006
2 mars 2004 à 15:31
BOOL CAppliDlg::PreTranslateMessage(MSG* pMsg)
{
switch(pMsg->message)
{
case WM_KEYDOWN:
if((pMsg->wParam) == VK_Y)
{
}
break;
}
return CDialog::PreTranslateMessage(pMsg);
}
0
PunkDude424 Messages postés 117 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 24 avril 2006
2 mars 2004 à 15:32
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dambeaufort Messages postés 60 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 17 septembre 2004
2 mars 2004 à 15:37
ok je vais tester.
Reste un hic, si tu pouvais m'aider.....

ta fonction me pêrmet de voir lorsque une touche du clavier est enfonce, c ok. mais comment l'inserer dans ma structure qu e j'ai definis ci dessus.
Une fois dans le while, je ne voit pas comment tester en continu si un bouton du clavier est enfonce......
0
PunkDude424 Messages postés 117 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 24 avril 2006
2 mars 2004 à 16:13
tu te mets un variable dans ta classe.....par exemple m_KeyPressed....et quand tu rentre dans pretranslatemessage et dans WM_KEYDOWN tu mets la varaible a true par exemple et quand tu va dans WM_KEYUP tu mets la variable a false.....alors dans ta fonction tu mets ta boucle en mettant

while(m_KeyPressed)
....
0
dambeaufort Messages postés 60 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 17 septembre 2004
2 mars 2004 à 16:46
et bien tu vas dire que je suis nul, mais je n'y arrive pas.
Voila ce que g pour l'instant:

//fct gerant l'acqui du clavier
BOOL CAppliDlg::PreTranslateMessage(MSG* pMsg)
{
switch(pMsg->message)
{
case WM_KEYDOWN:
if((pMsg->wParam) == VK_DELETE) {m_clavierok=TRUE;}
else {m_clavierok=FALSE;}
break;
}
return CDialog::PreTranslateMessage(pMsg);
}

//fct de lancement de procedure
void CAppliDlg::Onlancer()
{
char cconsignebarre;
long consignebarre;
int Pas=1; int gap;

if (m_mob ) {consignebarre=m_consignebarre.GetPos();
gap=consignebarre;
while (m_clavierok==TRUE)
{while (gap>0.01)
{Sleep(500);
m_progress.SetPos(consignebarre-gap);
ltoa(consignebarre-gap,&cconsignebarre,10);
m_consigne.ReplaceSel(&cconsignebarre);
gap=gap-Pas;m_clavierok=FALSE;}
}
}
else {m_consigne.ReplaceSel("no ");}
}

Le probleme c que ca marche mais je voudrais une confirmation que le bouton del est enfoncee a chaque pas.
Pour l'instant les pas ce deroule que si j'ai enfonce le bouton del initialement. si je le relache j'aimerais que l'evolution des pas s'arrete.

Merci.
0
PunkDude424 Messages postés 117 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 24 avril 2006
2 mars 2004 à 17:01
et bien tu vas dire que je suis nul, mais je n'y arrive pas.
Voila ce que g pour l'instant:

//fct gerant l'acqui du clavier
BOOL CAppliDlg::PreTranslateMessage(MSG* pMsg)
{
switch(pMsg->message)
{
case WM_KEYDOWN:
if((pMsg->wParam) == VK_DELETE)
{
m_clavierok=TRUE;
}
break;
case WM_KEYUP:
if((pMsg->wParam) == VK_DELETE)
{
m_clavierok= FALSE;
}
break;
}
return CDialog::PreTranslateMessage(pMsg);
}
0
dambeaufort Messages postés 60 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 17 septembre 2004
2 mars 2004 à 17:08
oui mais ce que je veux dire c que une fois que tu as lancer le "mouvement" donc que tu es entrer dans la boucle du while(gap>0.01), le changement d'etat du bouton DEL ne fera rien a l'execution du mouvement.
Ce que je voudrais c que le mouvement s'arrete des que le bouton est relache.
0
PunkDude424 Messages postés 117 Date d'inscription mardi 3 février 2004 Statut Membre Dernière intervention 24 avril 2006
2 mars 2004 à 17:20
ta juste a mettre while(gap>0.01 && m_clavierok == true)
0
dambeaufort Messages postés 60 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 17 septembre 2004
3 mars 2004 à 10:15
ca doit venir de moi mais je n'y arrive pas du tout. Le probleme que g c que lorsque je met mon sleep dans ma boucle while les pressions sur la touche del sont toujours enregistrer et donc quand je decide de m'arreter en relachant la touche, il faut attendre quelques pas pour que l'evolution s'arrete. Pourrais tu me reeecrire la fonction comme tu la voit toi?
merci
0
Rejoignez-nous