Calque pour application graphique

cs_Grand_steak Messages postés 8 Date d'inscription mercredi 10 mars 2004 Statut Membre Dernière intervention 23 mars 2004 - 18 mars 2004 à 16:27
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 - 18 mars 2004 à 18:24
Bonjour, :)

J'aimerai un petit coup de main pour développer mon appli. graphique.
Je dessine une courbe contenant un nbre important de point.
Jusque là, pas de problème...

Mon problème se situe au niveau de l'utilisation de mes curseurs de tracé et mes zones de zoom qui ont besoin d'être rafraichis souvent.

J'utilise l'événement OnMouseMove pour rafraichir la position de mes différents curseurs et la fenêtre se met à osciller car tout est dessiné sur le même plan .

Je voudrais appliqué une sorte de calque
afin que ma représentation graphique reste en arrière-plan. Ainsi mes curseurs et mes zones de zoom seraient rafraichies et on ne verrait pas ces oscillations.

Je travaille avec Visual C++ 6.

Merci.

1 réponse

ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
18 mars 2004 à 18:24
tu dessine ta courbe dans un DC en mémoire. Lors du rafraîchissement, tu dessine ce DC à l'écran et tu y rajoute le reste.

1) dessin de la courbe dans un DC en mémoire,

// variables globales:
int cxCourbe, int cyCourbe;
HDC hDCCourbe;
HBITMAP hBmpCourbe;
HBITMAP hOldBmpCourbe;

void DessineCourbe(int cx, int cy)
{
cxCourbe=cx;
cyCourbe=cy;
HDC hdc = GetDC(NULL);
hDCCourbe=CreateCompatibleDC(hdc);
hBmpCourbe=CreateCompatibleBitmap(hdc, cx, cy);
hOldBmpCourbe = (HBITMAP)SelectObject(hDCCourbe, hBmpCourbe);
ReleaseDC(NULL, hdc);

// ici tu dessine ta courbe en utilisant hDCCourbe

}

2) Rafraîchissement de la fenêtre (hdc est le DC de la fenêtre, obtenu par BeginPaint dans OnPaint, ou GetDC)
les autres paramètres sont la taille de la zone cliente où dessiner.

void Redraw(HDC hdc, int cxClient, int cyClient)
{
// DC en mémoire
HDC hMemDC = CreateCompatibleDC(hdc);
HBITMAP hMemBmp = CreateCompatibleBitmap(hdc, cxClient, cyClient);
HBITMAP hOldBmp = (HBITMAP)SelectObject(hMemDC, hMemBmp);

// dessin de la courbe à la position xCourbe, yCourbe
int xCourbe = 0;
int yCourbe = 0;
BitBlt(hMemDC, xCourbe, yCourbe, cxCourbe, cyCourbe, hDCCourbe, 0, 0, SRCCOPY);

// dessin du reste an utilisant hMemDC et pas hdc (curseurs...)

// recopie à l'écran
BitBlt(hdc, 0, 0, cxClient, cyClient, hMemDC, 0, 0, SRCCOPY);

// libération mémoire
SelectObject(hMemDC, hOldBmp);
DeleteObject(hMemBmp);
DeleteDC(hMemDC);
}

3) libération courbe
void FreeCourbe()
{
SelectObject(hDCCourbe, hOldBmpCourbe);
DeleteObject(hBmpCourbe);
DeleteDC(hDCCourbe);
}
0
Rejoignez-nous