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.
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();
}
}