A megvalósításhoz nincs más teendőnk, mint mind a két Form mozgatását figyelni és mindig egymáshoz igazítani az aktuális pozíciójukat.
A második Form megjelenéséhez szükségünk lesz egy Form2 típusú változóra.
A Form1 konstruktorában létrehozzuk a Form2 egy példányát. A Form2-höz készítettünk egy MainForm nevű property-t, mely képes tárolni a Form1 példányát. Ezt tettük azért, hogy majd a Form2-ből is képesek legyünk vezérelni a Form1 működését. Maradjunk azonban még a Form1-nél.
public Form1()
{
...
f = new Form2();
f.MainForm = this;
A Form2 megjelenítését, illetve eltüntetését a button1 gomb lenyomásával tudjuk előidézni. Készítettünk egy UpdatePos nevű belső függvényt, mely a két Form-ot egymás mellé igazítja. Mivel ez csak akkor működik helyesen, ha a hívó Form az aktív, így meghívjuk a From Activate függvényét, mely ismét a Form1-et teszi aktívvá. Erre azért van szükség, mert amikor a Form2 Visible property-je éppen igaz értéket kap, akkor az lesz a programunkban az aktív Form és nem a Form1.
private void button1_Click(object sender, System.EventArgs e)
{
f.Visible = !f.Visible;
this.Activate();
UpdatePos();
}
A Form1 mozgatásának figyeléséhez létrehozunk egy eseménykezelőt a Form1 Move eseményéhez. Ha itt a Form2 látható, akkor szükséges az egymáshoz igazítás, így ismét meghívjuk az UpdatePos függvényünket.
private void Form1_Move(object sender, System.EventArgs e)
{
if (f.Visible)
{
UpdatePos();
}
}
Az UpdatePos függvénynek egyszerű a feladata: ha az aktív Form a Form1, akkor állítja a Form2 Left és Top property-jét úgy, hogy az pontosan a Form1 bal oldalára kerüljön. Az aktív Form vizsgálatára azért van szükség, mert amikor a Form2-t mozgatjuk, az majd a Form1-et fogja pozícionálni. Ekkor mivel változik a Form1 helyzete meghívásra kerül a Move esemény, amely hívja az UpdatePos függvényt, így az megpróbálná a Form2 helyzetét állítani, ahol az ottani Move esemény figyelése miatt ismét a Form1 helyzete kerülne állításra és ez a kör folytatódna a végtelenségig. Ezért mindig csak akkor lehet elvégezni a pozíció állítást, ha a Move az aktív Form-nál következik be.
private void UpdatePos()
{
if (Form.ActiveForm == this)
{
f.Left = Left - f.Width;
f.Top = Top;
}
}
Nézzük most a Form2-t. Itt egy MainForm property áll rendelkezésre, mely az FMainForm változóban tárolja a Form1 osztály példányát, hogy azt vezérelhessük innen is.
public Form1 MainForm
{
set
{
FMainForm = value;
}
}
Így amikor létrejön a Form2-nél a Move esemény, akkor ismét ellenőrizzük, hogy melyik az aktív Form, majd ha úgy látható, hogy ez a Form2, akkor nyugodtan állíthatjuk a Form1 pozícióját, a Form2 mellé igazítva azt.
private void Form2_Move(object sender, System.EventArgs e)
{
if (Form.ActiveForm == this)
{
FMainForm.Top = Top;
FMainForm.Left = Left + Width;
}
}
Ezen lépésekkel elértük azt, hogy akár a Form1-et, akár a Form2-t mozgatja a felhasználó, a két Form mindig egymás mellett marad a képernyőn.