Tracer une courbe à partir d'un tableau dans une fenêtre

Signaler
Messages postés
14
Date d'inscription
lundi 24 avril 2006
Statut
Membre
Dernière intervention
1 mai 2006
-
Messages postés
14
Date d'inscription
lundi 24 avril 2006
Statut
Membre
Dernière intervention
1 mai 2006
-
Salut! je dois réaliser un projet dont une partie consiste à tracer une courbe caractérisant une force appliquée sur un capteur. J'essaie pour ça de faire d'abord simple en traçant une courbe à partir d'un tableau, mais la courbe n'apparaît pas... j'ai utilisé plusieurs infos du site mais sans résultat, si vous pouviez me dire ce qui ne va pas svp. j'ai quelques notions en c et c++ mais rien en api.
une partie du programme est la suivante:

#include <Windows.h>


LRESULT CALLBACK MainProc(HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam);


int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WNDCLASSEX principale;
principale.cbSize=sizeof(WNDCLASSEX);
principale.style=CS_HREDRAW|CS_VREDRAW;
principale.lpfnWndProc=MainProc;
principale.cbClsExtra=0;
principale.cbWndExtra=0;
principale.hInstance=hInstance;
principale.hIcon=LoadIcon(NULL,IDI_APPLICATION);
principale.hCursor=LoadCursor(NULL,IDC_ARROW);
principale.hbrBackground=reinterpret_cast<HBRUSH>(COLOR_WINDOW+1);
principale.lpszMenuName=NULL;
principale.lpszClassName="std";
principale.hIconSm=LoadIcon(NULL,IDI_APPLICATION);
RegisterClassEx(&principale);


HWND hWnd;
hWnd=CreateWindowEx(
WS_EX_CLIENTEDGE,
"std",
"fenetre",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL
);
ShowWindow(hWnd,SW_SHOW);


MSG msg;
while(GetMessage(&msg,NULL,0,0)==TRUE)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}


LRESULT CALLBACK MainProc(HWND hWnd, UINT mes, WPARAM wParam, LPARAM lParam)
{
HDC hDC;
PAINTSTRUCT paintst;
switch (mes)
{
case WM_PAINT:
hDC=BeginPaint(hWnd,&paintst);
int tab[15];
int i;
int value;
int compteur;
compteur=0;
for(i=1;i<=15;i++)
{
tab[i];
}
for(;;)
{
value=tab[compteur];
SetPixel(hDC,compteur,value,RGB(0,255,0)); //pixel de couleur verte
compteur+=1;
if(compteur==15) {break;}
}
EndPaint(hWnd,&paintst);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hWnd, mes, wParam, lParam);
}
}

11 réponses

Messages postés
199
Date d'inscription
vendredi 16 avril 2004
Statut
Membre
Dernière intervention
28 février 2008

Salut, je veux pas dire de bêtises mais il me semble que tu devrais plutôt appliquer les appels de fonctoins SetPixel sur un HDC mémoire, pour créer ce MemDC utilise CreateCompatibleDC et n'oublie pas de le libérer avec DeleteDC a la fin du WM_PAINT. Et pour finir tu appliques un BitBlt à partir de ton MemDC sur ton hDC, ce qui aura normalement pour effet d'appliquer les pixels sur la surface client.
En espérant t'avoir aider...

___________________
MVS - Most Valuable Student ( Microsoft)
Messages postés
688
Date d'inscription
mercredi 6 avril 2005
Statut
Membre
Dernière intervention
2 juin 2006
1
SDK propose ceci sinon :

DrawSpline(xyArray, tolerance, flags);



@+;
satellite34

http://wxcod.free.fr/forum/
Messages postés
14
Date d'inscription
lundi 24 avril 2006
Statut
Membre
Dernière intervention
1 mai 2006

merci pour la reponse, mais je comprends pas tres bien comment et quand on se sert de BitBlt, qu'est-ce qu'il faut lui mettre dans la parenthèse?
Messages postés
199
Date d'inscription
vendredi 16 avril 2004
Statut
Membre
Dernière intervention
28 février 2008

Vas voir sur MSDN : http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceui40/html/cerefbitblt.asp

___________________
MVS - Most Valuable Student ( Microsoft)
Messages postés
14
Date d'inscription
lundi 24 avril 2006
Statut
Membre
Dernière intervention
1 mai 2006

j'ai changé une partie du programme en m'inspirant de différentes discussion, et ca donne ça (mais ca ne fonctionne toujours pas...):

PAINTSTRUCT paintst;
HDC hDC;
HDC hMemDC;
switch (mes)
{
case WM_PAINT:
hDC=BeginPaint(hWnd,&paintst);
hMemDC=CreateCompatibleDC(hDC);
int tab[15];
int i;
int value;
int compteur;
compteur=0;
for(i=1;i<=15;i++)
{
tab[i];
}
for(;;)
{
value=tab[compteur];
SetPixel(hMemDC,compteur,value,RGB(0,255,0)); //pixel de couleur verte
BitBlt(hDC,0,0,100,100,hMemDC,0,0,SRCCOPY);
compteur+=1;
if(compteur==15) {break;}
}
DeleteDC(hMemDC);
EndPaint(hWnd,&paintst);
return 0;

si vous voyez une erreur...
Messages postés
199
Date d'inscription
vendredi 16 avril 2004
Statut
Membre
Dernière intervention
28 février 2008

Il faut juste mettre le SetPïxel dans ta boucle for(;;) et ensuite avant le DeleteDC tu fais le BitBlt...

___________________
MVS - Most Valuable Student ( Microsoft)
Messages postés
14
Date d'inscription
lundi 24 avril 2006
Statut
Membre
Dernière intervention
1 mai 2006

mais le SetPixel est déjà dans la boucle for(;;), et si je mets le BitBlt juste avant le DeleteDC, ça ne marche tjs pas...

for(;;)
{
value=tab[compteur];
SetPixel(hMemDC,compteur,value,RGB(0,255,0)); //pixel de couleur verte
BitBlt(hDC,0,0,100,100,hMemDC,0,0,SRCCOPY);
compteur+=1;
if(compteur==15) {break;}
}
DeleteDC(hMemDC);
EndPaint(hWnd,&paintst);
return 0;
Messages postés
199
Date d'inscription
vendredi 16 avril 2004
Statut
Membre
Dernière intervention
28 février 2008

T'as essaye ça :

for(;;)
{
value=tab[compteur];
SetPixel(hMemDC,compteur,value,RGB(0,255,0)); //pixel de couleur verte
compteur+=1;
if(compteur==15) {break;}
}
BitBlt(hDC,0,0,100,100,hMemDC,0,0,SRCCOPY);
DeleteDC(hMemDC);
EndPaint(hWnd, &paintst);

?
___________________
MVS - Most Valuable Student ( Microsoft)
Messages postés
14
Date d'inscription
lundi 24 avril 2006
Statut
Membre
Dernière intervention
1 mai 2006

oui c ça que j'ai essayé, excuse moi pour le dernier message, j'ai fait bêtement un copier coller sans rien changer...
Messages postés
199
Date d'inscription
vendredi 16 avril 2004
Statut
Membre
Dernière intervention
28 février 2008

Ben je sais pas trop, il faudrait que quelqu'un d'autre intervienne...

___________________
MVS - Most Valuable Student ( Microsoft)
Messages postés
14
Date d'inscription
lundi 24 avril 2006
Statut
Membre
Dernière intervention
1 mai 2006

Ok, merci bcp pour ton aide quand même, j'ai avancé... du coup je vais me coucher. Bonne nuit!