AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Eigenes Formlayout

Ein Thema von Tommy1988 · begonnen am 31. Aug 2007 · letzter Beitrag vom 19. Sep 2007
Antwort Antwort
Seite 1 von 2  1 2      
Tommy1988
(Gast)

n/a Beiträge
 
#1

Eigenes Formlayout

  Alt 31. Aug 2007, 20:05
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.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Eigenes Formlayout

  Alt 31. Aug 2007, 20:07
Doch sollte so gehen
Markus Kinzler
  Mit Zitat antworten Zitat
EDatabaseError

Registriert seit: 11. Mai 2005
Ort: Göppingen
1.238 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Eigenes Formlayout

  Alt 31. Aug 2007, 20:08
Schau mal hier im Forum nach Alpha PNG Form (oder so ähnlich müsste in OS liegen)

perfektes Beispiel
Tobias
It's not a bug, it's a feature.
  Mit Zitat antworten Zitat
Benutzerbild von Rastaman
Rastaman

Registriert seit: 6. Jan 2005
Ort: Lübbecke
575 Beiträge
 
Turbo C++
 
#4

Re: Eigenes Formlayout

  Alt 31. Aug 2007, 20:19
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
Chuck Norris has counted to infinity ... twice!
  Mit Zitat antworten Zitat
Progman

Registriert seit: 31. Aug 2007
Ort: 99974 MHL
695 Beiträge
 
Delphi 10.1 Berlin Starter
 
#5

Re: Eigenes Formlayout

  Alt 31. Aug 2007, 20:27
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
Karl-Heinz
Populanten von Domizilen mit fragiler, transparenter Aussenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
(Wer im Glashaus sitzt sollte nicht mit Steinen werfen)
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Eigenes Formlayout

  Alt 31. Aug 2007, 22:11
Hi Progman,
erst mal herzlich willkommen in der 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
42
  Mit Zitat antworten Zitat
Progman

Registriert seit: 31. Aug 2007
Ort: 99974 MHL
695 Beiträge
 
Delphi 10.1 Berlin Starter
 
#7

Re: Eigenes Formlayout

  Alt 1. Sep 2007, 11:30
@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
Karl-Heinz
Populanten von Domizilen mit fragiler, transparenter Aussenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
(Wer im Glashaus sitzt sollte nicht mit Steinen werfen)
  Mit Zitat antworten Zitat
Progman

Registriert seit: 31. Aug 2007
Ort: 99974 MHL
695 Beiträge
 
Delphi 10.1 Berlin Starter
 
#8

Re: Eigenes Formlayout, Nachtrag

  Alt 1. Sep 2007, 11:33
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*
Karl-Heinz
Populanten von Domizilen mit fragiler, transparenter Aussenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
(Wer im Glashaus sitzt sollte nicht mit Steinen werfen)
  Mit Zitat antworten Zitat
oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Eigenes Formlayout

  Alt 1. Sep 2007, 11:38
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

Und ich hoffe ich habe es richtig verstanden.

Gruß oki
42
  Mit Zitat antworten Zitat
Progman

Registriert seit: 31. Aug 2007
Ort: 99974 MHL
695 Beiträge
 
Delphi 10.1 Berlin Starter
 
#10

Re: Eigenes Formlayout

  Alt 1. Sep 2007, 11:40
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.
Karl-Heinz
Populanten von Domizilen mit fragiler, transparenter Aussenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
(Wer im Glashaus sitzt sollte nicht mit Steinen werfen)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:52 Uhr.
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