Problème dessiner image dans fenêtre

Signaler
Messages postés
40
Date d'inscription
vendredi 14 mars 2003
Statut
Membre
Dernière intervention
21 avril 2007
-
Messages postés
40
Date d'inscription
vendredi 14 mars 2003
Statut
Membre
Dernière intervention
21 avril 2007
-
Bonjour

Comme je tourne en rond, je viens chercher de l'aide. J'essaye de faire un morpion en GDI, c'est pour apprendre. J'ai une fenêtre mère avec 9 fenêtres clientes.

Aujourd'hui, le jeu fonctionne, sauf si la fenêtre est recouverte ou réduite, je n'arrive pas à stocker les images dessinées dans un ou plusieurs buffeurs pour les rappeler lorsqu'un WM_PAINT est envoyé.
Ca fait des jours que j'essaye de trouver une solution et j'en peux plus, mon code est devenu un véritable champ de bataille.

Y aurait-il une bonne âme pour me donner la portion de code me permettant d'afficher un bmp et surtout, de le stocker dans un buffer pour le rappeler lorsque un WM_PAINT est envoyé.

Merci d'avance

4 réponses

Messages postés
126
Date d'inscription
jeudi 5 juin 2003
Statut
Membre
Dernière intervention
11 juillet 2006

Si tu me donne un mail, je peux t'envoyer une classe permettant d'afficher facilement un fichier image.C'est un peu long pour mettre le code dans la réponse.

TOCHE
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Salut,
Voici un exemple qui pourrait te servir:
Au début de ta WndProc tu déclares ceci:
static HDC memDC ;
static HBITMAP hBmp;
static RECT rect;

A la fin du traitement de WM_CREATE tu ajoutes:
HDC hdc;
hdc = GetDC(hwnd);
memDC = CreateCompatibleDC(hdc);
GetClientRect(hwnd,&rect);
hBmp = CreateCompatibleBitmap(hdc, rect.right, rect.bottom);
SelectObject(memDC, hBmp);
ReleaseDC(hwnd,hdc);

Pour le traitement de WM_PAINT tu fais:
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
BitBlt(hdc,0,0,rect.right,rect.bottom,memDC,0,0,SRCCOPY); 
EndPaint(hwnd, &ps);
return 1;
}

Juste avant la fermeture du programme du fais:
DeleteObject(hBmp);
DeleteDC(memDC);

Dand cet exemple, on dessine dans un HBITMAP en mémoire. Il y reste tant qu'on ne l'a pas supprimé. La fonction BitBlt() l'affiche sur la fenêtre pendant WM_PAINT. Si tu veux l'afficher juste après avoir dessiné tu fais par exemple:
Rectangle(memDC,10,10,50,30);
InvalidateRect(hwnd,&rect);

J'espère que ça résoudra ton problème.
Messages postés
40
Date d'inscription
vendredi 14 mars 2003
Statut
Membre
Dernière intervention
21 avril 2007
1
Je vais essayer.

merci
Messages postés
40
Date d'inscription
vendredi 14 mars 2003
Statut
Membre
Dernière intervention
21 avril 2007
1
Je vais essayer.

merci