Programowanie w języku C/C++ » Artykuły

Cool Form w builderze (dla poczatkujacych) Uaktualnione

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)

3. Gdy już mamy współrzędne to ustawiam właściwości formularza borderstyle na none

4. 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++;

5. 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 komentarze

mcbury 2005-01-21 17:23

POPRAWKA!!
OnMouseMove

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

Marooned 2003-07-30 01:55

"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();