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.

1 Zmiana kształtu formularza
2 Jak to zrobić bez TImage
3 Przesuwanie naszej aplikacji
4 Zamykanie
5 Jak uzyskać te punkty łatwiej i szybciej

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]