Double Buffer !!!!!!!!!!!!

BugcORE Messages postés 46 Date d'inscription dimanche 27 août 2006 Statut Membre Dernière intervention 26 octobre 2006 - 13 oct. 2006 à 20:00
cs_bbear Messages postés 92 Date d'inscription jeudi 24 novembre 2005 Statut Membre Dernière intervention 29 mai 2008 - 14 oct. 2006 à 20:14
SA FAIT un bon moment que j'essai de faire
fonctionner un Double Buffer !
J'ai eu pas mal de problème avec !
(U.C. 100%, Affiche rien, etc....)

J'arrive maintenant a un autre problème....
quand j'essai de faire bouger mon Bitmap
ya toujours un PUTIN de cliniotement !!!!
(sa veut dire que mon Double Buffer ne marche pas )

SA COMMENCE VRAIMENT mais
vraiment A ME FAIRE CHIER !

Si quelqu'un aurait la gentillesse de poster une
ptite source simple ou a m'aider sa serait
sympa

14 réponses

melkiorlenecrarque Messages postés 97 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 20 janvier 2008
13 oct. 2006 à 20:40
Bonjour,

il est préférable de garder un langage correcte dans les messages : ton smiley est suffisant pour exprimer ton énervement !
Sinon, une portion de ton code pourrait être utile...

++
0
cs_bbear Messages postés 92 Date d'inscription jeudi 24 novembre 2005 Statut Membre Dernière intervention 29 mai 2008
13 oct. 2006 à 20:45
bin je sais pas les autresn, mais moi dans le winproc, au message WM_CREATE, je crée un timer et j'initialise l'ecran (bitmap=createDIBsection(...,..,&framebuffer), pDC=createcompatibledc, select(pDC,bitmap) )
dans WM_TIMER, j'appelle mes routines d'effets (fait dans le pDC/framebuffer) et je fais un InvalidateRgn(hwnd,0,0) et UpdateWindow(hwnd) qui appel WM_PAINT où je copie le framebuffer/pDC où les effets ont été fait dans l'ecran en cours avec un SetDIBitsToDevice(hdc,..,..,...., framebuffer,...) ou un BitBlt(hdc,x,y,sx,sy,pDC,0,0,SRCCOPY) avec hdc=BeginPaint()

je sais c'est peut être pas très clair, mais bon, ça marche
0
BugcORE Messages postés 46 Date d'inscription dimanche 27 août 2006 Statut Membre Dernière intervention 26 octobre 2006
13 oct. 2006 à 21:06
Je fait casiment la même chose que bbear (jutilise un Timer , etc...)

dans WM_CREATE:
hBmp1 = LoadBitmap(GetModuleHandle(0), MAKEINTRESOURCE(IDB_BITMAP1));
_hOffScreenDC = CreateCompatibleDC(GetDC(hWindow));
hBmpOff = CreateCompatibleBitmap(GetDC(hWindow), 640, 480);
SelectObject(_hOffScreenDC, hBmpOff);

dans WM_TIMER:
xx+=1;
....
InvalidateRect(...);

dans WM_PAINT:
BlitBitmap(_hOffScreenDC, hBmp1, xx, 0, 0, 0); //<-Ma fonction pour Dessiner un bitmap.
BitBlt(hDC, 0, 0, 640, 480, _hOffScreenDC, 0, 0, SRCCOPY);
ReleaseDC(hWindow, hDC);
0
BugcORE Messages postés 46 Date d'inscription dimanche 27 août 2006 Statut Membre Dernière intervention 26 octobre 2006
13 oct. 2006 à 21:07
Et au faite ..... desolé pour mon langage mais j'été sur les nerfs
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BugcORE Messages postés 46 Date d'inscription dimanche 27 août 2006 Statut Membre Dernière intervention 26 octobre 2006
13 oct. 2006 à 23:14
ok .... personne a la soluce ??

jai juste oublier de préciser

dans WM_PAINT:
hDC = BeginPaint(hWindow, &ps);
BlitBitmap(_hOffScreenDC, hBmp1, xx, 0, 0, 0); //<-Ma fonction pour Dessiner un bitmap.
BitBlt(hDC, 0, 0, 640, 480, _hOffScreenDC, 0, 0, SRCCOPY);
ReleaseDC(hWindow, hDC);
EndPaint(hWindow, &ps);
0
BugcORE Messages postés 46 Date d'inscription dimanche 27 août 2006 Statut Membre Dernière intervention 26 octobre 2006
14 oct. 2006 à 01:06
ok ... vais me pendre
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
14 oct. 2006 à 13:03
Salut,

C'est si compliqué que ca de prendre une source qui marche et de regarde comment c'est fait ?

Et dans ton code, il ne faut pas utiliser ReleaseDC() sur le hDC retourné par BeginPaint().
0
BugcORE Messages postés 46 Date d'inscription dimanche 27 août 2006 Statut Membre Dernière intervention 26 octobre 2006
14 oct. 2006 à 13:09
J'ai trouvé Aucune Source sur cppfrance ...
C'est pour sa que je poste dans le forum!
Et même en mettant ReleaseDC avec le hdc hors de l'écran
sa change rien en plus ya une trainé derirère l'image maintenant :S
0
cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
14 oct. 2006 à 13:22
Salut,

Bon déja pour le code:

- Pour detruire le DC mémoire c'est DeleteDC().

- Pour liberer celui retourné par BeginPaint(), c'est EndPaint() qui s'en charge.


Pour les sources: ma source "des yeux" utilise le double buffering, par exemple.
0
BugcORE Messages postés 46 Date d'inscription dimanche 27 août 2006 Statut Membre Dernière intervention 26 octobre 2006
14 oct. 2006 à 13:53
j'y arrive toujours pas :s !
Je suis sur qui doit avoir une erreur dans mon code
mais je sais pas laquel ..

    case WM_CREATE:
        SetTimer(hWindow, IDT_TIMER1, 100, (TIMERPROC)NULL);
        hBit = LoadBitmap(GetModuleHandle(0), MAKEINTRESOURCE(IDB_BITMAP1));
        return 0;

    case WM_TIMER:
        switch(wParam)
        {
        case IDT_TIMER1:
            xpos += 1;
            InvalidateRect(hWindow, NULL, true);
            return 0;
        }
        return 0;

    case WM_PAINT:
        hDC = BeginPaint(hWindow, &ps);
        hMemDC = CreateCompatibleDC(hDC);
        hBmp = CreateCompatibleBitmap(hDC, 0, 0);
        SelectObject(hMemDC, hBmp);

        SelectObject(hMemDC, hBit);
        BitBlt(hMemDC, xpos, 0, 1024, 465, hMemDC, 1024, 465, SRCCOPY);

        BitBlt(hDC, 0, 0, 1024, 465, hMemDC, 0, 0, SRCCOPY);

        DeleteObject(hBmp);
        DeleteDC(hMemDC);
        EndPaint(hWindow, &ps);
        return 0;
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
14 oct. 2006 à 17:18
Plusieurs chose
Comme je te l'avait dit la derniere fois tu ne traite pas le message WM_ERASE donc tu devrait plutot faire
InvalidateRect(hWindow, NULL, false);
a la place de
InvalidateRect(hWindow, NULL, true);

SelectObject(hMemDC, hBmp);
SelectObject(hMemDC, hBit);
Pas compris l'utilité

BitBlt(hMemDC, xpos, 0, 1024, 465, hMemDC, 1024, 465, SRCCOPY);
Tu copie le meme DC sur lui meme ? C'est fait expres ?
0
SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
14 oct. 2006 à 17:25
Par contre pour l'UC qui monte la je voit pas tu  as essayé d'augmenter la valeur du timer pour tester ?
0
BugcORE Messages postés 46 Date d'inscription dimanche 27 août 2006 Statut Membre Dernière intervention 26 octobre 2006
14 oct. 2006 à 19:46
ppppffffff ! Si je continu je sens que je
vais m'aracher les cheveux !

Le seul moyen ce serait que quelqu'un poste
une source paske sa me rend fou FOU fou
0
cs_bbear Messages postés 92 Date d'inscription jeudi 24 novembre 2005 Statut Membre Dernière intervention 29 mai 2008
14 oct. 2006 à 20:14
moi j'ai demarré avec cet exemple : (je ne met pas l'effet, juste le winproc et l'initialisation)

HDC pDC;
HBITMAP old;
HBITMAP ourbitmap;
int * framebuf;


void render_effect()
{
// ICI tracer dans le PDC caché
// avec les instructions GDI BitBlt, SetPixel...
// ou directement dans le framebuffer
// *(framebuf+x+y*MAX_X)=RGB(255,255,255); => equivalent de setpixel(pDC,x,y)
}


void deinit_framebuf(void)
{
  SelectObject(pDC,old);
  DeleteDC(pDC);
  DeleteObject(ourbitmap);
}


void init_framebuf(void)
{
  HDC hDC;
  BITMAPINFO bitmapinfo;
  hDC=CreateCompatibleDC(NULL);
  bitmapinfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
  bitmapinfo.bmiHeader.biWidth=MAX_X;
  bitmapinfo.bmiHeader.biHeight=-MAX_Y; /* top-down */
  bitmapinfo.bmiHeader.biPlanes=1;
  bitmapinfo.bmiHeader.biBitCount=32;
  bitmapinfo.bmiHeader.biCompression=BI_RGB;
  bitmapinfo.bmiHeader.biSizeImage=0;
  bitmapinfo.bmiHeader.biClrUsed=256;
  bitmapinfo.bmiHeader.biClrImportant=256;
  ourbitmap=CreateDIBSection(hDC,&bitmapinfo,DIB_RGB_COLORS,&framebuf,0,0);
  pDC=CreateCompatibleDC(NULL);
  old=SelectObject(pDC,ourbitmap);
  DeleteDC(hDC);
}


LRESULT CALLBACK winproc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
  HDC hDC;
  PAINTSTRUCT PtStr;


  switch (uMsg) {
  case WM_DESTROY:
    deinit_framebuf();
    PostQuitMessage(0);
    KillTimer (hWnd, 1);
    break;

  case WM_CREATE:
    SetTimer (hWnd, 1, 10, NULL); // set a timer 10 ms
    init_framebuf(); // create DIB and framebuffer
    break;

  case WM_TIMER:
    render_effect(); // draw in hidden screen
    InvalidateRgn(hWnd,0,0); // refresh screen
    UpdateWindow (hWnd);
    break;
  case WM_PAINT:
    hDC=BeginPaint(hWnd,&PtStr);
 // copy hidden screen to visible screen
 BitBlt(hDC,0,0,MAX_X,MAX_Y,pDC,0,0,SRCCOPY);
    EndPaint(hWnd,&PtStr);
    break;
  default:
    return DefWindowProc (hWnd, uMsg, wParam, lParam);
    break;
  }
 return 0;
}
0
Rejoignez-nous