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:
-
Na formularzu dajemy TImaga, ł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:
- 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)
-
Gdy już mamy współrzędne to ustawiam właściwości formularza borderstyle na none
-
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
- Robimy przykładową aplikacje z załadowanym obrazkiem
- Umieszczamy komponent TMemo
- Deklarujemy i inicjujemy zmienna licznik=0;
- 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++;
- 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
POPRAWKA!!
OnMouseMove
"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();