TCanvas-klassen i Delphi
Förord
Denna artikel kommer att handla om egenskapen Canvas som ofta används i samband med grafiska operationer och är en egenskap som tillhandahålls av många olika komponenter i Delphi (och även i andra programmeringsspråk)Innehåll
»»
»
»
»
Introduktion till Canvas
Som sagt, egenskapen Canvas tillhandahålls av många komponenter i Delphi såsom TBitmap, TComboBox, TListBox, TPaintBox för att nämna några. Egenskapen Canvas införlivas i Windows Grafiska Gränssnitt (GDI) och erbjuder en enhetsoberoende yta för att rita grafiska objekt genom Windows. Man kan tänka sig Canvas som en kanal för dina program för att kunna rita ut grafiska objekt och text.
Rita med Canvas
Egenskapen Canvas är ett mångsidigt, objektorienterat skal för Windows GDI. Canvas står klar för att användas för programmeraren och dess klass TCanvas innehåller mängder av egenskaper, metoder och händelser. Du använder i allmänhet Canvas på två sätt:
- För att konfigurera grafiska objekt och textflöden genom att tilldela dem färger, mönster, typsnitt och andra egenskaper.
- För att skapa visuella figurer genom att anropa grafiska metoder.
Canvas-egenskapen är inte tillgänglig i designläge i Objektinspektorn. För att använda Canvas är du tvungen att skriva kod och i denna tilldela egenskapsvärden och anropa metoder. För att ta ett exempel kan vi låta Delphi rita ut en blå rektangel med gula diagonala streck i ett vanligt formulär. Skriv in nedanstående kod i formulärets OnPaint-händelse.
with Canvas do
begin
Pen.Color :=clBlue;
Brush.Color := clYellow;
Brush.Style := bsDiagCross;
Rectangle(10, 10, 100, 100);
end;
Tryck F9 för att köra programmet och du upptäcker vilken fantastiskt fin ruta(!) som ritas upp på formuläret.
Detta kodexempel använder sig av en With-sats som talar om för Delphi att använda Canvas egenskaper och metoder. Eftersom denna kod körs i en metod i Tform1, så är det formulärets Canvas som den refererar till, och därför ritas den också upp på formuläret. De första tre raderna (efter begin) tilldelar värden till två Canvas-egenskaper: Pen och Brush. Den fjärde raden anropar en Canvas-metod, Rectangle, för att med hjälp av de inskrivna parametervärdena rita ut en figur på formuläret. För att skapa de flesta typer av grafik, används liknande tillvägagångssätt:
- Tilldela värden till Canvas egenskaper och subegenskaper.
- Anropa Canvas metoder för att skapa visuella produkter.
Rita med Shapes
Delphi erbjuder en annan metod för att skapa figurer (Shapes). Istället för att rita figurer under ”runtime” kan du skapa grafiska objekt på ditt formulär och tilldela dessa egenskaper via Objektinspektorn. För att ta ett exempel, rita ut ett Shapeobjekt från fliken Additional i komponentpaletten. Välj Shape-egenskapen stRoundRect eller skriv in följande kodrad i formulärets OnCreate-händelse:
Shape1.Shape := stRoundRect;
Du kan välja att ändra egenskaperna Color och Pattern i designläget med hjälp av Objektinspektorn för att tilldela värden till dess Brush och Pen subegenskaper. Brush-egenskapen målar figurens inneryta och Pen ritar ut figurens ytterlinje. Prova gärna att ändra egenskaperna för att få insikt om vad som händer. Prova gärna denna kod i formulärets OnCreate-händelse:
with Shape do
begin
Shape := stRoundRext;
Brush.Color := clLime;
Brush.Style := bsCross;
Pen.Color := clNavy;
Pen.Width := 3;
end;
Canvas egenskaper
Canvas egenskaper erbjuder åtta subegenskaper för att konfigurera grafik. Du kan tilldela värden till dessa egenskaper endast under körning. Här följer en lista över subegenskaperna med förklaringar:
- Brush – Tillhandahåller färg och mönster för cirklar, rektanglar, polygoner och även bakgrundsfärger för text.
- ClipRect – Klipper av grafik inom rektanglars gränslinjer. Du kan tilldela talvärden till dess Left, Top, Right och Bottom-egenskaper för att klippa av grafik till andra regioner.
- CopyMode – Bestämmer hur du kombinerar bitar när du anropar Canvas CopyRect-metod, med vilken du kopierar ett objekts canvas inuti ett annat. Du kan t ex sätta CopyMode till cmNotSourceCopy för att invertera pixlar innan du kopierar dem till en annan canvas.
- Font – Tilldelar egenskapsvärden till Canvas TextOut och TextRect metoder. Detta fontobjekt är inte relaterat till formulärets motsvarighet. Initiera Canvas.Font innan du ritar text.
- Handle – För GDI-funktioner som kräver en handtag till en enhetskod, skicka Canvas.Handle till en HDC-parameter. Detta gör det möjligt att anropa GDI-funktioner som inte finns inkapslade i Canvas.
- Pen – Skriver ut linjer och ytterlinjer (till figurer). Du kan tilldela värden till subegenskaperna Color, Style, Mode och Width.
- PenPos – Bestämmer Pen-egenskapens navigering (PenPos.X, PenPos.Y) och bestämmer var nästa output ska hamna. Eftersom Delphi hela tiden tilldelar nya värden till PenPos, kan du istället använda Canvas metod MoveTo för att direkt hoppa till en annan position.
- Pixels – Skapar en tvådimensionell array till Canvas individuella pixlar. Exempelvis så returnerar Pixels[0,0] färgen på pixeln vid koordinaten (0,0).
Notera att Pixels-egenskapen är en s k pseudo-array och inte en bitmap. Klassen TCanvas översätter referenser och tilldelningar av Pixels[0,0] till anrop av GDI SetPixel och GetPixel. Av denna anledning så är denna metod väldigt ineffektiv för att skapa grafiska objekt. Använd därför Pixels bara om du absolut måste hämta upp enstaka pixelfärger.
Canvas metoder och händelser
Canvas erbjuder också en rad andra metoder som med fördel kan användas för att manipulera grafiska objekt. De minst uppenbara metoderna som finns att tillgå i Canvas beskrivs nedan.
- CopyRect – Kopiera allt eller delar av Canvas från en plats till en annan. Ställ in CopyRect-egenskapen för att bestämma hur pixlarna ska kombineras i slutändan. Mer detaljerad information för denna egenskap finns i Delphi´s direkthjälp.
- Draw – Ritar ut objekt från TGraphic-klassen som är en direkt moder till TIcon, TBitmap, och TMetafile-klasserna. Du kan använda vilken ikon, bitmap eller metafile du vill till Draw.
- DrawFocusRect – Ritar ut en rektangel och använder antingen-eller logiken. Anropa metoden en andra gång med identiska argument för att radera rektangeln. Använd denna metod till att dra-och-släppa ytterlinjer.
- FrameRect – Ritar ut en ej ifylld rektangel när aktuell Pen-egenskap används men ignorerar Canvas Brush.
- StretchDraw – Denna fungerar på samma sätt som Draw men med den skillnaden att StretchDraw kan sträcka ut eller trycka ihop en ikon, bitmap eller metafile. Den kan också använda en Metafile till att automatiskt anpassa sin storlek inuti en rektangel.
Canvas har också två händelser till sitt förfogande som kan vara användbara under speciella mständigheter. Dessa två händelser beskrivs nedan.
- OnChange – Körs efter att Canvas egenskapsvärden har blivit ändrade.
- OnChanging – Körs omedelbart före att Canvas egenskapsvärden änras.
Eftersom Canvas egenskaper inte är tillgängliga i ”design-time” så kan du inte ta hjälp av Objektinspektorn för att skapa kod för dessa händelser. För att använda dem får du istället deklarera procedurerna i formulärets klass.
TForm1 = class(TForm)
procedure MyOnChange(Sender: TObject);
procedure MyOnChanging(Sender: TObject);
...
end;
Skriv in procedurnamnen till dessa två händelser i formulärets OnCreate-händelse:
Canvas.OnChange := MyOnChange;
Canvas.OnChanging := MyOnChanging;
Sedan är dessa klara att användas i din programkod. Här följer ett exempel som beskriver hur händelserna kan användas.
Procedure TForm1.MyOnChange(Sender: TObject);
begin
SavedPenColor := Canvas.Pen.Color;
end;
Noterbart i detta sammanhang kan vara att Delphi´s smarta projekthanterare (Project Manager) raderar alla tidigare deklarationer om proceduren inte innehåller några satser eller kommentarer. Försäkra dig därför om att alltid skriva åtminstone en rad innan du kompilerar ditt program.
Björn Johansson
Du skulle inte kunna gå mer "på djupet" av Tcanvas? tycker den här artikeln var mest "skrap på ytan"