Desoler c'est moi que j'ai fait une faute au lieu de le mettre en-dessous j'ai fait
au en-dessus :oops: Sorry again
c'est parfait de ta part :ccool:
Version imprimable
De retour ,j'attends avec patience votre prochaine poste pour Faire
nos propres butons et les donner une commande "rôle" dans notre projet
merci
Alors pour la suite, je vais supposer que quand tu as renommé ton bouton, tu n'as pas changé son ID et qu'il est resté à IDC_BUTTON1.
Pour traiter l'événement, il s'agit de changer la façon dont on traite le message WM_COMMAND. Mais pour commencer, on va isoler son traitement dans une fonction séparée sans rien changer d'autre, pour éviter d'avoir une DialogProc trop compliquée.
Si tu regardes sa documentation, tu verras que ses deux paramètres contiennent trois valeurs:
- L'ID du bouton dans le mot inférieur de wParam
- Un code de notification dans le mot supérieur de wParam
- Le HWND du bouton dans lParam
On va alors se définir une fonction (qu'on modifiera un peu plus tard pour y ajouter le traitement de ton nouveau bouton), qu'on place au-dessus de la DialogProc dans le code:
Et dans la dialogproc, on remplace l'appel à EndDialog par:Code:
1
2
3
4
5 BOOL HandleWmCommand(HWND hWnd, WORD controlId, WORD notifyCode, HWND hControl) { EndDialog(hWnd, 42); return TRUE; }
LOWORD et HIWORD sont des macros pour extraire le mot bas et le mot haut, respectivement. Pour le HWND du bouton, on caste le LPARAM en HWND; en Win32, on fait beaucoup de casts de ce genre, on n'a pas trop le choix. Heureusement, les types WPARAM et LPARAM sont étudiés pour pouvoir contenir aussi bien des entiers que des pointeurs, et vu du compilo, les HWND sont des pointeurs (même s'ils ne pointent pas vraiment sur quelque chose).Code:ret = HandleWmCommand(hWnd, LOWORD(wParam), HIWORD(wParam), (HWND)lParam);
Normalement, si tu compiles et exécutes, le code doit se comporter exactement comme avant. Patience, la suite arrive.
Pour ouvrir une page internet dans le navigateur par défaut, nous allons avoir besoin de la fonction ShellExecute(), donc on va commencer par inclure le fichier d'en-tête qui la déclare.
- Dans le projet, ouvre StdAfx.h
- Sous la ligne #include <windows.h>, ajoute cette ligne-ci:
Code:#include <shellapi.h>
Ensuite, on va modifier la fonction HandleWmCommand():
N'hésite pas à poser des questions pour tout ce que tu as du mal à comprendre.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 BOOL HandleWmCommand(HWND hWnd, WORD controlId, WORD notifyCode, HWND hControl) { BOOL ret = TRUE; switch(controlId) { case IDOK: EndDialog(hWnd, 42); break; case IDCANCEL: EndDialog(hWnd, 0); break; case IDC_BUTTON1: ShellExecute(hWnd, TEXT("open"), TEXT("http://www.developpez.net/forums/"), NULL, NULL, SW_SHOWNORMAL); break; default: ret = FALSE; } return ret; }
ok marche a 100 % le nouveau bouton aussi qu'on a créer ferme elle aussi le
projet comme ok et cancel ,merci
A la suite je vous attends cher frère
Juste comme rappel, je re-poste la dernière version de ProjTuto.cpp:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 // ProjTuto.cpp : Defines the entry point for the application. // #include "stdafx.h" #include "resource.h" BOOL HandleWmCommand(HWND hWnd, WORD controlId, WORD notifyCode, HWND hControl) { BOOL ret = TRUE; switch(controlId) { case IDOK: EndDialog(hWnd, 42); break; case IDCANCEL: EndDialog(hWnd, 0); break; case IDC_BUTTON1: ShellExecute(hWnd, TEXT("open"), TEXT("http://www.developpez.net/forums/"), NULL, NULL, SW_SHOWNORMAL); break; default: ret = FALSE; } return ret; } //Note: devrait être INT_PTR, mais Visual 6 le déclare comme long. BOOL CALLBACK TutoDialogProc( HWND hWnd, //[in] Handle de fenêtre de la boîte de dialogue UINT uMessage, //[in] N° de message. WPARAM wParam, //[in] Valeur dépendante du message LPARAM lParam //[in] Valeur dépendante du message ) //Retourne TRUE si la fonction a traité elle-même le message. { INT_PTR ret = TRUE; switch(uMessage) { case WM_COMMAND: //Clic sur un bouton ret = HandleWmCommand(hWnd, LOWORD(wParam), HIWORD(wParam), (HWND)lParam); break; default: //Indique qu'on n'a pas traité le message, //il faut donc que le système le fasse pour nous. ret = FALSE; } return ret; } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { int ret = DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, TutoDialogProc, 0); return ret; }
c'est ok l'exemple de #include <shellapi.h> j'ai tester avec l'ouverture
de la page de forum et aussi après avec media player en changent
le lien par "C:/Program Files/Windows Media Player/wmplayer.exe"
,c'est ok
on passe si vous voulez bien au combobox ou comme vous voulez
parec que je veut par la suite scanner les ports active sur mon pc
........
merci , j'attends le prochain leçon
j'attends la suite mon frère comment faire une combobox
comment add des itmes ,comment en sélectionner un
itmes et clicker sur un bouton on la donne une
commande ....
Merci
Bonjour,
Une ComboBox, ce n'est pas le contrôle le plus simple à employer.
Avant ça, on va apprendre à mémoriser correctement des données pour une boîte de dialogue. Nous mémoriserons un pointeur vers une structure contenant juste un entier:
Pour mémoriser un pointeur, il faut utiliser la fonction SetWindowLongPtr(). Toutefois, cette fonction n'existe pas sous Visual 6, ni même sous forme de macro, il faut donc rajouter ceci dans stdafx.h:Code:
1
2
3
4 struct memoire_dialog { int toto; };
Code:
1
2
3
4
5
6
7 #if !defined(SetWindowLongPtr) && !defined(_WIN64) #define SetWindowLongPtr SetWindowLong #define GetWindowLongPtr GetWindowLong #define GWLP_USERDATA GWL_USERDATA #define DWLP_USER DWL_USER typedef LONG LONG_PTR; #endif
Et dans la DialogProc, ça peut s'utiliser ainsi:
Pour l'instant, on ne va rien mettre d'intéressant dedans, mais c'est bien de l'avoir à portée de main.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 //Note: devrait être INT_PTR, mais Visual 6 le déclare comme long. BOOL CALLBACK TutoDialogProc( HWND hWnd, //[in] Handle de fenêtre de la boîte de dialogue UINT uMessage, //[in] N° de message. WPARAM wParam, //[in] Valeur dépendante du message LPARAM lParam //[in] Valeur dépendante du message ) //Retourne TRUE si la fonction a traité elle-même le message. { INT_PTR ret = TRUE; struct memoire_dialog *pMem = (struct memoire_dialog *)GetWindowLongPtr(hWnd, DWLP_USER); switch(uMessage) { //Construction et destruction case WM_INITDIALOG: pMem = (struct memoire_dialog *)malloc(sizeof *pMem); SetWindowLongPtr(hWnd, DWLP_USER, (LONG_PTR)pMem); break; case WM_NCDESTROY: free(pMem); pMem = NULL; SetWindowLongPtr(hWnd, DWLP_USER, (LONG_PTR)pMem); break; case WM_COMMAND: //Clic sur un bouton ret = HandleWmCommand(hWnd, LOWORD(wParam), HIWORD(wParam), (HWND)lParam); break; default: //Indique qu'on n'a pas traité le message, //il faut donc que le système le fasse pour nous. ret = FALSE; } return ret; }
Patience, la leçon sur la ComboBox arrive dès quand j'aurais fini de la prendre en main (j'utilise très peu les ComboBox).
Pour la combobox, j'ai la flemme de faire un cours détaillé.
Agrandis un peu ta boîte de dialogue et ajoutes-y une combobox nommée IDC_COMBO1 (pour éviter les problèmes, donne-lui le type "Drop List" pour la rendre non-éditable).
Je joins un code qui l'utilise (j'ai modifié la DialogProc et le traitement de WM_COMMAND), pose des questions sur ce que tu as du mal à comprendre.
Désolé de ne pas pouvoir faire mieux, je suis un peu fatigué aujourd'hui.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92 // ProjTuto.cpp : Defines the entry point for the application. // #include "stdafx.h" #include "resource.h" struct memoire_dialog { int toto; }; //Attention, si cette taille n'est pas assez grande, le comportement est indéfini //Pour bien faire, il faudrait allouer dynamiquement le buffer. //Peut-être pour une prochaîne leçon... #define COMBOBOX_BUFFER_SIZE 80 BOOL HandleWmCommand(HWND hWnd, WORD controlId, WORD notifyCode, HWND hControl) { BOOL ret = TRUE; switch(controlId) { case IDOK: EndDialog(hWnd, 42); break; case IDCANCEL: EndDialog(hWnd, 0); break; case IDC_BUTTON1: { LRESULT index = SendDlgItemMessage(hWnd, IDC_COMBO1, CB_GETCURSEL, 0, 0); if(index==CB_ERR) MessageBox(hWnd, TEXT("Rien n'est sélectionné!"), NULL, MB_OK); else { TCHAR buf[COMBOBOX_BUFFER_SIZE] = TEXT(""); SendDlgItemMessage(hWnd, IDC_COMBO1, CB_GETLBTEXT, index, (LPARAM)buf); ShellExecute(hWnd, TEXT("open"), buf, NULL, NULL, SW_SHOWNORMAL); } } break; default: ret = FALSE; } return ret; } //Note: devrait être INT_PTR, mais Visual 6 le déclare comme long. BOOL CALLBACK TutoDialogProc( HWND hWnd, //[in] Handle de fenêtre de la boîte de dialogue UINT uMessage, //[in] N° de message. WPARAM wParam, //[in] Valeur dépendante du message LPARAM lParam //[in] Valeur dépendante du message ) //Retourne TRUE si la fonction a traité elle-même le message. { INT_PTR ret = TRUE; struct memoire_dialog *pMem = (struct memoire_dialog *)GetWindowLongPtr(hWnd, DWLP_USER); switch(uMessage) { //Construction et destruction case WM_INITDIALOG: pMem = (struct memoire_dialog *)malloc(sizeof *pMem); SetWindowLongPtr(hWnd, DWLP_USER, (LONG_PTR)pMem); SendDlgItemMessage(hWnd, IDC_COMBO1, CB_ADDSTRING, 0, (LPARAM)TEXT("http://www.developpez.net/forums/")); SendDlgItemMessage(hWnd, IDC_COMBO1, CB_ADDSTRING, 0, (LPARAM)TEXT("http://www.developpez.com/")); SendDlgItemMessage(hWnd, IDC_COMBO1, CB_SETCURSEL, 1, 0); break; case WM_NCDESTROY: free(pMem); pMem = NULL; SetWindowLongPtr(hWnd, DWLP_USER, (LONG_PTR)pMem); break; case WM_COMMAND: //Clic sur un bouton ret = HandleWmCommand(hWnd, LOWORD(wParam), HIWORD(wParam), (HWND)lParam); break; default: //Indique qu'on n'a pas traité le message, //il faut donc que le système le fasse pour nous. ret = FALSE; } return ret; } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { int ret = DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, TutoDialogProc, 0); return ret; }
Merci mon frère je vais essayer de comprendre ce leçon d'abord et l'appliquer
a la prochaine leçon :ccool:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94 // ProjTuto.cpp : Defines the entry point for the application. // #include "stdafx.h" #include "resource.h" struct memoire_dialog { int toto; }; #define COMBOBOX_BUFFER_SIZE 80 BOOL HandleWmCommand(HWND hWnd, WORD controlId, WORD notifyCode, HWND hControl) { BOOL ret = TRUE; switch(controlId) { case IDOK: EndDialog(hWnd, 42); break; case IDCANCEL: EndDialog(hWnd, 0); break; case IDC_BUTTON1: { LRESULT index = SendDlgItemMessage(hWnd, IDC_COMBO1, CB_GETCURSEL, 0, 0); if(index==CB_ERR) MessageBox(hWnd, TEXT("Rien n'est sélectionné!"), NULL, MB_OK); else { TCHAR buf[COMBOBOX_BUFFER_SIZE] = TEXT(""); SendDlgItemMessage(hWnd, IDC_COMBO1, CB_GETLBTEXT, index, (LPARAM)buf); ShellExecute(hWnd, TEXT("open"), buf, NULL, NULL, SW_SHOWNORMAL); } } break; default: ret = FALSE; } return ret; } default: ret = FALSE; } return ret; } //Note: devrait être INT_PTR, mais Visual 6 le déclare comme long. BOOL CALLBACK TutoDialogProc( HWND hWnd, //[in] Handle de fenêtre de la boîte de dialogue UINT uMessage, //[in] N° de message. WPARAM wParam, //[in] Valeur dépendante du message LPARAM lParam //[in] Valeur dépendante du message ) //Retourne TRUE si la fonction a traité elle-même le message. { INT_PTR ret = TRUE; struct memoire_dialog *pMem = (struct memoire_dialog *)GetWindowLongPtr(hWnd, DWLP_USER); switch(uMessage) { //Construction et destruction case WM_INITDIALOG: pMem = (struct memoire_dialog *)malloc(sizeof *pMem); SetWindowLongPtr(hWnd, DWLP_USER, (LONG_PTR)pMem); SendDlgItemMessage(hWnd, IDC_COMBO1, CB_ADDSTRING, 0, (LPARAM)TEXT("http://www.developpez.net/forums/")); SendDlgItemMessage(hWnd, IDC_COMBO1, CB_ADDSTRING, 0, (LPARAM)TEXT("http://www.developpez.com/")); SendDlgItemMessage(hWnd, IDC_COMBO1, CB_SETCURSEL, 1, 0); break; case WM_NCDESTROY: free(pMem); pMem = NULL; SetWindowLongPtr(hWnd, DWLP_USER, (LONG_PTR)pMem); break; case WM_COMMAND: //Clic sur un bouton ret = HandleWmCommand(hWnd, LOWORD(wParam), HIWORD(wParam), (HWND)lParam); break; default: //Indique qu'on n'a pas traité le message, //il faut donc que le système le fasse pour nous. ret = FALSE; } return ret; } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { int ret = DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, TutoDialogProc, 0); return ret; }
ca n'a pas marcher pour moi cette fois
voici mon code pour que vous pouvez savoir les erreurs que j'ai comis
et aussi ici le message d'erreur par visuel c++
Merci j'attends votre correctionCitation:
--------------------Configuration: ProjTuto - Win32 Debug--------------------
Compiling...
ProjTuto.cpp
C:\Program Files\Microsoft Visual Studio\MyProjects\ProjTuto\ProjTuto.cpp(33) : error C2065: 'ShellExecute' : undeclared identifier
C:\Program Files\Microsoft Visual Studio\MyProjects\ProjTuto\ProjTuto.cpp(43) : error C2143: syntax error : missing ';' before 'default'
C:\Program Files\Microsoft Visual Studio\MyProjects\ProjTuto\ProjTuto.cpp(44) : error C2501: 'ret' : missing storage-class or type specifiers
C:\Program Files\Microsoft Visual Studio\MyProjects\ProjTuto\ProjTuto.cpp(45) : error C2143: syntax error : missing ';' before '}'
C:\Program Files\Microsoft Visual Studio\MyProjects\ProjTuto\ProjTuto.cpp(45) : error C2143: syntax error : missing ';' before '}'
C:\Program Files\Microsoft Visual Studio\MyProjects\ProjTuto\ProjTuto.cpp(45) : error C2143: syntax error : missing ';' before '}'
C:\Program Files\Microsoft Visual Studio\MyProjects\ProjTuto\ProjTuto.cpp(47) : error C2143: syntax error : missing ';' before '}'
C:\Program Files\Microsoft Visual Studio\MyProjects\ProjTuto\ProjTuto.cpp(47) : error C2143: syntax error : missing ';' before '}'
C:\Program Files\Microsoft Visual Studio\MyProjects\ProjTuto\ProjTuto.cpp(47) : error C2143: syntax error : missing ';' before '}'
C:\Program Files\Microsoft Visual Studio\MyProjects\ProjTuto\ProjTuto.cpp(56) : error C2143: syntax error : missing ';' before '{'
C:\Program Files\Microsoft Visual Studio\MyProjects\ProjTuto\ProjTuto.cpp(56) : error C2447: missing function header (old-style formal list?)
C:\Program Files\Microsoft Visual Studio\MyProjects\ProjTuto\ProjTuto.cpp(92) : error C2065: 'TutoDialogProc' : undeclared identifier
Error executing cl.exe.
ProjTuto.exe - 12 error(s), 0 warning(s)
C'est bizarre. Puis-je voir ton stdafx.h ?
Edit: Tu as un passage écrit en double!
non j'ai pas fait doubleCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 // stdafx.h : include file for standard system include files, // or project specific include files that are used frequently, but // are changed infrequently // #if !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_) #define AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers #include <windows.h> // TODO: reference additional headers your program requires here //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_)
Que sont devenues les modifs que je t'aies conseillées d'apporter?
Voici ma version de stdafx.h:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 // stdafx.h : include file for standard system include files, // or project specific include files that are used frequently, but // are changed infrequently // #if !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_) #define AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers #include <windows.h> #include <shellapi.h> #include <stdlib.h> // TODO: reference additional headers your program requires here #if !defined(SetWindowLongPtr) && !defined(_WIN64) #define SetWindowLongPtr SetWindowLong #define GetWindowLongPtr GetWindowLong #define GWLP_USERDATA GWL_USERDATA #define DWLP_USER DWL_USER typedef LONG LONG_PTR; #endif //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_)
Je peux pourtant t'assurer que ce n'est pas moi qui ai écrit ceci:
Citation:
Code:
1
2
3
4
5
6
7
8
9
10
11 default: ret = FALSE; } return ret; } default: ret = FALSE; } return ret; }
bon je vais revenir de 0 je récrit le projet a nouveau c'est pour mieu
comprendre et d'essayer de corriger mes fautes
Merci a +
c'est ok mon frère j'ai refait le projet et ca marche pour moi et je vais le refaire
encore plusieurs fois pour le maîtriser bien
si on passe a la cobobox et mscomm lier entre eux pour détecter les port
rs232 connecter au pc en utilisons Ftdi
je vai refaire la lecon precedente en attendant votre repense et votre prochain
leçon
Merci
Je préviens, je ne connais pas mscomm.
Et sur le coup, je ne vois pas trop sur quoi faire porter la prochaine leçon...
C'est H.S. mais Médinoc, franchement tu m'épates.
Peu de personnes auraient eu l'amabilité d'aider un débutant de la manière dont tu le fais, et je trouve que c'est notable et tout à ton honneur.
Ca fait vraiment plaisir de voir des gens aider comme ça sans attendre quoi que ce soit en retour. :ccool:
J'en connais plus d'un (moi y compris) qui auraient déjà livré la personne à elle même en l'envoyant faire des recherches longues et houleuses.
Même si Sayler devra bientôt le faire (se débrouiller seul), il aura au moins les clés et saura mieux où et comment chercher.