Question

im essayant de créer une animation de balle à l'aide RDB, mais je ne peux pas le faire fonctionner. J'ai créé une boule en utilisant cette

   Graphics graphics(hdc);

stylo Pen (Color (255, 0, 0, 255));    graphics.DrawEllipse (& stylo, sf, 0, 10, 10); i ai tout en boucle des boucles et ajoute 1 à la valeur sf sf fondamentalement comme ceci ++; que je tente de repeindre la fenêtre (il ne fonctionne pas) si mal finir avec plus d'un cercle; / voici la boucle (la boucle est int WM_PAINT)

while(sd==1)//sd equals 1
    {
        sf++;
        onPaint(hdc);
        InvalidateRect (hWnd, NULL, TRUE);// this should repaint the window but it doesn't
        UpdateWindow(hWnd);
    }

Merci d'avance Rami

Était-ce utile?

La solution

Pour obtenir l'animation, je vous suggère d'utiliser une minuterie. Par exemple:

int OnCreate(HWND window, WPARAM wParam, LPARAM lParam)
{
   SetTimer(window, TIMER_ID, 1000, 0);
   return 0;
}

fenêtre recevoir des messages WM_TIMER chaque seconde (1000ms). Vous devez les gérer:

int OnTimer(HWND window, WPARAM wParam, LPARAM lParam)
{
   if(TIMER_ID == wParam)
   {
      /*do stuff*/
      InvalidateRect(window, NULL, TRUE);//force window to repaint
   }
   return 0;
}

alors vous devez gérer un message WM_PAINT pour faire le dessin

int OnPaint(HWND window, WPARAM wParam, LPARAM lParam)
{
   PAINTSTRUCT ps;
   HDC dc = BeginPaint(&ps);
   Graphics graphics(hdc);
   graphics.Draw...
   EndPaint(&ps);
   return 0;
}

Autres conseils

Vous vous rendez compte que vous incrémentez sf dans une boucle avec une condition de (sd == 1), à droite? Cette volonté de boucle bien sûr juste être infiniment ou jamais entré parce que la valeur de SD n'est pas changé en aucune façon. Avez-vous utilisé le débogueur du tout ici? Pourquoi auriez-vous besoin d'une telle boucle de toute façon? Vous ne devriez pas appellerez OnPaint dans une boucle.

Si vous voulez plus d'un cercle, il suffit de les tirer tout avant le retour de la fonction. Maintenir un ensemble de données qui seront utilisées pour dessiner les cercles dans le gestionnaire OnPaint.

InvalidateRect envoie un message WM_ERASEBKGND, et si vous ne disposez pas d'un hbrBackground (pinceau pour repeindre l'arrière-plan), membre de la structure WNDCLASS définie lors de la création de la fenêtre, il ne sera pas redessiner l'arrière-plan à moins que vous gérez le message WM_ERASEBKGND vous .

Si tel est le problème, alors peut-être parce que vous appelez UpdateWindow directement au lieu des messages vote et la manipulation, le message WM_ERASEBKGND ne se traité. Essayez le cercle précédent écraser avec la couleur d'arrière-plan avant de dessiner le nouveau.

ou appelez SendMessage avec WM_ERASEBKGRND comme le message.

Je trouve un exemple sur msdn qui montre comment dessiner des choses dans win32 pur.

Vous ne devez pas appeler invalidera ou UpdateWindow dans WM_PAINT, comme UpdateWindow envoie un nouveau WM_PAINT événement, et Invalide s'accumulent jusqu'à ce que le suivant événement WM_PAINT.

Vous devriez diviser votre code en deux fonctions, l'un pour effectuer le mouvement et l'autre pour dessiner votre cercle à l'emplacement actuel.

Votre fonction déménageur peut être appelé à partir n'importe où (peut-être dans une fonction de gestionnaire de minuterie?) Et doit se terminer par

InvalidateRect (hWnd, NULL, TRUE);
UpdateWindow(hWnd);

Pour marquer votre espace client pour redrawal et avisez votre fenêtre pour se redessiner.

Votre Draw () -. Fonction doit lire l'ensemble de position avec votre fonction de moteur, et à seulement dessiner un cercle autour de ce lieu

(Sidenote: Si vous voulez minimiser le scintillement et obtenir une animation fluide, jetez un oeil à double tampon une fois que vous obtenez votre animation de base et en cours d'exécution)

UPDATE

Vous étiez pas la commande UpdateWindow dans votre fonction de mise à jour Votre OnPaint-fonction est appelée uniquement lorsqu'un WM_PAINT message est reçu par votre application, vous devez envoyer celles-ci.

UpdateWindow sert à cette fin

VOID update(HDC hdc,HWND hWnd) 
{ 
    sf++; 
    FillRect(hdc,rect,(HBRUSH)(COLOR_WINDOW+1)); 
    InvalidateRect (hWnd, NULL, TRUE); 
    UpdateWindow(hWND);//<- This Line sends a wm_paint-message to your window in order to make it redraw itself
} 
//i didn't do any changes to the onPaint functon but here is the code for it 
VOID onPaint(HDC hdc) 
{ 
    Graphics graphics(hdc); 
    Pen pen(Color(255, 0, 0, 255)); 
    graphics.DrawEllipse(&pen, sf , 0, 10, 10); 
} 

//here is the while loop 
while(sd==1) 
{   onPaint(hdc); 
    update(hdc,hWnd); 
} 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top