Forum
Grundkurs
»Introduktion
»Snabbguide
»Komponenter
»Händelser
»Strängar
»Räkna med Delphi »Egna
typer
»Selektion
»Iteration
»Menyer
»Funktioner
»Arraystrukturer
Tips & Tricks
»Nya tips
»Blandat
»Databaser
»Filer
»Forms
»Grafik
»Internet
»Komponenter
»Matematik
»Multimedia
»Objekt/ActiveX
»Skrivare
»Strängar
»System
»Mest lästa tips
Artiklar
»Delphi och ADO
»Bygga en DLL
»Skapa en enkel rapport
»Hantera registret
»Enheter, units
»Klassen TCanvas
»Använd LookUp Controls
Nya
tips
Lägg
till tips
Delphilänkar
Gästbok
|
|
FuzzyDizzie » Delphi » Artiklar » Klassen TCanvas |
|
Operativsystem: Windows 95/98/ME/2000/XP
Delphiversion: Delphi 3 eller senare
Komponenter: TCanvas
|
|
Publicerad: 2003-07-22
Läst: 4078
Röster: 9
Skribent: Staffan Berg
|
Rösta på artikeln
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)
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 textstdn 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 ”designtime” 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.
uses
with Canvas do
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:
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 ändras.
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.
Avslutningsvis
Faktum är att innan jag skrev denna artikel visste jag inte så mycket om hur Canvas
fungerar. Men allteftersom man skriver och tar hjälp av kodlistningar som det finns
mängder av (både i böcker och på internet) snappar man upp och lär sig nya tekniker
och programmeringsmetoder som man kan få mycket användning av när man utvecklar sina
program.
Vid tangentbordet
/Staffan Berg
|