CoolForm w Delphi (dla początkujących)

Kintaro
Ten artykuł wymaga dopracowania!

Jeżeli możesz popraw ten artykuł według zaleceń, które możesz znaleźć na stronie Artykuły do poprawy. Po dopracowaniu tego tekstu można usunąć ten komunikat.

# Zmiana kształtu formularza

Najprostszy sposób to:
#na formularzu wstaw TImage, ładujemy do niego obrazek, a następnie powiększamy go tak aby był całkowicie widoczny.
#zaznaczamy odpowiednie punkty (współrzędne) wyznaczające krawędzie obrazka. To znaczy, gdy obrazek to kwadrat i jest umieszczony w lewym górnym rogu, to współrzędne w kolejności to:
Indeks
Wartość
1 [0, 0]
2 [długość_boku, 0]
3 [długość_boku, długość_boku]
4 [0, długość_boku]
5 [0, 0] (aby zapełnić cały kwadrat, tak postępujemy z całym obrazkiem)

#gdy już mamy współrzędne to ustawiam właściowości formularza BorderStyle na bsNone
#w zdarzeniu OnCreate formularza wpisujemy kod:

var
  A: array [0 .. 8] of TPoint;
  Z: HRGN;
begin
  A[0].X := 68;
  A[0].Y := 44;
  A[1].X := 125;
  A[1].Y := 0;
  A[2].X := 516;
  A[2].Y := 222;
  A[3].X := 462;
  A[3].Y := 271;
  A[4].X := 409;
  A[4].Y := 420;
  A[5].X := 423;
  A[5].Y := 431;
  A[6].X := 400;
  A[6].Y := 447;
  A[7].X := 1;
  A[7].Y := 220;
  A[8].X := 68;
  A[8].Y := 44;
 
  Z := CreatePolygonRgn(A, 9, ALTERNATE);
  SetWindowRgn(Form1.Handle, Z, True);
end;

To już wszystko.

# Jak to zrobić bez TImage

W zdarzeniu OnPaint wpisujemy taki kod:

var
  B: TBitmap;
begin
  B := TBitmap.create;
  B.LoadFromFile('obrazek.bmp');
 
  Form1.Canvas.Draw(0, 0, B);
end;

# Przesuwanie naszej aplikacji

Jeśli mamy obrazek to poniższy kod wpisujemyw zdarzenia obrazka (TImage) jjeślinie to w wwłaściowościggłównegofformularza(TForm).
Najpierw deklarujemy zmienne globalne (na początku w dyrektywie var):

var
  MD: Boolean;
  P: TPoint;

w OnMouseDown:

begin
  P.X := X;
  P.Y := Y;
  MD := True;
end;

w OnMouseUp:

begin
  MD := False;
end;

i w OnMouseMove:

begin
  if not MD then Exit;
 
  Left := Left + (X - P.X);
  Top := Top + (Y - P.Y);
end;

# Zamykanie

Application.Minimize;
Application.Terminate;

# Jak uzyskać te punkty łatwiej i szybciej

#robimy przykładową aplikację z załadowanym obrazkiem
#umieszczamy komponent TMemo
#Deklarujemy i inicjujemy zmienna licznik:=0;
#w zdarzeniu OnMouseDown obrazka wklepujemy kod

Memo1.Lines.Add('A[' + IntToStr(Licznik) + '].Y = ' + IntToStr(X) + ';');
Memo1.Lines.Add('A[' + IntToStr(Licznik) + '].Y = ' + IntToStr(Y) + ';');
Inc(Licznik);

#uruchamiamy i klikamy w poszczególnych punktach, i w memo mamy gotowy kod.

6 komentarzy

Artykuł gruntownie sprawdzony i poprawiony... Jeszcze jest sporo do zrobienia;

Ja dodam, że jest specjalny komponent do tego, który robi to za nas. Nazywa się... CoolForm :)

[Delphi] Cool Form w builderze (dla poczatkujacych) - czyli w Delphi, czy Builderze :D

nie czytalem do konca ale jesli dobrze zatrybilem to chyba mozna we wlasciwosciach obrazka ustawic algin>al client

Kosmetyczne zmiany (żeby działało), ale mnie początkującemu sprawiły troche trudności:
Memo1.Lines.Add('a['+IntToStr(licznik)+'].x='+IntToStr(X)+';');
Memo1.Lines.Add('a['+IntToStr(licznik)+'].y='+IntToStr(Y)+';');
inc(licznik);

ja tylko dodam, że można jeszcze RoundRect użyć(troche mniej skomplikowany:)):
[code]var
rgn:HRGN;
begin
rgn:=windows.CreateRoundRectRgn(0,0,clientwidth,clientheight,25,25 );
SetWindowRgn(Handle,rgn,true);
end;[/code]