raV Napisano Marzec 23, 2011 Zgłoś Share Napisano Marzec 23, 2011 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 More sharing options...
Blind Napisano Marzec 23, 2011 Zgłoś Share Napisano Marzec 23, 2011 W timerze wywołuj odświeżanie kontrolki na której rysujesz, a w niej w zdarzeniu Paint rysuj. Wtedy zastosuj sposób dwóch Bitmap. Powinno to rozwiązać problem. www.blinder.pl - Blog Link do komentarza Udostępnij na innych stronach More sharing options...
raV Napisano Marzec 23, 2011 Autor Zgłoś Share Napisano Marzec 23, 2011 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 More sharing options...
Blind Napisano Marzec 23, 2011 Zgłoś Share Napisano Marzec 23, 2011 Nie znam się za bardzo na WinApi, ale kojarzy mi się, że do wymuszenia rysowania służy funkcja InvalidateRect www.blinder.pl - Blog Link do komentarza Udostępnij na innych stronach More sharing options...
xevil21 Napisano Marzec 24, 2011 Zgłoś Share Napisano Marzec 24, 2011 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 More sharing options...
Polecane posty
Zarchiwizowany
Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.