Cool Form w builderze (dla poczatkujacych) Uaktualnione

Kintaro

Kilka osób się mnie o to pytała, dlatego postanowiłem trochę o tym skrobnąć.

Więc tak (od więc się nie zaczyna :-P), problem jest taki: chcemy, aby nasza aplikacja (dokładnie główny formularz) miał inny kształt a najlepiej, aby był to jakiś obrazek itp. Tutaj pokaże jak to zrobić, co jest zresztą banalnie proste.

Najprostszy sposób to:

  1. Na formularzu dajemy TImaga, ładujemy do niego obrazek, a następnie powiększamy go tak, aby był całkowicie widoczny.

  2. 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:

  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 (jak to zrobić szybciej, jak ktoś nie wie, powiem później)
  1. Gdy już mamy współrzędne to ustawiam właściwości formularza borderstyle na none

  2. W zdarzeniu create formularza wklepujemy ten kod:

TPoint a[4]; 

*tablica obiektow TPoint

a[0].x=215; 

* deklaracja poszczególnych zmiennych

a[0].y=0;
a[1].x=215;
a[1].y=110;
a[2].x=120;
a[2].y=110;
a[3].x=0;
a[3].y=0;
HRGN obszar=CreatePolygonRgn(a,4,ALTERNATE); 

* przypisanie regionow 4 to ilosc punkotw z tablicy

SetWindowRgn(Form1->Handle,obszar,true); 

* i zaaplikowanie

i to by było wszystko

******teraz jak łatwo uzyskać te punkty

  1. Robimy przykładową aplikacje z załadowanym obrazkiem
  2. Umieszczamy komponent TMemo
  3. Deklarujemy i inicjujemy zmienna licznik=0;
  4. W zdarzeniu mousedown obrazka wklepujemy kod
Memo1->Lines->Add("a["+IntToStr(licznik)+"].x="+IntToStr(X)+";");
Memo1->Lines->Add("a["+IntToStr(licznik)+"].y="+IntToStr(Y)+";");
licznik++;
  1. uruchamiamy i klikamy w poszczególnych punktach, i w memo mamy gotowy kod.

******przesuwanie
jakby ktos nie wiedzial
zmienne globalne :

TPoint p;
bool md;

Metody obrazka:

OnMouseDown  {
md=true;
p.x=X;
p.y=Y; }

OnMouseUp {
md=false;}

OnMouseMove{
Left+=X-p.x;
Top+=Y-p.y; }

*****inne
zamkniecie aplikacji to Close, zminimalizowane chyba

Application->Minimize()
 * jak to samo tylko bez TImaga
Graphics::TBitmap *b = new Graphics::TBitmap();
b->LoadFromFile("l.bmp");
Form1->Canvas->Draw(0,0,b);  

Ten kod rysuje na formularzy bitmapę
Należy go umieścić w zdarzeniu onpaint
i przedefiniować metody z TImaga na Form1

WERSJA DLA DELPHI POD: http://4programmers.net/view.html?id=332

Pozdrawiam
Kintaro_Oe

Jakby cos było nie jasne to mail w profilu

2 komentarzy

POPRAWKA!!
OnMouseMove

{
if (md==true)
{
Left+=X-p.x;
Top+=Y-p.y;
}
}

"zamkniecie aplikacji to Close"

To jest tylko zamknięcie formy - jeśli to jest akurat główna, to ok, ale radzę używać odpowiedniej metody:

Application->Terminate();