Accueil > > > UTILISATION DES TOUCHES TAB, ENTREE ET ECHAP DANS UNE FENÊTRE WIN32.
UTILISATION DES TOUCHES TAB, ENTREE ET ECHAP DANS UNE FENÊTRE WIN32.
Information sur la source
Description
On rencontre souvent des questions dans le forum portant sur l'utilisation de la touche TAB pour naviguer entre les différents contrôles d'une fenêtre. Le présent code source montre comment ajouter cette fonctionnalité en utilisant la fonction IsDialogMessage() dans la boucle des messages après avoir donné le style WS_TABSTOP aux contrôles parmi lesquels on veut naviguer. Je profite de ce code source pour ajouter une autre fonctionnalité souvent demandée aussi. Il s'agit de l'utilisation de la touche ENTREE pour actionner un bouton quelque soit le contrôle ayant le focus. Pour cela il suffit de lui donner IDOK comme identificateur. Pareil pour la touche ECHAP ayant comme identificateur IDCANCEL. La fonction IsDialogMessage() ,vue plus haut, est indispensable dans tous les cas. J'espère que ce sera utile pour certains. Pour tester l'exécutable renommez le en ToucheTab.exe
Source
- #include <windows.h>
-
- LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- // Déclaration des variables en static:
- static HWND hedit1,hedit2,hedit3,hok,hquitter;
- switch(message)
- {
- case WM_CREATE:
- {
- // Création des contrôles:
- hedit1=CreateWindowEx(WS_EX_CLIENTEDGE,"edit","",WS_CHILD | WS_VISIBLE | WS_TABSTOP,20,20,100,20,hwnd,0,0,0);
- hedit2=CreateWindowEx(WS_EX_CLIENTEDGE,"edit","",WS_CHILD | WS_VISIBLE | WS_TABSTOP,20,60,100,20,hwnd,0,0,0);
- hedit3=CreateWindowEx(WS_EX_CLIENTEDGE,"edit","",WS_CHILD | WS_VISIBLE | WS_TABSTOP,20,100,100,20,hwnd,0,0,0);
- hok=CreateWindowEx(0,"button","Ok",WS_CHILD | WS_VISIBLE | WS_TABSTOP ,150,40,100,20,hwnd,(HMENU)IDOK,0,0);
- hquitter=CreateWindowEx(0,"button","Quitter",WS_CHILD | WS_VISIBLE | WS_TABSTOP,150,80,100,20,hwnd,(HMENU)IDCANCEL,0,0);
- // Changement de la police des contrôles:
- HFONT font=(HFONT)GetStockObject(DEFAULT_GUI_FONT);
- HWND child=FindWindowEx(hwnd,0,0,0);
- do
- {
- SendMessage(child,WM_SETFONT,(WPARAM)font,0);
- child=FindWindowEx(hwnd,child,0,0);
- }while(child);
- // Mettre le focus sur le premier EDIT:
- SetFocus(hedit1);
- return 0;
- }
- case WM_CLOSE:
- // Détruire la fenêtre:
- DestroyWindow(hwnd);
- return 0;
- case WM_DESTROY:
- // Forcer la sortie de la boucle des messages:
- PostQuitMessage(0);
- return 0;
- case WM_COMMAND:
- // Clic sur le bouton Ok ou appui sur la touche ENTREE:
- if((HWND)lParam==hok) MessageBox(hwnd,"Bouton Ok utilisé","Touche TAB",0);
- // Clic sur le bouton Quitter ou appui sur la touche ECHAP:
- if((HWND)lParam==hquitter)SendMessage(hwnd,WM_CLOSE,0,0);
- return 0;
- default:
- break;
- }
- // Appeler la procedure par défaut de la fenêtre:
- return DefWindowProc(hwnd,message, wParam, lParam);
- }
-
- int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hprev, LPSTR cmd, int show)
- {
- // Déclaration et initialisation de la structure WNDCLASSEX:
- WNDCLASSEX wc;
- ZeroMemory(&wc,sizeof(WNDCLASSEX));
- wc.cbSize=sizeof(WNDCLASSEX);
- wc.hInstance=hinst;
- wc.lpszClassName="fenetre";
- wc.lpfnWndProc=WinProc;
- wc.hCursor=LoadCursor(0,IDC_ARROW);
- wc.hIcon=LoadIcon(0,IDI_APPLICATION);
- wc.hbrBackground=(HBRUSH)GetStockObject(LTGRAY_BRUSH);
- // Enregistrement de notre classe de fenêtre:
- RegisterClassEx(&wc);
- // Création de notre fenêtre:
- HWND hwnd=CreateWindowEx(0,"fenetre","Utilisation de la touche TAB",WS_SYSMENU | WS_VISIBLE ,0,0,280,170,0,0,hinst,0);
- // Boucle des messages:
- MSG msg;
- while(GetMessage(&msg,0,0,0))
- {
- if(!IsDialogMessage(hwnd,&msg))
- {
- DispatchMessage(&msg);
- TranslateMessage(&msg);
- }
- }
- // Sortie du programme:
- return 0;
- }
#include <windows.h>
LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
// Déclaration des variables en static:
static HWND hedit1,hedit2,hedit3,hok,hquitter;
switch(message)
{
case WM_CREATE:
{
// Création des contrôles:
hedit1=CreateWindowEx(WS_EX_CLIENTEDGE,"edit","",WS_CHILD | WS_VISIBLE | WS_TABSTOP,20,20,100,20,hwnd,0,0,0);
hedit2=CreateWindowEx(WS_EX_CLIENTEDGE,"edit","",WS_CHILD | WS_VISIBLE | WS_TABSTOP,20,60,100,20,hwnd,0,0,0);
hedit3=CreateWindowEx(WS_EX_CLIENTEDGE,"edit","",WS_CHILD | WS_VISIBLE | WS_TABSTOP,20,100,100,20,hwnd,0,0,0);
hok=CreateWindowEx(0,"button","Ok",WS_CHILD | WS_VISIBLE | WS_TABSTOP ,150,40,100,20,hwnd,(HMENU)IDOK,0,0);
hquitter=CreateWindowEx(0,"button","Quitter",WS_CHILD | WS_VISIBLE | WS_TABSTOP,150,80,100,20,hwnd,(HMENU)IDCANCEL,0,0);
// Changement de la police des contrôles:
HFONT font=(HFONT)GetStockObject(DEFAULT_GUI_FONT);
HWND child=FindWindowEx(hwnd,0,0,0);
do
{
SendMessage(child,WM_SETFONT,(WPARAM)font,0);
child=FindWindowEx(hwnd,child,0,0);
}while(child);
// Mettre le focus sur le premier EDIT:
SetFocus(hedit1);
return 0;
}
case WM_CLOSE:
// Détruire la fenêtre:
DestroyWindow(hwnd);
return 0;
case WM_DESTROY:
// Forcer la sortie de la boucle des messages:
PostQuitMessage(0);
return 0;
case WM_COMMAND:
// Clic sur le bouton Ok ou appui sur la touche ENTREE:
if((HWND)lParam==hok) MessageBox(hwnd,"Bouton Ok utilisé","Touche TAB",0);
// Clic sur le bouton Quitter ou appui sur la touche ECHAP:
if((HWND)lParam==hquitter)SendMessage(hwnd,WM_CLOSE,0,0);
return 0;
default:
break;
}
// Appeler la procedure par défaut de la fenêtre:
return DefWindowProc(hwnd,message, wParam, lParam);
}
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hprev, LPSTR cmd, int show)
{
// Déclaration et initialisation de la structure WNDCLASSEX:
WNDCLASSEX wc;
ZeroMemory(&wc,sizeof(WNDCLASSEX));
wc.cbSize=sizeof(WNDCLASSEX);
wc.hInstance=hinst;
wc.lpszClassName="fenetre";
wc.lpfnWndProc=WinProc;
wc.hCursor=LoadCursor(0,IDC_ARROW);
wc.hIcon=LoadIcon(0,IDI_APPLICATION);
wc.hbrBackground=(HBRUSH)GetStockObject(LTGRAY_BRUSH);
// Enregistrement de notre classe de fenêtre:
RegisterClassEx(&wc);
// Création de notre fenêtre:
HWND hwnd=CreateWindowEx(0,"fenetre","Utilisation de la touche TAB",WS_SYSMENU | WS_VISIBLE ,0,0,280,170,0,0,hinst,0);
// Boucle des messages:
MSG msg;
while(GetMessage(&msg,0,0,0))
{
if(!IsDialogMessage(hwnd,&msg))
{
DispatchMessage(&msg);
TranslateMessage(&msg);
}
}
// Sortie du programme:
return 0;
}
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
lire dans un fichier [ par skeul ]
Bonjour,je rencontre qqs difficultés a faire une fonction qui lit un fichier et qui rentre la chaine de caractere dans un tableauy a comme un probleme
Aidez moi !!!! [ par sebastienbro ]
Voilà, g une fonction créé en C++ avec VC++. Elle marche très bien si elle est mis dans un EXE, mais dès k'elle est ds une DLL, ca marche plus !!Avec
kbhit quand l'appli est minimisé ? [ par isaac ]
bonjour,je debute en c++ et je cherche à faire une appli qui compte fais une moyenne de vitesse de frappe lorsque l'on fait du Word. Ce genre de ptit
Occurence Tableau [ par BimboKlak ]
Comment faire pour trouver l'occurence d'un nombre dans un tableau à 1 dimension en C?ex:tab[4] = {3, 2, 3, 2}for (i=0;i<4;i++) cout << tab[
Débutant - Capturer KeyBoard [ par MichelAliasMiB ]
MiBBonjour,Je commence un cours en VC++ etje dois capturer les touches au clavieravant qu'elle ne soit afficher.De façon simple, quelle est la syntaxe
char tab[]=a; [ par zelze ]
Voila mon probleme:je connais char tab[]="ton texte"; mais se que je veux faire c'est a la place de "ton texte" mettre une variable.j'ai essaié plusie
ajout d'un caractere dans un tableau [ par kalf2000 ]
salut,g un petit blèm:g un tableau de caractère où g mis un chiffre, aprés avoir utilisé la fct itoa. et il fo que j'insere un autre chiffre avant cel
pb reservation memoire C [ par dam1234 ]
Salut, g un probleme de reservation d'espace memoire ds mon prog utilisant l api mysql. Enfin je pense que c un pb de reservation car qd j'execute un
comment programmer un tab control [ par jbebli ]
tab
Probleme avec getline [ par bouba ]
Bonjour, je réalise un getline sur un fichier mais, je ne comprends pas, j'ai l'impression que rien n'est lu!!!!Voici le code:#
|
Derniers Blogs
[WP7] DYNAMICALLY CHANGE STARTUP PAGE[WP7] DYNAMICALLY CHANGE STARTUP PAGE par KooKiz
Let's say that you want to allow the user to customize the startup page of your application. You can easily change the startup page by editing the 'NavigationPage' attribute in the manifest file. But the manifest cannot be modified once the applicatio...
Cliquez pour lire la suite de l'article par KooKiz SESSION SILVERLIGHT 5 3D : SLIDES ET DEMOSSESSION SILVERLIGHT 5 3D : SLIDES ET DEMOS par Groc
Durant les techdays, j'ai eu le plaisir d'animer une session sur Silverlight 5 et la 3D avec Simon Ferquel. Comme promis, voici nos slides et mes démos (celles avec le viper BSG) ici et là. Pour mémoire, les démos utilisent toutes le viper BSG...
Cliquez pour lire la suite de l'article par Groc [TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES[TECHDAYS 2012] SESSION WEBMATRIX 2 : LE COUTEAU SUISSE GRATUIT POUR VOS DéVELOPPEMENTS WEB - SLIDES par gpommier
Suite à la session que j'ai présenté sur WebMatrix 2, vous pouvez trouver les slides ici, ainsi que les démos en packages nuget : démos1 et démos2 J'en profite pour remercier chaleureusement tous ceux qui sont venus très nombreux à cette sess...
Cliquez pour lire la suite de l'article par gpommier [SHAREPOINT] LES SESSIONS TECHDAYS 2012.[SHAREPOINT] LES SESSIONS TECHDAYS 2012. par Patrick Guimonet
Voici donc pour ceux qui n'ont pas pu venir, ou ceux qui n'ont pas pu toutes les suivre la liste des sessions SharePoint aux TechDays 2012, que je mettrais à jour dès que les liens des vidéo seront disponibles. Ou ici : http...
Cliquez pour lire la suite de l'article par Patrick Guimonet TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning
|