📄 scope.cpp
字号:
// Scope.cpp : implementation file
//
#include "stdafx.h"
#include "randomNum.h"
#include "Scope.h"
#include "resource.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// Scope
Scope::Scope()
{
m_strTitle = _T("随机数显示器");
m_strValueName = _T("数值");
m_strUnitName = _T("度");
m_BkBrush.CreateSolidBrush(RGB(0x00,0x00,0x33));
m_PanelBrush.CreateSolidBrush(RGB(0x22,0x22,0x44));
m_CurveBrush.CreateSolidBrush(RGB(0x00,0x00,0x00));
m_PenCurve.CreatePen(PS_SOLID,2,RGB(0,255,0));
m_PenGrid.CreatePen(PS_SOLID,0,RGB(192,192,192));
m_PenBrightLine.CreatePen(PS_SOLID,0,RGB(0xff,0xff,0xff));
m_PenDarkLine.CreatePen(PS_SOLID,0,RGB(0x55,0x55,0x55));
m_FontTitle.CreateFont(18,0,0,0,FW_BOLD,FALSE,FALSE,FALSE,DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,"宋体");
m_FontAxis.CreateFont(15,0,0,0,FW_THIN,FALSE,FALSE,FALSE,DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,"Arial");
m_FontValue.CreatePointFont(120,"FixedSys");
m_FontLabel.CreatePointFont(120,"Times New Roman");
m_bitmapTitle.LoadBitmap(IDB_BITMAP1);
m_bitmapTrack.LoadBitmap(IDB_TRACK);
m_dDimT = 100;
m_dDimY = 0.5;
m_nBase = 5;
m_nRange = 10;
m_dValue = 0.0;
m_nArrowIndex =-1;
m_bPressed = FALSE;
}
Scope::~Scope()
{
if(!m_TimeList.empty())
m_TimeList.clear();
if(!m_ValueList.empty())
m_ValueList.clear();
}
BEGIN_MESSAGE_MAP(Scope, CStatic)
//{{AFX_MSG_MAP(Scope)
ON_WM_MOUSEMOVE()
ON_WM_PAINT()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_ERASEBKGND()
ON_WM_NCHITTEST()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// Scope message handlers
void Scope::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
if(m_rgnYPlus.PtInRegion(point)&&m_nArrowIndex !=0)
{
m_nArrowIndex =0;
DrawArrow(&dc,m_nArrowIndex,TRUE);
}
if(m_rgnYMinus.PtInRegion(point)&&m_nArrowIndex !=1)
{
m_nArrowIndex =1;
DrawArrow(&dc,m_nArrowIndex,TRUE);
}
if(m_rgnTPlus.PtInRegion(point)&&m_nArrowIndex !=2)
{
m_nArrowIndex =2;
DrawArrow(&dc,m_nArrowIndex,TRUE);
}
if(m_rgnTMinus.PtInRegion(point)&&m_nArrowIndex !=3)
{
m_nArrowIndex =3;
DrawArrow(&dc,m_nArrowIndex,TRUE);
}
if(!m_rgnYPlus.PtInRegion(point)&&
!m_rgnYMinus.PtInRegion(point)&&
!m_rgnTPlus.PtInRegion(point)&&
!m_rgnTMinus.PtInRegion(point)&&
m_nArrowIndex!=-1)
{
DrawArrow(&dc,m_nArrowIndex,FALSE);
m_nArrowIndex = -1;
}
if(m_bPressed)
{
int newBase = (int)(((point.y-m_rectScroll.top+m_rectScroll.Height()/m_nRange/2)/(double)m_rectScroll.Height())*m_nRange);
if(newBase<0)
newBase =0;
if(newBase>m_nRange)
newBase =m_nRange;
if(newBase !=m_nBase )
{
m_nBase = newBase;
DrawCurvePanel(&dc);
DrawCurvePanel(&dc);
DrawGrid(&dc);
DrawCurve(&dc);
DrawAxis(&dc);
DrawTrack(&dc,m_bPressed);
DrawArrow(&dc,0,FALSE);
DrawArrow(&dc,1,FALSE);
DrawArrow(&dc,2,FALSE);
DrawArrow(&dc,3,FALSE);
}
}
CStatic::OnMouseMove(nFlags, point);
}
void Scope::OnPaint()
{
//CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
CPaintDC dc(this);
DrawTitle(&dc);
DrawCurvePanel(&dc);
DrawGrid(&dc);
DrawCurve(&dc);
DrawArrow(&dc,0,FALSE);
DrawArrow(&dc,1,FALSE);
DrawArrow(&dc,2,FALSE);
DrawArrow(&dc,3,FALSE);
DrawAxis(&dc);
DrawTrack(&dc,m_bPressed);
}
void Scope::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(m_rgnYPlus.PtInRegion(point))
{
if(m_dDimY>=1&&m_dDimY<10)
m_dDimY+=1;
if(m_dDimY>=10&&m_dDimY<100)
m_dDimY+=10;
if(m_dDimY>=100&&m_dDimY<1000)
m_dDimY+=100;
if(m_dDimY>=1000)
m_dDimY+=1000;
Invalidate();
}
if(m_rgnYMinus.PtInRegion(point))
{
if(m_dDimY>1&&m_dDimY<=10)
m_dDimY-=1;
if(m_dDimY>10&&m_dDimY<=100)
m_dDimY-=10;
if(m_dDimY>100&&m_dDimY<=1000)
m_dDimY-=100;
if(m_dDimY>1000)
m_dDimY-=1000;
if(m_dDimY<=1)
m_dDimY=max(m_dDimY-0.1,0.1);
Invalidate();
}
if(m_rgnTPlus.PtInRegion(point))
{
m_dDimT+=0.1;
Invalidate();
}
if(m_rgnTMinus.PtInRegion(point))
{
m_dDimT=max(m_dDimT-0.1,0.1);
Invalidate();
}
if(m_rectScroll.PtInRect(point))
{
SetCapture();
m_bPressed = TRUE;
m_nBase = (int)(((point.y-m_rectScroll.top+m_rectScroll.Height()/m_nRange/2)/(double)m_rectScroll.Height())*m_nRange);
Invalidate();
}
CStatic::OnLButtonDown(nFlags, point);
}
void Scope::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
//CStatic::OnLButtonUp(nFlags, point);
CClientDC dc(this);
ReleaseCapture();
m_bPressed = FALSE;
DrawTrack(&dc,m_bPressed);
CStatic::OnLButtonUp(nFlags, point);
}
BOOL Scope::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
//return CStatic::OnEraseBkgnd(pDC);
/////////
CRect rect;
GetClientRect(&rect);
pDC->FillRect(&rect,&m_BkBrush);//Draw background
rect.InflateRect(-3,-25,-4,-3);//curve panel
m_rectCurvePanel = rect;
m_rectCurve = rect;
m_rectCurve.InflateRect(-30,-5,-23,-25);//curve area
m_rectScroll = m_rectCurve;
m_rectScroll.left = m_rectCurve.right+8;
m_rectScroll.right = m_rectScroll.left+10;//rect scroll created
m_rectValuePanel = rect;
m_rectValuePanel.top = rect.bottom+5;
m_rectValuePanel.bottom= m_rectValuePanel.top+51;//rectValuePanel created
CFont *pOldFont;
pOldFont = pDC->SelectObject(&m_FontLabel);
CSize size = pDC->GetTextExtent(m_strValueName);
m_rectValue.left = m_rectValuePanel.left+20+size.cx;
m_rectValue.top = m_rectValuePanel.top+(m_rectValuePanel.Height()-size.cy)/2-2;
m_rectValue.bottom = m_rectValue.top+size.cy+4;
size = pDC->GetTextExtent(m_strUnitName);
m_rectValue.right = m_rectValuePanel.right - 20 - size.cx;
pDC->SelectObject(pOldFont);
if(m_rgnCurve.m_hObject==NULL)
m_rgnCurve.CreateRectRgn(m_rectCurve.left+2,m_rectCurve.top+2,m_rectCurve.right-2,m_rectCurve.bottom-2);
POINT ptYPlus[3];
POINT ptYMinus[3];
POINT ptTPlus[3];
POINT ptTMinus[3];
ptYPlus[0].x = m_rectCurvePanel.left+15;
ptYPlus[0].y = m_rectCurve.bottom+3;
ptYPlus[1].x = ptYPlus[0].x-5;
ptYPlus[1].y = ptYPlus[0].y+6;
ptYPlus[2].x = ptYPlus[0].x+5;
ptYPlus[2].y = ptYPlus[0].y+6;
ptYMinus[0].x = m_rectCurvePanel.left+15;
ptYMinus[0].y = m_rectCurve.bottom+18;
ptYMinus[1].x = ptYMinus[0].x-5;
ptYMinus[1].y = ptYMinus[0].y-6;
ptYMinus[2].x = ptYMinus[0].x+5;
ptYMinus[2].y = ptYMinus[0].y-6;
ptTPlus[0].x = m_rectScroll.left+m_rectScroll.Width()/2;
ptTPlus[0].y = m_rectCurve.bottom+3;
ptTPlus[1].x = ptTPlus[0].x-5;
ptTPlus[1].y = ptTPlus[0].y+6;
ptTPlus[2].x = ptTPlus[0].x+5;
ptTPlus[2].y = ptTPlus[0].y+6;
ptTMinus[0].x = m_rectScroll.left+m_rectScroll.Width()/2;
ptTMinus[0].y = m_rectCurve.bottom+18;
ptTMinus[1].x = ptTMinus[0].x-5;
ptTMinus[1].y = ptTMinus[0].y-6;
ptTMinus[2].x = ptTMinus[0].x+5;
ptTMinus[2].y = ptTMinus[0].y-6;
if(m_rgnYPlus.m_hObject==NULL)
m_rgnYPlus.CreatePolygonRgn( ptYPlus, 3, ALTERNATE );
if(m_rgnYMinus.m_hObject==NULL)
m_rgnYMinus.CreatePolygonRgn( ptYMinus, 3, ALTERNATE );
if(m_rgnTPlus.m_hObject==NULL)
m_rgnTPlus.CreatePolygonRgn( ptTPlus, 3, ALTERNATE );
if(m_rgnTMinus.m_hObject==NULL)
m_rgnTMinus.CreatePolygonRgn( ptTMinus, 3, ALTERNATE );
return TRUE;
}
UINT Scope::OnNcHitTest(CPoint point)
{
// TODO: Add your message handler code here and/or call default
return HTCLIENT;
//return CStatic::OnNcHitTest(point);
}
void Scope::PreSubclassWindow()
{
// TODO: Add your specialized code here and/or call the base class
CStatic::PreSubclassWindow();
}
void Scope::DrawTitle(CDC *pDC)
{
CDC dcMem;
BITMAP bm;
CBitmap *pBmp;
CFont *pFont;
m_bitmapTitle.GetObject(sizeof(BITMAP),&bm);
dcMem.CreateCompatibleDC(pDC);
pBmp = dcMem.SelectObject(&m_bitmapTitle);
CRect rect;
GetClientRect(&rect);
pFont = pDC->SelectObject(&m_FontTitle);
CSize size= pDC->GetTextExtent(m_strTitle);
rect.top += 3;
rect.bottom=rect.top+size.cy;
rect.left=3;
rect.right=rect.right-3;
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(255,255,255));
pDC->DrawText(m_strTitle,-1,&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
int nBmpWidth = (rect.Width()-size.cx-16)/2;
int nTimes = nBmpWidth/10-1;
pDC->BitBlt(rect.left,rect.top,bm.bmWidth,bm.bmHeight,&dcMem,0,0,SRCCOPY);
pDC->BitBlt(rect.right-nBmpWidth,rect.top,bm.bmWidth,bm.bmHeight,&dcMem,0,0,SRCCOPY);
int i;
for(i=0;i<nTimes;i++)
{
pDC->BitBlt(rect.left+5+i*10,rect.top,10,bm.bmHeight,&dcMem,10,0,SRCCOPY);
pDC->BitBlt(rect.right-nBmpWidth+5+i*10,rect.top,10,bm.bmHeight,&dcMem,10,0,SRCCOPY);
}
pDC->BitBlt(rect.left+nBmpWidth-bm.bmWidth+5,rect.top,bm.bmWidth-5,bm.bmHeight,&dcMem,5,0,SRCCOPY);
pDC->BitBlt(rect.right-bm.bmWidth+5,rect.top,bm.bmWidth-5,bm.bmHeight,&dcMem,5,0,SRCCOPY);
pDC->SelectObject(pFont);
dcMem.SelectObject(pBmp);
}
void Scope::SetTitle(CString strTitle)
{
m_strTitle = strTitle;
CClientDC dc(this);
Invalidate();
}
void Scope::DrawValuePanel(CDC *pDC)
{
CFont *pOldFont;
CPen *pOldPen;
pDC->FillRect(&m_rectValuePanel,&m_PanelBrush);
pDC->SetTextAlign(TA_LEFT);
pDC->SetTextColor(RGB(255,255,0));
pDC->SetBkMode(TRANSPARENT);
pOldPen = pDC->SelectObject(&m_PenBrightLine);
pDC->MoveTo(m_rectValuePanel.left,m_rectValuePanel.top);
pDC->LineTo(m_rectValuePanel.left,m_rectValuePanel.bottom);
pDC->MoveTo(m_rectValuePanel.left,m_rectValuePanel.top);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -