![]() |
Form nicht rechteckig
Hallo,
ich möchte bei einem Projekt, an dem ich im Moment arbeite es möglich machen eine Form nicht rechteckig darzustellen. Von den Voreinstellungen her wird eine Form ja immer rechteckig dargestellt. Ich möchte jetzt im Prinzip wieder die Form so gestalten wie bisher, die Hintergrundgrafik (z.B. eine png) soll letztendlich die Umrisse der Form angeben (border=none). Ich hoffe man kann verstehen was ich meine. Auch wenn es nicht über eine PNG umsetzbar wäre ich für Lösungsvorschläge sehr dankbar. mfg KahPee |
Re: Form nicht rechteckig
Hallo,
Also wenn ich die richtig verstanden habe, willst Du z.B. eine Viereckige Form. Wenn es das ist, kannst Du die Größe doch einfach anpassen. Wenn Du was ganz anderes willst, brauchst Du dazu Spin Komponenten oder so. Gruß Jens |
Re: Form nicht rechteckig
Die Form hat doch mit der Größe nichts zu tun. IIRC gab es bei den Schweizern einen Code dazu, ansonsten lies Dich mal in Regions ein (SetWindowRgn und Konsorten).
[edit] ![]() |
Re: Form nicht rechteckig
kein ding, ganz einfach:
hier mal ein Bsp:
Delphi-Quellcode:
Du kannst beliebig viele Punkte ins Array packen... je nach dem was du als Form haben willst!
procedure TfrmMain.FormCreate(Sender: TObject);
var HR1 : Hrgn; P : array [0..3] of TPoint; begin P[0] := Point(0,0); P[1] := Point(0,100); P[2] := Point(100,0); P[3] := Point(0,0); HR1 := createPolygonRgn(P,4,ALternate); SetWindowRgn(Handle,HR1,True); end; LG Marco |
Re: Form nicht rechteckig
wenn man jetzt aber ein unförmiges Hintergrundbild hat, dann wird das sehr aufwendig. Bei mir handelt es sich um eine unregelmäßige ganz leichte Wellenlinie das wäre irre aufwendig da die ganzen Punkte einzugeben. Mal ganz davon abgesehen hätte man das gleiche Problem bei einem Kreis (obwohl dabei hätte man noch den VOrteil, dass man den per procedur erzeugen kann).
Gibt es noch andere Möglichkeitenß? |
Re: Form nicht rechteckig
Hi, lies mal diesen Thread, da ist ein Beispiel dabei, wie du deine Form auf Grundlage eines eigenne Bildes anpassen kannst.
![]() Grundlage ist aber wie bereits erwähnt Regions. Gruß oki |
Re: Form nicht rechteckig
Hallo, danke für den Hinweis zu transparenten Formen an dieser Stelle, bei weiterem Suchen ahbe ich dies hier gefunden
![]() Da ich Anfänger bin habe ich so meine Probleme den Code dort zu verstehen, allerdings wird mit der erwünschte Effekt in dem Projekt erfüllt. Als ich nun den Code testweise übernommen habe gab es allerdings auch nach anpassen von TImage1 (etc.) noch Probleme. Ich habe es also nicht selber umsetzten können. Liegt das evtl daran, dass ich DELPHI 4 benutze? Bzw. kann mir jemand evtl erklären wie das ganze aussehen müsste für Delphi 4. Vielen Dank schon für eure Hilfe mfg KahPee |
Re: Form nicht rechteckig
Woran hakt es denn? Evtl. könntest Du auch über die Verwendung von Turbo Delphi Explorer nachdenken, das ist kostenlos und moderner.
|
Re: Form nicht rechteckig
Dann lass doch deine Eckpunkte der Form mitels einer Funktion oder so berechnen. oder mach dir einmal die Arbeit und ermittle alle Punkte sofern das Bild gleich bleibt!
|
Re: Form nicht rechteckig
Das Problem bei der Sache ist, dass es Wahnsinn wäre die ganzen Punke manuell nachzuprüfen. Die Punkte sind unregelmäßig angeordnet und das sind nen paar hundert wenn nicht sogar ein paar Tausend.
Gibt es für Delphi 4 da keine halbwegs geeignete Variante? mfg Kahpee |
Re: Form nicht rechteckig
zeig doch mal ein Bilde, nach dem du die Form formen willst
|
Re: Form nicht rechteckig
Eine Grafik habe ich noch nicht, aber im Prinzip kann das alles mögliche sein.
nur mal so als beispiel was ich beim googlen gefunden habe: ![]() wahrscheinlich sehen die Grafiken für die ich das später brauche aber ganz anders aus. Da ich die Farbe des Hintergrundes der unsichtbar und durchklickbar sein soll aber frei wählen kann war die Variante auf der oben genannten Seite eigentlich eine recht schöne variable Lösung. Naja wenn das Delphi4 nicht kann hilft das alles nichts. mfg KahPee |
Re: Form nicht rechteckig
und das funzt nicht?
![]() Ansonste musste idhc wirklich langsam für nen Bild entscheiden und dann mal die Punkte auslesen. Bei deinem Beispiel wären das ganicht so viele. muss ja nicht jedes pixel angeben! Wenn es auch noch klickbar sein soll dann lege doch die buttons oder was auch immer aufs Image drauf! Dann gehts! |
Re: Form nicht rechteckig
Zitat:
ansonsten kann ich die Punkte schlecht Auslesen, die muss ich ja manuell bestimmten bei dem was mir vorschwebt, ist das manuelle glaube ich schon ein bisschen viel Arbeit wenn es denn gut aussehen soll am ende. |
Re: Form nicht rechteckig
|
Re: Form nicht rechteckig
Wie schon gesagt, mit TurboDelphi habe ich bisher noch nicht gearbeitet, aber es muss doch sowas in der Art auch für das Normale Delphi und PNGs geben..
|
Re: Form nicht rechteckig
Wo oben von TurboDelphi die Rede ist schmeiße ich mal eben eine Frage, die mir gekommen ist da zwischen:
Im Moment habe ich Delphi 4 - macht es da Sinn zu Turbo Delphi zu wechseln? Wen ich richtig informiert bin ist nur die Explorerversion kostenlos. Welche Vor-/Nachteile/Einschränkungen hätte ich wenn ich wechseln würde? Lässt sich das obige Problem mit der Explorerversion verwircklichen? Ist da eigentlich die Syntax eine andere? Ich wollte keinen neuen Thread aufmachen, da mich hier besonders der Bezug zu dem Problem interessiert (was nicht heißen soll das ich einer allgemeinen Übersicht gegenüber undankbar wäre). mfg KahPee edit: srry doppelpost |
Re: Form nicht rechteckig
Prinzipiell ist die Syntax die gleiche, allerdings gibt es ein paar Erweiterungen. Nachteile fallen mir von der Umgewöhnung einmal abgesehen spontan keine ein, außer dass sich in TDE keine Komponenten installieren lassen (zur Laufzeit nutzen aber schon).
|
Re: Form nicht rechteckig
Also ich will mir nicht alles jetzt durchlesen, aber kann es sein, daß du für dein Programmfenster eine Sonderform willst? Ist es das was du meinst?
Wenn ja, dann ist das an für sich nicht schwer, aber hier ein Tool das es ganz einfach macht: ![]() Lade dir das kleine Tool runter, lade die Grafik die du für deine Sonderform willst und laß daß Tool eine Unit mit einem Code berechnen und schreiben. Diese Unit bindest du in dein Programm ein, führst eine Funktion aus und dein Programm hat eine Sonderform. |
Re: Form nicht rechteckig
:gruebel: Was hat denn die Version vom User turboPASCAL mit TurboDelphi zu tun? Hast du dir den Link überhaupt angesehen?
|
Re: Form nicht rechteckig
Zitat:
Zitat:
Was ganz anderes: Gibt es eine Möglichkeit delphi 4 programme mit TurboDelphi weiter zuschreiben oder muss man die komplett neu schreiben? Vielen Dank schon mal.. Edit: Zitat:
Wenn es sinn machen sollte von Delphi 4 zu wechseln welches mir nahegelegt wurde: Zitat:
|
Re: Form nicht rechteckig
@KahPee
Hat sich das Thema geändert? Ich hab dir doch gerade ein Tool genannt wo du dein Problem in 30 Sekunden erledigen kannst. Willst du jetzt lieber Turbo Pascal programmieren? |
Re: Form nicht rechteckig
Zitat:
was muss ich machen beim Einbauen (uses Unit XYZ ist klar, aber was sonst [oder kommt dieses Thema in der Hilfe vor?])? Das Programm schneidet immer alles Weisse weg richtig? |
Re: Form nicht rechteckig
- GabesOddForm.exe starten
- deine Grafik öffnen (die Bereiche die später nicht sichtbar sein sollen, sollten weiß sein) - Bild scannen (Menü Image > Scan bitmap) - Datei UGabesOddForm.pas in deinem Projektordner speichern (Menü File > Save Source...) - Unit UGabesOddForm unter Uses eintragen - Prozedur in TForm1.FormCreate aufrufen: CreateOddWindow(form1.Handle, False); - Fertig |
Re: Form nicht rechteckig
Vielen Dank werde das mal zuHause austesten. Da hat jemand saubere arbeit geleistet...
|
Re: Form nicht rechteckig
Das ist ein echt Tolle Tool!
|
Re: Form nicht rechteckig
Liste der Anhänge anzeigen (Anzahl: 2)
Ich hatte das ganze mal folgendermassen gelöst, das Teil ist auch noch Win9x kompatibel:
Delphi-Quellcode:
//...
function TForm1.SetWndRegionFromImg(Bmp: TBitmap; TransparentColor: TColor): Boolean; type TTransColState = (trsOn, trsOff); TRGBQuadArray = array[WORD] of Cardinal; pRGBQuadArray = ^TRGBQuadArray; var TransColState: TTransColState; x, y: Integer; line: Integer; count: Integer; rgn, nrgn: THandle; pPixelArray: pRGBQuadArray; begin Result := TRUE; if Bmp.PixelFormat <> pf32Bit then Bmp.PixelFormat := pf32Bit; count := 0; line := 0; rgn := CreateRectRGN(0, 0, 0, 0); // First Init Region nrgn := rgn; for y := 0 to Bmp.Height - 1 do begin pPixelArray := Bmp.Scanline[y]; TransColState := trsOff; for x := 0 to Bmp.Width - 1 do begin if pPixelArray[x] <> COLORREF(TransparentColor) then begin if TransColState = trsOff then begin TransColState := trsOn; line := x - 1; inc(line); end; end else begin if TransColState = trsOn then begin TransColState := trsOff; if count < 4096 then begin nrgn := CreateRectRgn(line, y, x, y + 1); CombineRgn(Rgn, Rgn, nRgn, RGN_OR); inc(Count); end else begin ShowMessage('Debuginfo: To many Regions. Count of Rgn: '#9 + IntToStr(Count)); Application.Terminate; end; end; end; end; end; SetWindowRgn(Handle, Rgn, TRUE); DeleteObject(Rgn); DeleteObject(nRgn); end; procedure TForm1.FormCreate(Sender: TObject); const LWA_COLORKEY = 1; // Use crKey as the transparency color. LWA_ALPHA = 2; // Use bAlpha to determine the opacity of the layered window.. USER32DLL = 'user32.dll'; var _SetLayeredWindowAttributes: function(hWnd: THandle; TRansparentColor: COLORREF; AlphaValue: Byte; Flags: Cardinal): BOOL; stdcall; var hLib: THandle; begin Self.Color := clFuchsia; Self.BorderStyle := bsNone; if not (Image1.Picture.Graphic is TBitmap) then begin ShowMessage('Fehler: Image muss ein Bitmap sein !'); Application.Terminate; end; hLib := LoadLibrary(USER32DLL); @_SetLayeredWindowAttributes := GetProcAddress(hLib, 'SetLayeredWindowAttributes'); if @_SetLayeredWindowAttributes <> nil then begin SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) or WS_EX_LAYERED); _SetLayeredWindowAttributes(Self.Handle, COLORREF(clFuchsia), 250, LWA_COLORKEY or LWA_ALPHA); end else begin // alternative, im falle das es SetLayeredWindowAttributes nicht gibt SetWndRegionFromImg(Image1.Picture.Bitmap, clFuchsia); end; FreeLibrary(hLib); end; //... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:14 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