Partage
  • Partager sur Facebook
  • Partager sur Twitter

Joystick

Contrôle d'un point sur une interface graphique C++

    16 juin 2019 à 20:24:36

    Salut à tous !

    Alors voilà j'ai un projet en informatique qui est de contrôler un point sur une interface graphique et mon code ne s’exécute pas, le projet se génère sans suite, même en lançant le fichier .exe cela ne fais rien...
    Je développe en C++ sous Visual Studio 2013 et mon code est le suivant :

    #pragma comment(lib,"winmm.lib")
    
    #include <windows.h>										
    #include <stdio.h>											
    
    #define CURSOR_SPEED 20										// Vitesse du curseur lorsque l'on deplace le joystick
    
    RECT windowRect = { 100, 100, 600, 500 };						// Creation du carré pour l'interface de controle
    
    ///////////////////////////////// INIT JOYSTICK /////////////////////////////////
    ////			Initialisation du Joystick et gestion d'erreur
    ////
    ////////////////////////////////////////////////////////////////////////////////
    
    
    BOOL InitJoystick(HWND fenetre)
    {
    	DWORD Result = 0;
    
    
    
    	if (!joyGetNumDevs())
    	{
    		MessageBoxA(NULL, "There are no joystick devices installed.", "Error", MB_OK | MB_ICONEXCLAMATION);
    		return FALSE;
    	}
    
    
    	Result = joySetCapture(fenetre, JOYSTICKID1, 0, FALSE); //capture un joystick en envoyant ses messages dans la fenêtre
    
    
    	switch (Result)
    	{
    	case JOYERR_UNPLUGGED:								// Le joystick est débranché
    		MessageBoxA(fenetre, "Veuillez Branchez le Joystick.", NULL, MB_OK | MB_ICONEXCLAMATION);
    		return FALSE;									// retourne une erreur
    	case MMSYSERR_NODRIVER:								// Pas de driver pour le joystick
    		MessageBoxA(fenetre, "Le driver du Joystick est invalide.", NULL, MB_OK | MB_ICONEXCLAMATION);
    		return FALSE;									// retourne une erreur
    	case JOYERR_NOCANDO:								// erreur inconnue, réessayer
    		MessageBoxA(fenetre, "Capture du Joystick impossible, réessayer.", NULL, MB_OK | MB_ICONEXCLAMATION);
    		return FALSE;									// retourne une erreur
    	}
    
    	return TRUE;											// Cela fonctionne, retourne le succés
    }
    
    
    ////////////////////////// MOVEVEMENT DU CURSEUR AVEC LE JOYSTICK ///////////////////////////
    /////
    /////	Le mouvement du curseur dépent du mouvement du Joystick
    /////
    ////////////////////////////////////////////////////////////////////////////////////////////
    
    void MoveCursorWithJoystick(LPARAM lParam)
    {
    	POINT cursorPos;										// Fixe la position du curseur
    	int x = 0, y = 0;										// Fixe les coordonnées du curseur
    
    	GetCursorPos(&cursorPos);								// Obtient la position du curseur
    
    	x = LOWORD(lParam) >> 12;
    	y = HIWORD(lParam) >> 12;
    
    	
    	if (x == 0)
    		cursorPos.x -= CURSOR_SPEED;
    	else if (x == 15)
    		cursorPos.x += CURSOR_SPEED;
    
    	
    	if (y == 0)
    		cursorPos.y -= CURSOR_SPEED;
    	else if (y == 15)
    		cursorPos.y += CURSOR_SPEED;
    
    	
    
    	// Ici on fixe la nouvelle position du capteur
    	SetCursorPos(cursorPos.x, cursorPos.y);
    
    }
    
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    
    // Ici nous avons le "main()" equivalent WinMain().	
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    	PSTR szCmdLine, int iCmdShow)
    {
    	HWND        fenetre;										// Creation d'une variable qui gère la fenêtre.
    	MSG         msg;										// Creation d'une variable qui affiche les informations
    	WNDCLASSEX  wndclass;		
    	
    							// Cette variable vas prendre toutes les infos de la fenêtre (Le nom, icone, cursor, couleur, menu)
    
    	wndclass.cbSize = sizeof (wndclass);				// Initialise la taille de la fenêtre
    	wndclass.style = CS_HREDRAW | CS_VREDRAW;	
    	wndclass.lpfnWndProc = WndProc;						// The function to handle the messages
    	wndclass.cbClsExtra = 0;								// Zero extra bytes
    	wndclass.cbWndExtra = 0;							
    	wndclass.hInstance = hInstance;						
    	wndclass.hIcon = LoadIcon(NULL, IDI_WINLOGO);	// Charger le logo pour la fenêtre
    	wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);	// Charger le curseur pour la fenêtre
    
    	// Fixer la couleur de fond de la fenêtre
    	wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    	wndclass.lpszMenuName = NULL;							// NULL car on a pas besoin de menu menu
    	wndclass.lpszClassName = "Joystick";					// Creation du nom de la fenêtre
    	wndclass.hIconSm = LoadIcon(NULL, IDI_WINLOGO);	// Creation d'une icône en haut a gauche de la fenêtre
    
    	RegisterClassEx(&wndclass);							
    	
    	fenetre = CreateWindowA("Joystick",						// window class nom 
    		"Joystick",			  			// Titre    
    		WS_OVERLAPPEDWINDOW,				//  Style		 
    		windowRect.left,					// position x initiale
    		windowRect.top,						// position y initiale
    		windowRect.right,					// Taille x initiale	 
    		windowRect.bottom,				    // Taille y initiale	 
    		NULL,								
    		NULL,								
    		hInstance,						    
    		NULL);								
    
    	ShowWindow(fenetre, iCmdShow);							// Afficher la fenêtre
    	UpdateWindow(fenetre);									// Actualiser la fenêtre et la colorer
    
    	// Commencement de la boucle principale
    	while (GetMessage(&msg, NULL, 0, 0))					// Create our message loop, Get the message, then translate it and handle it.
    	{
    		TranslateMessage(&msg);							// Traduire le mesage reçu par l'utilisateur
    		DispatchMessage(&msg);								// Gérer le mesage reçu par l'utilisateur
    	}
    
    	UnregisterClassA("Joystick", hInstance);					// Ici on va enlever l'enregistrement pour libérer de le mémoire
    
    	return msg.wParam;										// Quitter le programme
    }
    
    // Start our window procedure (wndProc).  This handles the messages
    LRESULT CALLBACK WndProc(HWND fenetre, UINT iMsg, WPARAM wParam, LPARAM lParam)
    {
    	PAINTSTRUCT paintStruct;								// Creation d'une structure peinte
    	HDC hdc;												
    
    	switch (iMsg)											
    	{
    	case WM_CREATE:										// Message envoyé lors de la création de la fenêtre
    
    		if (!InitJoystick(fenetre))						// Appelle la méthode d'initiation du Joystick pour vérifier si il y a une erreur
    			PostQuitMessage(0);							// Si cela retourne FALSE, le programme se ferme
    
    		break;											
    
    	case MM_JOY1BUTTONDOWN:								// Ce message s'envoie lorsqu'un bouton est pressé
    
    
    		if (wParam & JOY_BUTTON1)						// Si on presse le bouton 1
    			MessageBoxA(NULL, "Bouton 1 pressé", "Message", MB_OK);
    
    		if (wParam & JOY_BUTTON2)						// Si on presse le bouton 2
    			MessageBoxA(NULL, "Bouton 2 pressé!", "Message", MB_OK);
    
    		if (wParam & JOY_BUTTON3)						// Si on presse le bouton 3
    			MessageBoxA(NULL, "Bouton 3 pressé!", "Message", MB_OK);
    
    		if (wParam & JOY_BUTTON4)						// Si on presse le bouton 4
    			MessageBoxA(NULL, "Bouton 4 pressé!", "Message", MB_OK);
    
    		break;
    
    	case MM_JOY1MOVE:									// Ce message s'envoie quand on bouge le Joystick
    
    
    		MoveCursorWithJoystick(lParam);					// Bouge le curseur			
    		break;
    
    	case WM_PAINT:										
    		hdc = BeginPaint(fenetre, &paintStruct);								
    		EndPaint(fenetre, &paintStruct);					// Libération de la mémoire
    		DeleteDC(hdc);									
    		break;											
    
    	case WM_DESTROY:									// Message envoyé à la fermeture de la fenêtre
    		PostQuitMessage(0);								
    		break;											
    	}
    
    	return DefWindowProc(fenetre, iMsg, wParam, lParam);		
    }															
    



    Quelle est l'erreur ? Que faut-il faire s'il-vous-plaît...

    Merci :)

    • Partager sur Facebook
    • Partager sur Twitter
      25 juin 2019 à 11:46:39

      C'est vieux tout ça.

      Pourquoi utiliser des trucs vieux de plus de 30 ans ???

      Pourquoi ne pas utiliser DirectInput ou un équivalent intégré dans un Framework graphique qui ne date pas de Windows 1.0 (~1986)?

      Sinon, votre code WinSDK est du C, il faut donc SYSTÉMATIQUEMENT vérifier les valeurs de retour.

      Pas mal de maladresse comme l'usage explicite des API ASCII de Win32 plutôt que d'utiliser les versions TCHAR (avec l'usage de la MACRO TEXT).

      Le débogueur est votre ami.

      Mais une erreur très très courante avec ces API antédiluviennes, c'est d'oublier de mettre à 0 les champs de la structure WNDCLASSEX (via un ZeroMemory par exemple).

      https://www.gamedev.net/forums/topic/441775-zeromemory/

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

      Joystick

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown