Keyboard

cs_ToToL Messages postés 170 Date d'inscription vendredi 25 avril 2003 Statut Membre Dernière intervention 9 juillet 2008 - 8 mai 2004 à 11:21
cs_ToToL Messages postés 170 Date d'inscription vendredi 25 avril 2003 Statut Membre Dernière intervention 9 juillet 2008 - 8 mai 2004 à 11:56
J'ai créé un programme sauf que mon probleme est la vitesse de repetition des touche que je voudrai faire instantanné car sinon j'ai il y a un "blanc" de 0.5sec au debut.

Merci et aurevoire

Voici mon code

#include <windows.h>

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

#define NOM_FENETRE_1 "fenetre 1"

HINSTANCE hinst;

struct cercle {int x1;int y1; int x2; int y2;}mon_cercle;

int WINAPI WinMain (HINSTANCE hInstance,		//numero definissant notre programme
HINSTANCE hPrevInstance,	//plus utilisé (à NULL°
                    PSTR szCmdLine,				//ligne de commande avec l'appel du programme
int iCmdShow)				//état du programme au démarrage
 
{
 //variable devant contenir un numero identifiant la fenetre que nous allons creer
     HWND         hwnd;
 //structure contenant les données d'un message
     MSG          msg ;
 //classe de fenetre
     WNDCLASS     wndclass;
 //Instance du programme
 hinst = hInstance;
 //place du cercle
 mon_cercle.x1=50;
 mon_cercle.x2=70;
 mon_cercle.y1=50;
 mon_cercle.y2=70;
 
     wndclass.style         = CS_HREDRAW | CS_VREDRAW ; //demande à Windows de rafraichir la fenetre si sa largeur ou sa hauteur changent
     wndclass.lpfnWndProc   = WndProc ;					//donne l'adresse de la procédure de fenêtre
     wndclass.cbClsExtra    = 0 ;						//permet de reserver de l'espace mémoire interne...
     wndclass.cbWndExtra    = 0 ;						//...a windows pour notre appli (non neccessaire)
     wndclass.hInstance     = hinst ;				//a quel programme est destiné cette fenêtre (le notre)
     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;//definit l'icône de notre programme (icône par defaut)...
     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;	//...le curseur (par defaut)
     wndclass.hbrBackground = CreateSolidBrush(RGB(255, 0,0));//...la couleur de fond (ici GRAY_BRUSH, mais il y'en a d'autres (WHITE_BRUSH, BLACK_BRUSH..)
     wndclass.lpszMenuName  = NULL ;	//permet de donner le nom d'une ressource menu (nous verrons cela plus tard)
     wndclass.lpszClassName = NOM_FENETRE_1 ; //nom que nous attribuons a la classe de fenêtre

 //créer la classe de fenêtre et la sauvegarder sous ce nom
 
     RegisterClass (&wndclass);
 
 //creer la fenêtre a partir de notre classe de fenêtre
 
     hwnd = CreateWindow (NOM_FENETRE_1,                  // nom de la classe de fenêtre pour créer notre fenêtre
                          "Mon premiere programme Win32 !",  // titre de la fenêtre
                          WS_CAPTION|WS_MINIMIZEBOX|WS_SYSMENU,        // style de la fenêtre (ici superposable)
                          100,              // position initiale coin superieur gauche en X
                          100,              // position initiale coin superieur gauche en y
                          320,              // largeur de départ
                          240,              // hauteur de départ
                          NULL,                       // pas de fenêtre parente
                          NULL,                       // pas de menu
                          hinst,                      // a quel programme est relié notre fenêtre
                          NULL) ;                     // données de création
//affiche la fenetre
ShowWindow (hwnd, iCmdShow);
//mettre son contenu à jour
    UpdateWindow (hwnd);
 
     while (GetMessage (&msg,NULL,0,0))
 
     {
   //traduire les données du message pour qu'elles soient lisible
          TranslateMessage (&msg) ;
  //envoyer le message à Windows qui le transmettra à WINDOWPROC
          DispatchMessage (&msg) ;
     }
 
     return msg.wParam ;
 
}
 
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 
{
 
 //handle sur un device context
     HDC         hdc ;
 //structure de dessin
     PAINTSTRUCT ps ;
 //structure contenant les coordonnées et la taille d'un rectangle
     RECT        rect ;

     switch (message)
 
     {
 //Si une touche est enfoncée
 case WM_KEYDOWN:

if (HIWORD(GetKeyState(VK_UP)))
{
mon_cercle.y1 = mon_cercle.y1-5;
mon_cercle.y2 = mon_cercle.y2-5;
InvalidateRect(hwnd, NULL, TRUE);
 }
if (HIWORD(GetKeyState(VK_DOWN)))
{
mon_cercle.y1 = mon_cercle.y1+5;
mon_cercle.y2 = mon_cercle.y2+5;
InvalidateRect(hwnd, NULL, TRUE);
 }
if (HIWORD(GetKeyState(VK_RIGHT)))
{
mon_cercle.x1 = mon_cercle.x1+5;
mon_cercle.x2 = mon_cercle.x2+5;
InvalidateRect(hwnd, NULL, TRUE);
 }
if (HIWORD(GetKeyState(VK_LEFT)))
{
mon_cercle.x1 = mon_cercle.x1-5;
mon_cercle.x2 = mon_cercle.x2-5;
InvalidateRect(hwnd, NULL, TRUE);
 }
 return 0;

 //s'il faut redessiner le contenu de la fenetre
     case WM_PAINT:
//obtenir les données graphique de la fenêtre
hdc = BeginPaint (hwnd, &ps) ;
//Selectionne le pinceau
SelectObject(hdc, CreateSolidBrush(RGB(255, 0,0)));
//faire en sorte que le fond du texte soit transparent (sinon le tour du texte
//serait blanc sur nue fenêtre grise...)
SetBkMode( hdc, TRANSPARENT);
//obtenir la taille cliente de la fenêtre
GetClientRect (hwnd, &rect);
//Dessine un rectangle qui sera notre fond
Rectangle(hdc, rect.left,rect.top,rect.right,rect.bottom);
SelectObject(hdc, CreateSolidBrush(RGB(255, 255,0)));
Ellipse(hdc, mon_cercle.x1, mon_cercle.y1, mon_cercle.x2, mon_cercle.y2);
//fin de la procédure de dessinage
EndPaint (hwnd, &ps) ;
     return 0 ;

//si faut quitter
     case WM_DESTROY:
  //alors mettre un message "WM_QUIT" dans la file d'attente
          PostQuitMessage (0) ;
     return 0 ;
 
     }
 
 //tous les messages dont nous ne nons servons pas sont renvoyés au système
     return DefWindowProc (hwnd, message, wParam, lParam) ;
 
}

2 réponses

MoDDiB Messages postés 546 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 4 mai 2007 1
8 mai 2004 à 11:45
gere le key up c'est mieux que gerer un temps ! et si la touche reste enfoncé plus de 0.5s sans keyup alors fo ecrire kan meme :)
0
cs_ToToL Messages postés 170 Date d'inscription vendredi 25 avril 2003 Statut Membre Dernière intervention 9 juillet 2008
8 mai 2004 à 11:56
Meme si je fait avec le key up il y aura tjr un acou au depart puisque que sa vien d'un blanc fait par windows donc il y a un blanc de message pendant peut de temps et meme en mettant SystemParametersInfo(SPI_SETKEYBOARDDELAY,0,NULL,NULL); la répétition clavier ne s'enleve pas.

Ya aucun moyen d'enlever ce fichu truc ?

++
0
Rejoignez-nous