06. juli 2003 - 10:25Der er
13 kommentarer og 1 løsning
Skins hvordan?
Hej
Jeg er ved at lave en mp3 afspiller men hvordan laver jeg en skins funktion? Jeg har prøvet to komponenter men de virkede ikke sælig godt. Det skal være hvor man kan lave skins til alle ting, og skinsne skal så efterfølgende ligge i en mappe for sig. Hvordan gør man det?
Bare vær kreativ! Jeg tror ikke der findes en enstemmet løsning på dette. Skins er vel i bund og grund bare nogle TBitmaps der repræsentere de forskellige komponenter, så som TButtons og TSliders osv. Så hvorfor ikke bare lægge ud med at brugeren kan indlæse forskellige billeder fra harddisken og bruge dem som skins!
Hvis en komponent ikke har en Public Canvas, kan du selv lave en Canvas og sætte den ovenpå komponenten. Det vil resultere i at komponenten's "Standard" Canvas vil blive "OverRided" (overskrevet). Her er et eksempel hvor du har en ganske almindelig TButton og en TOpenDialog. Når du trykker på knappen vil en Åbn-Fil-Dialog vises, hvor du kan vælge en Bitmap fil. Den Bitmap fil du vælger vil blive tegnet på knappen når du trykker "OK" og dermed lukker dialog-boksen.
procedure TForm1.Button1Click(Sender: TObject); var MyCanvas : TControlCanvas; MyBitmap : TBitmap; begin MyCanvas := TControlCanvas.Create; MyBitmap := TBitmap.Create;
MyCanvas.Control := TControl(Button1);
if OpenDialog1.Execute then MyBitmap.LoadFromFile(OpenDialog1.Filename);
Ja det er korrekt. Fordi komponentens "Standard" Canvas ligger stadig under vores Canvas og bliver automatisk opdateret af komponenten selv og dermed tegner over vors Canvas. Dette kan løses på utallige måder her er et eksempel(Dog stadig med vores TButton):
//Definere en "Global" Canvas og Bitmap var MyCanvas : TControlCanvas; MyBitmap : TBitmap; //Skaber en Canvas og en Bitmap //assigner derefter Button1 som Control til vors Canvas procedure TForm1.FormCreate(Sender: TObject); begin MyCanvas := TControlCanvas.Create; MyBitmap := TBitmap.Create; MyCanvas.Control := TControl(Button1); end;
//Åbner en bitmap fra hardisken procedure TForm1.Button1Click(Sender: TObject); begin if OpenDialog1.Execute then MyBitmap.LoadFromFile(OpenDialog1.Filename); end;
//En timer opdatere vores Canvas hele tiden ved at tegne //bitmapen på vores canvas procedure TForm1.Timer1Timer(Sender: TObject); begin MyCanvas.Draw(0,0,MyBitmap); end;
//Fri giver vore Canvas og Bitmap fra hukommelsen procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin MyCanvas.Free; MyBitmap.Free; end;
Det er altså bare et spørgsmål om at være kreativ nok! Her har jeg lavet så en ny Slide design vil blive tegnet ovenpå den gamle TrackBar design, så du kan se ideén med det. Nu er det så op til dig at passe det ind på nøjagtigt den måde du vil have det. Egenligt er den identisk med koden jeg viste dig tidligere, bortset fra at Button1 er blevet erstattet med TrackBar1 som CanvasControl og at Timeren referere til TegnTrackBar hele tiden.
//Definere en "Global" Canvas og Bitmap var MyCanvas : TControlCanvas; MyBitmap : TBitmap; //Skaber en Canvas og en Bitmap //assigner derefter TrackBar1 som Control til vores Canvas procedure TForm1.FormCreate(Sender: TObject); begin MyCanvas := TControlCanvas.Create; MyBitmap := TBitmap.Create; MyCanvas.Control := TControl(TrackBar1); end;
//Tegner ny design oven på den gamle TrackBar design!!! procedure TForm1.TegnTrackBar(Sender: TObject); var TrackPos : Integer; begin if TrackBar1.Visible then with MyBitmap do begin Width := TrackBar1.Width; Height := TrackBar1.Height; //Tegn Vandret... if TrackBar1.Orientation = trHorizontal then begin with Canvas do begin //Tegner baggrunden grå Brush.Color := clBtnFace; FillRect(TrackBar1.ClientRect); //Tegner vandret Slide Pen.Color := clBtnShadow; MoveTo(7,12); LineTo(TrackBar1.Width-12,12); Pen.Color := clBtnHighLight; MoveTo(7,13); LineTo(TrackBar1.Width-12,13); end;
//Hvis TrackBarens Slider er sat synlig tegn selve Baren... if TrackBar1.SliderVisible then begin //Beregner position af Baren with TrackBar1 do TrackPos := ((Width-14) div (Max-Min))* (Position-Min); //Tegner Baren med functionen: DrawButtonFace fra "Buttons.pas" with TrackBar1 do DrawButtonFace(MyBitmap.Canvas,Rect(TrackPos+7,5,TrackPos+17,Height div 2),1,bsNew,False,False,False); end; end else //Tegn Lodret... //Her kan du så selv gå i krig med et eller andet... MyBitmap.Canvas.TextOut(0,0,'Tegn...'); end; end;
//En timer opdatere vores Canvas hele tiden ved at tegne //bitmapen på vores canvas procedure TForm1.Timer1Timer(Sender: TObject); begin TegnTrackBar(nil); //Referer til TegnTrackBar MyCanvas.Draw(0,0,MyBitmap); end;
//Fri giver vore Canvas og Bitmap fra hukommelsen procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin MyCanvas.Free; MyBitmap.Free; end;
Held og Lykke ZeroHero
Synes godt om
Ny brugerNybegynder
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.