A kontrolunk működését és megjelenítését tekintve egy nyomógomb, melyet megnyomva legördül a választópanel, melyen 5x5 darab négyzet rajzolódik ki. Az egeret mozgatva a panelen kijelölhetők a négyzetek, vagyis egy akkora mátrixot kell kijelölnünk a 25 darab négyzetből, amekkora táblázatot szeretnénk elkészíttetni a Word dokumentumban. Ennek megfelelően maximálisan egy 5x5 méretű táblázat hozható létre, de a kontrolt továbbfejlesztve ez a szám növelhető.
A nyomógombra történő második kattintáskor a panel bezáródik, és a bezáródáshoz rendelt eseménykezelő paraméteréből kiolvasható az aktuálisan kijelölt mátrix mérete.
A táblázat oszlopainak és sorainak száma megjelenik a hívó alkalmazás űrlapján. Miután a választás megtörtént, a MŰVELET gombra kattintva indítható a Word dokumentum és a táblázat generálása.
Kontrol elkészítése
A kontrolunk projektje két részből tevődik össze. A MWTForm osztály a megjelenő választópanel osztálya, míg a MWTButton a kontrol nyomógombja. Elsőként vizsgájuk meg a panel kódját.
A kontrol legfontosabb változója a tableSize tag, mely tartalmazni fogja a kiválasztott mátrix méreteit.
private Size tableSize = new Size(0,0);
A lekérdezéshez egy property-t rendeltünk a változóhoz.
public Size TableSize
{
get{return tableSize;}
}
A panel konstruktorában határozzuk meg a megjelenés pozícióit, melynek alapjául a szülőkontrol – jelen esetben a nyomógomb – pozíciója szolgál.
parentRect = parent.RectangleToScreen(parent.ClientRectangle);
A kontrol kódjában felüldefiniáltunk néhány eseménykezelő metódust, vizsgáljuk meg most, melyik milyen feladatot lát el.
Az OnDeactivate metódus akkor fut le, amikor a hívó alkalmazásban máshová kattintunk, vagyis a fókusz már nem a panelen van. Ekkor a Close metódussal bezárjuk az űrlapot.
Amikor a kontrol nyomógombjára kattintunk, akkor többek közt lefut az OnActivated metódus, melyben meghatározzuk a panelen megjelenő – az aktuális kijelölést tolmácsoló - szöveg magasságát, valamint kalkuláljuk a panel méreteit, és a helyzetét. Ezekre szolgálnak a SizeCalculation és a FormLocation belső metódusok.
Az OnMouseLeave metódus fut le, amikor az egérrel elhagyjuk a panel kliensterületét. Ekkor a kijelöléseket töröljük, vagyis a mátrix méretét 0x0 méretre állítjuk.
Az OnMouseMove metódusban gondoskodunk arról, hogy megvizsgáljuk az aktuális kurzorpozíciót, majd eldöntsük, hány négyzet területét kell kitöltenünk az adott színnel, jelezve az aktuális méretet. A folyamat közben folyamatosan frissítjük a tableSize változó értékét az Updates3 belső metódussal.
A panel kirajzolását az OnPaint metódusban végezzük el, melyben alapvetően kétfajta művelet zajlik le. Az alapértelmezett procedúrában kirajzoljuk a 25 darab négyzetet, valamint az információs szöveget. Amennyiben az egérmutató a panel fölött tartózkodik valamely pozícióban, akkor kalkuláljuk a mátrix-méretet és kitöltjük az adott számú négyzetet.
A kontrol második eleme a felületen állandóan megjelenő nyomógomb, mely lényegesen egyszerűbb kódot rejt. A kijelölt mátrix méreteinek lekérdezéséhez létrehoztunk egy TSEventArgs osztályt, mely a panel bezárását követő esemény kezelésére hivatott metódus második paraméterének típusa lesz.
Csupán egy property-vel rendelkezik, melyből lekérdezhetjük a Size típusú struktúra értékeit.
A nyomógomb osztályában létrehoztunk egy delegáltat az esemény kezelőjeképpen, melynek második paramétere a fent deklarált osztály típusú.
public delegate void SelectEventHandler(object sender,TSEventArgs e);
Az esemény neve Changed lesz, melyre kezelőmetódust hozunk létre.
public event SelectEventHandler Changed;
A panel osztályából létrehozunk egy tagobjektumot.
Amikor a kontrol panelje bezáródik, meghívjuk az OnChanged metódust, vagyis az esemény objektumát példányosítjuk.
protected virtual void OnChanged(TSEventArgs e)
{
if (Changed != null) Changed(this,e);
}
A nyomógombra kattintva két eset állhat elő. Az első esetben a panel objektuma létezik, így azt meg kell szüntetni, a memóriaterületet fel kell szabadítani.
protected override void OnClick(EventArgs e)
{
base.OnClick(e);
if (f != null)
{
f.Dispose();
f = null;
}
A második esetben a panel nem létezik, példányosítani kell az osztályát, majd meg kell jeleníteni azt.
else
{
f = new MWTForm(this);
f.Closed += new EventHandler(f_Closed);
tableSize.Width = tableSize.Height = 0;
f.Show();
}
}
A panel bezárását követő esemény kezelőjében átadjuk a panel tableSize tagjának értékét a nyomógomb tableSize változójának, majd elsütjük a Changed eseményt a kapott értéket átadva paraméterül.
if (f != null)
{
tableSize = f.TableSize;
OnChanged(new TSEventArgs(tableSize));
f = null;
}
Hívó alkalmazás
A hívó kliensben csak deklarálunk egy kezelőt a fenti eseményre, hogy kinyerjük az aktuális kijelölés értékét. Az információkat megjelenítjük a Form szövegmezőiben.
private void mwtButton1_Changed(object sender,MWTLibrary.TSEventArgs e)
{
Size s = e.TableSize;
if (s.Width != 0 && s.Height != 0)
{
textBox1.Text = s.Width.ToString();
textBox2.Text = s.Height.ToString();
}
}
A MŰVELET gombra kattintva példányosítjuk a Word alkalmazást, majd létrehozunk egy új dokumentumot.
wa = new Word.Application();
wa.Documents.Add(ref m, ref m, ref m, ref m);
Word.Document wd = wa.ActiveDocument;
...
Létrehozzuk a megadott méretekkel rendelkező Word táblázatot, melynek cellái 50x25 pixel méretűek lesznek.
Word.Table wt = wd.Tables.Add(wa.Selection.Range, row, col, ref dtb, ref m);
...
Végül láthatóvá tesszük a dokumentumot.
A példa egyszerűségére való tekintettel nem írtunk adatokat a cellákba.