Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Eigenes Formlayout (https://www.delphipraxis.net/98759-eigenes-formlayout.html)

Tommy1988 31. Aug 2007 20:05


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.

mkinzler 31. Aug 2007 20:07

Re: Eigenes Formlayout
 
Doch sollte so gehen

EDatabaseError 31. Aug 2007 20:08

Re: Eigenes Formlayout
 
Schau mal hier im Forum nach Alpha PNG Form (oder so ähnlich müsste in OS liegen)

perfektes Beispiel

Rastaman 31. Aug 2007 20:19

Re: Eigenes Formlayout
 
Geht einfacher ;)

Delphi-Quellcode:
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)
);
Dann im onCreate
Delphi-Quellcode:
var
  Rgn : HRGN;
begin
  Rgn := CreatePolygonRgn(RgnPoints,  High(RgnPoints), ALTERNATE);
  SetWindowRgn(Handle, Rgn, True);
end;
Fertig :)

Progman 31. Aug 2007 20:27

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

oki 31. Aug 2007 22:11

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

Progman 1. Sep 2007 11:30

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

Progman 1. Sep 2007 11:33

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*

oki 1. Sep 2007 11:38

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

Progman 1. Sep 2007 11:40

Re: Eigenes Formlayout
 
und nochwas:
Umd das Form zu verschieben, im MouseDown eintragen:
Delphi-Quellcode:
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;
Dann kann man die Sache mit Klick auf den sichtbaren Bereich verschieben.
Wenn gewünscht, mach ich mal ne kleine Demo dazu.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:28 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz