HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Egér mozgásának korlátozása egy ellipszis területére


Példaprogram letöltése

3803 bájt

Ebben a példában azzal foglalkozunk, hogy miként lehet az egérkurzor mozgását alkalmazásunk egy adott területére korlátozni. A feladatot nehezíti, hogy ez a terület nem téglalap, hanem ellipszis alakú.

Az ellipszis körvonala olyan pontok halmaza a síkban, amelyek két megadott ponttól egyenlő távolságra vannak. Az ellipszisnek van két fókuszpontja, F1 és F2. Ha vesszük a körvonal bármely pontját, és megmérjük annak F1-től mért távolságát, majd hozzáadjuk az F2-től mért távolságát, akkor egy állandó számot kapunk.
A mellékelt példában az ellipszist egy TShape komponens segítségével szemléltetjük. A Form OnCreate eseményében, a Shape1 objektum alapján feljegyezzük az ellipszis középpontjának, szélességének és magasságának adatait.
A CalculateEllipsePoints függvény segítségével, a feljegyzett adatokból meghatározzuk az ellipszis két fókuszpontját és azt az állandót, amely az ellipszis körvonalát jellemzi.
procedure TForm1.CalculateEllipsePoints;
A számítási művelet elvégzésénél különbséget kell tennünk a fekvő és az álló ellipszisek között. Az első esetben az ellipszis vízszintes tengelye, még a másodiknál a függőleges tengely a hosszabb. A fókuszpontok mindig a hosszabb tengelyen helyezkednek el.
A fókuszpontok koordinátáinak kiszámolásához a Pitagorasz tételt használhatjuk.
if FEllipseWidth>=FEllipseHeight then begin
  c:=FEllipseWidth/2;
  b:=FEllipseHeight/2;
  a:=Sqrt(Sqr(c)-Sqr(b));
  F1.x:=FEllipseCenterX-Round(a);
  F1.y:=FEllipseCenterY;
  F2.x:=FEllipseCenterX+Round(a);
  F2.y:=FEllipseCenterY;
  FMaxDistance:=FEllipseWidth;
end
Az ellipszis körvonalát jellemző állandót feljegyezzük az FMaxDistance változóba. Ez az érték megegyezik az ellipszis hosszabbik tengelyének méretével.
Az IsCursorInEllipse függvény segítségével eldönthetjük, hogy az egér éppen az ellipszis területén tartózkodik-e.
function IsCursorInEllipse: Boolean;
Ha létrehozunk egy példányt a TMouse osztályból, akkor annak CursorPos property-jéből mindig kiolvashatjuk az egér aktuális helyét, képernyő koordinátákban. Ezt a koordinátát a ScreenToClient metódus segítségével átalakíthatjuk a Form-unkon használt koordinátává.
p:=ScreenToClient(Mouse.CursorPos);
Ha a lekérdezett pont és az F1 fókuszpont távolságának, valamint a pont és az F2 fókuszpont távolságának összege kisebb vagy egyenlő, mint az FMaxDistance-ban letárolt érték, akkor az adott pont az ellipszis területén található.
A távolság megméréséhez a koordinátageometriában használt két pont távolsága képletet használjuk fel.
A pont és F1 távolsága.
Distance:=Sqrt(Sqr(F1.x-p.x)+Sqr(F1.y-p.y));
Az előbb kiszámított távolság + a pont és F2 távolsága.
Distance:=Distance+Sqrt(Sqr(F2.x-p.x)+Sqr(F2.y-p.y));
Ha felülírjuk a WndProc metódust, akkor mi kezelhetjük a Form összes üzenetét.
procedure WndProc(var Message: TMessage); override;
Számunkra a WM_MOUSEMOVE, azaz az egérelmozdulásnak van jelentősége.
if Message.Msg=WM_MOUSEMOVE then begin
  if IsCursorInEllipse then
    FLastMousePos:=Mouse.CursorPos
  else begin
    Mouse.CursorPos:=FLastMousePos;
    ...
Ilyenkor mindig megnézzük az egér jelenlegi helyét. Az egér előző koordinátáit az FLastMousePos változóban tároljuk el. Ha a felhasználó kihúzza az egeret az ellipszis területéről, akkor azt azonnal visszaküldjük az előző helyére.

Cikksorozat

#IDKategóriaCikk címeSorozat
3643DelphiFormEditor1. rész
3689DelphiProject és modul információk2. rész
3719DelphiMegnyitás, mentés3. rész
3749DelphiKódszerkesztő4. rész
3778DelphiForráskód írása, olvasása5. rész
3809DelphiInterfész a kódszerkesztő ablakhoz6. rész
3839DelphiKijelölt blokkok7. rész
3869DelphiA buffer beállításai8. rész
3899DelphiKörnyezeti és Project opciók9. rész
3929DelphiKurzor a kódszerkesztőben10. rész
3959DelphiKeresés és csere beállításai11. rész


Könyv
Ez a cikk megtalálható ebben a könyvben: Delphi Software Offline 2003 évkönyv 317. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |