HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Bezier görbe interaktív szerkesztése


Példaprogram letöltése

7803 bájt

E példában egy kis rajzoló programot készítünk, mely lehetőséget biztosít arra, hogy egy tetszőleges Bezier görbét szerkesszen a felhasználó az egér segítségével.

Ennek megvalósításához szükségünk lesz egy tömbre, mely képes négy pont (Point) tárolására. Itt fogjuk a Bezier görbéhez szükséges kezdő és végpontokat, valamint a két segédpontot tárolni.
    private Point[] coord = {new Point(10, 10), new Point(100, 10), new Point(10, 100), new Point(100, 100)};
Mivel a szerkesztést az egérrel kell végeznünk, így fel kell használnunk a MouseDown, MouseUp, MouseMove eseményeket. A lényeges tennivalónk majd az egér mozgásánál, a MouseMove eseménynél lesz, de tudnunk kell, hogy ekkor a felhasználó éppen egy pontot mozgat a Form-on vagy csak egyszerűen mozog az egér.
Ennek eldöntését a MouseDown eseménynél egy move nevű globális logikai változóban tároljuk, melynek akkor adunk igaz értéket, ha a Cursor Hand értéket kap. Ez utóbbi akkor következik be, amikor a felhasználó a négy pont közül valamelyikre kattint az egérrel. Ezt az értéket a MouseMove-nál fogjuk beállítani.
    private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    {
      if (this.Cursor == Cursors.Hand)
      {
        move = true;
      }
    }
Az egér gomb felengedésekor minden feltétel nélkül hamisra állítjuk a move változónkat.
    private void Form1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
    {
      move = false;    
    }
Nézzük most mi is történik a MouseMove eseménynél.
    private void Form1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
    {   
      label1.Text = e.X.ToString() + " - " + e.Y.ToString();
Itt a move változótól függően két részre bontjuk a program futását. Ha a move változó hamis, akkor ez azt jelenti, hogy felhasználó még nem fogott meg egyetlen pontot sem a Bezier görbén, így az egér csak szabadon mozog a Form területén. Ekkor azt kell vizsgálnunk, hogy az egér nem ért-e valamely pont fölé. Ha ez így lenne, akkor kell a kurzort átállítanunk a Hand értékre, ezzel jelezve a felhasználó felé, hogy megfoghatja egérrel az adott pontot és egy másik helyre húzhatja azt.
      if (!move)
      {
        bool b = false;
Egy keresést végzünk, mely vizsgálja, hogy a négy pont közül melyik esik bele az egér aktuális pozíciójába.
        for (int i=0; i<4; i++)
        {        
          if ((coord[i].X-4 <= e.X) && (coord[i].X+4 >= e.X) && (coord[i].Y-4 <= e.Y)  && (coord[i].Y+4 >= e.Y))
          {
            b = true;
Ha van ilyen pont, akkor ennek sorszámát eltároljuk a selected globális változóba.
            selected = i;
            break;
          }
        }
Végül állítjuk a kurzort attól függően, hogy volt-e találat vagy sem.
        if (b)
        {
          this.Cursor = Cursors.Hand;        
        }
        else
        {
          this.Cursor = Cursors.Default;
        }
      }
      else
Abban az esetben, ha a move értéke igaz, akkor már folyamatban van egy koordináta pont átmozgatása egy másik helyre. Ekkor annyi a teendőnk, hogy tároljuk az új pozíciót, majd az Invalidate hívásával újrarajzoltatjuk a Form-ot, melyen megjelenik a Bezier görbe aktuális képe. E rajzolásra a Form Paint eseményénél kerül sor, ahol a Bezier görbe megjelenítése mellett húzunk két vonalat is a segéd pontokhoz, hogy szemléletesebb legyen a szerkesztés.
      {
        coord[selected].X = e.X;
        coord[selected].Y = e.Y;
        Invalidate();
      }
    }

Könyv
Ez a cikk megtalálható ebben a könyvben: C# Software Offline 2002 évkönyv 513. 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 |