?????

解决方案 »

  1.   

    codeproject刚推出一个进程管理工具,
    http://www.codeproject.com/KB/cpp/processviewer.aspx
      

  2.   

         我是想参考任务管理器里面性能下的CPU使用及使用记录的图形如何画
      

  3.   

    用VC++编写象任务管理器中的CPU使用记录的波形显示的程序- -
                                           
    可以在OnTimer()中写下面代码: CDC* pDC;
     pDC = m_parentWnd->GetDC();  //m_parentWnd 为需要画波形图的Dialog的m_hWnd CSize szFont; szFont = pDC->GetTextExtent("1"); CRect rcClient;
     m_parentWnd->GetClientRect(rcClient);  //得到画图的客户区域 CDC dcMem;
     dcMem.CreateCompatibleDC(NULL);//这里我们就在内存中虚拟建造了DC
     
     CBitmap bitmap; 
     CBitmap* pOldBitmap;
     if(bitmap.CreateCompatibleBitmap(pDC,rcClient.Width(), rcClient.Height()))//创建一与pDC兼容的位图,大小为整个客户区 
     { 
      pOldBitmap=dcMem.SelectObject(&bitmap);//将位图选入内存环境 
      dcMem.SelectClipRgn(NULL);//使dc的整个客户区都成无效区 
      dcMem.IntersectClipRect(rcClient);//再“与上”检取的无效区,使内存环境与pDC检取的无效区相等 
     }  CDC* pdcClient;
     CPen pen,pen1;
    // pdc = m_parentWnd->GetDC();
     pdcClient = &dcMem;
     CRect roundrc; BOOL bCanDrawline;
     bCanDrawline = IsCanDrawLine(); //重新刷新背景
     if( bCanDrawline )
     {
      pdcClient->Rectangle(rcClient);
      CBrush bsh(RGB(0,0,0));
      pdcClient->FillRect(rcClient, &bsh);
     }// DrawGrids( pdcClient ); int lineStartPos, lineEndPos; //画上下界限线, 把界面分成4等份
     POINT startPos,EndPos;
     int UpLimit, DownLimit, line_height; lineStartPos = rcClient.left;
     lineEndPos = rcClient.right; startPos.x = rcClient.left;
     startPos.y = rcClient.top + (rcClient.bottom-rcClient.top)*2/4;
     m_ZeroY = startPos.y; int imodvalue;
     imodvalue = m_lineheight % ( 2 * BETWEENSPACEVALUE );
     if( imodvalue != 0 ) m_lineheight -= imodvalue; UpLimit = m_ZeroY - m_lineheight; DownLimit = m_ZeroY + m_lineheight; line_height = m_lineheight; EndPos.x = rcClient.right; startPos.y = UpLimit;
     EndPos.y = UpLimit; pen1.CreatePen(PS_SOLID,1,RGB(0,128,0));
     CPen* pOldPen1 = (CPen*)pdcClient->SelectObject(&pen1); DrawGrids( pdcClient ); pdcClient->SelectObject( pOldPen1 );  pen1.DeleteObject();
     pen1.CreatePen(PS_SOLID,1,RGB(255,255,0));
     pOldPen1 = (CPen*)pdcClient->SelectObject(&pen1); int fnWidth, fnHeight; CString strup;
     if( m_MaxShow.GetLength()<1 )
      strup.Format("%.2f",linelimitevalue.UpLimiteValue);
     else  strup = m_MaxShow; 
     CRect rcUpvalue;
     fnWidth = szFont.cx * strup.GetLength();
     fnHeight = szFont.cy;
     rcUpvalue.left = rcClient.right - fnWidth - 2;
     rcUpvalue.top = UpLimit - fnHeight - 2;
     rcUpvalue.bottom = rcUpvalue.top + fnHeight + 1;
     rcUpvalue.right = rcClient.right - 1;
     
     //写上界值
     pdcClient->SetBkMode(TRANSPARENT); pdcClient->SetTextColor(RGB(255,255,0));
     pdcClient->DrawText( strup, rcUpvalue, DT_CENTER); //画上界限
     pdcClient->MoveTo(startPos);
     pdcClient->LineTo(EndPos); //写零坐标值
    // CString strzero;
    // strzero.Format("%.2f",linelimitevalue.ZeroValue);
    // CRect rcZerovalue;// fnWidth = szFont.cx * strup.GetLength();
    // fnHeight = szFont.cy;// rcZerovalue.left = rcClient.right - fnWidth - 2;
    // rcZerovalue.top = m_ZeroY - fnHeight - 2;
    // rcZerovalue.right = rcClient.right - 1;
    // rcZerovalue.bottom = rcZerovalue.top + fnHeight + 1;// pdcClient->DrawText( strzero, rcZerovalue, DT_CENTER); //画零坐标线
     startPos.y = m_ZeroY;
     EndPos.y = m_ZeroY;
     pdcClient->MoveTo(startPos);
     pdcClient->LineTo(EndPos); //写下界值
     CString strDown;
     if( m_MinShow.GetLength()<1 )
      strDown.Format("%.2f",linelimitevalue.DownLimiteValue);
     else strDown = m_MinShow;
     CRect rcDownvalue; fnWidth = szFont.cx * strDown.GetLength();
     fnHeight = szFont.cy; rcDownvalue.left = rcClient.right - fnWidth - 2;
     rcDownvalue.top = DownLimit + 1;
     rcDownvalue.right = rcClient.right - 1;
     rcDownvalue.bottom = rcDownvalue.top + fnHeight + 2; pdcClient->DrawText( strDown, rcDownvalue, DT_CENTER);
     //画下界限
     startPos.y = DownLimit;
     EndPos.y = DownLimit;
     pdcClient->MoveTo(startPos);
     pdcClient->LineTo(EndPos); pdcClient->SelectObject(pOldPen1); pen.CreatePen(PS_SOLID,1,RGB(68,232,219));
     CPen* pOldPen = (CPen*)pdcClient->SelectObject(&pen); int i = 0;
     double *pdblPos; int iArrCount = m_arrYHeight.GetSize(); if( (lineEndPos-lineStartPos)>(m_betweenspace*iArrCount) )
     {
      i = 0;
      m_fromPos.x = lineEndPos-m_betweenspace*iArrCount;
     }
     else
     {
      i = iArrCount - ( (lineEndPos-lineStartPos)/m_betweenspace );
      m_fromPos.x = lineStartPos;
     } if(m_arrYHeight.GetSize()<1) return FALSE;
     double dblpos;
     //画第一个点
     pdblPos = (double*)m_arrYHeight.GetAt(i); dblpos = *pdblPos;
     if(*pdblPos>99000) dblpos = 0;
     dblpos = (dblpos-linelimitevalue.ZeroValue)*m_ZoomInRatio;
     m_fromPos.y = m_ZeroY-int(dblpos/m_Height*line_height); if( *pdblPos<99000 )  //不是临时加的点
     {
      if( ( m_fromPos.y>=UpLimit )&&
       ( m_fromPos.y<=DownLimit )  )
      {
       pdcClient->SetPixel(m_fromPos,RGB(0,0,255));   //打蓝点
      }
      else
      {
       pdcClient->SetPixel(m_fromPos,RGB(255,0,0));   //打红点
      }
     } i++; double *pdblprePos;
     COLORREF clNaturaldot, clAlarmdot;
     clAlarmdot = RGB(255,0,0);
     clNaturaldot = RGB(255,255,255);
     
     while( (i<iArrCount) )
     {
      m_toPos.x = m_fromPos.x+m_betweenspace;
      pdblprePos = (double*)m_arrYHeight.GetAt(i-1);
      pdblPos = (double*)m_arrYHeight.GetAt(i);
      dblpos = *pdblPos;
      if(*pdblPos>90000) dblpos = 0;
      dblpos = (dblpos-linelimitevalue.ZeroValue)*m_ZoomInRatio;
      m_toPos.y = m_ZeroY-int(dblpos/m_Height*line_height);//  if( ( *pdblprePos>9000 )&&( *pdblPos>9000 ) )
      if( *pdblPos>9000 )
      {
       //不处理
      }
      else
      {
       pdcClient->MoveTo(m_fromPos);
       pdcClient->LineTo(m_toPos);   if( ( m_fromPos.y>=UpLimit )&&
        ( m_fromPos.y<=DownLimit )  )
       {
        if( m_fromPos.y<m_ZeroY )
         pdcClient->SetPixel(m_fromPos.x,m_fromPos.y-1,clNaturaldot);   //打白点
        else
        {
         if( m_fromPos.y==m_ZeroY )
          pdcClient->SetPixel(m_fromPos.x,m_fromPos.y,clNaturaldot);   //打白点
         else pdcClient->SetPixel(m_fromPos.x,m_fromPos.y+1,clNaturaldot);   //打白点
        }
       }
       else
       {
        if( m_fromPos.y < UpLimit )
         pdcClient->SetPixel(m_fromPos.x,m_fromPos.y-1, clAlarmdot);   //打红点
        else pdcClient->SetPixel(m_fromPos.x,m_fromPos.y+1, clAlarmdot);   //打红点
       }
       if( ( m_toPos.y>=UpLimit )&&
        ( m_toPos.y<=DownLimit )  )
       {
        if( m_toPos.y < m_ZeroY )
         pdcClient->SetPixel(m_toPos.x,m_toPos.y-1,clNaturaldot);   //打白点
        else
        {
         if( m_toPos.y == m_ZeroY )
          pdcClient->SetPixel(m_toPos.x,m_toPos.y,clNaturaldot);   //打白点
         else pdcClient->SetPixel(m_toPos.x,m_toPos.y+1,clNaturaldot);   //打白点
        }
       }
       else
       {
        if( m_toPos.y < UpLimit )
         pdcClient->SetPixel(m_toPos.x,m_toPos.y-1,clAlarmdot);   //打红点
        else pdcClient->SetPixel(m_toPos.x,m_toPos.y+1,clAlarmdot);   //打红点
       }
      }  m_fromPos = m_toPos;
      ++i;
     } pDC->BitBlt(rcClient.left,rcClient.top,rcClient.Width(),rcClient.Height(),&dcMem,0,0,SRCCOPY);//第一次拷贝到屏幕
     m_parentWnd->ReleaseDC(pDC);  pdcClient->SelectObject(pOldPen);
     pdcClient->SelectObject(pOldBitmap); pdcClient->DeleteDC();
     pdcClient = NULL;