🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.delphi
Article #335040

Re: Problem z miganiem aplikacji

#335040
From: Arivald
Date: Mon, 06 Feb 2012 07:43
63 lines
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-mail
References: <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