Bonjour,
J'aimerai savoir comment peut on assurer la permanence du contenu d'une fenêtre.
Je m'explique, j'ai créer un projet sous Visual C++ utilisant le MFC (juste pour préciser) qui me permet d'afficher des images puis de les traiter. L'affichage de l'image marche nickel. Par contre, j'ai créer un fonction de calculer et d'afficher son histogramme. Il s'affiche bien à l'endroit que je lui est indiquer. Hélas dés que je touche à la fenêtre, que je la redimensionne ou que je passe sur une autre fenêtre, le dessin de l'histogramme disparait instantanément. Comment puis-je faire en sorte qu'il s'affiche tout le temps.
De plus, j'aimerai aussi savoir comment peut-on récuperer les tailles de la fenêtre pour afficher ce dessin relativement au dimensions de la fenêtre (toujours au centre par exmple).
Je vous colle un bout du code correspondant en espérant que quelqu'un pourra m'aider.
void CMy3View::OnHistogramme()
{
/* Chargement de l'image */
Image *im;
CMy3Doc *pDoc=GetDocument();
if (pDoc->m_dib.m_lpBMIH==NULL)
return;
im=pDoc->m_dib.DibToImage();
/* Calcul de l'histogramme */
double *hist;
long *hist0;
// char *seuil;
char *pics;
int i,nbpic=0;
pics=(char*) malloc (5*sizeof(char));
hist=(double*)malloc(256*sizeof(double));
hist0=Calcul_Histogramme(im);
/* On augmente le contraste dans l'histogramme */
/*for (i=0;i<256;i++)
hist[i]=(double)(hist0[i]*5000)/(double)(im->width*im->height);*/
/* Opération morphologique (Ouverture) sur l'histogramme */
MorphologieHist(hist0);
for (i=0;i<256;i++)
hist[i]=(double)(hist0[i]*5000)/(double)(im->width*im->height);
afficher_hist0(hist,35,330,RGB(255,0,0));
/* Lissation de l'histogramme avec un filtre gaussien */
LissationGaussienne(hist,2);
afficher_hist1(hist,35,330,RGB(0,0,255));
/* Seuillage de l'histogramme */
nbpic=Recherche_Pic(hist,pics);
affiche_hist_pics(hist,35,330,RGB(0,0,255),pics,nbpic);
//seuil=Calcul_Seuil(*hist,*pics);
/* Effacement du buffer image et libération de la mémoire allouer */
delete im;
free(hist);
}
void CMy3View::afficher_hist0(double *hist, int x, int y, COLORREF c)
{
int i,j;
coordonne(x,y,300,300);
for(j=0;j<256;j++)
{
for (i=0;i<(int)(hist[j]);i++)
{
draw_point(j+x,y-i,c);
}
}
}
void CMy3View::afficher_hist1(double *hist, int x, int y, COLORREF c)
{
int j,y1,y2;
coordonne(x,y,300,300);
for(j=1;j<256;j++)
{
y1=y-(int)(hist[j-1]);
y2=y-(int)(hist[j]);
draw_line(j+x-1,y1,j+x,y2,c,1);
}
}
void CMy3View::show(int n,int x,int y)
{
char c[10];
itoa(n,c,10);
CClientDC dc(this);
OnPrepareDC(&dc);
dc.TextOut(x,y,c);
}
void CMy3View::draw_line(int x1,int y1,int x2,int y2,COLORREF c,int size)
{
CClientDC dc(this);
OnPrepareDC(&dc);
CPen crayon(PS_SOLID,size,c);
dc.SelectObject(&crayon);
dc.MoveTo(x1,y1);
dc.LineTo(x2,y2);
}
void CMy3View::draw_point(int x,int y,COLORREF c)
{
CClientDC dc(this);
OnPrepareDC(&dc);
dc.SetPixel(x, y, c);
}
Je n'ai mis que les fonctions que je pense concernées. Alors si quelqu'un à un conseil, je suis preneur.
Merci. :)