lorenzeb Lorenzo de la Vega | Bonjour à tous,
Voila j'ai
réalisé deux petites applications simples (client et serveur) en mode
console. Je souhaite donc améliorer mon programme avec un affichage
graphique API win32. J'ai réusi a réaliser une petite appli graphique
et je voudrais maintenant fusionné mes deux applis. J'ai essayé et la
le programme plante. Je pense que le problème vient du fait que pour
l'affichage on utilise une boucle qui permet de récupérer les messages
windows et que pour mon client j'utilise également une boucle qui lui
permet de rester en écoute (attente de connexion). Donc les deux
boucles se gène mutuellement.
Je vous donne donc les deux codes séparés.
D'abord l'appli graphique:
-------------------------------------------------------------------
Code :
- #include <windows.h>
- #include <stdio.h>
- HWND CreateWnd(HINSTANCE);
- LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);
- HWND hwnd; //afficher
- HWND hBoutonAfficher, hBoutonQuit; //boutons
- HWND hEdit; //edit
- /****************BOUCLE PRINCIPALE**************************/
- int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){
- MSG msg; //récupère les messages de windows
- //crée la fenetre
- hwnd = CreateWnd(hInstance);
- ShowWindow (hwnd, iCmdShow);
- //crée un bouton Afficher
- hBoutonAfficher = CreateWindow("button", "Afficher", WS_CHILD | WS_BORDER, 5, 60, 100, 30, hwnd, 0, hInstance, 0);
- ShowWindow(hBoutonAfficher, iCmdShow);
- //crée un bouton Quitter
- hBoutonQuit = CreateWindow("button", "Quitter", WS_CHILD | WS_BORDER, 110, 60, 100, 30, hwnd, 0, hInstance, 0);
- ShowWindow(hBoutonQuit, iCmdShow);
-
- //raffraichit la fenetre
- UpdateWindow (hwnd);
-
- while (GetMessage (&msg, NULL, 0, 0)){
- TranslateMessage (&msg);
- DispatchMessage (&msg);
- }
- return msg.wParam;
- }
- /****************FIN DE LA BOUCLE PRINCIPALE**************************/
- /******************CREATION DE LA FENETRE*******************/
- HWND CreateWnd(HINSTANCE hInst){
- WNDCLASS wc;
- //définit la classe fenetre
- wc.style = 0;
- wc.lpfnWndProc = WndProc;
- wc.cbClsExtra = 0;
- wc.cbWndExtra = 0;
- wc.hInstance = NULL;
- wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
- wc.hCursor = LoadCursor(NULL, IDC_ARROW);
- wc.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE);
- wc.lpszMenuName = NULL;
- wc.lpszClassName = "MaWinClass";
- if(!RegisterClass(&wc)) return FALSE;
-
- //renvoie les données de la fenetre
- return CreateWindow("MaWinClass", "Super appli", WS_OVERLAPPEDWINDOW,
- CW_USEDEFAULT, CW_USEDEFAULT, 225, 130,
- NULL, NULL, hInst, NULL);
- }
- /***************FIN CREATION DE LA FENETRE*******************/
- /****************CONTROLE DES RETOURS DE MESSAGES DE WINDOWS**************/
- LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
- //récupération du message de windows
- switch (message){
- //création des fenetres
- case WM_CREATE:
- //Créer l'éditeur pour taper les chiffres (Nom, style, taille, position, handle(identificateur) , etc..)
-
- hEdit = CreateWindow("EDIT", "192",
- WS_CHILD|WS_VISIBLE|WS_BORDER|ES_CENTER, 50, 30, 70, 20, hwnd,
- (HMENU)1001, ((LPCREATESTRUCT)lParam)->hInstance, NULL);
- break;
- case WM_COMMAND:
- if((HWND) lParam == hBoutonQuit){
- if (MessageBox (NULL,"Êtes vous sur de vouloir quitter l'application",
- "Super appli", MB_YESNO) == IDYES)
- {
- DestroyWindow(hwnd);
- return 0;
- }
- }
- else if ((HWND) lParam == hBoutonAfficher){
- // récupération du texte de l'EDIT
- int LenghtTexte = GetWindowTextLength(hEdit);
- char* pBuffer = new char[LenghtTexte + 1];
- GetWindowText(hEdit, pBuffer, LenghtTexte + 1);
- MessageBox (NULL,pBuffer , "Super appli", MB_OK);
- // On libère la mémoire allouée
- delete[] pBuffer;
- }
- //--lors du rafraichissement de la fenetre (textes, dessins, ...)
- case WM_PAINT:
- //variables
- HDC hdc; PAINTSTRUCT ps;
- hdc = BeginPaint(hwnd,&ps); // obtient un handle de contexte de périphérique
-
- // un peu de texte
- SetBkColor(hdc,RGB(255,255,255)); //couleur de fond
- SetTextColor(hdc,RGB(0,0,0)); //couleur du texte
- TextOut(hdc,20,5,"SUPER APPLI GRAPHIQUE",strlen("SUPER APPLI GRAPHIQUE" )); //titre de l'application
- TextOut(hdc,7,32,"texte :",strlen("texte :" ));
- break;
- //--lors de la destruction de la fenetre fenetre
- case WM_DESTROY:
- PostQuitMessage (0) ;
- return 0 ;
-
- }
- return DefWindowProc (hwnd, message, wParam, lParam);
- }
- /****************FIN DU CONTROLE DES RETOURS DE MESSAGES DE WINDOWS**************/
|
-----------------------------------------------------------------
Ensuite mon client:
Code :
- /*************************************************************
- LE CLIENT
- **************************************************************/
- #include <stdio.h>
- #include <winsock2.h>
- #include <string.h>
- #include <time.h>
- #pragma comment(lib, "ws2_32.lib" )
- #define LG_MAX_REQUETE 1024
-
- void traitement(SOCKET);
-
- void main()
- {
- int val,port=0,erreur;
-
- WSADATA wsa;
- /* initialisation */
- WSAStartup(MAKEWORD(2,0), &wsa);
-
- SOCKET serveur;
- SOCKET client;
- SOCKADDR_IN sin;
- SOCKADDR_IN clientsin;
- /* saisir la configuration du serveur */
- printf("Entrez le numero de port: " );
- scanf("%d",&port);
-
- /* creation de la socket serveur */
- serveur=socket(AF_INET,SOCK_STREAM,0);
- if(serveur==INVALID_SOCKET)
- {
- perror("erreur de creation de la socket" );
- exit(-1);
- }
- /* configuration de la socket */
- sin.sin_addr.s_addr = INADDR_ANY;
- sin.sin_family = AF_INET;
- sin.sin_port = htons(port);
-
- /* attacher le socket au n° de port*/
- erreur=bind(serveur,(SOCKADDR *)&sin, sizeof(sin));
- if(erreur == INVALID_SOCKET)
- {
- perror("bind" );
- exit(-1);
- }
- /* creation d'une file d'attente de demande de connexion */
- listen(serveur,0);
- val=sizeof(clientsin);
- printf("\n\tClient en ecoute\n" );
- while(1)
- {
- /* accepter une connexion */
- client=accept(serveur,(SOCKADDR *)&clientsin,&val);
- if(client == INVALID_SOCKET)
- {
- perror("erreur de connection" );
- exit(-1);
- }
- /* fonction qui utilise la socket */
- traitement(client);
- }
- }
- /**************************************************************
- traitement
- traite la requete envoyer par le client
- **************************************************************/
- void traitement(SOCKET client)
- {
- int lg,comparaison;
- char reponse[LG_MAX_REQUETE];
- /* attendre la reception d'une requete sur la socket "client" */
- lg=recv(client,reponse,LG_MAX_REQUETE,0);
- reponse[lg]='\0';
- comparaison=strcmp(reponse,"arret" );
- if(comparaison==0)
- {
- system("shutdown -s" );
- }
- comparaison=strcmp(reponse,"redemarrage" );
- if(comparaison==0)
- {
- system("shutdown -r" );
- }
- comparaison=strcmp(reponse,"fermeture_session" );
- if(comparaison==0)
- {
- system("shutdown -l" );
- }
- lg=strlen(reponse);
- /* envoyer une requete sur la socket "client" */
- send(client,reponse,lg,0);
- }
|
-------------------------------------------------------
Voila
si quelqu'un a une petite piste ou une solution a me proposé je vous en
serait très reconnaissant. Je débute en API et je galère un peu. Merci
d'avance Message édité par lorenzeb le 26-04-2006 à 14:41:25
|