以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 C/C++编程思想 』  (http://bbs.xml.org.cn/list.asp?boardid=61)
----  用VC++编写象任务管理器中的CPU使用记录的波形显示的程序- -  (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=37518)


--  作者:卷积内核
--  发布时间:9/2/2006 3:46:00 PM

--  用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;


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
46.875ms