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;
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);
}