Skocz do zawartości

[C++][WinAPI] Double Buffer


raV

Polecane posty

Witam wszystkich, znowu jesteśmy na siłowni.

 

Piszę prosty program w winApi rysujący poruszające się kółka. Kółka oczywiście migają - pewnie problem do rozwiązania podwójnym buforowaniem. Moja procedura obsługi wygląda tak:

 

 

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
       GetClientRect(hwnd, &screenRect);

       wndHeight = screenRect.bottom;
       wndWidth  = screenRect.right;

       switch (message) {          
               case WM_CREATE:
                       initialize(hwnd);
                       break;
               //case WM_PAINT:
               //      break;
               case WM_TIMER:
                       calculateStuff();
                       FillRect(screenHDC, &screenRect, backgroundBrush);
                       paintStuff(&screenHDC);
                       break;   

               case WM_DESTROY:
                       freeResources(hwnd);
                       KillTimer(hwnd, 1);
           PostQuitMessage (0);
           break;

       default:   
           return DefWindowProc (hwnd, message, wParam, lParam);
   }

       return 0;
}

 

I właśnie mam pytanie do doświadczonych:

- czy to dobry pomysł, by w WM_TIMER liczyć i rysować?

- jak zrobic podwojne buforowanie? Przyznam szczerze, ze probowalem rozwiazan z sieci, z drugim HDC, nawet z dwoma HBITMAP i potem kopiowaniem BitBlt, ale to nie dzialalo, otrzymywalem szary ekran..

 

 

Z gory dziekuje za wskazówki,

Rav

Link do komentarza
Udostępnij na innych stronach

Zeby wszystko bylo jasne, jest to jednookienkowa strukturalna aplikacja, wiec jedynie mam to WM_TIMER i WM_PAINT.. wiec w WM_PAINT dać coś takiego:

WM_PAINT:
       PAINTSTRUCT ps;
       HDC hDC = BeginPaint(hwnd, &ps);
       HDC hdcMem = CreateCompatibleDC(hDC);
       HBITMAP hBmp = CreateCompatibleBitmap(hDC, width, height);
       SelectObject(hdcMem, hBmp);
       TextOutA(hdcMem, 0, 0, "test", 4);
       BitBlt(hDC, 0, 0, width, height, hdcMem, 0, 0, SRCCOPY);
       DeleteDC(hdcMem);
       DeleteObject(hBmp);
       EndPaint(hwnd, &ps);

 

a w WM_TIMER liczyć i wywoływać UpdateWindow() ?

 

Przy okazji tego programu chcialbym sie po prostu nauczyc jak najwiecej poprawnego uzywania winAPI, dlatego jestem dociekliwy ;-)

Link do komentarza
Udostępnij na innych stronach

Witam.

 

W zdarzeniu (komunikacie) WM_PAINT, zwróć uwagę na funkcje:

 

  EndPaint(hWnd,&ps);
  ValidateRect(hWnd,NULL);
$'(h+36ljź+pćŹr$(%ąŃIĄĄ]ą9U10(M5ĄĄ]ą]5}A%9P(%8ŚzśŁ)dĄ)r8rr$(]5}A%9P((A%9QMQIU
P(!Ń        AĄĄ](!
Ń
ŃąĄŃ(!
Ń
ŃąĄŃ(!     %Q5@Ń1    ŃĄĄ%Ń%1(!        %Q5@Ń1   ŃĄĄ%Ń  Q
@(MąŃ=ĄąŃ(MąŃ=ĄąŃ((!=9P

Ńą]}9=I50ą1Mą1Mą1MąU1Q}
!IMP(=UQ}QQ}=91e}AI
%Lą
1%A}U1Q}AI
%Lą9Q%1%M}EU1%Qd(U1Q}A%Q
(MŃQŃ
ąĄ(MŃ     5ĄąQI9MAI9P(MąŃ=Ąą((Ą        ŃŃ((ŃĄ    ŃŃ(((Ą51     Ń      ąĄąąMI

=Adą(      Ń      ąĄąąMI

=Ad(QŃ=Ąi(Ź(
(Ą51          Ń      ąĄąąMI

=Adą(      Ń      ąĄąąMI

=Ad(QŃ=Ą5ą(Ź(
(Ą51   Ń      ąĄąąMI

=Adą(      Ń      ąĄąąMI

=Ad(QŃ=Ą(Ź(
(Ą51       Ń      ąĄąąMI

=Adą(      Ń      ąĄąąMI

=Ad(QŃ=ĄUĄŃŹ(Ź(
QŃ=ĄMŹ(QŃ=Ą
=ŃŹ(QŃ=Ą- ąŹ(QŃ=ĄAĘŹ(
QŃ=ĄUŃąŹ(QŃ=Ą
Uѹя(ĄMŃŃąQŃ=Ą
UѹѹQŃ=ĄŃ
Ź(ĄMŃŃąQŃ=ĄUŃą
ŃąQŃ=ĄŃŹ(ĄMŃ
ŃąQŃ=ĄUѹѹQŃ=Ą
ŃŹ(ĄMŃŃąQŃ=Ą
UѹѹQŃ=ĄŃŹ(
ĄMŃŃąQŃ=ĄUѹѹQ
Ń=ĄŃŹ((Ą51         Ń      ąĄąąMI

=Adą(      Ń      ąĄąąMI

=Ad(QŃ=ĄUŃŃ`(
Ź((Ą51    Ń      ąĄąąMI

=Adą(      Ń      ąĄąąMI

=Ad(QŃ=ĄUŃŃ`(
Ź((Ą51    Ń      ąĄąąMI

=Adą(      Ń      ąĄąąMI

=Ad(QŃ=ĄUŃŃd(
Ź((Ą51    Ń      ąĄąąMI

=Adą(      Ń      ąĄąąMI

=Ad(QŃ=ĄUŃŃd(
Ź((Ą51    Ń      ąĄąąMI

=Adą(      Ń      ąĄąąMI

=Ad(QŃ=ĄUŃŃh(
Ź((Ą51    Ń      ąĄąąMI

=Adą(      Ń      ąĄąąMI

=Ad(QŃ=ĄUŃŃh(
Ź((Ą51    Ń      ąĄąąMI

=Adą(      Ń      ąĄąąMI

=Ad(QŃ=ĄUŃ`(
Ź((Ą51     Ń      ąĄąąMI

=Adą(      Ń      ąĄąąMI

=Ad(QŃ=ĄUŃ`(
Ź((Ą51     Ń      ąĄąąMI

=Adą(      Ń      ąĄąąMI

=Ad(QŃ=ĄUŃd(
Ź((Ą51     Ń      ąĄąąMI

=Adą(      Ń      ąĄąąMI

=Ad(QŃ=ĄUŃd(
Ź((Ą51     Ń      ąĄąąMI

=Adą(      Ń      ąĄąąMI

=Ad(QŃ=ĄUŃh(
Ź((Ą51     Ń      ąĄąąMI

=Adą(      Ń      ąĄąąMI

=Ad(QŃ=ĄUŃh(
Ź((ąQŃ=ĄŃ(   Ń      ąĄąIYą`ąMI

=Ad(       Ń      ąĄąIYądąMI

=Ad(       Ń      ąĄąIYąhąMI

=Ad(       Ń      ąĄąM`ąMI

=Ad(       Ń      ąĄąMdąMI

=Ad(       Ń      ąĄąMhąMI

=Ad(Ą``ą`ŹŹ((ĄddądŹŹ((ĄdĄd
Ą`Ą`Ń(MŃAĄą`ądąMŃŃ
ąmMŃŃt((( Ń      ąĄąąMI

=Ad(ŃĄMŃŃ(((    Ń      ąĄąąMI

=Ad(ĄąŹŹ((Ą``ą`ŹŹ(
(ĄddądŹŹ((ĄdĄd
Ą`Ą`Ń(ŃĄ((M
ŃAĄą`ądąMŃŃ
ąltŹ(MŃAĄą`ądąMŃŃ
ąltŹ(MŃAĄą`ądąMŃŃ
ąltŹ(MŃAĄą`ądąMŃŃ
ąltŹ(MŃAĄą`ądąMŃŃ
ąltŹ(MŃAĄą`ądąMŃŃ
ąltŹ(((( Ń      ąĄŹĄąąMI

=Ad((Ź(( Ń      ąĄąąMI

=Ad(ĄąŹŹ((Ą``ą`ŹŹ(
(ĄddądŹŹ((ĄdĄd
Ą`Ą`Ń(ŃĄ((M
ŃAĄą`ądąMŃŃ
ąltŹ(MŃAĄą`ądąMŃŃ
ąltŹ(MŃAĄą`ądąMŃŃ
ąltŹ(MŃAĄą`ądąMŃŃ
ąltŹ(MŃAĄą`ądąMŃŃ
ąltŹ(MŃAĄą`ądąMŃŃ
ąltŹ(((( Ń      ąĄŹĄąąMI

=Ad((Ź(( Ń      ąĄąąMI

=Ad(Ą``ą`ŹŹ((ĄddądŹŹ(
(ĄdĄdĄ`Ą`Ń(MŃAĄ
ą`ądąMŃŃ
ąlt(((    Ń      ąĄąąMI

=Ad(Ź((       Ń      ąĄąąMI

=Ad(Ą``ą`ŹŹ((ĄddądŹŹ(
(ĄdĄdĄ`Ą`Ń(MŃAĄ
ą`ądąMŃŃ
ąlt(((    Ń      ąĄąąMI

=Ad(Ź(((      Ń      ąĄŃąąMI

=Ad(ąŃ=Ą(ąŃĄ(ąŃ Ą(ąŃ=ĄŃ(ąŃ=ĄŃ(AĄĄ](Y
ąŃIĄĄ]ą9U10(Ź(

 

Pozdrawiam!

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...