Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Image Problem??? (https://www.delphipraxis.net/57006-image-problem.html)

Bernd29bln 14. Nov 2005 22:21


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

TStringlist 15. Nov 2005 00:46

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:
BitBlt(Image1.Canvas.Handle, 0, 0, FBitmap.Width div 2, FBitmap.Height,
       FBitmap.Canvas.Handle, 0, 0, SrcCopy);
bzw. so fürs Teil-Bild2:

Delphi-Quellcode:
BitBlt(Image1.Canvas.Handle, 0, 0, FBitmap.Width div 2, FBitmap.Height,
       FBitmap.Canvas.Handle, FBitmap.Width div 2, 0, SrcCopy);

Bernd29bln 15. Nov 2005 01:07

Re: Image Problem???
 
Hallo,

Könnst mir das jemand näher erklären, hab damit noch nicht viel Erfahrung.

Gruss Bernd

TStringlist 15. Nov 2005 07:50

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; MSDN-Library durchsuchenBitBlt) kannst du nun jeden beliebigen Ausschnitt (also z.B. auch eine linke o. rechte Hälfte) dieses Doppelbildes in ein anderes Bild herüber kopieren, so wie ich das in den zwei Codezeilen im ersten Post mal kurz vormachte.



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.

Bernd29bln 16. Nov 2005 08:49

Re: Image Problem???
 
Hallo,

Ich hab es mal mal BitBlT ausprobiert , da passiert bei mir nix :cry:

Delphi-Quellcode:
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;
Hab ich da noch was vergessen?

Gruss Bernd

turboPASCAL 16. Nov 2005 09:31

Re: Image Problem???
 
Liste der Anhänge anzeigen (Anzahl: 1)
Du kopierst von einer Paintbox in ein Image, soll das so herum sein ?

Code:
BitBlt([color=#ff0000]Ziehl.Canvas.Handle[/color], 0, 0, PaintBox1.Width div 2, PaintBox1.Height,
       [color=#ff003f]Quelle.Canvas.Handle[/color], 0, 0, SrcCopy);
Ist das Bitmap in der Paintbox oder im Image und wohin soll es kopiert werden?

// 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;

TStringlist 16. Nov 2005 14:08

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:
procedure TForm1.FormCreate(Sender: TObject);
const AFileName = 'blablabla';
begin
  FBitmap := TBitmap.Create;
  FBitmap.LoadFromFile(AFileName);
end;
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.


(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:
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;
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: )

Bernd29bln 16. Nov 2005 19:41

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

turboPASCAL 17. Nov 2005 10:48

Re: Image Problem???
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Bernd29bln
wie bekommt man die Bilder übereinander , also so das man nur eine LED sehen Kann ?

Wie ist das gemeint ?

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:
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');
... auch als Anhang zu haben:

Bernd29bln 18. Nov 2005 00:08

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 11:06 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz