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
//------------------------------------------------------------------------------