🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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

Re: Problem z miganiem aplikacji

#335052
From: Arivald
Date: Tue, 07 Feb 2012 08:22
100 lines
4300 bytes
W dniu 2012-02-07 08:15, konsul41@wp.pl pisze:
> zrobiłem tak
> var Brush : TBRUSH;
> c: TCanvas;
> begin
> c := TCanvas.Create();
> c.Handle := DC;
> c.Brush:=TBrush.Create;
> try
> c.Brush.Color:=:=CreateSolidBrush(TPGKomponentData(FPGKomponentData^).kolor);
>
> c.TextOut(TPGKomponentData(FPGKomponentData^).rozmiar.Left,
> TPGKomponentData(FPGKomponentData^).rozmiar.Top,'Test');
> c.Rectangle(TPGKomponentData(FPGKomponentData^).rozmiar.Left,
> TPGKomponentData(FPGKomponentData^).rozmiar.Top,
> TPGKomponentData(FPGKomponentData^).rozmiar.Width,
> TPGKomponentData(FPGKomponentData^).rozmiar.Height);
> finally
> c.Handle := 0;
> c.Free();
> end;
>
> I nadal nie ma koloru.
> Czy przypadkiem FBackBuffer nie jest czarnobiałe, ponieważ czarny jest
> dobrze malowany, biały także.
> Inne kolory to ta siatka się zmienia.
> http://www.kssoft.cba.pl/kolory.PNG

Możliwe że się gdzieś pomyliłem... Czarno-biała bitmapa jest tworzona 
automatycznie z każdym MemoryDC, i może to bruździ...

Po pierwsze AllocateBackBuffer() i ReleaseBackBuffer() powinno być takie:

dodaj zmienną
   FOldBbBitmap: HBITMAP;

function TMyPanel.AllocateBackBuffer(refDC: HDC; width, height: 
integer): HDC;
begin
   Result := CreateCompatibleDC(refDC);

   if (width > FBackBufferWidth)
   or (height > FBackBufferHeight)
   or (FBackBuffer = 0)
   then
   begin
     FBackBufferWidth:= width ;
     FBackBufferHeight:= height ;

     if FBackBuffer <> 0 then DeleteObject(FBackBuffer);

     FBackBuffer := CreateCompatibleBitmap(
               Result, FBackBufferWidth, FBackBufferHeight);
   end;

   FOldBbBitmap := SelectObject(Result, FBackBuffer);
end;

procedure TMyPanel.ReleaseBackBuffer(bbDC: HDC; freeBitmap: boolean = 
false);
begin
   if FBackBuffer <> 0 then
   begin
     SelectObject(bbDC, FOldBbBitmap);
     FOldBbBitmap := 0;
     DeleteDC(bbDC);
     FOldBbBitmap := 0;
     if freeBitmap then
     begin
       DeleteObject(FBackBuffer);
       FBackBuffer := 0;
     end;
   end;
end;

przetestuj czy pomoże.



A potem spróbuj takiej zmiany: w WMPaint zamień
   ReleaseBackBuffer(bbDC, false);
na
   ReleaseBackBuffer(bbDC, True);

To spowoduje że bitmapa bufora będzie odtwarzana przy każdym paincie, 
efektywnie wyłączając optymalizację.


A przy okazji, osobiście ja rzadko używam do tego WinAPI bezpośrednio. 
Za durzo z tym kłopotów. Najczęściej tworzę bufor jako Graphics.TBitmap, 
z HandleType := bmDDB (aka  Device Dependent Bitmap).
Wtedy VCL sam dba o utworzenie Canvasa i powiązanego z nim Memory DC, i 
nie trzeba się ręcznie bawić. DC takiej bitmapy pobierasz poprzez:

   bitmap.Canvas.Handle

Tyle że z pluginami z DLL to raczej nie będzie dobrze działać...

-- 
Arivald
Technical Details
Message-ID: <jgqn30$kn1$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> <jgo0ef$b6v$1@news.dialog.net.pl> <4f2f8a9f$0$1217$65785112@news.neostrada.pl> <4f2fb47e$0$1220$65785112@news.neostrada.pl> <jgoh5e$j3k$1@news.dialog.net.pl> <4f2fde49$0$1230$65785112@news.neostrada.pl> <jgoof1$mj4$1@news.dialog.net.pl> <4f2fea02$0$1260$65785112@news.neostrada.pl> <4f2fea47$0$26695$65785112@news.neostrada.pl> <jgoqc3$ndt$1@news.dialog.net.pl> <4f30cf7d$0$26695$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: Tue, 07 Feb 2012 09:22:10 +0100
Organization: Dialog Net
Lines: 100
Message-ID: <jgqn30$kn1$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> <jgo0ef$b6v$1@news.dialog.net.pl> <4f2f8a9f$0$1217$65785112@news.neostrada.pl> <4f2fb47e$0$1220$65785112@news.neostrada.pl> <jgoh5e$j3k$1@news.dialog.net.pl> <4f2fde49$0$1230$65785112@news.neostrada.pl> <jgoof1$mj4$1@news.dialog.net.pl> <4f2fea02$0$1260$65785112@news.neostrada.pl> <4f2fea47$0$26695$65785112@news.neostrada.pl> <jgoqc3$ndt$1@news.dialog.net.pl> <4f30cf7d$0$26695$65785112@news.neostrada.pl>
NNTP-Posting-Host: dynamic-78-8-128-226.ssp.dialog.net.pl
Mime-Version: 1.0
X-Trace: news.dialog.net.pl 1328603040 21217 78.8.128.226 (7 Feb 2012 08:24:00 GMT)
X-Complaints-To: abuse@dialog.net.pl
NNTP-Posting-Date: Tue, 7 Feb 2012 08:24:00 +0000 (UTC)
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:11.0) Gecko/20120202 Thunderbird/11.0
In-Reply-To: <4f30cf7d$0$26695$65785112@news.neostrada.pl>
X-Antivirus: avast! (VPS 120206-1, 2012-02-06), Outbound message
X-Antivirus-Status: Clean
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit