?? oscopectrl.cpp
字號:
// OScopeCtrl.cpp : implementation file//
#include "stdafx.h"
#include "math.h"
#include "OScopeCtrl.h"
#include "resource.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__ ;
#endif
/////////////////////////////////////////////////////////////////////////////
// COScopeCtrl
COScopeCtrl::COScopeCtrl()
{
//初始化起始點
m_PrePos=0;
//初始化數(shù)據(jù)范圍
m_XLower=0;
m_XUpper=8000;
m_Y1Lower=0;
m_Y1Upper=150;
m_Y2Lower=-180;
m_Y2Upper=180;
//設置背景顏色,網(wǎng)格顏色和數(shù)據(jù)顏色
m_crBackColor = RGB( 0, 0, 0);
m_crGridColor = RGB( 0,255,255);
m_crLableColor = RGB(255, 0, 0);
//數(shù)據(jù)筆,背景刷
m_PenGrid.CreatePen(PS_SOLID,0,m_crGridColor);
m_PenWave1.CreatePen(PS_SOLID,0,RGB(0,255,0));;
m_PenWave2.CreatePen(PS_SOLID,0,RGB(0,0,255));;
//坐標顯示
m_Title.Format("Y:電壓(V) X:時間(s)");
//用于恢復內(nèi)存DC的CBitmap指針
m_pbitmapOldGrid = NULL ;
m_pbitmapOldWave = NULL ;
m_pbitmapOldWindow=NULL;
m_bXLable=0;
m_bYLable=0;
m_XPos=0;
m_YPos=0;
m_bCover=TRUE;
m_bIndication=TRUE;
m_bMagnitude=TRUE;
m_bPhase=TRUE;
}
/////////////////////////////////////////////////////////////////////////////
COScopeCtrl::~COScopeCtrl()
{
//恢復內(nèi)存DC
if (m_pbitmapOldGrid != NULL)
m_dcGrid.SelectObject(m_pbitmapOldGrid) ;
if (m_pbitmapOldWave != NULL)
m_dcWave.SelectObject(m_pbitmapOldWave) ;
if (m_pbitmapOldWindow != NULL)
m_dcWindow.SelectObject(m_pbitmapOldWindow) ;
}
BEGIN_MESSAGE_MAP(COScopeCtrl, CWnd)
//{{AFX_MSG_MAP(COScopeCtrl)
ON_WM_PAINT()
ON_WM_SIZE()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// COScopeCtrl message handlers
/////////////////////////////////////////////////////////////////////////////
BOOL COScopeCtrl::Create(DWORD dwStyle,const RECT& rect,CWnd* pParentWnd, UINT nID)
{
BOOL result ;
static CString className = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW) ;
result = 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) ;
if (result != 0)
InvalidateCtrl() ;
return result ;
}
void COScopeCtrl::SetTitle(CString title)
{
m_Title=title;
InvalidateCtrl();
}
/////////////////////////////////////////////////////////////////////////////
//設置網(wǎng)格顏色
void COScopeCtrl::SetGridColor(COLORREF color)
{
m_crGridColor=color;
m_PenGrid.DeleteObject();
m_PenGrid.CreatePen(PS_SOLID,0,m_crGridColor);
InvalidateCtrl() ;
}
/////////////////////////////////////////////////////////////////////////////
//設置背景顏色
void COScopeCtrl::SetBackColor(COLORREF color)
{
m_crBackColor=color;
InvalidateCtrl();
}
void COScopeCtrl::SetRangeX(int nMin,int nMax)
{
if(nMax>nMin)
{
m_XLower=nMin;
m_XUpper=nMax;
InvalidateCtrl();
}
}
void COScopeCtrl::SetRangeYA(int nMin,int nMax)
{
if(nMax>nMin)
{
m_Y1Lower=nMin;
m_Y1Upper=nMax;
InvalidateCtrl();
}
}
void COScopeCtrl::SetRangeYB(int nMin,int nMax)
{
if(nMax>nMin)
{
m_Y2Lower=nMin;
m_Y2Upper=nMax;
InvalidateCtrl();
}
}
/////////////////////////////////////////////////////////////////////////////
void COScopeCtrl::InvalidateCtrl()
{
//刷新控件,注意只刷新一次
int i,j;
CPen *oldPen;
CFont axisFont,yUnitFont,*oldFont;
CString strTemp;
CClientDC dc(this);
if (m_dcGrid.GetSafeHdc() == NULL)
{
m_dcGrid.CreateCompatibleDC(&dc) ;
m_bitmapGrid.CreateCompatibleBitmap(&dc, m_nClientWidth, m_nClientHeight) ;
m_pbitmapOldGrid = m_dcGrid.SelectObject(&m_bitmapGrid) ;
}
m_dcGrid.FillSolidRect(m_rectClient,m_crBackColor);
m_dcGrid.FillSolidRect(m_rectWave,RGB(0,0,0));
//畫波形方框
oldPen = m_dcGrid.SelectObject (&m_PenGrid);
m_dcGrid.MoveTo (m_rectWave.left-1,m_rectWave.top-1);
m_dcGrid.LineTo (m_rectWave.right+1,m_rectWave.top-1);
m_dcGrid.LineTo (m_rectWave.right+1,m_rectWave.bottom+1);
m_dcGrid.LineTo (m_rectWave.left-1,m_rectWave.bottom+1);
m_dcGrid.LineTo (m_rectWave.left-1,m_rectWave.top-1);
m_dcGrid.SelectObject (oldPen);
//畫點線
for(i=0;i<7;i++)
for(j=m_rectWave.left;j<m_rectWave.right;j+=2)
{
m_dcGrid.SetPixel (j,m_rectWave.top+i*40,m_crGridColor) ;
}
for(i=0;i<9;i++)
for(j=m_rectWave.top;j<m_rectWave.bottom;j+=2)
{
m_dcGrid.SetPixel(m_rectWave.left+i*40,j,m_crGridColor) ;
}
// 創(chuàng)建字體(水平和垂直)
// height:14 weight:300
axisFont.CreateFont (14,0,0,0,300,
FALSE,FALSE,0,DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH|FF_SWISS, "Arial") ;
yUnitFont.CreateFont (12,0,0,0,300,
FALSE,FALSE,0,DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH|FF_SWISS,"宋體") ;
//字體更換
oldFont = m_dcGrid.SelectObject(&axisFont);
m_dcGrid.SetBkColor (m_crBackColor);
m_dcGrid.SetTextColor (m_crGridColor);
//Y坐標
m_dcGrid.SetTextAlign (TA_RIGHT|TA_BASELINE);
for(i=0;i<=6;i++)
{
strTemp.Format ("%d",m_Y1Upper-(6-i)*(m_Y1Upper-m_Y1Lower)/6);
strTemp+="%";
m_dcGrid.TextOut (m_rectWave.left-4,m_rectWave.bottom-i*(m_rectWave.bottom-m_rectWave.top)/6,strTemp);
}
m_dcGrid.SetTextAlign (TA_LEFT|TA_BASELINE);
for(i=0;i<=6;i++)
{
strTemp.Format("%d°",m_Y2Lower+i*(m_Y2Upper-m_Y2Lower)/6);
m_dcGrid.TextOut (m_rectWave.right+4,m_rectWave.bottom-i*(m_rectWave.bottom-m_rectWave.top)/6,strTemp);
}
//X坐標
m_dcGrid.SetTextAlign (TA_CENTER|TA_TOP);
for(i=0;i<=8;i++)
{
strTemp.Format (" %.2f",i*(m_XUpper-m_XLower)/8000.0+m_XLower);
m_dcGrid.TextOut (m_rectWave.left+i*(m_rectWave.right-m_rectWave.left)/8,
m_rectWave.bottom+4,strTemp);
}
//字體更換
m_dcGrid.SelectObject(oldFont);
yUnitFont.DeleteObject();
if (m_dcWave.GetSafeHdc() == NULL)
{
m_dcWave.CreateCompatibleDC(&dc) ;
m_bitmapWave.CreateCompatibleBitmap(&dc, m_nClientWidth, m_nClientHeight) ;
m_pbitmapOldWave=m_dcWave.SelectObject(&m_bitmapWave) ;
}
//確信數(shù)據(jù)位圖已清除
m_dcWave.FillSolidRect(m_rectClient,RGB(0,0,76));
if(m_XPos<m_rectWave.left) m_XPos=m_rectWave.left;
if(m_XPos>m_rectWave.right) m_XPos=m_rectWave.right;
if(m_YPos<m_rectWave.top) m_YPos=m_rectWave.top;
if(m_YPos>m_rectWave.bottom) m_YPos=m_rectWave.bottom;
//強制刷新波形區(qū)域
InvalidateRect(m_rectClient);
DrawPoint();
}
////////////////////////////////////////////////////////////////////////////
void COScopeCtrl::OnPaint()
{
CPaintDC dc(this);
if (m_dcWindow.GetSafeHdc() == NULL)
{
m_dcWindow.CreateCompatibleDC(&dc);
m_bitmapWindow.CreateCompatibleBitmap(&dc, m_nClientWidth,m_nClientHeight);
m_pbitmapOldWindow= m_dcWindow.SelectObject(&m_bitmapWindow);
}
if (m_dcWindow.GetSafeHdc() != NULL)
{
//畫網(wǎng)格
m_dcWindow.BitBlt(0,0,m_nClientWidth,m_nClientHeight,
&m_dcGrid, 0, 0, SRCCOPY) ;
//畫波形
m_dcWindow.BitBlt(0,0,m_nClientWidth,m_nClientHeight,&m_dcWave,0,0,SRCPAINT);
//m_dcWindow.BitBlt(m_rectWave.left,m_rectWave.top,
// m_rectWave.Width(),m_rectWave.Height(),
// &m_dcWave,m_rectWave.left,m_rectWave.top,SRCPAINT);
if(m_bIndication==TRUE)
{
//畫標尺
int i;
//畫點線
for(i=m_rectWave.left+1;i<m_rectWave.right;i+=2)
{
m_dcWindow.SetPixel (i,m_YPos,m_crLableColor) ;
}
for(i=m_rectWave.top+1;i<m_rectWave.bottom;i+=2)
{
m_dcWindow.SetPixel (m_XPos,i,m_crLableColor) ;
}
}
//顯示坐標數(shù)據(jù)
CFont yUnitFont,*oldFont;
yUnitFont.CreateFont (12,0,0,0,300,
FALSE,FALSE,0,DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH|FF_SWISS,"宋體") ;
//字體更換
CString strTemp1,strTemp2;
oldFont = m_dcWindow.SelectObject(&yUnitFont);
m_dcWindow.SetTextColor (m_crGridColor);
m_dcWindow.SetBkColor(m_crBackColor);
m_dcWindow.SetTextAlign (TA_LEFT|TA_TOP);
strTemp2.Format("頻率:%dHz",(m_XPos-m_rectWave.left)*(m_XUpper-m_XLower)/320+m_XLower);
strTemp1.Format(" 幅度:%.2f",m_Y1Upper-(float)(m_YPos-m_rectWave.top)*(m_Y1Upper-m_Y1Lower)/240);
strTemp2+=strTemp1;
strTemp2+="%";
strTemp1.Format(" 相位:%.2f°",(float)(m_YPos-m_rectWave.bottom)*(m_Y2Lower-m_Y2Upper)/240+m_Y2Lower);
strTemp2+=strTemp1;
m_dcWindow.TextOut(m_rectWave.left,m_rectWave.bottom+20,strTemp2);
m_dcWindow.SelectObject(oldFont);
//將結果送到顯示區(qū)域
dc.BitBlt(0, 0, m_nClientWidth, m_nClientHeight,
&m_dcWindow, 0, 0, SRCCOPY) ;
}
}
/////////////////////////////////////////////////////////////////////////////
void COScopeCtrl::SetData(int *data1,int *data2)
{
//向波形窗口追加一幀數(shù)據(jù)
int i;
for(i=0;i<320;i++)
{
m_DataA[i]=data1[i];
m_DataB[i]=data2[i];
}
DrawPoint();
Invalidate();
}
/////////////////////////////////////////////////////////////////////////////
void COScopeCtrl::DrawPoint()
{
int i;
//數(shù)據(jù)調(diào)整
int m,n;
double nr;
int dat1[320],dat2[320];
m=(m_Y1Lower+m_Y1Upper)*120/(m_Y1Lower-m_Y1Upper)+120-1;
n=(m_Y2Lower+m_Y2Upper)*120/(m_Y2Lower-m_Y2Upper)+120-1;
nr=240.0/(m_Y2Upper-m_Y2Lower);
for(i=0;i<320;i++)
{
dat1[i]=m_DataA[i]+m;
if(dat1[i]<0)
dat1[i]=0;
else if(dat1[i]>240)
dat1[i]=240;
dat2[i]=(int)(m_DataB[i]*nr+n);
if(dat2[i]<0)
dat2[i]=0;
else if(dat2[i]>240)
dat2[i]=240;
}
if (m_dcWave.GetSafeHdc() != NULL)
{
// 選擇畫筆
// 移到當前位置,畫數(shù)據(jù)
CPen *oldPen;
if(m_bCover==TRUE)
m_dcWave.FillSolidRect(m_rectWave,m_crBackColor);
if(m_bMagnitude==TRUE)
{
oldPen=m_dcWave.SelectObject (&m_PenWave1);
m_dcWave.MoveTo(m_rectWave.left,m_rectWave.bottom-dat1[0]-1);
for(i=1;i<320;i++)
{
m_dcWave.LineTo(m_rectWave.left+i,m_rectWave.bottom-dat1[i]-1);
}
m_dcWave.SelectObject (oldPen);
}
if(m_bPhase==TRUE)
{
oldPen=m_dcWave.SelectObject (&m_PenWave2);
m_dcWave.MoveTo(m_rectWave.left,m_rectWave.bottom-dat2[0]-1);
for(i=1;i<320;i++)
{
m_dcWave.LineTo(m_rectWave.left+i,m_rectWave.bottom-dat2[i]-1);
}
m_dcWave.SelectObject (oldPen);
}
}
}
/////////////////////////////////////////////////////////////////////////////
void COScopeCtrl::OnSize(UINT nType,int cx,int cy)
{
CWnd::OnSize(nType,cx,cy);
GetClientRect(m_rectClient);
m_nClientHeight=m_rectClient.Height();
m_nClientWidth =m_rectClient.Width();
//決定波形方框位置
m_rectWave.top=m_rectClient.top+15;
m_rectWave.bottom=m_rectWave.top+240;
m_rectWave.left=m_rectClient.left+(m_nClientWidth-320)/2;
m_rectWave.right=m_rectWave.left+320;
}
/////////////////////////////////////////////////////////////////////////////
void COScopeCtrl::Reset()
{
InvalidateCtrl() ;
}
void COScopeCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(m_XPos-5<point.x&&m_XPos+5>point.x)
m_bXLable=1;
else
m_bXLable=0;
if(m_YPos-5<point.y&&m_YPos+5>point.y)
m_bYLable=1;
else
m_bYLable=0;
CWnd::OnLButtonDown(nFlags, point);
}
void COScopeCtrl::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_bXLable=0;
m_bYLable=0;
CWnd::OnLButtonUp(nFlags, point);
}
void COScopeCtrl::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
int f=0;
if(m_bXLable==1)
{
m_XPos=point.x-1;
if(m_XPos<m_rectWave.left) m_XPos=m_rectWave.left;
if(m_XPos>=m_rectWave.right)
m_XPos=m_rectWave.right;
f=1;
}
if(m_bYLable==1)
{
m_YPos=point.y-1;
if(m_YPos<m_rectWave.top) m_YPos=m_rectWave.top;
if(m_YPos>=m_rectWave.bottom) m_YPos=m_rectWave.bottom;
f=1;
}
if(f==1) InvalidateRect(m_rectClient);
CWnd::OnMouseMove(nFlags, point);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -