⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 curveframe.cpp

📁 模拟了现实中的示波器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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 + -