A program indulásakor meghatározzuk, hogy milyen merevlemez-meghajtók találhatók a számítógépen, és ezek betűjelét kiírjuk a Form felületén található ComboBox kontrolba. A lista legelső betűjelét felhasználva lekérdezzük a meghajtó kapacitására és kihasználtságára vonatkozó információkat, majd ezek alapján generálunk egy folyamatjelzőt jelképező ikont, az adott meghajtó foglaltságát jelzendő. Az ikon fölé mozgatva a kurzort bővebb információ jelenik meg a meghajtó állapotáról.
A megoldáshoz szükségünk van a Microsoft Scripting Runtime COM komponensre, melyet a projekthez kell adnunk, és Scripting néven hivatkozhatunk rá. Megvizsgáljuk, hogy miképp használható a Scripting komponens FileSystemObject objektuma a merevlemez meghajtóinak vizsgálatához, valamint hogyan generálható kép a kapott információkból.
A GetDriveinfos metódusban lekérdezzük a megadott merevlemez információit, és egy 4 elemű tömbben adjuk vissza az adatokat. A tömb tartalmazza a meghajtó nevét, a teljes kapacitást, és a szabad terület méretét bájtban, valamint a százalékos értéket.
private string[] GetDriveInfos()
{
Példányosítjuk a FileSystemObject objektumot, valamint lekérdezzük a meghajtókat.
Scripting.FileSystemObject fso = new Scripting.FileSystemObject();
IEnumerator ie = fso.Drives.GetEnumerator();
A kapott listán végighaladva meghatározzuk, hogy a megadott meghajtó benne van-e a csoportban. Ha igen, akkor kigyűjtjük az adatait.
...
while (ie.MoveNext())
{
id = (Scripting.IDrive)ie.Current;
if (id.DriveType == Scripting.DriveTypeConst.Fixed && id.DriveLetter == drive)
...
Amennyiben a megadott meghajtó nem megfelelő, akkor a tömb NULL értékű lesz, és később megakadályozzuk, hogy megjelenjen az ikon.
A CreateIcon metódussal generáljuk az ikon képét úgy, hogy a GetDriveInfos metódus által visszaadott tömböt feldolgozzuk.
A megoldás lényege, hogy egy Bitmap objektumot rajzolunk meg, és ezt használjuk fel az ikon létrehozására.
private Icon CreateIcon()
{
Bitmap bitmap = new Bitmap(16,16);
Létrehozunk egy Graphics objektumot, hogy a Bitmap objektumra rajzolhassunk.
Graphics g = Graphics.FromImage(bitmap);
A folyamatjelző-szerű ikont úgy rajzoljuk meg, hogy egy fekete szegélyű téglalapot sárga színnel töltünk ki a foglaltság arányában.
A kitöltő színhez szükségünk van egy ecsetre.
SolidBrush graphBack = new SolidBrush(Color.Yellow);
Amennyiben a lekérdezett tömb nem NULL értékű, akkor megkezdjük a rajzolást.
driveinfo = GetDriveInfos();
if (driveinfo != null)
{
A keretbe rajzolt téglalap szélessége függ a foglaltság százalékos értékétől, így azt kiszámoljuk.
decimal width = Convert.ToDecimal(driveinfo[3])/100*14;
Szükség van egy fekete tollra a keret rajzolásához.
Pen pr = new Pen(Color.Black, 1);
Megrajzoljuk a keretet.
g.DrawRectangle(pr,0,3,15,8);
Majd a kitöltő téglalapot, egy pixellel beljebb kezdve, hogy jobban mutasson.
g.FillRectangle(graphBack,0,4,Convert.ToInt32(width),6);
Az ikon objektuma a Bitmap objektumból generálódik.
icon = Icon.FromHandle(bitmap.GetHicon());
}
}
Az ikon kirajzolása előtt a NotifyIcon komponens Icon property-jének értékül adjuk a generált ikont.
notifyIcon1.Icon = CreateIcon();
A komponensre duplán kattintva megjeleníthetjük a Form-ot, melyen – amennyiben több meghajtóval rendelkezünk – kiválaszthatunk egy újabb meghajtót, melynek adataiból generálunk egy újabb ikont.
Az ikonon a jobb egérgombbal kattintva egy menü jeleníthető meg, melynek pontjaival elrejthető, vagy megjeleníthető a Form, vagy leállítható a program.