Article View: pl.comp.lang.delphi
Article #335040Re: Problem z miganiem aplikacji
From: Arivald
Date: Mon, 06 Feb 2012 07:43
Date: Mon, 06 Feb 2012 07:43
63 lines
3667 bytes
3667 bytes
W dniu 2012-02-06 08:27, konsul41@wp.pl pisze: >> Podwójne buforowanie to prawidłowe podejście. Ale to wbudowane w VCL >> (DoubleBuffered:=true) działa tylko jak rysujesz w zgodzie z VCLem, >> czyli w metodzie Paint a nie w obsłudze WM_PAINT. >> >> Twój poprzedni problem z brushem miał prawdopodobnie to samo źródło: >> fakt że wiesz za mało o rysowaniu w WinAPI/Delphi. > To fakt dlatego zadaje pytania na grupie. > Jednak szybko się uczę zwłaszcza z Petzold-a ale to ponad 1000stron > trudno tyle wiedzy przyswoić w jeden wieczór. > Ładnie to wszystko opisuje i wiem skąd był efekt migania który opisywałem. > Petzold pisze na 158s. że brush wewnętrznie jest to bitmapa 8*8 pikseli > i Windows kopiuje ją do wypełnienia obszarów i symulowania koloru, stąd > widać czasami nie pełną zamalowaną linie. > >> >> >> Podwójne buforowanie (jeśli będziesz to robił sam w WM_Paint) polaga na: >> >> a) przejmujesz WM_ERASEBKGND i NIE czyścisz tła. > To jest generowane podczas BeginPaint? > Nie, jest generowane sporo wcześniej. Cykl odrysowywania okna składa się z kilku etapów, jednym z pierwszych jest wysłanie WM_ERASEBKGND. Domyślnie okno w obsłudze powinno wyczyścić swój obszar. Ale właśnie to domyślne zachowanie jest źródłem migotania, użytkownik widzi jak okno jest wypełniane kolorem tła, i ponownie odrysowywane. Dlatego należy to zablokować, a procedurę czyszczenia tła przenieść do WM_PINT i czyścić tło bufora. BeginPaint jest wołane sporo później, zakłada że tło zostało już wyczyszczone. >> >> b) W WM_PAINT rysujesz nie bezpośrednio na DC ekranu (Canvas >> kontrolki) a do Birmapy (Canvas bitmapy) >> >> c) Jak skończysz rysowanie to blitujesz jedną operacją cały nowy obraz >> nadpisując stare, niezmazane tło. > > I tą drogą pójdę. Dziękuję. >> >> Ale przy Twojej wiedzy i możliwościach > To zostawię bez komentarza, gdybym tak myślał nadal siedziałbym na > garnuszku rodziców mając dziesiąt lat. > > >> , proponuję Ci raczej rysować w metodzie Paint() lub PaintWindow(), i >> użycie DoubleBuffered:=true. Wtedy VCL za Ciebie zrobi buforowanie. > Nie tamte rozwiązanie jest ciekawsze. Ciekawsze, i pozwala na optymalizację (np. odrysowywanie tylko tych fragmentów które tego wymagają). Informacje o działaniu GDI, i multum przykładów w każdym języku programowania, dostępne są w internecie. Wystarczy trochę Googlowania i wiedział byś jak to ma działać. Dlatego napisałem co napisałem. -- Arivald
Technical Details
Message-ID:
<jgo0ef$b6v$1@news.dialog.net.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!news.dialog.net.pl!not-for-mailReferences:
<4f2d0c44$0$1229$65785112@news.neostrada.pl> <jgjc7n$558$1@news.dialog.net.pl> <4f2f80c2$0$1223$65785112@news.neostrada.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!newsfeed.pionier.net.pl!news.dialog.net.pl!not-for-mail From: Arivald <NOSPAMarivald@interia.pl> Newsgroups: pl.comp.lang.delphi Subject: Re: Problem z miganiem aplikacji Date: Mon, 06 Feb 2012 08:43:29 +0100 Organization: Dialog Net Lines: 63 Message-ID: <jgo0ef$b6v$1@news.dialog.net.pl> References: <4f2d0c44$0$1229$65785112@news.neostrada.pl> <jgjc7n$558$1@news.dialog.net.pl> <4f2f80c2$0$1223$65785112@news.neostrada.pl> NNTP-Posting-Host: dynamic-78-8-130-174.ssp.dialog.net.pl Mime-Version: 1.0 X-Trace: news.dialog.net.pl 1328514319 11487 78.8.130.174 (6 Feb 2012 07:45:19 GMT) X-Complaints-To: abuse@dialog.net.pl NNTP-Posting-Date: Mon, 6 Feb 2012 07:45:19 +0000 (UTC) User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0) Gecko/20120124 Thunderbird/10.0 In-Reply-To: <4f2f80c2$0$1223$65785112@news.neostrada.pl> X-Antivirus: avast! (VPS 120205-3, 2012-02-05), Outbound message X-Antivirus-Status: Clean Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit