程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 模擬Windows下CPU占用率的控件及其實現

模擬Windows下CPU占用率的控件及其實現

編輯:關於VC++

參考了一下Windows任務管理器(圖一),於是模仿MS的東西,做了這個控件 (圖二)。

圖一 Windwows管理器

圖二 我的 Control

二、功能說明

我把這個東東做成了ActiveX控件, 為的是通用性,這樣,其他的開發工具(VB、Delphi等)也能使用它,而不僅限 於VC。 我是用MFC來寫的這個控件,該控件提供的大致功能有:設置占用比率顏 色、未占用比率顏色、設置占用率、設置背景顏色、字體顏色,等等。 控件的 方法列表如下:

void SetFreeColor(OLE_COLOR m_Color);      //設置未占用部分的顏色
      void SetUsedColor(OLE_COLOR m_Color);     //設置占用部分的顏色
      void RestoreDefaultColor();          //恢復默認顏色設置
       void SetUsedRate(short iRate);         //設置占用率
      void SetBKColor(OLE_COLOR m_Color);      //設置背 景顏色
      void SetFontColor(OLE_COLOR m_Color);      //設置字體顏色

三、主要代碼分析

這個控件的重點,當然 是控件的繪制。核心的繪制函數代碼如下(必要的部分,我添加了注釋):void CCPURateControlCtrl::ReDrawControl()
{
  CDC  memDC;
  CClientDC dc(this);
  CBitmap memBitmap;
  CBitmap *pOldBitmap=NULL;
  CString strUsges;
  CPen FreePen;
  CPen UsedPen;
  CPen *pOldPen  = NULL;
  CPen *pOldMemPen = NULL;
  CRect m_rect;
   GetClientRect(&m_rect);
  FreePen.CreatePen (PS_SOLID,2,m_FreeColor);
  UsedPen.CreatePen (PS_SOLID,2,m_UsedColor);
  memDC.CreateCompatibleDC (&dc);
  pOldMemPen=memDC.SelectObject(&FreePen);
  memBitmap.CreateCompatibleBitmap (&dc,m_rect.right,m_rect.bottom);

   pOldBitmap=memDC.SelectObject(&memBitmap);

   memDC.FillSolidRect(&m_rect, m_BackColor);
  //繪制未占用比 率的線條
  for(int i=0;i<=15;i+=3)  //總共6行,12條
   {
    memDC.MoveTo(m_rect.left+15,m_rect.top+15+i);
     memDC.LineTo(m_rect.Width()/2-2,m_rect.top+15+i);
     memDC.MoveTo(m_rect.Width()/2+2,m_rect.top+15+i);
     memDC.LineTo(m_rect.right-15,m_rect.top+15+i);
  }
      //繪制顯示比率的百分比文字
  CString str;
   str.Format("%3d%%",iUsedRate);
  memDC.SelectObject (&UsedPen);

  CFont m_Font;
   m_Font.CreateFont(14,     // nHeight
    5,              // nWidth
    0,             // nEscapement
    0,             // nOrientation
    FW_NORMAL,         // nWeight
    FALSE,            // bItalic
    FALSE,           // bUnderline
    0,             // cStrikeOut
    ANSI_CHARSET,       // nCharSet
     OUT_DEFAULT_PRECIS,    // nOutPrecision
     CLIP_DEFAULT_PRECIS,    // nClipPrecision
     DEFAULT_QUALITY,      // nQuality
    DEFAULT_PITCH | FF_SWISS, // nPitchAndFamily
    "Arial"
   );

  CFont *pFont=memDC.SelectObject(&m_Font);
  memDC.SetTextColor(m_FontColor);
  memDC.SetBkMode (TRANSPARENT);
  memDC.TextOut(m_rect.Width()/2- 12,m_rect.bottom-20,str);
  int iAmount=0,k;
  //判斷占 用率,分段。
  if(iUsedRate>5 && iUsedRate<=20)
    iAmount=1;
  if(iUsedRate>20 && iUsedRate<=33)
    iAmount=2;
  if(iUsedRate>34 && iUsedRate<=50)
    iAmount=3;
  if (iUsedRate>51 && iUsedRate<=70)
     iAmount=4;
  if(iUsedRate>71 && iUsedRate<=90)
    iAmount=5;
  if(iUsedRate>91 && iUsedRate<=100)
    iAmount=6;

     //確定 繪制的偏移位置
  switch(iAmount)
  {
    case 1:   k=0;break;
    case 2:  k=-3;break;
     case 3:  k=-6;break;
    case 4:  k=-9;break;
     case 5:  k=-12;break;
    case 6:  k=-16;break;
     default:  k=1;break;
  }
  //繪制已占用的條數
   for(int j=0;j>=k;j-=3)
  {
    memDC.MoveTo (m_rect.left+15,m_rect.top+15+15+j);
    memDC.LineTo (m_rect.Width()/2-2,m_rect.top+15+15+j);

     memDC.MoveTo(m_rect.Width()/2+2,m_rect.top+15+15+j);
     memDC.LineTo(m_rect.right-15,m_rect.top+15+15+j);
  }

  //從內存DC拷貝到當前DC。這樣做的好處是速度快,防止閃爍。
   dc.BitBlt (m_rect.left,m_rect.top,m_rect.right,m_rect.bottom,&memDC,0,0,SRCC OPY);

  memDC.SelectObject(pOldBitmap);
   memDC.SelectObject(pOldMemPen);
  memDC.DeleteDC();
   memBitmap.DeleteObject();
}

四、控件的測試

編譯完 成後,我們得到CPURateControl.ocx控件。一般在編譯後,VC會自動幫你注冊這 個控件,你也可以在命令行下用regsvc32.exe來注冊。 關於測試,我們可以在 Visual Studio自帶的工具ActiveX Control Test Container中進行測試。也可 以自己寫一個小程序來測試。我在VC中 做了個測試的小程序。如圖三:

圖三 測試小程序

測試程序中,我用了一個自己封裝的DLL來分別獲 取CPU和內存的占用率。是在一個Timer中定時刷新獲取的。這個DLL你也可以拿 來自己用, DLL導出函數為2個:

UINT GetCpuUseage();  //返 回CPU占用率
UINT GetMemUseage();  //返回內存占用率

返 回的是多少,就表示占用了百分之多少。

五、結束語

這個控件其 實不光可以用來顯示CPU占用率,還可以用在其他的用途,只要和百分比顯示有 關的場合都可以。

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved