|
Par
Mg++
Mise à jour : 12/07/2009
1 327 visites depuis 7 jours,
dont 284 sur ce chapitre
classé 98/786
|

1 | #include <windows.h>
|
1 2 3 4 5 6 7 8 9 10 11 | #include <windows.h> int WinMain ( HINSTANCE cetteInstance, HINSTANCE precedenteInstance, LPSTR lignesDeCommande, int modeDAffichage ) { return 0; } |
C'est quoi, tout ça ? Où diable sont passés les argc et argv tout bêtes ?
Étudions ensemble cette fonction. Vous connaissez forcément le type de retour de cette fonction : il s'agit d'un int. Passons maintenant aux arguments :1 | HINSTANCE cetteInstance |
1 | HINSTANCE precedenteInstance |
1 | LPSTR lignesDeCommande |
1 | int modeDAffichage |
-, vous devriez au préalable savoir à quoi correspondent les types principaux utilisés par cette API : 1 | LPTSTR string = TEXT("exemple"); |
1 | LPWSTR string = L"exemple"; |
.
Génial, non ? Vous en voulez plus ? (pas étonnant
) D'accord, direction "Votre première fenêtre"
.1 | MessageBox(NULL, "Hello World", "Hello World", MB_OK); |
1 | MessageBox(NULL, TEXT("Hello World"), TEXT("Hello World"), MB_OK); |

1 2 3 4 5 6 | #include <windows.h> int WinMain (HINSTANCE cetteInstance, HINSTANCE precedenteInstance, LPSTR lignesDeCommande, int modeDAffichage) { return 0; } |
1 2 3 | HWND fenetrePrincipale; MSG message; WNDCLASS classeFenetre; |
).
) nécessaire à la construction de la fenêtre principale. C'est en fait une liste d'informations permettant par la suite de créer la fenêtre selon notre bon vouloir. (Je précise que la "classe" n'a pas ici la même définition que pour le C++.)1 | classeFenetre.style=0; |
1 | classeFenetre.lpfnWndProc = procedureFenetrePrincipale; |
) :Code : C1 | classeFenetre.cbClsExtra = 0; |
1 | classeFenetre.cbWndExtra = 0; |
1 | classeFenetre.hInstance = cetteInstance; |
1 | classeFenetre.hIcon = LoadIcon(NULL, IDI_APPLICATION); |
1 | classeFenetre.hCursor = LoadCursor(NULL, IDC_ARROW); |
1 | classeFenetre.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE); |
1 | classeFenetre.lpszMenuName = NULL; |
1 | classeFenetre.lpszClassName = "classeF"; |
1 | RegisterClass(&classeFenetre); |
1 2 3 4 5 6 7 8 9 10 11 12 13 | HWND CreateWindow( LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HANDLE hInstance, LPVOID lpParam ); |
Ne me dis pas que l'on doit retenir toutes ces fonctions ?
), vous les connaîtrez par coeur. "C'est en forgeant qu'on devient forgeron" à ce qu'il paraît.
. En fait, cette fonction remplit la structure HWND avec les informations propres à la fenêtre, et la crée par la même occasion. (CreateWindow ne crée pas vraiment que des fenêtres au sens connu, mais toutes sortes de contrôles, que ce soit : fenêtre, bouton, listbox, progressbar, etc.)1 | LPCTSTR lpClassName |
1 | LPCTSTR lpWindowName |
1 | DWORD dwStyle |
1 2 3 4 | int x, int y, int nWidth, int nHeight |
1 | HWND hWndParent |
1 | HMENU hMenu |
1 | HANDLE hInstance |
1 | LPVOID lpParam |
1 2 3 4 5 6 7 8 9 10 11 | fenetePrincipale = CreateWindow("classeF", "Première fenêtre en winAPI !", WS_OVERLAPPEDWINDOW, /*Style qui permet d'avoir une fenêtre tout ce qu'il y a de plus normale : barre de titre, menu système (réduire, maximiser, fermer), bordure etc...*/ CW_USEDEFAULT, // Permet à l'OS de déterminer dynamiquement la position de la fenêtre CW_USEDEFAULT, //Idem 400, 300, NULL, // Pas de fenêtre parent, puisque c'est la principale NULL, //Aucun menu ne lui est associé cetteInstance, NULL); // Aucun paramètre à lui envoyer en plus |
Elle est créée, mais c'est tout.
1 | ShowWindow(fenetrePrincipale,SW_SHOW); |
) et destinés aux fenêtres concernées.1 | BOOL GetMessage(LPMSG msg, HWND hwnd, UINT wMsgFilterMin, UINT wMsgFilterMax); |
1 | LPMSG msg |
1 | HWND hwnd |
). Mettez-les donc à zéro.1 2 3 4 5 | while (GetMessage(&message, NULL, 0, 0)) /*Récupération des évènements de toutes les fenêtres de l'instance dans message*/ { TranslateMessage(&message); // Traduction de l'événement DispatchMessage(&message); // Envoi du message correspondant à la fenêtre concernée } |
Voilà déjà son prototype :1 | LRESULT CALLBACK procedureFenetrePrincipale(HWND fenetrePrincipale, UINT message, WPARAM wParam, LPARAM lParam); |
1 | HWND fenetrePrincipale |
1 | UINT message |
1 | WPARAM wParam, LPARAM lParam |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | LRESULT CALLBACK procedureFenetrePrincipale(HWND fenetrePrincipale, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_CREATE: return 0; case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc(fenetrePrincipale, message, wParam, lParam); } } |
. Ici, il est traité, et PostQuitMessage est exécuté : il s'agit d'une fonction permettant de quitter simplement et proprement le programme. Elle prend comme unique argument 0.
: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 | #include <windows.h> LRESULT CALLBACK procedureFenetrePrincipale(HWND, UINT, WPARAM, LPARAM); int WinMain (HINSTANCE cetteInstance, HINSTANCE precedenteInstance, LPSTR lignesDeCommande, int modeDAffichage) { HWND fenetrePrincipale; MSG message; WNDCLASS classeFenetre; classeFenetre.style = 0; classeFenetre.lpfnWndProc = procedureFenetrePrincipale; classeFenetre.cbClsExtra = 0; classeFenetre.cbWndExtra = 0; classeFenetre.hInstance = NULL; classeFenetre.hIcon = LoadIcon(NULL, IDI_APPLICATION); classeFenetre.hCursor = LoadCursor(NULL, IDC_ARROW); classeFenetre.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE); classeFenetre.lpszMenuName = NULL; classeFenetre.lpszClassName = "classeF"; // On prévoit quand même le cas où ça échoue if(!RegisterClass(&classeFenetre)) return FALSE; fenetrePrincipale = CreateWindow("classeF", "Ma première fenêtre winAPI !", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, NULL, NULL, cetteInstance, NULL); if (!fenetrePrincipale) return FALSE; ShowWindow(fenetrePrincipale, modeDAffichage); UpdateWindow(fenetrePrincipale); while (GetMessage(&message, NULL, 0, 0)) { TranslateMessage(&message); DispatchMessage(&message); } return message.wParam; } LRESULT CALLBACK procedureFenetrePrincipale(HWND fenetrePrincipale, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_CREATE: return 0; case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc(fenetrePrincipale, message, wParam, lParam); } } |
) :
. Vous aurez sûrement une barre de titre différente, à cause du thème de Windows.
. Ne vous découragez surtout pas face à la longueur du code, car cela en vaut la peine, et cela va rentrer progressivement en tant qu'automatisme.
. Nous allons voir ici comment créer des boutons, comment les manipuler, et comment faire apparaître un message à l'utilisateur.
).
Mais je croyais que c'était pour faire des fenêtres ?
), soit d'un ID, défini grâce à :Code : C1 | #define ID 1
|
1 2 3 | LRESULT CALLBACK procedureFenetrePrincipale(HWND fenetrePrincipale, UINT message, WPARAM wParam, LPARAM lParam) { static HWND boutons[2] = {NULL}; |
. Cependant, j'envisage de vous parler d'une autre méthode (meilleure) plus tard. Pour les curieux, il s'agit de la combinaison de SetWindowLong() avec GetWindowLong() (et leur déclinaison ~Ptr), permettant d'utiliser les membres de la WindowClass cbClsExtra et cbWndExtra.1 2 | #define ID_B_PARLER 0 #define ID_B_QUITTER 1 |
1 | HINSTANCE instance; |
1 | instance = cetteInstance; |
1 2 3 4 5 6 | case WM_CREATE: boutons[0] = CreateWindow("BUTTON", "Parler", WS_CHILD | WS_VISIBLE, 5, 5, 383, 30, fenetrePrincipale, ID_B_PARLER, instance, NULL); boutons[1] = CreateWindow("BUTTON", "Quitter", WS_CHILD | WS_VISIBLE, 5, 45, 383, 30, fenetrePrincipale, ID_B_QUITTER, instance, NULL); return 0; |
1 2 3 4 5 6 7 8 9 10 11 12 | case WM_COMMAND: switch(LOWORD(wParam)) { case ID_B_PARLER: //Ici l'instruction associée à "Parler" break; case ID_B_QUITTER: //Là l'instruction associée à "Quitter" break; } return 0; |
En effet, ce bouton a le même effet que "la croix". Comme son message associé est WM_DESTROY, nous allons donc envoyer le message WM_DESTROY à la fenêtre principale quand le bouton "Quitter" a été cliqué. 1 | LRESULT SendMessage(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam); |
.1 | SendMessage(fenetrePrincipale, WM_DESTROY, 0, 0); |
). Et pour cela, rien de mieux que MessageBox. 1 | int MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType); |
1 | MessageBox(fenetrePrincipale, "Clic !", "Bonjour.", MB_ICONINFORMATION); |
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 | #include <windows.h> #define ID_B_PARLER 0 #define ID_B_QUITTER 1 HINSTANCE instance; LRESULT CALLBACK procedureFenetrePrincipale(HWND, UINT, WPARAM, LPARAM); int WinMain (HINSTANCE cetteInstance, HINSTANCE precedenteInstance, LPSTR lignesDeCommande, int modeDAffichage) { HWND fenetrePrincipale; MSG message; WNDCLASS classeFenetre; instance = cetteInstance; classeFenetre.style = 0; classeFenetre.lpfnWndProc = procedureFenetrePrincipale; classeFenetre.cbClsExtra = 0; classeFenetre.cbWndExtra = 0; classeFenetre.hInstance = NULL; classeFenetre.hIcon = LoadIcon(NULL, IDI_APPLICATION); classeFenetre.hCursor = LoadCursor(NULL, IDC_ARROW); classeFenetre.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE); classeFenetre.lpszMenuName = NULL; classeFenetre.lpszClassName = "classeF"; // On prévoit quand même le cas où ça échoue if(!RegisterClass(&classeFenetre)) return FALSE; fenetrePrincipale = CreateWindow("classeF", "Ma premiere fenetre winAPI !", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 110, NULL, NULL, cetteInstance, NULL); if (!fenetrePrincipale) return FALSE; ShowWindow(fenetrePrincipale, modeDAffichage); UpdateWindow(fenetrePrincipale); while (GetMessage(&message, NULL, 0, 0)) { TranslateMessage(&message); DispatchMessage(&message); } return message.wParam; } LRESULT CALLBACK procedureFenetrePrincipale(HWND fenetrePrincipale, UINT message, WPARAM wParam, LPARAM lParam) { static HWND boutons[2] = {NULL}; switch (message) { case WM_CREATE: boutons[0] = CreateWindow("BUTTON", "Parler", WS_CHILD | WS_VISIBLE, 5, 5, 383, 30, fenetrePrincipale, (HMENU)ID_B_PARLER, instance, NULL); boutons[1] = CreateWindow("BUTTON", "Quitter", WS_CHILD | WS_VISIBLE, 5, 45, 383, 30, fenetrePrincipale, (HMENU)ID_B_QUITTER, instance, NULL); return 0; case WM_COMMAND: switch(LOWORD(wParam)) { case ID_B_PARLER: MessageBox(fenetrePrincipale, "Clic", "Bonjour.", MB_ICONINFORMATION); break; case ID_B_QUITTER: SendMessage(fenetrePrincipale, WM_DESTROY, 0, 0); break; } return 0; case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc(fenetrePrincipale, message, wParam, lParam); } } |

Eh bien vous allez apprendre dans ce chapitre à créer des menus. Pour cela, deux manières de coder : 1 | HMENU menu, sousMenu; |
1 | HMENU CreateMenu(VOID); |
1 | BOOL AppendMenu(HMENU hMenu, UINT uFlags, UINT_PTR uIDNewItem, LPCSTR lpNewItem); |
1 | HMENU hMenu |
1 | UINT uFlags |
1 | UINT_PTR uIDNewItem |
1 | LPCSTR lpNewItem |
1 2 3 4 5 6 7 8 9 10 11 12 | //Déclarations : HMENU menu, sousMenu; //... sousMenu = CreateMenu(); AppendMenu(sousMenu, MF_STRING, ID_B_PARLER, "Parler"); AppendMenu(sousMenu, MF_SEPARATOR, (UINT)NULL, ""); AppendMenu(sousMenu, MF_STRING, ID_B_QUITTER, "Quitter"); menu = CreateMenu(); AppendMenu(menu, MF_POPUP, (UINT)sousMenu, "Actions"); |
), et bien d'autres choses.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | ID_MENU MENU BEGIN POPUP "Menu" BEGIN POPUP "Sous Menu" BEGIN MENUITEM "Truc", ID_TRUC MENUITEM SEPARATOR MENUITEM "Machin", ID_MACHIN END MENUITEM "Groar", ID_GROAR END POPUP "Menu2" BEGIN MENUITEM "Miaou", ID_MIAOU END END |
.)
). Les ID de chaque commande doivent être spécifiés après le nom affiché et une virgule.1 2 3 4 5 6 7 8 | ID_MENU MENU BEGIN POPUP "Actions" BEGIN MENUITEM "Parler", ID_B_PARLER MENUITEM "Quitter", ID_B_QUITTER END END |
1 | fenetrePrincipale = CreateWindow("classeF", "Ma premiere fenetre winAPI !", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 130, NULL, <gras>menu</gras>, cetteInstance, NULL); |
1 | classeFenetre.lpszMenuName = "MENU"; |
1 | SetMenu(fenetrePrincipale, LoadMenu(instance, "ID_MENU")); |
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <windows.h> #include "constantes.h" ID_MENU MENU BEGIN POPUP "Actions" BEGIN MENUITEM "Parler", ID_B_PARLER MENUITEM SEPARATOR MENUITEM "Quitter", ID_B_QUITTER END END |
1 2 3 4 5 6 7 | #ifndef CONSTANTES_H #define CONSTANTES_H #define ID_B_PARLER 0 #define ID_B_QUITTER 1 #endif |
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 | #include <windows.h> #define ID_B_PARLER 0 #define ID_B_QUITTER 1 HINSTANCE instance; LRESULT CALLBACK procedureFenetrePrincipale(HWND, UINT, WPARAM, LPARAM); int WinMain (HINSTANCE cetteInstance, HINSTANCE precedenteInstance, LPSTR lignesDeCommande, int modeDAffichage) { HWND fenetrePrincipale; MSG message; WNDCLASS classeFenetre; HMENU menu, sousMenu; instance = cetteInstance; sousMenu = CreateMenu(); AppendMenu(sousMenu,MF_STRING, ID_B_PARLER, "Parler"); AppendMenu(sousMenu,MF_SEPARATOR, (UINT)NULL, ""); AppendMenu(sousMenu,MF_STRING,ID_B_QUITTER,"Quitter"); menu = CreateMenu(); AppendMenu(menu, MF_POPUP, (UINT)sousMenu, "Actions"); classeFenetre.style = 0; classeFenetre.lpfnWndProc = procedureFenetrePrincipale; classeFenetre.cbClsExtra = 0; classeFenetre.cbWndExtra = 0; classeFenetre.hInstance = NULL; classeFenetre.hIcon = LoadIcon(NULL, IDI_APPLICATION); classeFenetre.hCursor = LoadCursor(NULL, IDC_ARROW); classeFenetre.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE); classeFenetre.lpszMenuName = NULL; classeFenetre.lpszClassName = "classeF"; // On prévoit quand même le cas où ça échoue if(!RegisterClass(&classeFenetre)) return FALSE; fenetrePrincipale = CreateWindow("classeF", "Ma premiere fenetre winAPI !", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 130, NULL, menu /* Ou LoadMenu(instance, "ID_MENU")*/, cetteInstance, NULL); if (!fenetrePrincipale) return FALSE; ShowWindow(fenetrePrincipale, modeDAffichage); UpdateWindow(fenetrePrincipale); while (GetMessage(&message, NULL, 0, 0)) { TranslateMessage(&message); DispatchMessage(&message); } return message.wParam; } LRESULT CALLBACK procedureFenetrePrincipale(HWND fenetrePrincipale, UINT message, WPARAM wParam, LPARAM lParam) { static HWND boutons[2] = {NULL}; switch (message) { case WM_CREATE: boutons[0] = CreateWindow("BUTTON", "Parler", WS_CHILD | WS_VISIBLE, 5, 5, 383, 30, fenetrePrincipale, (HMENU)ID_B_PARLER, instance, NULL); boutons[1] = CreateWindow("BUTTON", "Quitter", WS_CHILD | WS_VISIBLE, 5, 45, 383, 30, fenetrePrincipale, (HMENU)ID_B_QUITTER, instance, NULL); return 0; case WM_COMMAND: switch(LOWORD(wParam)) { case ID_B_PARLER: MessageBox(fenetrePrincipale, "Clic", "Bonjour.", MB_ICONINFORMATION); break; case ID_B_QUITTER: SendMessage(fenetrePrincipale, WM_DESTROY, 0, 0); break; } return 0; case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc(fenetrePrincipale, message, wParam, lParam); } } |
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 | #include <windows.h> #include "constantes.h" HINSTANCE instance; LRESULT CALLBACK procedureFenetrePrincipale(HWND, UINT, WPARAM, LPARAM); int WinMain (HINSTANCE cetteInstance, HINSTANCE precedenteInstance, LPSTR lignesDeCommande, int modeDAffichage) { HWND fenetrePrincipale; MSG message; WNDCLASS classeFenetre; instance = cetteInstance; classeFenetre.style = 0; classeFenetre.lpfnWndProc = procedureFenetrePrincipale; classeFenetre.cbClsExtra = 0; classeFenetre.cbWndExtra = 0; classeFenetre.hInstance = NULL; classeFenetre.hIcon = LoadIcon(NULL, IDI_APPLICATION); classeFenetre.hCursor = LoadCursor(NULL, IDC_ARROW); classeFenetre.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE); classeFenetre.lpszMenuName = "ID_MENU"; classeFenetre.lpszClassName = "classeF"; // On prévoit quand même le cas où ça échoue if(!RegisterClass(&classeFenetre)) return FALSE; fenetrePrincipale = CreateWindow("classeF", "Ma premiere fenetre winAPI !", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 130, NULL, NULL, cetteInstance, NULL); if (!fenetrePrincipale) return FALSE; ShowWindow(fenetrePrincipale, modeDAffichage); UpdateWindow(fenetrePrincipale); while (GetMessage(&message, NULL, 0, 0)) { TranslateMessage(&message); DispatchMessage(&message); } return message.wParam; } LRESULT CALLBACK procedureFenetrePrincipale(HWND fenetrePrincipale, UINT message, WPARAM wParam, LPARAM lParam) { static HWND boutons[2] = {NULL}; switch (message) { case WM_CREATE: boutons[0] = CreateWindow("BUTTON", "Parler", WS_CHILD | WS_VISIBLE, 5, 5, 383, 30, fenetrePrincipale, (HMENU)ID_B_PARLER, instance, NULL); boutons[1] = CreateWindow("BUTTON", "Quitter", WS_CHILD | WS_VISIBLE, 5, 45, 383, 30, fenetrePrincipale, (HMENU)ID_B_QUITTER, instance, NULL); return 0; case WM_COMMAND: switch(LOWORD(wParam)) { case ID_B_PARLER: MessageBox(fenetrePrincipale, "Clic", "Bonjour.", MB_ICONINFORMATION); break; case ID_B_QUITTER: SendMessage(fenetrePrincipale, WM_DESTROY, 0, 0); break; } return 0; case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc(fenetrePrincipale, message, wParam, lParam); } } |
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 | #include <windows.h> #include "constantes.h" HINSTANCE instance; LRESULT CALLBACK procedureFenetrePrincipale(HWND, UINT, WPARAM, LPARAM); int WinMain (HINSTANCE cetteInstance, HINSTANCE precedenteInstance, LPSTR lignesDeCommande, int modeDAffichage) { HWND fenetrePrincipale; MSG message; WNDCLASS classeFenetre; instance = cetteInstance; classeFenetre.style = 0; classeFenetre.lpfnWndProc = procedureFenetrePrincipale; classeFenetre.cbClsExtra = 0; classeFenetre.cbWndExtra = 0; classeFenetre.hInstance = NULL; classeFenetre.hIcon = LoadIcon(NULL, IDI_APPLICATION); classeFenetre.hCursor = LoadCursor(NULL, IDC_ARROW); classeFenetre.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE); classeFenetre.lpszMenuName = NULL; classeFenetre.lpszClassName = "classeF"; // On prévoit quand même le cas où ça échoue if(!RegisterClass(&classeFenetre)) return FALSE; fenetrePrincipale = CreateWindow("classeF", "Ma premiere fenetre winAPI !", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 130, NULL, NULL, cetteInstance, NULL); if (!fenetrePrincipale) return FALSE; ShowWindow(fenetrePrincipale, modeDAffichage); UpdateWindow(fenetrePrincipale); while (GetMessage(&message, NULL, 0, 0)) { TranslateMessage(&message); DispatchMessage(&message); } return message.wParam; } LRESULT CALLBACK procedureFenetrePrincipale(HWND fenetrePrincipale, UINT message, WPARAM wParam, LPARAM lParam) { static HWND boutons[2] = {NULL}; switch (message) { case WM_CREATE: boutons[0] = CreateWindow("BUTTON", "Parler", WS_CHILD | WS_VISIBLE, 5, 5, 383, 30, fenetrePrincipale, (HMENU)ID_B_PARLER, instance, NULL); boutons[1] = CreateWindow("BUTTON", "Quitter", WS_CHILD | WS_VISIBLE, 5, 45, 383, 30, fenetrePrincipale, (HMENU)ID_B_QUITTER, instance, NULL); SetMenu(fenetrePrincipale, LoadMenu(instance, "ID_MENU")); /*Ou dans le cas manuel, SetMenu(fenetrePrincipale, menu); où menu a été d"jà créé*/ return 0; case WM_COMMAND: switch(LOWORD(wParam)) { case ID_B_PARLER: MessageBox(fenetrePrincipale, "Clic", "Bonjour.", MB_ICONINFORMATION); break; case ID_B_QUITTER: SendMessage(fenetrePrincipale, WM_DESTROY, 0, 0); break; } return 0; case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc(fenetrePrincipale, message, wParam, lParam); } } |

1 | MENUITEM "Parler", ID_B_PARLER, MF_GRAYED |
1 | EnableMenuItem(menu, ID_B_PARLER, MF_BYCOMMAND | MF_GRAYED); |
1 | MENUITEM "Parler", ID_B_PARLER, MF_CHECKED |
1 | CheckMenuItem(menu, ID_B_PARLER, MF_BYCOMMAND | MF_CHECKED); |
1 2 3 4 5 6 7 | SetMenuItemBitmaps( hMenu, ID_PARLER, MF_BYCOMMAND, LoadBitmap(hInstance, "talkBtnBmp_normal"), LoadBitmap(hInstance, "talkBtnBmp_selected") ); |
1 2 3 4 | POPUP "Aide" BEGIN MENUITEM "A propos", ID_B_APROPOS END |
1 2 3 4 5 6 | ID_DIALOGUE DIALOG CW_USEDEFAULT, CW_USEDEFAULT, 200, 120 STYLE WS_OVERLAPPEDWINDOW CAPTION "Titre" BEGIN END |
1 | MOTCLE TEXTE_ASSOCIE, ID, x, y, w, h, STYLES |
) : une icône possède le même mot-clé que pendant une intégration à l'exécutable de celle-ci, en passant par les ressources, à savoir ICON.1 | icone1 ICON "chemin/icone.ico" |
1 2 3 4 5 6 7 8 9 | APROPOS DIALOG CW_USEDEFAULT, CW_USEDEFAULT, 200, 120 CAPTION "Titre" STYLE WS_OVERLAPPEDWINDOW BEGIN DEFPUSHBUTTON "Ok", IDOK, 96, 90, 42, 12 ICON icone1, -1, 60, 55, 32, 32 LTEXT "A propos test des boîtes de dialogue", -1, 100, 58, 100, 10 END |
1 | HINSTANCE hInstance |
1 | LPCTSTR lpTemplate |
1 | HWND hWndParent |
1 | DLGPROC lpDialogFunc |
1 2 3 4 5 6 | case WM_COMMAND: switch(LOWORD(wParam)) { case ID_B_APROPOS: DialogBox(instance, "APROPOS", fenetrePrincipale, (DLGPROC)aPropos_procedure); break; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | BOOL APIENTRY aPropos_procedure(HWND boiteDeDialogue,UINT message,WPARAM wParam,LPARAM lParam) { switch (message) { case WM_INITDIALOG: return TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDCANCEL || LOWORD(wParam) == IDOK) { EndDialog(boiteDeDialogue,0); return TRUE; } return 0; default: return FALSE; } } |
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 | #include <windows.h> #include "constantes.h" icone1 ICON "Icones/icone.ico" ID_MENU MENU BEGIN POPUP "Actions" BEGIN MENUITEM "Parler", ID_B_PARLER MENUITEM SEPARATOR MENUITEM "Quitter", ID_B_QUITTER END POPUP "Aide" BEGIN MENUITEM "A propos", ID_B_APROPOS END END APROPOS DIALOG CW_USEDEFAULT, CW_USEDEFAULT, 200, 120 CAPTION "Titre" STYLE WS_OVERLAPPEDWINDOW BEGIN DEFPUSHBUTTON "Ok", IDOK, 76, 90, 42, 12 ICON icone1, -1, 30, 50, 32, 32 LTEXT "A propos test des boîtes de dialogue", -1, 60, 38, 200, 10 END |
1 2 3 4 5 6 7 8 | #ifndef CONSTANTES_H #define CONSTANTES_H #define ID_B_PARLER 0 #define ID_B_QUITTER 1 #define ID_B_APROPOS 2 #endif |
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 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | #include <windows.h> #include "constantes.h" HINSTANCE instance; LRESULT CALLBACK procedureFenetrePrincipale(HWND, UINT, WPARAM, LPARAM); BOOL APIENTRY aPropos_procedure(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam); int WinMain (HINSTANCE cetteInstance, HINSTANCE precedenteInstance, LPSTR lignesDeCommande, int modeDAffichage) { HWND fenetrePrincipale; MSG message; WNDCLASS classeFenetre; instance = cetteInstance; classeFenetre.style = 0; classeFenetre.lpfnWndProc = procedureFenetrePrincipale; classeFenetre.cbClsExtra = 0; classeFenetre.cbWndExtra = 0; classeFenetre.hInstance = NULL; classeFenetre.hIcon = LoadIcon(NULL, IDI_APPLICATION); classeFenetre.hCursor = LoadCursor(NULL, IDC_ARROW); classeFenetre.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE); classeFenetre.lpszMenuName = NULL; classeFenetre.lpszClassName = "classeF"; // On prévoit quand même le cas où ça échoue if(!RegisterClass(&classeFenetre)) return FALSE; fenetrePrincipale = CreateWindow("classeF", "Ma premiere fenetre winAPI !", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 130, NULL, LoadMenu(instance, "ID_MENU"), cetteInstance, NULL); if (!fenetrePrincipale) return FALSE; ShowWindow(fenetrePrincipale, modeDAffichage); UpdateWindow(fenetrePrincipale); while (GetMessage(&message, NULL, 0, 0)) { TranslateMessage(&message); DispatchMessage(&message); } return message.wParam; } LRESULT CALLBACK procedureFenetrePrincipale(HWND fenetrePrincipale, UINT message, WPARAM wParam, LPARAM lParam) { static HWND boutons[2] = {NULL}; switch (message) { case WM_CREATE: boutons[0] = CreateWindow("BUTTON", "Parler", WS_CHILD | WS_VISIBLE, 5, 5, 383, 30, fenetrePrincipale, (HMENU)ID_B_PARLER, instance, NULL); boutons[1] = CreateWindow("BUTTON", "Quitter", WS_CHILD | WS_VISIBLE, 5, 45, 383, 30, fenetrePrincipale, (HMENU)ID_B_QUITTER, instance, NULL); return 0; case WM_COMMAND: switch(LOWORD(wParam)) { case ID_B_APROPOS: DialogBox(instance, "APROPOS", fenetrePrincipale, (DLGPROC)aPropos_procedure); break; case ID_B_PARLER: MessageBox(fenetrePrincipale, "Clic", "Bonjour.", MB_ICONINFORMATION); break; case ID_B_QUITTER: SendMessage(fenetrePrincipale, WM_DESTROY, 0, 0); break; } return 0; case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc(fenetrePrincipale, message, wParam, lParam); } } BOOL APIENTRY aPropos_procedure(HWND boiteDeDialogue,UINT message,WPARAM wParam,LPARAM lParam) { switch (message) { case WM_INITDIALOG: return TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDCANCEL || LOWORD(wParam) == IDOK) { EndDialog(boiteDeDialogue,0); return TRUE; } return 0; default: return FALSE; } } |
)
), et pourrez alors étendre vos connaissances avec le prochain chapitre, lequel portera sur les différents contrôles.