Partage
  • Partager sur Facebook
  • Partager sur Twitter

problème avec mon code source (API Win32)

    19 juin 2006 à 10:29:15

    bonjours sur un tuto sur l'API Win32 que je suis sur un site , il me donne se code source, je le copi colle dans dev C++, je le compile et je l'exécute, mais il apparait de nombreuses erreurs alors que simplement copier coller...comment peut on apprendre quelque chose s'il y a des erreur partout?

    Pouvez vous me corriger leur code source ou pouvez vous me donner un tuto sans erreur dans leur code source.

    Voici leur code:
    #include <windows.h>
    #include <stdio.h>
           
    int k=0;

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

    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
    {
         static CHAR szAppName[] ="Salut" ;
         HWND         hwnd ;
         MSG          msg ;
         WNDCLASS     wndclass ;


             wndclass.style         = NULL;
         wndclass.lpfnWndProc   = WndProc ;
         wndclass.cbClsExtra    = 0 ;
         wndclass.cbWndExtra    = 0 ;
         wndclass.hInstance     = hInstance ;
         wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
         wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
         wndclass.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH) ;
         wndclass.lpszMenuName  = NULL ;
         wndclass.lpszClassName = szAppName ;

         if (!RegisterClass (&wndclass))
         {
              MessageBox (NULL, TEXT ("Problème!"),szAppName, MB_ICONERROR) ;
              return 0 ;
         }
         hwnd = CreateWindow (szAppName,                  // nom de la classe
                              "Réalité Virtuelle",      // titre de la fenêtre
                               WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU
                                                                            | WS_MINIMIZEBOX | WS_VISIBLE    ,   // style de la fenêtre
                              CW_USEDEFAULT,              // position initiale en x
                              CW_USEDEFAULT,              // position initiale en y
                              190,              // largeur initiale
                              180,              // hauteur initiale
                              NULL,                       // handle de la fenêtre mère
                              NULL,                       // handle du menu de la fenêtre
                              hInstance,                  // handle de l'instance
                              NULL) ;                     // paramètres de création
         
         ShowWindow (hwnd, iCmdShow) ;
         UpdateWindow (hwnd) ;
         
         while (GetMessage (&msg, NULL, 0, 0))
         {
              TranslateMessage (&msg) ;
              DispatchMessage (&msg) ;
         }
         return msg.wParam ;
    }

    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
            static HBITMAP hbitmap;  // pour le bitmap

         switch (message)
         {
             case WM_KEYDOWN:
                     switch(wParam)
                     {
                            case VK_UP:
                                    // creation d'un rectangle
                                    RECT rect;
                                    rect.top=0;
                                    rect.left=20;
                                    rect.bottom=115;
                                    rect.right=52;
                                    // maintenant k change la valeur des couleurs des pixels
                                    k+=50;
                                if(k>250) k=0;
                                    // on demande à redessiner la zone de rect avec un message WM_PAINT
                                    InvalidateRect(hwnd,&rect,FALSE);
                                    // c'est plus beau de ne pas effacer la zone avant de la redessiner
                                    // cela évite les clignotements
                                    break;
                            case VK_ESCAPE:
                                    DestroyWindow(hwnd);
                                    break;
                            default:
                                    break;
                           
                     }
                     break;

            case WM_PAINT:
                                    HDC hdc;HDC hdcMemory;
                                    PAINTSTRUCT ps;
                                    hdc=BeginPaint(hwnd,&ps);   // obtient un handle de contexte de périphérique
                                
                           
                                    // un peu de texte
                                    SetBkColor(hdc,RGB(0,0,255));
                                    SetTextColor(hdc,RGB(255,255,0));
                                    TextOut(hdc,10,3,"Texte ->",strlen("Texte ->"));

                                    char tab[20];
                                    SetTextAlign(hdc,TA_RIGHT | TA_TOP );
                                    SetBkColor(hdc,RGB(0,255,200));
                                    SetTextColor(hdc,RGB(255,0,0));
                                    TextOut(hdc,170,3,tab,sprintf(tab,"<- Texte")); // sprintf renvoit la longueur de la chaîne
                                   
                                    SetTextAlign(hdc,TA_LEFT | TA_TOP );
                                    SetBkColor(hdc,RGB(255,0,0));
                                    SetTextColor(hdc,RGB(30,30,30));
                                    TextOut(hdc,20,125,"Pressez flèche haut ",strlen("Pressez flèche haut "));

                                    // un bitmap
                                   
                                    BITMAP bm;
                                    hbitmap=(HBITMAP) LoadImage(NULL,"image.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
                                    hdcMemory=CreateCompatibleDC(NULL);
                                    SelectObject(hdcMemory,hbitmap);
                                    GetObject(hbitmap,sizeof(bm),&bm);
                                    BitBlt(hdc,20,20,bm.bmWidth,bm.bmHeight,hdcMemory,0,0,SRCCOPY);
                                    // Zoom sur la partie supérieur droite
                                    StretchBlt(hdc,55,20,100,100,hdcMemory,16,16,16,16,SRCCOPY);

                                    DeleteDC(hdcMemory);

                                   

         

                                    // On affiche un petit pixel
                                    int i,j;
                                    for(j=0;j<=32;j++)
                                            for(i=0;i<=60;i++)
                                                    SetPixel(hdc,20+j,55+i,RGB(i*4,j*4,k+4));
                           
                                    EndPaint(hwnd,&ps);         // libère un handle de contexte de périphérique
                                    break;

         case WM_DESTROY:
                      DeleteObject(hbitmap);       
              PostQuitMessage (0) ;
              return 0 ;
           
            
         }
        return DefWindowProc (hwnd, message, wParam, lParam);

    }
    • Partager sur Facebook
    • Partager sur Twitter
      19 juin 2006 à 17:38:51

      ns.jour,

      Votre code ne contient pas énormément d'erreurs :

      D'abord un "warning" :
      la ligne
               wndclass.style         = NULL;

      est à rempacer par la ligne
               wndclass.style         = 0;

      Ensuite dans votre fonction WndProc vous déclarez des variables dans des cas de switch ce n'est pas autorisé directement. Soit vous insérer un bloc avec des accolades { et } dans les cas de votre switch soit vous sortez les déclarations de variables de votre instruction swicth

      Exemple :

      swicth test
      {
         case 0 :
            { /* début d'un bloc de code */
               /* ici vous pouvez déclarer des variables */
               /* et mettre les instructions à exécuter pour le cas 0 de votre instruction switch */
            } /* fin du bloc de code */
            break;
         case 1 :
            { /* début d'un bloc de code */
            } /* fin du bloc de code */
            break;
         default :
      }

      Vous devez donc modifiez

                              case VK_UP:
                                 {
                                      // creation d'un rectangle
                                      RECT rect;
                                      rect.top=0;
                                      rect.left=20;
                                      rect.bottom=115;
                                      rect.right=52;
                                      // maintenant k change la valeur des couleurs des pixels
                                      k+=50;
                                  if(k>250) k=0;
                                      // on demande à redessiner la zone de rect avec un message WM_PAINT
                                      InvalidateRect(hwnd,&rect,FALSE);
                                      // c'est plus beau de ne pas effacer la zone avant de la redessiner
                                      // cela évite les clignotements
                                  }
                                      break;

      et

              case WM_PAINT:
                 {
                                      HDC hdc;HDC hdcMemory;
                                      PAINTSTRUCT ps;
                                      hdc=BeginPaint(hwnd,&ps);   // obtient un handle de contexte de périphérique
                                 
                             
                                      // un peu de texte
                                      SetBkColor(hdc,RGB(0,0,255));
                                      SetTextColor(hdc,RGB(255,255,0));
                                      TextOut(hdc,10,3,"Texte ->",strlen("Texte ->"));

                                      char tab[20];
                                      SetTextAlign(hdc,TA_RIGHT | TA_TOP );
                                      SetBkColor(hdc,RGB(0,255,200));
                                      SetTextColor(hdc,RGB(255,0,0));
                                      TextOut(hdc,170,3,tab,sprintf(tab,"<- Texte")); // sprintf renvoit la longueur de la chaîne
                                     
                                      SetTextAlign(hdc,TA_LEFT | TA_TOP );
                                      SetBkColor(hdc,RGB(255,0,0));
                                      SetTextColor(hdc,RGB(30,30,30));
                                      TextOut(hdc,20,125,"Pressez flèche haut ",strlen("Pressez flèche haut "));

                                      // un bitmap
                                     
                                      BITMAP bm;
                                      hbitmap=(HBITMAP) LoadImage(NULL,"image.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
                                      hdcMemory=CreateCompatibleDC(NULL);
                                      SelectObject(hdcMemory,hbitmap);
                                      GetObject(hbitmap,sizeof(bm),&bm);
                                      BitBlt(hdc,20,20,bm.bmWidth,bm.bmHeight,hdcMemory,0,0,SRCCOPY);
                                      // Zoom sur la partie supérieur droite
                                      StretchBlt(hdc,55,20,100,100,hdcMemory,16,16,16,16,SRCCOPY);

                                      DeleteDC(hdcMemory);

                                      // On affiche un petit pixel
                                      int i,j;
                                      for(j=0;j<=32;j++)
                                              for(i=0;i<=60;i++)
                                                      SetPixel(hdc,20+j,55+i,RGB(i*4,j*4,k+4));
                             
                                      EndPaint(hwnd,&ps);         // libère un handle de contexte de périphérique
                 }
                                      break;


      Ou alors supprimez les déclarations de variables à l'intérieur de l'instruction switch et les ajouter au début de votre fonction.

      LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
      {
         static HBITMAP hbitmap;  // pour le bitmap
         RECT rect;
         HDC hdc;HDC hdcMemory;
         PAINTSTRUCT ps;

           switch (message)
           {
      /* ici le reste du code */

      J'espère avoir répondu à vos questio
      • Partager sur Facebook
      • Partager sur Twitter

      problème avec mon code source (API Win32)

      × 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