Skocz do zawartości

double buffering w gdi


Chaos

Recommended Posts

Jeżeli masz kod, który nie działa najlepiej go tutaj wkleić.

Podwójne buforowanie ja implementuję tak:

        case WM_PAINT:
        {
            HDC hDC; // (1)
            HDC hdcMem; // (2)
            PAINTSTRUCT ps;
            hDC=BeginPaint(hwndChild,&ps); // (3)
            hdcMem=CreateCompatibleDC(hDC); // (4)
            ... // (5)
            BitBlt(hDC,0,0,200,200,hdcMem,0,0,SRCCOPY); // (6)
            DeleteDC(hdcMem); // (7)
            EndPaint(hwndChild,&ps); // (8)
        }
        break;

Komentarze do linijek:
1. Deklarujesz uchwyt kontekstu ekranu (pierwszoplanowy).
2. Deklarujesz uchwyt kontekstu w pamięci (drugoplanowy).
3. Zaczynasz rysować (pobierasz uchwyt kontekstu ekranowego).
4. Tworzysz kontekst kompatybilny z ekranowym (w sensie ilości kolorów i innych parametrów) i pobierasz uchwyt do niego.
5. Tu sobie rysujesz na kontekscie w pamięci, czyli np. : Ellipse(hdcMem,50,50,100,100);.
6. Kopiujesz szybko zawartość jednego kontekstu do drugiego.
7. Zwalniasz kontekst w pamięci.
8. Kończysz rysowanie.

Link do komentarza
Udostępnij na innych stronach

dzieki za odpowiedz wlasnie tak to robilem ale chcialem w ten sposob wyswietlac bitmapy tzn kopiowac je do drugiego bufora a pozniej jako calos do pierwszego i nie wiem czy tak mozna a jak nie to czy sa jakies sposoby jak to zrobic i zalezy mi zeby to nie bylo skaplikowane bo potrzebuje tego do prpgramu w asemblerze pod win jezeli ktos moze to interesuja mnie fragmenty kodu ja to zrobic dzieki
pozdrawiam

Link do komentarza
Udostępnij na innych stronach

Witam!

Nie wiem czy dokładnie zrozumiałem o co Ci chodzi. Bo troszkę namieszałeś :) Ale jeżeli chodzi Ci o kod kopiujący jedną bitmapę na drugą to go zamieszczem poniżej. I jeszcze jedno napisałeś że potrzebujesz kodu w assemlerze pod Windows więc na przyszłość sprecyzuj pytanie bo jest kilka odmian (min.: masm, fasm, tasm, nasm). Ten kod jest pod Masm i celowo nie używałem makra "invoke" abyś mógł go łatwo dostosować do innego kompilatora.

LOCAL mDC1, mDC2 :HDC
LOCAL bm         :BITMAP
........
lea  eax, dword ptr [bm]
push eax
push sizeof BITMAP
push hBmp2
call GetObject
              
push 0
call CreateCompatibleDC
mov  mDC1,eax
push hBmp1
push eax
call SelectObject    
             
push 0
call CreateCompatibleDC
mov  mDC2,eax
push hBmp2
push eax
call SelectObject
      
push SRCCOPY 
push 0
push 0
push mDC2
push bm.bmHeight 
push bm.bmWidth
push 0
push 0
push mDC1
call BitBlt
      
push mDC1
call DeleteDC
push mDC2
call DeleteDC

W tym przykładzie kopiowana jest cała bitmapa hBmp2 w lewy górny róg bitmapy hBmp1.
Opisy funkcj masz w helpie.

PS: Gdyby jednak nie o to Ci chodziło to postaraj się napisać dkładnie o co Ci chodzi. Mozesz wtawić też kawałek Twojego kodu, napisać co nie działa itd.

Pozdrowienia

Link do komentarza
Udostępnij na innych stronach

dzieki za cierpliwosc tym razem umieszcze kawalek kodu:

invoke CreateCompatibleDC ,hDC
mov memDC,eax
invoke SelectObject ,memDC, hBmp
mov oldDC,eax

invoke CreateCompatibleDC ,hDC
mov memDC2,eax
invoke CreateCompatibleBitmap,hDC,450,450
mov hBmp2,eax
invoke SelectObject ,memDC2, hBmp2
mov oldDC2,eax

invoke BitBlt ,memDC2,x,300, 48, 48, memDC,0,0, SRCCOPY
invoke BitBlt ,memDC2,y,200, 48, 48, memDC,0,0, SRCCOPY
invoke BitBlt ,memDC2,180,z, 48, 48, memDC,0,0, SRCCOPY

invoke BitBlt,hDC,0,0,450,450,memDC2,0,0,SRCCOPY

i cala sprawa sprowadza sie do tego ze chce wyswietlac kilka(nascie) bitmap w ruchu i wszystko to strasznie miga i nie wiem jak sobie z tym poradzic :?
pozdrawiam

Link do komentarza
Udostępnij na innych stronach

Witam!

Znalazłem w internecie przykład robienia animacji. Niestety nie miałem czasu sprawdić czy działa :( ale może Cię zainteresuje:

https://www.modula2.org/win32tutor/animation.php

Zauważyłem że znajdują się tam wywołania funkcji SelectBitmap zdefiniowanej chyba w windowsx.h dla C++. W MASM nie ma zdefiniowanej tej funkcji ale możesz ja zastąpić funkcją SelectObject i powinno działać :)

Gdyby jednak nie pomogło to się odewij może coś wymyślę.

Pozdrowienia

Link do komentarza
Udostępnij na innych stronach

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...