Probleme fenêtre sous windows

vixare Messages postés 1 Date d'inscription mardi 30 août 2005 Statut Membre Dernière intervention 5 juillet 2006 - 5 juil. 2006 à 12:06
vincelefou Messages postés 16 Date d'inscription vendredi 24 décembre 2004 Statut Membre Dernière intervention 28 juillet 2007 - 5 juil. 2006 à 14:59
Bonjour  à tous je debute en C++ sous windows et je voulais créer une fenêtre(fond bleu ) découpé en 9 rectangles à la  bordure jaune.La fenêtre s'affiche normalement mais les rectangles n'apparaissent pas si quelqu'un peut m'aider merci beaucoup.
Voila le code :

#include <windows.h>                      
                    
//------------------------------------------------------------------------------
// Comme il n'y a pas de fichier ressource ; on n'utilisera pas non plus
// de fichier .h, afin de simplifier au maximum.
// Toutes les définitions sont dans le fichier principal....
//------------------------------------------------------------------------------


#define ID_MENU                         500


#define IDM_QUITTER                     101


#define IDM_NOUVELLEPARTIE              102


#define IDM_AIDE                        103


#define IDM_INSTRUCTIONS                104
#define IDM_BLEU                        105
#define IDM_ROUGE                       106
#define IDM_BLANC                       107
HDC hDc;




   
#define Ox1  0          // coord rectangle ou région 1 :
#define Oy1  0          //               {0, 0, nLarg, nHaut}


#define Ox2  nLarg      // coord rectangle ou région 2 :
#define Oy2  0          //                    {nLarg, 0, 2 * nLarg, nHaut}


#define Ox3  2 * nLarg  // coord rectangle ou région 3 :
#define Oy3  0          //              {2 * nLarg, 0, 3 * nLarg, nHaut}


#define Ox4  0  // coord rectangle ou région 4 :
#define Oy4  nHaut         //               {0, nHaut,  nLarg, 2*nHaut}


#define Ox5  nLarg         // coord rectangle ou région 5 :
#define Oy5  nHaut      //              {nLarg, nHaut, 2*nLarg, 2 * nHaut}
                     
#define Ox6  2 * nLarg      // coord rectangle ou région 6 :
#define Oy6  nHaut      //             {2*nLarg, nHaut, 3* nLarg, 2 * nHaut};


#define Ox7  0  // coord rectangle ou région 7 :      
#define Oy7  2*nHaut      //          {0, 2*nHaut,  nLarg, 3 * nHaut}


#define Ox8  nLarg // coord rectangle ou région 8 :      
#define Oy8  2 * nHaut      // {nLarg,2* nHaut, 2 * nLarg, 3 * nHaut};


#define Ox9  2 * nLarg //coord rectangle ou région 9:
#define Oy9  2 * nHaut     //{2*nLarg,2*nHaut,3*nLarg,3*nHaut};


#define X  nLarg / 10   
#define Y  nHaut / 10 
static int nLarg;
static int nHaut;
static int nXdroit;
static int nXgauche;
static int nYhaut;
static int nYbas;


LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
HWND hWnd; 
       
HMENU hMenu;             
HMENU hMenuPopup;        
HMENU hSousMenuPopup;


 
HBRUSH hBackground   =  CreateSolidBrush(RGB(0,0,255)); // Bleu
                                      // Il s'agit de la couleur
                                      // à l'ouverture de la fenêtre
                                                                                                            
static char szClassName[ ] = "Fenêtre Windows";
                           
static HBRUSH hBlanc, hGris, hJaune,hRouge;  
static HRGN rgnRegion_1, rgnRegion_2, rgnRegion_3, rgnRegion_4, rgnRegion_5,
            rgnRegion_6, rgnRegion_7, rgnRegion_8, rgnRegion_9;
static int cxZone_Client, cyZone_Client;
                     


 




//------------------------------------------------------------------------------
int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpcmdLine,
                    int nCmdShow)
{
   
    WNDCLASSEX wincl;   


    wincl.hInstance                =            hThisInstance;   
    wincl.lpfnWndProc              =            WindowProcedure; 
    wincl.hbrBackground            =            hBackground;     
    wincl.style                    =            CS_HREDRAW | CS_VREDRAW;               
    wincl.lpszClassName            =            szClassName;      
    
                      
    
    wincl.cbSize                   =           sizeof (WNDCLASSEX);
                                                // Taille de  WNDCLASSEX
         
    wincl.hIcon                    =           LoadIcon (NULL, IDI_APPLICATION);
                                                // Utilise l'icône prédéfinie




    wincl.hIconSm                  =           LoadIcon (NULL, IDI_APPLICATION);
                                                // Utilise l'icône prédéfinie


    wincl.hCursor                  =            LoadCursor (NULL, IDC_ARROW);
                                        // Utilise le curseur standard (flêche)


    wincl.lpszMenuName             =            NULL;      
                                 // Pointeur sur la ressource menu (ici le menu
                                 // est initialise par SetMenu(hWnd, hMenu);
                                 // la valeur est donc à  NULL                                        


    wincl.cbClsExtra = 0;            // Non utilisé pour l'instant
    wincl.cbWndExtra = 0;            // Non utilisé pour l'instant
   
// -----------------------------------------------------------------------------


    if (RegisterClassEx (&wincl) == false)
                 return 0 ;              
                   


    else {
    MessageBox(hWnd,
    "??",
                                            "Initialisation",MB_OK);
         }              
                     
// -----------------------------------------------------------------------------        


hWnd = CreateWindowEx
           (0,                            
           szClassName,                   
           "fenêtre windows"        ,   
          
           WS_OVERLAPPEDWINDOW,          
           CW_USEDEFAULT,      
           CW_USEDEFAULT,      
           CW_USEDEFAULT,      
           CW_USEDEFAULT,     
           HWND_DESKTOP,       
           NULL,            // Menu créé sans fichier ressource
                            // cet argument reste à NULL            
           hThisInstance,     
           NULL                
           );


ShowWindow (hWnd, nCmdShow);




 




hMenu = CreateMenu();


hMenuPopup = CreateMenu();


    
AppendMenu (hMenuPopup , MF_STRING | MF_DISABLED, IDM_NOUVELLEPARTIE, "&Nouvelle partie (INACTIVE");
AppendMenu (hMenuPopup , MF_SEPARATOR, 0, NULL);
AppendMenu (hMenuPopup , MF_STRING, IDM_QUITTER , "&Quitter"); 


AppendMenu (hMenu, MF_POPUP,(UINT)(hMenuPopup), "&Options");


hMenuPopup = CreateMenu();


    
AppendMenu (hMenuPopup , MF_STRING , IDM_INSTRUCTIONS, "&Instructions"); 
AppendMenu (hMenu, MF_POPUP,(UINT)(hMenuPopup), "&Aide");


SetMenu(hWnd, hMenu);


UpdateWindow (hWnd);
                     
ShowWindow (hWnd,SW_MAXIMIZE);
                 


MSG messages;
   


  
    while (GetMessage (&messages, NULL, 0, 0))
    {
        TranslateMessage(&messages);


        DispatchMessage(&messages);
    }


    return messages.wParam;
}




    LRESULT CALLBACK WindowProcedure (HWND hWnd, UINT messages, WPARAM wParam, 
                                                                  LPARAM lParam)
{    
           
    nLarg = cxZone_Client/3;
    nHaut = cyZone_Client/3;
   
    // Puis on défini les 9 rectangles utilisés dans le contexte 1 à partir
    // des valeurs Ox, Oy, x et y. 
 
   
    RECT rectangle_1 = {Ox1, Oy1, Ox1 + 10*X, Oy1 + 10*Y};
    RECT rectangle_2 = {Ox2, Oy2, Ox2 + 10*X, Oy2 + 10*Y};
    RECT rectangle_3 = {Ox3, Oy3, Ox3 + 10*X, Oy3 + 10*Y};
    RECT rectangle_4 = {Ox4, Oy4, Ox4 + 10*X, Oy4 + 10*Y};   
    RECT rectangle_5 = {Ox5, Oy5, Ox5 + 10*X, Oy5 + 10*Y};
    RECT rectangle_6 = {Ox6, Oy6, Ox6 + 10*X, Oy6 + 10*Y};
    RECT rectangle_7 = {Ox7, Oy7, Ox7 + 10*X, Oy7 + 10*Y};
    RECT rectangle_8 = {Ox8, Oy8, Ox8 + 10*X, Oy8 + 10*Y}; 
 RECT rectangle_9 = {Ox9, Oy9, Ox9 + 10*X, Oy9 + 10*Y};
   
   
   
    PAINTSTRUCT ps; // Déclaration d'un objet de structure PAINTSTRUCT.


                                                      LPARAM lParam)


    static int nSelection = IDM_BLEU;
    POINT point;                  
                 
                 
 
    switch (messages) 
                                      
    {


   
                  
 case WM_PAINT:
  {
   hDc = BeginPaint(hWnd, &ps);
          HBRUSH hJaune;
          hJaune        =  CreateSolidBrush(RGB(255,255,0));
        SelectObject(hDc, hJaune);


 


FrameRect(hDc, &rectangle_1,  hJaune); // Bordure du rectangle 1 en jaune


    // On colorie les autres rectangles ...
   
    FrameRect(hDc, &rectangle_2, hJaune);
    FrameRect(hDc, &rectangle_3, hJaune);
    FrameRect(hDc, &rectangle_4, hJaune);
    FrameRect(hDc, &rectangle_5, hJaune);
    FrameRect(hDc, &rectangle_6, hJaune);
    FrameRect(hDc, &rectangle_7, hJaune);
    FrameRect(hDc, &rectangle_8, hJaune);
 FrameRect(hDc, &rectangle_9, hJaune);
               DeleteObject(hJaune);         
    EndPaint(hWnd, &ps);
 break;
  }
        case WM_RBUTTONUP : // click sur le bouton droit affiche le menu -------
                            // à l'endroit du click
                            // sous forme d'une barre.
            {              
                point.x = LOWORD(lParam); // On récupère les coordonnées
                point.y = HIWORD(lParam); // de la position de la souris
                                          // au moment du click droit.
     
      


               ClientToScreen (hWnd,&point);
               
                                                                

    
                                      
               hMenuPopup = GetSubMenu(hMenu, 1);


               TrackPopupMenu( hMenuPopup,TPM_RIGHTALIGN | TPM_LEFTBUTTON,
                                             point.x,point.y,0,hWnd,NULL);
                 
                break;
            }// fin case WM_RBUTTONUP ------------------------------------------
           
           
        case WM_MENUSELECT :       
        {       
        switch (LOWORD(wParam)) // On récupère l'ID de l'option en surbrillance-
              {
                case IDM_QUITTER :// cas d'une mise en surbrillance sur l'option
                                 // quitter du menu
                {
                
                        
                SetWindowText(hWnd,"Pour sélectionner l'option cliquer dessus");
                
                
                 InvalidateRect(hWnd,NULL,TRUE);
                
                         
               
                break;    
                }
                
                default :
                {
                // on laisse (ou on remet) le texte original de légende.
                SetWindowText(hWnd,"<Morpion multijoueur>");
                InvalidateRect(hWnd,NULL,TRUE);
                }
                  
       
              } // fin switch (LOWORD(wParam))----------------------------------
        break;
        }// fin case WM_MENUSELECT ---------------------------------------------


   
        case WM_COMMAND :  // click sur les options menu (wParam contient l'ID
                           // de l'option cliquée)
       {                 
//     rappel :                          
                          
//        WM_COMMAND :  Message généré par un click sur l'une des options
//                      du menu que nous avons crée


//              LOWORD (wParam) : ID de l'option menu
//              HIWORD (wParam) : 0
//              lParam : 0
//
//             HIWORD valant 0 ; on peut au choix utiliser (DANS CE CAS) :
//                              switch (wParam)  ou
//                              switch (LOWORD (wParam))
//             Par souci de lisibilité, il me paraît judicieux d'utiliser
//             switch (LOWORD (wParam)) ...
//            
      
              switch (LOWORD(wParam)) // ---------------------------------------
              {              
                   case IDM_NOUVELLEPARTIE :  // INACTIVE ; pas d'envoi de
                                             // message WM_COMMAND.
                                             // Ce choix ne sera jamais
                                             // réalisé tant que l'option
                                             // est définie INACTIVE.
          
                   case IDM_INSTRUCTIONS :           // idem
                  
                   {                                               
                    MessageBox(hWnd,"Pour jouer le joueur 1 utilise le bouton gauche de la souris et le joueur 2 le bouton droit",
                                            "Info de service",MB_OK);
                    break;
                   } // fin case IDM_AIDE --------------------------------------
             
                
                                   
                   case IDM_QUITTER : // option menu quitter // ----------------
                   {
                   int quit = 0; // Pour récupérer la réponse de l'utilisateur.
                 
                   quit = MessageBox(hWnd,"Voulez vous réellement Quitter",
                                          szClassName,MB_YESNO|MB_ICONQUESTION);
                                           
                         if (quit == IDNO) {return 0; break;}
                               
                        // Sinon, (si quit == IDYES )...
                         SendMessage( hWnd, WM_CLOSE, 0, 0L);    
                   // ----------------------------------------------------------
                   break;   
                   } // fin case IDM_QUITTER -----------------------------------
                  
             
                
                 
                  
              } // fin switch (wParam) -----------------------------------------
                     
           break;
          
           } // fin case WM_COMMAND --------------------------------------------
           
                  
       case WM_SYSCOMMAND : // -------------------------------------------------
       
     {switch (wParam) // ---------------------------------------------
              {
                case SC_CLOSE : // cas d'un click sur la croix de fermeture
                {
                    int quit = 0;
                    quit = MessageBox(hWnd,"Voulez vous réellement Quitter?",
                                       szClassName,MB_YESNO|MB_ICONQUESTION);                                           
                         if (quit == IDNO) {return 0; break;}
                        
                 
                         SendMessage( hWnd, WM_CLOSE, 0, 0);    
               break;
    }
    // fin case SC_CLOSE ----------------------------------------
                 
                default : // on renvoie tous les autres messages système à
                          // windows selon la procédure normale.
                       
               
                {return DefWindowProc (hWnd, messages, wParam, lParam);
    }             
                 
    }// fin switch (wParam) -----------------------------------------
              
    break;} // fin case WM_SYSCOMMAND ----------------------------------
            
            
      
       case WM_CLOSE: // -------------------------------------------------------
       {
            DestroyWindow( hWnd );
            break;
       } // fin case WM_CLOSE --------------------------------------------------
      
                 
        case WM_DESTROY:
        {
            PostQuitMessage (0);            
                 
          
            
             // Destruction des pinceaux
             DeleteObject(hBlanc);      
             DeleteObject(hGris);
             DeleteObject(hJaune);  
             DeleteObject(hRouge);
                  
                        
                   
                          
             // Destruction des régions
             DeleteObject(rgnRegion_1);
             DeleteObject(rgnRegion_2);
             DeleteObject(rgnRegion_3);
             DeleteObject(rgnRegion_4);
             DeleteObject(rgnRegion_5);
             DeleteObject(rgnRegion_6);
             DeleteObject(rgnRegion_7);
             DeleteObject(rgnRegion_8);
    DeleteObject(rgnRegion_9);
                                            
            break;
           
         } // fin case WM_DESTROY ----------------------------------------------
                      
            
        default:                     
            {return DefWindowProc (hWnd, messages, wParam, lParam); }
  
}


    return 0;
}
//------------------------------------------------------------------------------
// fin du code
//------------------------------------------------------------------------------


 


 


 

1 réponse

vincelefou Messages postés 16 Date d'inscription vendredi 24 décembre 2004 Statut Membre Dernière intervention 28 juillet 2007
5 juil. 2006 à 14:59
Salut,



<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /?>
 




J’ai l’impression que le problème vient de :



 





    nLarg = cxZone_Client/3;



    nHaut = cyZone_Client/3;



 




en remplaçant ces zones par :



 





    nLarg = 50;



    nHaut = 50;



 




J’obtiens un résultat (dessin de 9 rectangles)



 




PS : c’est une piste…



 




A+

Vince Le Fou !
0
Rejoignez-nous