![]() |
Eigenes Formlayout
Hallo, wie kann ich mir ein Formular mit einer speziellen Form basteln?
Sprich: es soll z.B. die Form eines U's haben, anklickbar oder verschiebbbar soll es dann natürlich nur an den U-Stellen sein. Ich dachte zuerst mit einem Bild was aussieht wie ein U, und das Form dann Transparent machen. Aber das geht so nicht. |
Re: Eigenes Formlayout
Doch sollte so gehen
|
Re: Eigenes Formlayout
Schau mal hier im Forum nach Alpha PNG Form (oder so ähnlich müsste in OS liegen)
perfektes Beispiel |
Re: Eigenes Formlayout
Geht einfacher ;)
Delphi-Quellcode:
Dann im onCreate
const
RgnPoints : array[1..21] of TPoint = ( (X:1;Y:5), (X:1;Y:321), (X:9;Y:348), (X:27;Y:370), (X:49;Y:385), (X:86;Y:393), (X:124;Y:393), (X:168;Y:386), (X:200;Y:361), (X:215;Y:334), (X:221;Y:315), (X:221;Y:6), (X:169;Y:6), (X:169;Y:306), (X:158;Y:325), (X:141;Y:333), (X:110;Y:336), (X:84;Y:332), (X:63;Y:323), (X:53;Y:310), (X:53;Y:5) );
Delphi-Quellcode:
Fertig :)
var
Rgn : HRGN; begin Rgn := CreatePolygonRgn(RgnPoints, High(RgnPoints), ALTERNATE); SetWindowRgn(Handle, Rgn, True); end; |
Re: Eigenes Formlayout
Ein Form einem Bitmap anpassen:
Delphi-Quellcode:
//Declaration in TForm: private HG: TBitmap; FRegion: THandle; function CreateRegion(Bmp: TBitmap): THandle; end; var frmMain: TfrmMain; implementation {$R *.dfm} function TfrmMain.CreateRegion(Bmp: TBitmap): THandle; var X, Y, StartX: Integer; Excl: THandle; Row: PRGBArray; TransparentColor: TRGBTriple; begin Bmp.PixelFormat := pf24Bit; Result := CreateRectRGN(0, 0, Bmp.Width, Bmp.Height); for Y := 0 to Bmp.Height - 1 do begin Row := Bmp.Scanline[Y]; StartX := -1; if Y = 0 then TransparentColor := Row[0]; for X := 0 to Bmp.Width - 1 do begin if (Row[X].rgbtRed = TransparentColor.rgbtRed) and (Row[X].rgbtGreen = TransparentColor.rgbtGreen) and (Row[X].rgbtBlue = TransparentColor.rgbtBlue) then begin if StartX = -1 then StartX := X; end else begin if StartX > -1 then begin Excl := CreateRectRGN(StartX, Y, X + 1, Y + 1); try CombineRGN(Result, Result, Excl, RGN_DIFF); StartX := -1; finally DeleteObject(Excl); end; end; end; end; if StartX > -1 then begin Excl := CreateRectRGN(StartX, Y, Bmp.Width, Y + 1); try CombineRGN(Result, Result, Excl, RGN_DIFF); finally DeleteObject(Excl); end; end; end; end; procedure TfrmMain.FormCreate(Sender: TObject); begin DoubleBuffered:=True; HG:=TBitmap.Create; HG.LoadFromFile('dein Pfad und dein Bild.bmp'); //Breite und Höhe den Bildmaßen anpassen ClientWidth:=HG.Width; ClientHeight:=HG.Height; //erzeugen einer Region, als Transparentfarbe wird die Farbe des ersten Picels oben links verwendet FRegion := CreateRegion(HG); SetWindowRGN(Handle, FRegion, True); ..... end; procedure TfrmMain.FormDestroy(Sender: TObject); begin HG.Free; end; procedure TfrmMain.FormPaint(Sender: TObject); begin BitBlt(Canvas.Handle,0,0,ClientWidth,ClientHeight,HG.Canvas.Handle,0,0,SRCCOPY); end; //so kann man ein Form einem Bitmap anpassen |
Re: Eigenes Formlayout
Hi Progman,
erst mal herzlich willkommen in der DP :dp: Dein vorgestellter Code sieht sehr interessant aus. Beim ersten überfliegen hab ich folgendes verstanden: - Bitmap als Region, - Hintergrundfarbe transparent. Meine Frage dabei ist, kombinierst du die Region nur auf das viereckige Bitmap, oder blendest du auch den Transparenten Bereich aus? Könntest du deinen Ansatz etwas näher erleutern? Gruß oki |
Re: Eigenes Formlayout
@oki:
Der transparente Bereich wird ausgeblendet. Angenommen, das Bitmap enthält ein großes blaues "U" auf weißem Grund, dann wird weiß als transparent genommen und dein Form hat das Aussehen des "U". Wichtig ist nur, dass Grafiken für solche Zwecke scharfe Grenzen haben sollten. Unscharfe Ränder, wie sie manchmal von Zeichenprogrammen gemacht werden geben unschöne Effekte am Rand. Aber Ansonsten funzt das ganz gut, sogar unter Vista ;) |
Re: Eigenes Formlayout, Nachtrag
Nur nicht vergessen, im Objectinspector den Borderstyle des Forms auf bsNone zu setzen, sonst ist die Captionleiste noch zu sehen, das stört dann doch meist *g*
|
Re: Eigenes Formlayout
Hi Progman,
Ich glaube folgendes entdekt zu haben: - es wird ein Region mit den Abmessungen des Bitmaps erstellt. Dann wird das Bitmap zeilenweise abgetastet und für jedes Pixel CombineRGN jenach Transparenz / Farbe des Pixels erstellt. Also Width*Hight CombineRGN's. Somit bleibt als Resultat eine Region übrig, die alles enthält außer der Bereiche die im Bild transparent sind. Cool :thumb: Und ich hoffe ich habe es richtig verstanden. Gruß oki |
Re: Eigenes Formlayout
und nochwas:
Umd das Form zu verschieben, im MouseDown eintragen:
Delphi-Quellcode:
Dann kann man die Sache mit Klick auf den sichtbaren Bereich verschieben.
procedure TfrmMain.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer); begin if Button <> mbLeft then Exit; ReleaseCapture; SendMessage(Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0); end; Wenn gewünscht, mach ich mal ne kleine Demo dazu. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:16 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 by Thomas Breitkreuz