frankthechamp
Messages postés1Date d'inscriptionsamedi 24 octobre 2009StatutMembreDernière intervention24 octobre 2009
-
24 oct. 2009 à 05:59
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDerniè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;
}
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 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;