Splash Screen transparant?

Rund um die LCL und andere Komponenten

Splash Screen transparant?

Beitragvon MmVisual » 9. Apr 2018, 23:39 Splash Screen transparant?

Hallo,

Ich habe eine PNG Datei mit transparentem Hintergrund. Diese möchte ich so beim Start der EXE in der Bildschirmmitte anzeigen.

Neues Formular erzeugen, das Bild rein setzen, soweit klappt das.

Aber wie mache ich von dem Fenster den transparenten Teil der Grafik transparent?

Das ist der Code den ich bisher geschrieben habe:
Code: Alles auswählen
procedure TfrmSplash.FormCreate(Sender: TObject);
begin
  frmSplash := Self;
  ShapeControl(Self);
end;
 
procedure TfrmSplash.ShapeControl(AControl: TWinControl);
var
  ABitmap: TBitmap;
  x, y: Integer;
begin
  ABitmap := TBitmap.Create;
  ABitmap.Width := Image1.Picture.Bitmap.Width;
  ABitmap.Height := Image1.Picture.Bitmap.Height;
  ABitmap.Monochrome := True;
  ABitmap.Canvas.Brush.Color := clBlack; // transparent color
  ABitmap.Canvas.FillRect(0, 0, ABitmap.Width, ABitmap.Height);
  ABitmap.Canvas.Brush.Color := clWhite;
  For x := 0 To ABitmap.Width - 1 do
  Begin
    For y := 0 To ABitmap.Height - 1 Do
    Begin
      If Image1.Picture.PNG.Canvas.Pixels[x,y] <> Image1.Picture.PNG.TransparentColor Then
        ABitmap.Canvas.Pixels[x,y] := clWhite;
    end;
  end;
 
  //Image1.Picture.Assign(ABitmap);
  AControl.SetShape(ABitmap);
  ABitmap.Free;
end


Muss ich im Formular noch was spezielles einstellen?
Oder ist der Ansatz schon mal ganz falsch?

Es sollte unter Linux und Windows funktionieren.

Dankeschön, Grüße Markus
MmVisual
 
Beiträge: 996
Registriert: 10. Okt 2008, 22:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon Warf » 10. Apr 2018, 01:18 Re: Splash Screen transparant?

Das FormCreate Event ist zu früh für SetShape, mach die Bitmap als privates Feld, erstell und berechne sie im FormCreate, mach das SetShape im FormShow und das Free dann im Destroy. Dann funktionierts super
Warf
 
Beiträge: 985
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon MmVisual » 10. Apr 2018, 12:12 Re: Splash Screen transparant?

Thx, funktioniert!
MmVisual
 
Beiträge: 996
Registriert: 10. Okt 2008, 22:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon MmVisual » 12. Apr 2018, 00:06 Re: Splash Screen transparant?

Hm ... kann man irgendwie ein Bild mit Alpha-Kanal auch darstellen?
Mit SetShape wird nur der Ausschnitt ausgeschnitten, wenn ich jedoch einen Alpha Farbverlauf ins Durchsichtige machen will, wie geht das?
Am besten wäre wenn sich das Formular auf "Durchsichtig" stellt und nur sich das TImage mit dem PNG Bild zeigt.

Der Hintergrund vom Splash-Formular habe ich dunkelblau gemacht damit man sieht wie das Formular ausgeschnitten ist, der Hellgraue Farbverlauf ist im Bild.

Bild1.png


EleLa_Verlauf.png


Dankeschön, grüße Markus
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
MmVisual
 
Beiträge: 996
Registriert: 10. Okt 2008, 22:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon Warf » 12. Apr 2018, 00:41 Re: Splash Screen transparant?

Kurze Antwort: Nicht so einfach. Bei Transparenz lieber bei harten kanten bleiben, sonst brauchst du OpenGL o.ä.

Ich hätte aber einen quick and dirty hack der eventuell besser funktionieren könnte. Über die Unit LazIntf kann man sich den Desktop Handle über GetDC(0); holen, dann mit einem Canvas Objekt darauf Zeichnen. Ich weiß nicht wie gut das Transparenz unterstützt und weiß nicht einmal ob das unter Linux geht (unter OSX glaube ich nicht, unter Windows auf jeden Fall), aber das ist schnell gemacht. Muss aber ständig neu gezeichnet werden (z.B. in einem Timer) denn der Hintergrund ändert sich ja stetig. Ist nicht schön, funktioniert aber.
Warf
 
Beiträge: 985
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon MmVisual » 12. Apr 2018, 06:37 Re: Splash Screen transparant?

Ich habe gestern Abend einige Stunden damit verbracht was zu finden mit den Lazarus eigenen Mitteln, geht leider nicht. Schade.

Ich muss nur deshalb ein Splash Screen zeigen weil die EXE im Raspberry ca 12 Sekunden braucht bis nur die Steuerelemente erzeugt wurden. Damit man überhaupt was sieht und nicht verzweifelt.
Zusätzlich extra viel Rechenleistung zu verbraten ist nicht wirklich der richtige Weg, daher belasse ich es besser beim "einfachen" Transparent mode.

Dankeschön nochmals!
MmVisual
 
Beiträge: 996
Registriert: 10. Okt 2008, 22:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon Mathias » 12. Apr 2018, 15:50 Re: Splash Screen transparant?

Guck dir dies mal an, die sollte sogar mit Bitmap gehen.

http://wiki.freepascal.org/LCL_Tips/de# ... _erstellen
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Mathias » 12. Apr 2018, 16:45 Re: Splash Screen transparant?

Kurze Antwort: Nicht so einfach. Bei Transparenz lieber bei harten kanten bleiben, sonst brauchst du OpenGL o.ä.

Wie willst du dies mit OpenGL lösen ?

Mit folgendem Befehl, kann ich den Hintergrund nicht transparent machen.
Code: Alles auswählen
  glClearColor(0.0, 0.0, 0.0, 0.0); // Hintergrundfarbe

Ausser in eine Frame/Textur-Buffer, aber diesen muss ich auch auf den BS bringen, und dort gibt ist die Transparent nicht.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon Warf » 12. Apr 2018, 17:35 Re: Splash Screen transparant?

Mathias hat geschrieben:Wie willst du dies mit OpenGL lösen ?

Mit folgendem Befehl, kann ich den Hintergrund nicht transparent machen.
Code: Alles auswählen
  glClearColor(0.0, 0.0, 0.0, 0.0); // Hintergrundfarbe

Ausser in eine Frame/Textur-Buffer, aber diesen muss ich auch auf den BS bringen, und dort gibt ist die Transparent nicht.


Ja einfach ist auch das nicht, hier ist ein C++ beispiel: https://stackoverflow.com/questions/405 ... background

Hardware beschläunigte frameworks wie .Net WPF oder Delphi FireMonkey können das glaube ich schon mit hausmitteln, sowas gibts für Lazarus aber leider nicht
Warf
 
Beiträge: 985
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon Mathias » 12. Apr 2018, 18:00 Re: Splash Screen transparant?

Dies habe ich vorhin auch ergoogelt, ist nur win32.

Man müsste es hinkriegen, das der Canvas transparent wird, aber wie ?
Dann würde es auch ohne OpenGL gehen.

Ein ganzes Form, funktioniert, aber dann werden die enthaltenen Komponnenten auch transparent.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon MmVisual » 12. Apr 2018, 18:21 Re: Splash Screen transparant?

TForm.Color := clNone;

... geht leider auch nicht, denn dann würde es schon genau das sein was ich brauche. Formular ist unsichtbar und das TImage nur noch sichtbar.
MmVisual
 
Beiträge: 996
Registriert: 10. Okt 2008, 22:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon MmVisual » 12. Apr 2018, 20:14 Re: Splash Screen transparant?

Mit dem Splash-Screen braucht EleLa nochmal 8 Sekunden länger zum Starten als ohne beim RaspberryPi :!:
Diese Idee war wohl doch nicht wirklich so toll. :(
Start-Zeit ohne Splash: 19 Sec und mit Splash 27 Sec.

Das einzige wäre wenn ich für den Splash Screen einen separaten Thread mache, vielleicht kann ich dann 2 Kerne nutzen (einer extra für den Splash-Screen). Geht das überhaupt?
MmVisual
 
Beiträge: 996
Registriert: 10. Okt 2008, 22:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon Mathias » 12. Apr 2018, 20:52 Re: Splash Screen transparant?

Aber mit einer statischen Form sollte es fast keine Verzögerung geben.

Ich habe sowas in der project.lpr so eingebaut:

Code: Alles auswählen
var
  StartForm: TForm;
 
begin
  StartForm := TForm.CreateNew(nil);
  StartForm.Show;
 
  Application.Title := 'Niveau-Anzeiger';
  RequireDerivedFormResource := True;
  Application.Initialize;
  Application.CreateForm(THauptForm, HauptForm);
  Application.CreateForm(TAnzeigerOptionenForm, AnzeigerOptionenForm);
 
  StartForm.Free;
  Application.Run;
end.

Natürlich muss du noch die StartForm mit dem Images bestücken, am besten dynamisch.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4342
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon MmVisual » 12. Apr 2018, 21:18 Re: Splash Screen transparant?

Ich kann drehen und machen wie ich will, der Splash kommt auf dem Windows Rechner ohne Verzögerung, der Raspberry braucht 8 Sekunden.
Nach dem "Application.Initialize" braucht es noch ein Application.Progessmessages, denn ansonsten wird das Bild nicht fertig gemalt.

Wenn ich den Splash in einem Thread zeige macht Lazarus es so dass dieser Thread die Windows Messages erhält und der Main App startet erst gar nicht, bzw. das ganze "hängt" sich auf. -> Taskmanager.


Edit: Die 8 Sekunden braucht meine Routine um das Transparent-Masken Bitmap zu errechnen...
MmVisual
 
Beiträge: 996
Registriert: 10. Okt 2008, 22:54
OS, Lazarus, FPC: Winux (L 1.6 FPC 3) | 
CPU-Target: 32/64Bit
Nach oben

Beitragvon Warf » 12. Apr 2018, 22:29 Re: Splash Screen transparant?

Mathias hat geschrieben:Dies habe ich vorhin auch ergoogelt, ist nur win32.

Man müsste es hinkriegen, das der Canvas transparent wird, aber wie ?
Dann würde es auch ohne OpenGL gehen.

Ein ganzes Form, funktioniert, aber dann werden die enthaltenen Komponnenten auch transparent.


Eine der tieferen Antworten beschreibt auch eine X11 Variante
Warf
 
Beiträge: 985
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

» Weitere Beiträge siehe nächste Seite »
Nächste

Zurück zu Komponenten und Packages



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste

porpoises-institution
accuracy-worried