📄 curveframe.cpp
字号:
pDC->LineTo(ptTo);
//绘制坐标刻度线
if((i+1)%5 == 0)
{
pDC->SelectObject(&penScale);
pDC->MoveTo(ptTo.x, ptTo.y - 50);
pDC->LineTo(ptTo.x, ptTo.y - 200);
}
}
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
pDC->SetMapMode(oldMapMode);
pDC->SetViewportOrg(oldPtViewOrg);
}
/////////////////////////////////////////////////////////////////////////////
/*
函数介绍: 绘制坐标标识文字
输入参数: CDC *pDC,
LPCRECT lpRect
输出参数: 无
返回值 : 无
*/
/////////////////////////////////////////////////////////////////////////////
void CCurveFrame::DrawCoordText(CDC *pDC, LPCRECT lpRect, LPCRECT lpRectOffset)
{
int nSpace;
CString s;
CFont font;
CRect rect[11];
CPoint ptPosition(0,lpRectOffset->top);
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(66,255,66));
nSpace = (lpRect->bottom - lpRect->top- lpRectOffset->top - lpRectOffset->bottom)/10;
font.CreateStockObject(SYSTEM_FONT);
pDC->SelectObject(&font);
rect[5].left = lpRect->left;
rect[5].right = lpRectOffset->left;
rect[5].bottom = (lpRect->bottom - lpRect->top - (lpRectOffset->bottom - lpRectOffset->top) + nSpace)/2;
rect[5].top = rect[5].bottom - nSpace;
//绘制纵坐标
for (int i=0; i<11; i++)
{
if (i!=5)
{
rect[i].left = 0;
rect[i].right = lpRectOffset->left;
rect[i].bottom = rect[5].bottom - (5-i)*nSpace;
rect[i].top = rect[i].bottom - nSpace;
}
s.Format("%2.1f ", m_fVerScale*(1.0-i*0.2));
pDC->DrawText(s, rect[i], DT_RIGHT |DT_VCENTER |DT_SINGLELINE);
}
nSpace = (lpRect->right-lpRect->left- lpRectOffset->right - lpRectOffset->left)/10;
//绘制横坐标
for (i=0; i<11; i++)
{
rect[i].left = lpRectOffset->left + lpRect->left - nSpace/2 + i*nSpace;
rect[i].top = lpRect->bottom - lpRectOffset->bottom;
rect[i].right = rect[i].left + nSpace;
rect[i].bottom = rect[i].top + 20;
s.Format("%d", i*m_nHorScale/10);
pDC->DrawText(s, rect[i], DT_CENTER|DT_BOTTOM |DT_SINGLELINE);
}
}
/////////////////////////////////////////////////////////////////////////////
/*
函数介绍: 绘制曲线
输入参数: CDC *pDC,
LPCRECT lpRect
输出参数: 无
返回值 : 无
*/
/////////////////////////////////////////////////////////////////////////////
void CCurveFrame::DrawCurveDetail(
CDC *pDC, //设备上下文
LPCRECT lpRect, //绘图区尺寸
COLORREF clrCurve, //曲线颜色
UINT width,//曲线宽度
double Data[1024],
int Number,//
double FreqencySample)
{
//绘图区的尺寸临时变量
CRect rectCur;
rectCur = lpRect;
CPen penCurve;//绘制曲线的颜色
CPen *pOldPen;
penCurve.CreatePen(PS_SOLID, width, clrCurve);
//绘制网格线之前要设置映射模式,转换坐标,移动原点
pOldPen = pDC->SelectObject(&penCurve);
int oldMapMode = pDC->SetMapMode(MM_HIMETRIC);
CPoint oldPtViewOrg = pDC->SetViewportOrg(0, (rectCur.bottom-rectCur.top)/2);
pDC->DPtoLP(&rectCur);
//绘制波形
CPoint ptFrom(0,0);
CPoint ptTo(rectCur.right, 0);
int nScaleHor = rectCur.Width();
int nScaleVer = abs(rectCur.Height()/2);
ptFrom.x = 0;
ptFrom.y = (int)(Data[0]*nScaleVer/m_fVerScale);
pDC->SelectObject(&penCurve);
pDC->MoveTo(ptFrom);
for (int i=0; i<Number; i++)
{
ptTo.x = (int)(i*nScaleHor/(m_nHorScale*FreqencySample/1000));
ptTo.y = (int)(Data[i]*nScaleVer/m_fVerScale);
pDC->LineTo(ptTo);
}
pDC->SelectObject(pOldPen);
pDC->SetMapMode(oldMapMode);
pDC->SetViewportOrg(oldPtViewOrg);
}
/////////////////////////////////////////////////////////////////////////////
/*
函数介绍: 设置三个通道开启状态
输入参数: CDC *pDC,
LPCRECT lpRect
输出参数: 无
返回值 : 无
*/
/////////////////////////////////////////////////////////////////////////////
void CCurveFrame::SetCurveChannel(BOOL bOpenFirstChannel,
BOOL bOpenSecondChannel,BOOL bOpenThirdChannel)
{
m_bChannelFlag[0] = bOpenFirstChannel;
m_bChannelFlag[1] = bOpenSecondChannel;
m_bChannelFlag[2] = bOpenThirdChannel;
}
void CCurveFrame::PreSubclassWindow()
{
// TODO: Add your specialized code here and/or call the base class
GetClientRect(&m_rectBkArea);
m_rectClientArea.left = m_rectBkArea.left + m_rectOffset.left;
m_rectClientArea.top = m_rectBkArea.top + m_rectOffset.top;
m_rectClientArea.right = m_rectBkArea.right - m_rectOffset.right;
m_rectClientArea.bottom = m_rectBkArea.bottom - m_rectOffset.bottom;
Init();
CStatic::PreSubclassWindow();
}
/////////////////////////////////////////////////////////////////////////////
/*
函数介绍: 初始化CurveFrame
输入参数: 无
输出参数: 无
返回值 : 无
*/
/////////////////////////////////////////////////////////////////////////////
void CCurveFrame::Init()
{
CDC *pDC;//设备上下文指针
pDC = GetDC();
m_memDC.CreateCompatibleDC(pDC);
m_bmp.CreateCompatibleBitmap(pDC,m_rectBkArea.Width(), m_rectBkArea.Height());
m_pBmpOld = m_memDC.SelectObject(&m_bmp);
m_memDCCur.CreateCompatibleDC(pDC);
m_bmpCur.CreateCompatibleBitmap(pDC,m_rectBkArea.Width(), m_rectBkArea.Height());
m_pBmpOldCur = m_memDCCur.SelectObject(&m_bmpCur);
m_memDCClient.CreateCompatibleDC(pDC);
m_bmpClient.CreateCompatibleBitmap(pDC,m_rectClientArea.Width(), m_rectClientArea.Height());
m_pBmpOldClient = m_memDCClient.SelectObject(&m_bmpClient);
ApplyModify();
m_memDCCur.BitBlt(0,0,m_rectBkArea.Width(),m_rectBkArea.Height(),&m_memDC,0,0,SRCCOPY);
ReleaseDC(pDC);
}
/////////////////////////////////////////////////////////////////////////////
/*
函数介绍: 当修改相关设置后,需要调用此函数使设置生效
输入参数: 无
输出参数: 无
返回值 : 无
*/
/////////////////////////////////////////////////////////////////////////////
void CCurveFrame::ApplyModify()
{
//绘制背景
// DrawBkGround(&m_memDC, &m_rectBkArea);
DrawBlackBkGround(&m_memDC, &m_rectBkArea);
//绘制绘图客户区
DrawBkGrid(&m_memDC, &m_rectClientArea,m_clrBkGround, m_clrGridXCoord, m_clrGridLine, m_clrGridBoldLine);
//绘制坐标文字
DrawCoordText(&m_memDC, &m_rectBkArea, &m_rectOffset);
}
void CCurveFrame::GetCurveWidth(UINT &width, int index)
{
width = m_nWidth[index];
}
void CCurveFrame::GetCurveColor(COLORREF &color,int index)
{
switch(index)
{
case 0:
case 1:
case 2:
color = m_clrCurve[index];
break;
case 3:
color = m_clrBkGround;
break;
case 4:
color = m_clrGridLine;
break;
case 5:
color = m_clrGridBoldLine;
break;
case 6:
color = m_clrGridXCoord;
break;
default:break;
}
}
void CCurveFrame::SetCurveWidth(int width, int index)
{
m_nWidth[index] = width;
}
void CCurveFrame::SetCurveColor(COLORREF color, int index)
{
switch(index)
{
case 0:
case 1:
case 2:
m_clrCurve[index] = color;
break;
case 3:
m_clrBkGround = color;
break;
case 4:
m_clrGridLine = color;
break;
case 5:
m_clrGridBoldLine = color;
break;
case 6:
m_clrGridXCoord = color;
break;
default:break;
}
}
void CCurveFrame::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
dc.BitBlt(0,0,m_rectBkArea.Width(), m_rectBkArea.Height(), &m_memDCCur,0,0,SRCCOPY);
// Do not call CStatic::OnPaint() for painting messages
}
void CCurveFrame::DrawBlackBkGround(CDC *pDC, LPCRECT lpRect)
{
CPen pen[10];
CBrush brush[10];
// pen.CreateStockObject(NULL_PEN);
for(int i=0; i<10; i++)
{
pen[i].CreatePen(PS_SOLID, 1, RGB(0,i*25,0));
brush[i].CreateSolidBrush(RGB(0,i*25,0));
}
//填充背景
CBrush *pOldBrush;
CPen *pOldPen;
CRect r = lpRect;
for(i=0; i < 10; i++)
{
if(i == 0)
{
pOldPen = pDC->SelectObject(&pen[i]);
pOldBrush = pDC->SelectObject(&brush[i]);
}
else
{
pDC->SelectObject(&pen[i]);
pDC->SelectObject(&brush[i]);
}
pDC->Rectangle(r);
r.DeflateRect(1,1);
}
for(i = 9; i >= 0; i--)
{
if(i == 9)
{
pOldPen = pDC->SelectObject(&pen[i]);
pOldBrush = pDC->SelectObject(&brush[i]);
}
else
{
pDC->SelectObject(&pen[i]);
pDC->SelectObject(&brush[i]);
}
pDC->Rectangle(r);
r.DeflateRect(1,1);
}
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -