以文本方式查看主题

-  计算机科学论坛  (http://bbs.xml.org.cn/index.asp)
--  『 C/C++编程思想 』  (http://bbs.xml.org.cn/list.asp?boardid=61)
----  如何创建一个波形显示vc++技术  (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=37520)


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

--  如何创建一个波形显示vc++技术


1>目的:创建一个波形显示器
2>步骤:*从CWnd继承一个类,包含四个函数分别是:UINT SetPos(UINT nPos) ,设置位置点;void
         SetRange(UINT nLower,UINT nUpper),设置波形条高度范围;绘制波形条void DrawBar();
  更新绘制void InvalidateCtrl();重载virtual BOOL Create(LPCTSTR lpszClassName,
         LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd,
         UINT nID, CCreateContext* pContext = NULL);映射afx_msg void OnPaint()消息函数。
        
        *定义五个变量UINT m_nVertical;范围最小值UINT  m_nLower;范围最大值UINT  m_nUpper;
  位置UINT  m_nPos;设备CDC m_MemDC;位图CBitmap m_Bitmap;
         
        *初始化数据
CAduioShow::CAduioShow()
      {
file://初始化数据 高为100,底为0,开始点为0
m_nPos=0;
m_nLower=0;
m_nUpper=100;
      }

       *//下面注册应用类,风格设置为如果窗口的高,宽改变时从绘制整个窗口
BOOL CAduioShow::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const
                        RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class
file://下面注册类,风格设置为如果窗口的高,宽改变时从绘制整个窗口
static CString  classname=AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW);
       
return CWnd::CreateEx(WS_EX_CLIENTEDGE|WS_EX_STATICEDGE,classname,NULL,
                    dwStyle,rect.left,rect.top,rect.right-rect.left,
        rect.bottom-rect.top,
                              pParentWnd->GetSafeHwnd(),(HMENU)nID);
file://(HMENU)nID为程序中的图片框id


}

      *设置变动条的动态位置,并返回初始位置
UINT  CAduioShow::SetPos(UINT nPos)
{
file://下面设置位置最大及最小值
if (nPos>m_nUpper)
  nPos=m_nUpper;
if(nPos<m_nLower)
        nPos=m_nLower;

UINT nOld=m_nPos;
      m_nPos=nPos;
    file://绘制变动条
   DrawBar();
   
   Invalidate();;

   return nOld;
}

      *设置变动条的范围
void CAduioShow::SetRange(UINT nLower,UINT nUpper)
{
m_nLower=nLower;
m_nUpper=nUpper;

InvalidateCtrl();
}
  
     *变换坐标
void CAduioShow::OnPaint()
{
CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here
CRect rcClient;
GetClientRect(rcClient);

if(m_MemDC.GetSafeHdc()!=NULL)
{
  dc.BitBlt(0,0,rcClient.Width(),rcClient.Height(),&m_MemDC,0,0,SRCCOPY);
}

// Do not call CWnd::OnPaint() for painting messages
}

      *绘制条形图
void CAduioShow::DrawBar()
{
UINT nRange=m_nUpper-m_nLower;
CRect reClient;
GetClientRect(reClient);

if(m_MemDC.GetSafeHdc()!=NULL)
{
  m_MemDC.BitBlt(0,0,reClient.Width(),reClient.Height(),&m_MemDC,4,0,SRCCOPY);

                CRect reTop(reClient.right-4,0,reClient.right-2,reClient.bottom);
                file://计算条形图的高度
  reTop.top =(long)(((float)(m_nPos-m_nLower)/nRange)*reClient.Height());
                file://计算条形图的宽度
  CRect reRight=reClient;
        reRight.left=reRight.right-4;
                file://绘制
        CBrush   bkBrush(HS_HORIZONTAL,RGB(0,128,128));
  m_MemDC.FillRect(reRight,&bkBrush);
        
  CBrush   bBrush(RGB(0,255,0));
  m_MemDC.FillRect(reTop,&bBrush);
}

}

       *
void CAduioShow::InvalidateCtrl()
{
CClientDC dc(this);
CRect reClient;
GetClientRect(reClient);
         file://无效更新
if(m_MemDC.GetSafeHdc()==NULL)
{
  m_MemDC.CreateCompatibleDC(&dc);
  m_Bitmap.CreateCompatibleBitmap(&dc,reClient.Width(),reClient.Height());
  m_MemDC.SelectObject(m_Bitmap);
  m_MemDC.SetBkColor(RGB(0,0,0));
  CBrush bkBrush(HS_HORIZONTAL,RGB(0,128,0));
  m_MemDC.FillRect(reClient,&bkBrush);
}
InvalidateRect(reClient);

}


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