Das hier ist für Windows Fans 'ne Möglichkeit 100% echte Non-Standard GUI zu zaubern. Mit einem oder sehr vielen PNG's.
(Zugegeben, in Bezug auf Standard Programme ist das eher mit 'nem Augenzwinkern zu verstehen...grins...)
Wie man das unter Linux macht hab' ich noch nicht herausgefunden...
Code: Alles auswählen
Unit uTEST;
{$mode objfpc}{$H+}
Interface
Uses
Windows, Messages, Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
ExtCtrls;
Type
TForm1 = Class(TForm)
Procedure FormClose(Sender: TObject; Var CloseAction: TCloseAction);
Procedure FormCreate(Sender: TObject);
Private
Public
End;
Var
Form1: TForm1;
Blendfunction : TBlendFunction;
point_PNGPosition : TPoint;
size_PNG : TSize;
dword_exStyle : DWORD;
Bild : TPicture;
Function UpdateLayeredWindow(hwnd: HWND; hdcDst: HDC; pptDst: PPoint; psize: PSize; hdcSrc: HDC; pptSrc: PPoint; crKey: TColor; pblend: PBlendFunction; dwFlags: DWORD): BOOL; stdcall; external 'user32';
Implementation
{$R *.lfm}
Procedure TForm1.FormCreate(Sender: TObject);
Begin
Bild := TPicture.Create;
Bild.LoadFromFile('Bild.png');
// Funzt genauso mit TImage...
dword_exStyle := GetWindowLongA(Form1.Handle, GWL_EXSTYLE);
If (dword_exStyle And WS_EX_LAYERED = 0)
Then SetWindowLong(Form1.Handle, GWL_EXSTYLE, dword_exStyle Or WS_EX_LAYERED Or WS_EX_TOPMOST);
point_PNGPosition := Point(0, 0);
size_PNG.cx := Bild.Width;
size_PNG.cy := Bild.Height;
Blendfunction.BlendOp := AC_SRC_OVER;
Blendfunction.BlendFlags := 0;
Blendfunction.SourceConstantAlpha := 255;
Blendfunction.AlphaFormat := AC_SRC_ALPHA;
UpdateLayeredWindow(Form1.Handle, 0, Nil, @size_PNG, Bild.Bitmap.Canvas.Handle, @point_PNGPosition, 0, @Blendfunction, ULW_ALPHA);
End;
Procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
Begin
FreeAndNil(Bild);
End;
End.
Die Windows API erwartet einen premultiplied AlphaKanal damit die Transparenz funktioniert.
Mit GIMP geht das so:
Premultiplied PNG
=================
3 einfache Schritte:
(Auswahl speichern, schwarze Ebene dahinter, Ebenenmaske erstellen)
1. Bild laden
2. Auswahl aus Alpha-Kanal
3. Auswahl speichern (im Kanal)
4. Nichts auswählen
5. Neue 100% schwarze Ebene hinter bzw. unter das Bild legen
6. Rechtsklick auf das Bild - nach unten vereinen
7. Kanal anklicken - Auswahl aus Kanal (gespeicherte Auswahl)
8. Bild Rechtsklick - Ebenenmaske hinzufügen (Auswahl anklicken)
9. Speichern (Exportieren als PNG)
Funzt genauso in Photoshop...
=============================
Und sei es nur mal für einen Splash-Screen... grins...
Wie heißt das noch gleich.. ich glaub' alphablended translucency...
Das Nonplusultra für jede GUI, wenn man Zeit hat und ein Bastlerherz...