Dessiner rectangle

frankthechamp Messages postés 1 Date d'inscription samedi 24 octobre 2009 Statut Membre Dernière intervention 24 octobre 2009 - 24 oct. 2009 à 05:59
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 - 25 oct. 2009 à 19:10
Je suis débutant en C++ Visual Studio 2005 et j'ai un problème à dessiner un rectangle. Dans le formulaire principal, l'utilisateur doit cliquer avec le bouton droit à deux reprises pour initialiser deux Points aux coordonnées de la souris qui serviront à dessiner le rectangle. J'ai utilisé le debugger et j'atteins le code de dessin, mais il ne se produit jamais sur le formulaire. Voici le code:

//Variables glabales
int Fois = 0;
POINT Point1;
POINT Point2;

//Procédure de fenêtre de la fenêtre principale
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
bool Dessin = true;
RECT Fenetre;

if (Fois == 0)
{
Point1.x = 0;
Point1.y = 0;
Point2.x = 0;
Point2.y = 0;
}


static HPEN coul;
HBRUSH sbRouge;



Fenetre.bottom = 0;
Fenetre.left = 0;
Fenetre.right = 0;
Fenetre.top = 0;

switch (message)
{
case WM_COMMAND:
wmId    = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Analyse les sélections de menu :
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_DESSIN:
if (Dessin == false)
Dessin = true;
else
Dessin = false;
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO : ajoutez ici le code de dessin...
if (Fois == 1)	
{
coul = CreatePen(PS_SOLID,  5, RGB(  0, 255,   0));
SelectObject(hdc, coul);
sbRouge = CreateSolidBrush(0x000000FF);
SelectObject(hdc, sbRouge);
Rectangle(hdc, Point1.x, Point1.y, Point2.x, Point2.y);	
}
EndPaint(hWnd, &ps);
break;
case WM_RBUTTONDOWN:
if (Fois == 0)
{
Point1.x = (int)LOWORD(lParam);
Point1.y = (int)HIWORD(lParam);
Fois++;
}
else
{
Point2.x = (int)LOWORD(lParam);
Point2.y = (int)LOWORD(lParam);
SendMessage(hWnd, WM_PAINT, 0, 0);
//UpdateWindow(hWnd);

}	
break;

case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}


Merci à l'avance :)

1 réponse

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
25 oct. 2009 à 19:10
Bienvenue !

Attention à bien tout libérer !
DeleteObject !

Code tout en anglais. Les noms français y a des accents dedans que l'on ne peut pas mettre.

Indente ton code : le "case WM_RBUTTONDOWN:" est à l'ouest.

Erreur de copié collé :
Point2.x = (int)LOWORD(lParam);
Point2.y = (int) LO WORD(lParam);

A mon avis, faut plutôt trois états pour Fois.
0 -> Pas encore cliqué.
1 -> Premier clique fait, en attente du deuxième.
2 -> Deuxième clique fait, faut dessiner.

Et finalement, il faut surtout faire un InvalidateRect après le deuxième clique (Et après être passé en Fois = 2).

Dans ce genre là :

case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO : ajoutez ici le code de dessin...
if (Fois == 2)
{
                        ...
}
EndPaint(hWnd, &ps);
break;
case WM_RBUTTONDOWN:
if (Fois == 0)
{
Point1.x = (int)LOWORD(lParam);
Point1.y = (int)HIWORD(lParam);
Fois++;

}
else
{
Point2.x = (int)LOWORD(lParam);
Point2.y = (int)HIWORD(lParam);
SendMessage(hWnd, WM_PAINT, 0, 0);
Fois++;
InvalidateRect(hWnd, NULL, FALSE);
}
break;
0
Rejoignez-nous