Avatar billede nubi19 Nybegynder
13. maj 2003 - 19:38 Der er 11 kommentarer og
1 løsning

Double Buffering af TForms Canvas i BCB 4

Jeg er igang med et program som næsten udelukkende hele tiden opdaterer Form1->Canvas (Form1 er hovedformen) på den ene eller den anden måde, og det gør jo at billedet flimrer ret kraftigt. Jeg ved dette kan fjernes via Double Buffering - men jeg ved ikke hvordan jeg laver denne buffering, så hvis nogen kan hjælpe vil det være alle tiders :)
Avatar billede borrisholt Novice
14. maj 2003 - 08:13 #1
Du kan Opretten en TBitmap, og tegne det på dens Canvas.

Så kan du sætte en timer til at opdatere din TForms canvas.
Avatar billede nubi19 Nybegynder
14. maj 2003 - 13:58 #2
Altså noget ala:
Bitmap1->Canvas->Ellipse(0,0,100,100);
Form1->Canvas->Draw(0,0,Bitmap1);
?
For det virker nemlig ikke :/ (der kommer intet på Form1)
Avatar billede borrisholt Novice
14. maj 2003 - 15:03 #3
Skriv lige en mail til Jens@Borrisholt.com så skal du få et eksempel der virker.

Jens B
Avatar billede borrisholt Novice
14. maj 2003 - 15:10 #4
Nej glem det ...

Du kan hente den her :
http://www.borrisholt.com/eksperten/DoubleBuffering.zip
Avatar billede nubi19 Nybegynder
14. maj 2003 - 16:18 #5
Hmmm jeg må indrømme at jeg ikke kan se hvorfor det ikke virker, da jeg gør det samme som du gør i dit eksempel (der btw. ikke er lavet i BCB :D) Det her burde da virke ?

Graphics::TBitmap *bimp = new Graphics::TBitmap();
bimp->Canvas->Brush->Color = clWhite;
bimp->Canvas->Rectangle(0,0,100,100);
Form1->Canvas->Draw(0,0,bimp);
Avatar billede borrisholt Novice
14. maj 2003 - 16:26 #6
nej jeg sætter Pixelformat på min TBitmap, ellers virker det ikke
Avatar billede nubi19 Nybegynder
14. maj 2003 - 16:29 #7
Graphics::TBitmap *bimp = new Graphics::TBitmap();
bimp->PixelFormat = pf32bit;
bimp->Canvas->Brush->Color = clWhite;
bimp->Canvas->Rectangle(0,0,100,100);
Form1->Canvas->Draw(0,0,bimp);

Stadigvæk intet resultat :/
Avatar billede nubi19 Nybegynder
14. maj 2003 - 17:02 #8
Har fundet problemet, eller noget af det anyway:

        Graphics::TBitmap *bimp = new Graphics::TBitmap();
        bimp->PixelFormat = pf32bit;
        bimp->Canvas->Brush->Color = clWhite;
        bimp->Canvas->Pen->Color = clBlack;
        bimp->Canvas->Rectangle(0,0,100,100);
        if (bimp->Empty)
                ShowMessage("ÆV");

Så skriver den ÆV, altså godtager den ikke bimp->Canvas->Rectangle (på trods af at jeg har sat alt muligt gejl)
Avatar billede nubi19 Nybegynder
14. maj 2003 - 17:06 #9
Her er btw. hvad hjælp filen siger om TBitmap->Canvas:

Canvas allows drawing on the bitmap by providing a TCanvas object for this purpose. Drawing on the canvas effectively modifies the underlying bitmap image pixels. Any canvas operation is valid on a bitmapnot just Draw and StretchDrawincluding line drawing, rectangles, and circles. The bitmap object is passed as a parameter to these methods.

Det ser ud til at man skal smide bitmap objektet med som parameter til rectangle, ellipse etc. Men parameterlisten til de 2 er jo bare int,int,int,int så det fatter jeg ik helt :/
Avatar billede nubi19 Nybegynder
14. maj 2003 - 17:29 #10
LOL jeg har netop fundet problemet selv: height og width var = 0.
Avatar billede nubi19 Nybegynder
14. maj 2003 - 17:39 #11
Men hmm det løste ikke problemet at gøre følgende (ligger i OnPaint-eventen for formen):

        bitmap->Canvas->Rectangle(0,ForskydningY, rumX, rumY+ForskydningY);
        for (int i = 0; i < plads; i++)
                ting[i]->paint(); // tegner div. objekter på bitmap
        FrmMain->Canvas->Draw(0,0,bitmap);

det flimrer stadigvæk - så nu er spørgsmålet bare hvad jeg gør forkert ?

Nåja jeg kalder Repaint hver gang jeg flytter på et objekt, måske det er der problemet ligger ? (Dvs. for hver pixel jeg flytter et objekt så kalder den repaint())
Avatar billede nubi19 Nybegynder
14. maj 2003 - 17:42 #12
Ah nm det var Repaint()s skyld :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester