![]() |
Image Problem???
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
Ich möchte mir ,eine LED auf meiner Form machen. um nicht ständig die Bilder für an und aus zuladen, hab ich sie in ein bild gestopft. Wie bekomme ich es nun hin ,daß meine Led das bild für on anzeigt. Momentan zeit er immer beide LED´s an die sich im bild befinden. :gruebel: Gruss Bernd |
Re: Image Problem???
Das einfachste ist, du lädst dieses Doppel-Bild zuerst in ein normales TBitmap, welches du im Creater der Form davor noch erzeugst. Und danach brauchst du nur noch mehr mittels der Api-Funktion "BitBlt" jeweils die erste Hälfte bzw. die zweite Hälfte dieses Bitmap auf das Image zu übertragen.
also für Teil-Bild1 so:
Delphi-Quellcode:
bzw. so fürs Teil-Bild2:
BitBlt(Image1.Canvas.Handle, 0, 0, FBitmap.Width div 2, FBitmap.Height,
FBitmap.Canvas.Handle, 0, 0, SrcCopy);
Delphi-Quellcode:
BitBlt(Image1.Canvas.Handle, 0, 0, FBitmap.Width div 2, FBitmap.Height,
FBitmap.Canvas.Handle, FBitmap.Width div 2, 0, SrcCopy); |
Re: Image Problem???
Hallo,
Könnst mir das jemand näher erklären, hab damit noch nicht viel Erfahrung. Gruss Bernd |
Re: Image Problem???
Also, wenn ich dich überhaupt richtig verstanden habe, dann hast du mittels irgendeines Grafikprogramms beide Zustands-Bilder des LED nebeneinanderer zu einem einzigen Bild zusammengebaut. Links das Bild für LED=OFF und rechts dasjenige für LED=ON. Mit dieser BitBlt-Funktion (deren Parameter du dir dann mal in der PSDK ansehen solltest;
![]() Normalerweise brauchst du die beiden Bilder aber erst überhaupt nicht zu einem einzigen zusammenzubauen. Wenn du noch eine TImageList mit auf die Form ziehst (und mal einen Doppelklick drauf machst), dann kannst du darin nämlich leicht beide Bilder gleichzeitig abspeichern. Bei Bedarf holst du dir dann mittels der GetMitmap-Methode jeweils eines davon heraus bzw. lädst es dann in ein weiteres einzelnes TImage rüber. |
Re: Image Problem???
Hallo,
Ich hab es mal mal BitBlT ausprobiert , da passiert bei mir nix :cry:
Delphi-Quellcode:
Hab ich da noch was vergessen?
procedure TForm1.Button1Click(Sender: TObject);
begin BitBlt(Image1.Canvas.Handle, 0, 0, PaintBox1.Width div 2, PaintBox1.Height, PaintBox1.Canvas.Handle, 0, 0, SrcCopy); end; Gruss Bernd |
Re: Image Problem???
Liste der Anhänge anzeigen (Anzahl: 1)
Du kopierst von einer Paintbox in ein Image, soll das so herum sein ?
Code:
Ist das Bitmap in der Paintbox oder im Image und wohin soll es kopiert werden?
BitBlt([color=#ff0000]Ziehl.Canvas.Handle[/color], 0, 0, PaintBox1.Width div 2, PaintBox1.Height,
[color=#ff003f]Quelle.Canvas.Handle[/color], 0, 0, SrcCopy); // Edit: Ein Beispielcode:
Delphi-Quellcode:
implementation
{$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin // "Antiflacker" (für diesen Beispielcode nützlich - wegen dem Repaint) {Form1.} DoubleBuffered := True; // Groesse des 2. Images an Groesse von Bitmap in Image 1 anpassen Image2.Width := Image1.Width; Image2.Height := Image1.Height div 2; // Alle "Aus"-LEDs zeichnen lassen SetLEDs(Image1, Image2, 0); end; procedure TForm1.SetLEDs(QuellImage, ZiehlImage: TImage; LEDOn: Byte); begin // Alle "Aus"-LEDs zeichnen BitBlt( ZiehlImage.Canvas.Handle, 0, 0, QuellImage.Width, QuellImage.Height div 2, QuellImage.Picture.Bitmap.Canvas.Handle, 1, QuellImage.Height div 2, SrcCopy); if LEDOn > 0 then begin BitBlt( ZiehlImage.Canvas.Handle, 0, 0, (QuellImage.Width div 8) * LEDOn, QuellImage.Height div 2, QuellImage.Picture.Bitmap.Canvas.Handle, 0, 0, SrcCopy); end; // Ziehl-Image neu zeichnen lassen ZiehlImage.Repaint; end; procedure TForm1.TrackBar1Change(Sender: TObject); begin // LEDs zeichnen wenn TrackBar1 geändert wird SetLEDs(Image1, Image2, TrackBar1.Position); end; |
Re: Image Problem???
So eine PaintBox ist eigentlich bloß mehr für den eigentlichen Screen-Output selbst gedacht, und eignet eher weniger für ein anfängliches nur Parken eines Bildes. So ein einfaches TBitmap ist dafür also besser geeignet. Das erzeugst und lädst du dann zuerst noch im Creater der Form:
Delphi-Quellcode:
Dann ersetzt du in deinem letzten Post einfach die Paintbox durch dieses FBitmap und schon müsste es eigentlich funktionieren. Auch ein Image1.Repaint nach dem "BitBlt" möglichst nicht vergessen.
procedure TForm1.FormCreate(Sender: TObject);
const AFileName = 'blablabla'; begin FBitmap := TBitmap.Create; FBitmap.LoadFromFile(AFileName); end; (Aber wie gesagt: Die Benutzung einer ImageList wäre in deiner Situation wohl das einfachste. Nötig gewesen wäre dann nämlich insgesamt immer nur so etwas:
Delphi-Quellcode:
Allerdings muss man ja das "BitBlt" in jedem Falle auch einmal kennen gelernt haben :-) --> als eigene Ausrede, nicht sofort die ImageList erwähnt zu haben :mrgreen: )
procedure TForm1.Button1Click(Sender: TObject); // z.B. fürs Anschalten des LED
begin Image1.Canvas.FillRect(Image1.Canvas.ClipRect); // ~ Image.clear ImageList1.GetBitmap(0,Image1.Picture.Bitmap); end; bzw. procedure TForm1.Button2Click(Sender: TObject); // z.B. fürs Ausschalten des LED begin Image1.Canvas.FillRect(Image1.Canvas.ClipRect); // ~ Image.clear ImageList1.GetBitmap(1,Image1.Picture.Bitmap); end; |
Re: Image Problem???
Hallo,
Vielen Dank für eure mühen. Funcktioniert fantastich . Mal noch ne Frage zum Code von turboPASCAL, wie bekommt man die Bilder übereinander , also so das man nur eine LED sehen Kann ? Gruss Bernd |
Re: Image Problem???
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Das erste BitBlt zeichnet alle "Aus"-LED's, das zweite BitBlt zeichnet darüber die LED's die "An" sein sollen. Möchtest du die LED's einzeln An,-bzw. Ausschalten (zB. die Erste und die Letzte) so must du das zweite BitBlt in einer Schleife oder in einem Case-Statement ausführen und nur die LED(s) zeichnen lassen die "An" sein soll. Zum Bleistift:
Delphi-Quellcode:
... auch als Anhang zu haben:
procedure TForm1.SetLEDs(QuellImage, ZiehlImage: TImage; LEDs: String);
var i: Byte; h,w: Integer; begin // LEDs zeichnen for i := 1 to Length(LEDs) do begin if LEDs[i] <> '0' then h := 0 else h := QuellImage.Height div 2; w := QuellImage.Width * (i-1); BitBlt( ZiehlImage.Canvas.Handle, w, 0, QuellImage.Width * i, QuellImage.Height div 2, QuellImage.Picture.Bitmap.Canvas.Handle, 0, h, SrcCopy); end; // Ziehl-Image neu zeichnen lassen ZiehlImage.Repaint; end; //Wenn die zwei mittleren leuchten sollen, Aufruf zB.: SetLEDs(Image1, Image2, '00011000'); |
Re: Image Problem???
HI TurboPascal,
Ich meinte es eher so, daß ich eine drei Fabige LED habe . Dein beispiel 2 hatte ich mir schon aus beispiel 1 gebastelt, Ich habe es nur noch nicht hin bekommen eine LED in drei Farben anzeigen zulassen. Muss ich da Top und Left mit einbringen oder wie geht das? Gruss Bernd |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz