Canvas i frame

Tags:    delphi

Ey!

Jeg er igang med et lille spil hvor jeg har opbygget GUI'en med frames (som en slags vinduer). En af disse frames indeholder kortet over den verden man render rundt i.

Da det kort skal tegnes automatisk ud fra en array med nogle integers (en speciel kode for farven :P ), vil jeg tegne hele kortet ved hjælp af canvas.

Det er ikke noget problem at få canvas til at gøre alt det jeg vil have den til (tegne en masse pixels i specielle farver), når det altså er formens canvas der bruges. Den tegner det dog på formen, og framen bliver så vist ovenpå :? .

Jeg har prøvet på flere forskellige måder at oprette en TCanvas, i framen og så tegne med den men den laver en fejl og siger at den tillader det ikke ("Canvas does not allow drawing"), hvilket jo egentlig ikke gir nogen mening :P .

Det sidste jeg har prøvet er at bruge TControlCanvas og så tilføje min frame som Control. Den laver ingen fejl nu men jeg kan ikke se hvor hulen den skulle have tegnet det henad :( .

En lang historie kort (nok for sent :P)...
Hvordan tegner jeg med canvas på en frame?

Lidt af min kode så det måske gir mere mening :P :
Fold kodeboks ind/udKode 




2 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 4 karma
Sorter efter stemmer Sorter efter dato
Er Det du bruger en Tframe ?

Har du overvejet Doublebuffer visning VIA GDI(Scanlines) hvis det er mange pixels vi snakker om ?

Men ellers ville jeg ligge en Timage i en frame. Sætte alignment til Client og Oprette en tom Bitmap i picture, husk at indstil farve dybde. Derefter kan Bitmappen jo tilgåes temlig let og direkte.


Et eksempel på at skrive i en bitmap(opret en bitmap(Tbitmap) manuelt og kopier den over i image1 som bitmap :
var
Buffer : tbitmap;
Arect : trect;
begin
Buffer := TBitmap.Create;
Buffer.Width := image1.Width;
Buffer.Height := image1.Height;
Buffer.PixelFormat := pf32bit;
ARect := Rect(0,0, Buffer.Width, Buffer.Height);
Buffer.Canvas.Brush.Color := 0;
Buffer.Canvas.FillRect(ARect);
..
...
image1.Picture.Bitmap := Buffer;

image1.canvas.pen.color := Clred
image1.Canvas.MoveTo(10,10);
image1.Canvas.LineTo(20,20);
....

For at aflæse en pixel farve i en Timage :
if image1.Canvas.Pixels[10,10] = Clred then
...

udfra ovenstående Buffer, kan du faktisk allerede lave det doublebuffered og tilgå med scanlines(Buffer.scanlines..), som er lynende hurtig, hvis du skulle få brug for det.



-------------------------------

mine freeware og shareware programmer : http://www.veloci.dk

Mine Freeware spil : http://www.nino.dk/ & http://www.osirisgames.com



\\o/

Jeg takker mange gange :) . Det virker rigtig godt.

.. og jo det er en TFrame ;) .



t