Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Form nicht rechteckig (https://www.delphipraxis.net/135484-form-nicht-rechteckig.html)

KahPee 11. Jun 2009 17:08


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

Jens Hartmann 11. Jun 2009 17:10

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

DeddyH 11. Jun 2009 17:34

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] Code bei den Schweizern [/edit]

SimStar001 11. Jun 2009 17:39

Re: Form nicht rechteckig
 
kein ding, ganz einfach:

hier mal ein Bsp:

Delphi-Quellcode:
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;
Du kannst beliebig viele Punkte ins Array packen... je nach dem was du als Form haben willst!


LG Marco

KahPee 12. Jun 2009 06:23

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ß?

oki 12. Jun 2009 06:38

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.

transprent Form

Grundlage ist aber wie bereits erwähnt Regions.

Gruß oki

KahPee 15. Jun 2009 12:45

Re: Form nicht rechteckig
 
Hallo, danke für den Hinweis zu transparenten Formen an dieser Stelle, bei weiterem Suchen ahbe ich dies hier gefunden
Delphi Tutorial - Shaping a Form around a Bitmap (Englisch)

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

DeddyH 15. Jun 2009 12:48

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.

SimStar001 15. Jun 2009 12:49

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!

KahPee 15. Jun 2009 12:56

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

SimStar001 15. Jun 2009 12:57

Re: Form nicht rechteckig
 
zeig doch mal ein Bilde, nach dem du die Form formen willst

KahPee 15. Jun 2009 13:04

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:
Bild

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

SimStar001 15. Jun 2009 13:08

Re: Form nicht rechteckig
 
und das funzt nicht? Link

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!

KahPee 15. Jun 2009 13:21

Re: Form nicht rechteckig
 
Zitat:

Zitat von SimStar001
und das funzt nicht? Link

Wie oben schon beschrieben habe ich das nicht hinbekommen (da fehlen iwelche dateien). Evtl kann mir ja jemand einmal nen funktionierendes Proejtk mit der Variante schicken und ich gucke ob es auch unter Delphi 4 läuft.

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.

Mithrandir 15. Jun 2009 13:41

Re: Form nicht rechteckig
 
Und das Programm von turboPASCAL haste schon probiert?

KahPee 15. Jun 2009 13:48

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..

KahPee 15. Jun 2009 14:13

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

DeddyH 15. Jun 2009 14:20

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).

Popov 15. Jun 2009 14:27

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:

http://www.informatics.no/progvareOF.htm

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.

Mithrandir 15. Jun 2009 14:29

Re: Form nicht rechteckig
 
:gruebel: Was hat denn die Version vom User turboPASCAL mit TurboDelphi zu tun? Hast du dir den Link überhaupt angesehen?

KahPee 15. Jun 2009 14:31

Re: Form nicht rechteckig
 
Zitat:

Zitat von DeddyH
Prinzipiell ist die Syntax die gleiche, allerdings gibt es ein paar Erweiterungen.

Wenn ich diese Erweiterungen von Anfang an nicht kenne gibt das dann Problem für mich oder kann ich einfach wie vorher weitermachen?
Zitat:

außer dass sich in TDE keine Komponenten installieren lassen (zur Laufzeit nutzen aber schon).
TDE? Ich steh gerade auf dem schlauch was das genau ist, wobei ich mir das glaube ich denken kann. Reichen die mitgelieferten Komponenten aus? Bzw. sind die vielen (vorsicht ironie) Komponenten von Delphi 4 vorhanden, sodass ich keine Möglichkeiten bei einem Wechsel einbüße?
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:

Zitat von Daniel G
:gruebel: Was hat denn die Version vom User turboPASCAL mit TurboDelphi zu tun? Hast du dir den Link überhaupt angesehen?

Hast recht, das hat mich iritiert, dachte das das durch TurboDelphi geproggt wurde. allerdings habe ich den Link angeguckt. wenn ich die Projektdatei versuche zu öffnen bekomme ich aber immer den Fehler "ungültiges Streamformat".
Wenn es sinn machen sollte von Delphi 4 zu wechseln welches mir nahegelegt wurde:
Zitat:

Zitat von DeddyH
Woran hakt es denn? Evtl. könntest Du auch über die Verwendung von Turbo Delphi Explorer nachdenken, das ist kostenlos und moderner.

würde ich das abgesehen davon trotzdem in erwägung ziehen

Popov 15. Jun 2009 14:40

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?

KahPee 15. Jun 2009 14:45

Re: Form nicht rechteckig
 
Zitat:

Zitat von Popov
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:

http://www.informatics.no/progvareOF.htm

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.

Hab nur den Link angesehen, das sieht soweit schon mal ganz gut aus... Vielen Dank dafür.
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?

Popov 15. Jun 2009 14:55

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

KahPee 15. Jun 2009 15:10

Re: Form nicht rechteckig
 
Vielen Dank werde das mal zuHause austesten. Da hat jemand saubere arbeit geleistet...

SimStar001 15. Jun 2009 15:21

Re: Form nicht rechteckig
 
Das ist ein echt Tolle Tool!

turboPASCAL 15. Jun 2009 17:26

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