Avatar billede Max Novice
30. maj 2002 - 00:45 Der er 13 kommentarer og
1 løsning

Meget custom form..

Hej igen alle..

Jeg har et spørgsmål, som nok er en sammenstykning af flere spørgsmål. Det bliver muligvis lidt langhåret, men jeg udlover 200 points til den der kan give mig et stykke brugbart kode.

Jeg vil gerne have lavet en borderless form. Det i sig selv skulle ikke være så svært, men den skal kunne strækkes ved at trække i kanterne, ligesom en almindelig form. Ud over det skal den kunne trækkes rundt på skærmen ved at 'gribe fat' i en komponent på formen, f.eks. et billede, så det virker som en erstatning for title-bar'en.

Formålet er at lave en 'skinned' applikation som f.eks. Winamp og Trillian.

Håber jeg har formuleret mig forståeligt.

Mvh.
/Mnc
Avatar billede Max Novice
30. maj 2002 - 00:49 #1
.. æh.. og : noget af formen skal være transparent, f.eks. formen er oval..
Lav venligst kommentarer til koden.

That's all..

/Mnc
Avatar billede hermandsen Juniormester
30. maj 2002 - 01:01 #2
Prøv at starte med det her...

procedure TFormParabel.FormCreate(Sender: TObject);
var
  State: LongInt;
begin
  State := GetWindowLong(Handle, gwl_Style);
  if (State and ws_Caption) = ws_Caption then
  begin
    case BorderStyle of
      bsSingle, bsSizeable:
        SetWindowLong(Handle, gwl_Style, State and (not ws_Caption) or ws_border);
      bsDialog:
        SetWindowLong(Handle, gwl_Style, State and (not ws_Caption) or ds_modalframe or ws_dlgframe);
    end;

    height := height - getSystemMetrics(sm_cyCaption);
    refresh;
  end;
end;
Avatar billede Max Novice
30. maj 2002 - 01:16 #3
Ok, det var da en Borderless form, så langt var jeg også kommet. Jeg var nu mere ude efter hele baljen, med Drag og Transparency.. Men takker alligevel.
Avatar billede hermandsen Juniormester
30. maj 2002 - 01:39 #4
I Delphi 6 kan du gøre din form gennemsigtig/halvgennemsigtig...

procedure TForm1.FormCreate(Sender: TObject);
begin
  Self.AlphaBlend := True;
  Self.AplhaBlendValue := 128;
end;

Husk på at det kun virker i win2k og frem...

Her har du opskriften på en femkantet form:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Buttons;

type
  TForm1 = class(TForm)
    SpeedButton1: TSpeedButton;
    procedure FormCreate(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
  private
    FRegion: THandle;
    procedure FreeRegion;
public
  procedure CreateParams(var Params: TCreateParams); override;
end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  Params.Style := WS_POPUP or WS_BORDER and not WS_MINIMIZE;
end;

procedure TForm1.FreeRegion;
begin
  if FRegion <> 0 then
  begin
    SetWindowRgn(Handle, 0, True);
    DeleteObject(FRegion);
    FRegion := 0;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
type
  TPointsArray = array[0..4] of TPoint;

var
  pa: TPointsArray;
begin
  FreeRegion;

  with ClientRect do
  begin
    pa[0] := Point(Left + 50, Bottom);
    pa[1] := Point(Left + 1, Top + Bottom div 2);
    pa[2] := Point(Left + Right div 2, Top);
    pa[3] := Point(Right, Top + Bottom div 2);
    pa[4] := Point(Right - 50, Bottom);

    FRegion := CreatePolygonRgn(pa, 5, ALTERNATE);
  end;

  if FRegion <> 0 then
    SetWindowRgn(Handle, FRegion, True);
end;

end.
Avatar billede Max Novice
30. maj 2002 - 01:40 #5
Ok, jeg tror - nej jeg ved - at jeg har fundet det.. Jeg har lavet en Shape og gjort følgende :

procedure TFormCustom.Shape1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  SendMessage(FormCustom.Handle,wm_SysCommand,$f012,0);
end;

Så er der bare transparency tilbage, og den er ikke svær..
Lukker spørgsmålet, tak for hjælpen hermandsen.
Avatar billede Max Novice
30. maj 2002 - 01:42 #6
F*ck, ok, min linie kører langsom.. Fik skrevet den sidste besked inden jeg fik set din sidste.. Lukker ikke alligevel.. Giv mig lige et øjeblik til at læse den igennem..
Avatar billede hermandsen Juniormester
30. maj 2002 - 01:44 #7
Hehe.... Yes yes... :)
Avatar billede Max Novice
30. maj 2002 - 01:48 #8
Hmmm... Win2k og frem.. Hvad gør en Win98 bruger så?
Avatar billede hermandsen Juniormester
30. maj 2002 - 01:54 #9
Kan ikke bruge det... :)

Den gør bare formen gennemsigtig, altså ingen huller i formen, og så vidt jeg forstod, så var det hvad du ville have... Det kan du også sagtens, men i Win98 kan du ikke lave formen halvgennemsigtig... Så skal du i hvert fald i gang med noget RET hardcore kode, og det tvivler jeg meget på du har lyst til... Du skal overtage alt styring med tegning af din form...

En af mine kammerater lavede en gang hans form "halvgennemsigtig" i win98, men det var ved at fjerne hver anden pixel... Problemet med det var bare at hvis man trykkede på en af de fjernede pixels, så blev det opfattet som et klik på skrivebordet... :(
Avatar billede Max Novice
30. maj 2002 - 01:57 #10
Ok, giv mig et øjeblik mere.. Hvis jeg får stykket dét her sammen, går pointsene ubeskåret til dig..
Avatar billede Max Novice
30. maj 2002 - 01:58 #11
Mens du venter, ved jeg at der er et ret interessant spørgsmål om Listboxe hér på Experten, som ikke er blevet lukket endnu... ;-)
Avatar billede hermandsen Juniormester
30. maj 2002 - 02:06 #12
Hehe... Jeg er i gang... ;)
Avatar billede Max Novice
30. maj 2002 - 02:10 #13
Well, der er ikke så meget at diskutere. Jeg har hvad jeg skal bruge. Tak for hjælpen endnu en gang, pointsene kommer hér! Enjoy..
;-)
Avatar billede hermandsen Juniormester
30. maj 2002 - 02:23 #14
Hehe... Selv tak! :)

Jeg har også kastet et svar til dit problem med din ListBox, men det har du sikkert opdaget! ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester