![]() |
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. |
Re: Eigenes Formlayout
Hi Progman,
hab deinen Zwischenpost verpasst. Die Titelleiste kannst du mit ausblenden. Nehm als Start-Region nicht nur das Bitmap, sondern das gesamte Form-Rect. Dann kompinierts du dieses mit Client-Rect (oder BitmapRect), oder ohne alles :gruebel: , und machst weiter wie gehabt. Gruß oki |
Re: Eigenes Formlayout
Und schon wieder einen Post verpasst!!
Jooop, das das Thema mit dem moven kenne ich. Benutze ich bei meinen eigenen Controls incl. Größenänderung. Gruß oki |
Re: Eigenes Formlayout
|
Re: Eigenes Formlayout
Jo, sieht gut aus!
entsprechende Schließbutton etc. kann man dann ja auf dem Bitmap platzieren. Ist das Bitmap eigentlich selbt entworfen? Wenn ja, welches Grafikprogramm nutzt du? Gruß Oki |
Re: Eigenes Formlayout
@oki: Das Bitmap hab ich nur mal schnell zusammen gebaut mit Photoshop. Das waren ursprünglich Teile eines Webtemplates, die ich dafür "mißbraucht" habe *g*
|
Re: Eigenes Formlayout
Bist du auf diesem Gebiet fitt? Ich tu mich immer ein bischer schwer damit.
Gruß oki |
Re: Eigenes Formlayout
:gruebel: uiuiui^^ kann nur schwer staunen :D
eine frage: wie kann man nun einen Button dem hintergrund der form anpassen? denn dieses grau passt da net so ganz rein ;) |
Re: Eigenes Formlayout
Es gibt auch verschiedene FormImage-Komponenten, die das können.
Manche sind besser, andere wieder nicht so gut. Schaust Du einfach mal bei torry.net. Ich habe gute Erfahrungen mit TKAFormImage gemacht, die läuft sogar mit Delphi2007. ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:35 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