C# - A merevlemezek foglaltságát jelző kontrol

forráskód letöltése
A .NET függvénykészletének segítségével a legkülönbözőbb információkat jeleníthetjük meg grafikusan. Cikkünkben elkészítünk egy kontrolt, mely megvizsgálja a számítógép merevlemezeit, és azok foglaltságát numerikus és grafikus formában egy-egy ábrán feltünteti. A felhasználó alkalmazásban nem kell beállítanunk semmilyen paramétert, a kontrol teljes felügyelete alatt történik az információk lekérdezése.
Annak érdekében, hogy a merevlemezek állapotáról információkat kaphassunk, fel kellett használnunk a Microsoft Scripting Runtime COM komponenst, melyet referenciaként a kontrolban meg kellett adnunk.
A kontrol GetDriveInfos metódusában oldottuk meg a lekérdezéseket, a merevlemezek információit egy két-dimenziós tömbben helyeztük el. Minden merevlemezzel kapcsolatban eltároltuk a teljes kapacitást, a szabad hely méretét, a merevlemez betűjelét, valamint a foglaltság százalékos értékét.
Az egyes merevlemezek információinak ismeretében az OnPaint metódusban kirajzoljuk a megfelelő számú folyamatjelző-szerű grafikont.
for(int i=0;i<_fixedcount;i++)
{
Kirajzolunk egy 20*160 méretű keretet.
  g.DrawRectangle(rectPen,50,(i*30)+10,160,20);
A kitöltéskor csak a megfelelő résztéglalapot töltjük ki azonos színnel.
  g.FillRectangle(new SolidBrush(Color.Blue),50,(i*30)+10,Convert.ToInt32(Math.Round(progresswidth)),20);
Kiírjuk a merevlemez betűjelét.
  g.DrawString(diskinfo[i,0],drivef,new SolidBrush(Color.Black),10,(i*30)+12);
Valamint a téglalapba kiírjuk a foglaltság értékét számmal is.
  g.DrawString(diskinfo[i,3] + " %",percf,new SolidBrush(Color.White),Convert.ToInt32(Math.Round(progresswidth)) - 10,(i*30)+13);
}
A kontrolunk fölé mozgatva az egeret láthatóvá teszünk egy ToolTip-et, melyben az ábrák rajzolásának alapértékeit jelenítjük meg szöveggel.
A megjelenítést a MouseHover esemény kezelőjében végezzük el, hogy ne kelljen mozgatni az egérmutatót a megjelenítéshez. Ekkor azonban a kezelőfüggvény paramétere EventArgs típusú, vagyis nem állnak rendelkezésre a kurzor adatai.
Felhasználható viszont a GetCursorPos API metódus, mely egy koordinátát ad vissza a meghívásakor.
[DllImport("user32.dll")]
private static extern Int32 GetCursorPos(ref Point point);
Az eseménykezelőben lekérdezzük a kurzor aktuális pozíciójának koordinátáit.
Point p = new Point(0,0);
GetCursorPos(ref p);
Majd a képernyőre vonatkoztatott koordinátákat leképezzük a kontrol kliensterületére a PointToClient metódussal.
Point cp = PointToClient(p);
Ezt követően minden grafikon esetén megvizsgáljuk, hogy a kurzor nincs-e a területén belül.
for(int i=0;i<_fixedcount;i++)
{
  if (cp.X >= 50 && cp.X <= 210 && cp.Y >= points[i,0] && cp.Y <= points[i,1])
  {
    ...
  }
}
Ha belül van, akkor összeállítjuk az információkat egy karakterláncban, és megadjuk azt a kontrolhoz rendelt ToolTip objektum SetToolTip metódusában.
toolTip1.SetToolTip(this,tooltip);
Annak érdekében, hogy kontrol mindig naprakész adatokat használjon, a kontrol WndProc metódusát átírva érzékennyé tesszük a WM_DEVICECHANGE üzenetre, melyet akkor kap meg a kontrol, ha valamely eszköz állapotában változás következik be, például valamely merevlemez foglaltsága megváltozik.
protected override void WndProc(ref Message message)
{
  base.WndProc(ref message);       
  if(message.Msg == WM_DEVICECHANGE)
  {
    Invalidate();
  }
}
Ekkor egyszerűen meghívjuk az Invalidate metódust, mely frissíti a kontrolt – meghívja az OnPaint metódust – vagyis lekérdezi a merevlemezek állapotát újra.