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

📄 bkgd.cpp

📁 简单的示波器程序
💻 CPP
字号:
// Bkgd.cpp : implementation file
//

#include "stdafx.h"
#include "aaa.h"
#include "Bkgd.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CBkgd

CBkgd::CBkgd()
{
	m_clrBk=RGB(123,124,0);//设置字的背景颜色
	m_clrGrid=RGB(255,125,124);//设置格子颜色
	m_clrPlot=RGB(123,255,124);//设置刻度字颜色

	m_penGrid.CreatePen(PS_SOLID,1,m_clrGrid);//
	m_penPlot.CreatePen(PS_SOLID,1,m_clrPlot);
	m_brushBk.CreateSolidBrush(m_clrBk);
    
	m_rectGrid=CRect(0,0,1440,1440);//设置格子区大小

    
}

CBkgd::~CBkgd()
{
	if (m_dcGrid.GetSafeHdc()!=NULL)//m_dcGrid可否用CDC后,直接用dc掉用?
	{
		m_dcGrid.SelectObject(m_pOldBitmapGrid);//选出bitmap
		m_bitmapGrid.DeleteObject();//清除内存
		m_dcGrid.DeleteDC();
	}
	if (m_dcPlot.GetSafeHdc()!=NULL)//作用?
	{
		m_dcPlot.SelectObject(m_pOldBitmapPlot);//选出BITMAP
		m_bitmapPlot.DeleteObject();//清除内存
		m_dcPlot.DeleteDC();
	}
}


BEGIN_MESSAGE_MAP(CBkgd, CWnd)
	//{{AFX_MSG_MAP(CBkgd)
	ON_WM_PAINT()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CBkgd message handlers

void CBkgd::InvalidateCtrl()
{
    GetParent()->GetDlgItem(m_ctlID)->GetWindowRect(&m_rectClient);
    GetParent()->ScreenToClient(&m_rectClient);
    m_rectClient.DeflateRect(CSize(0,0));//以防止边缘抖动
	MoveWindow(&m_rectClient);//改变自己的位置
	//保存窗口尺寸值以备后用
	GetClientRect(m_rectClient);
	m_nClientWidth = m_rectClient.Width();
	m_nClientHeight = m_rectClient.Height();

	CClientDC dc(this);
	//准备格子背景内存DC
	if(m_dcGrid.GetSafeHdc())/**Call this member function(GetSafeHdc) to get m_hDC, 
	                       	    the output device context. 
   					     	     This member function also works with null pointers.**/
	{
		m_dcGrid.DeleteDC();
		m_bitmapGrid.DeleteObject();
	}
	m_dcGrid.CreateCompatibleDC(&dc);
	m_bitmapGrid.CreateCompatibleBitmap(&dc,m_rectClient.Width(),m_rectClient.Height());
	m_pOldBitmapGrid=m_dcGrid.SelectObject(&m_bitmapGrid);
    
	//确定映射模式:(1440,1440)逻辑单位
	m_dcGrid.SetMapMode(MM_ANISOTROPIC);  //+y down
	m_dcGrid.SetWindowExt(m_rectGrid.Width(),m_rectGrid.Height());
	m_dcGrid.SetViewportExt(m_rectClient.Width(),m_rectClient.Height());
	m_dcGrid.SetViewportOrg(0,0);
	//画背景
	m_dcGrid.SetBkColor(m_clrBk);//字的背景色

	//填充周围边框****
	//开始记录top**	
/*	m_dcGrid.BeginPath();	//画背景框(灰色)上面那个横部分
	
	m_dcGrid.MoveTo(m_rectGrid.left,m_rectGrid.top);
	m_dcGrid.LineTo(m_rectGrid.right,m_rectGrid.top);
    m_dcGrid.LineTo(m_rectGrid.right-65,m_rectGrid.top+60);
	m_dcGrid.LineTo(m_rectGrid.left+60,m_rectGrid.top+60);
	m_dcGrid.MoveTo(m_rectGrid.left,m_rectGrid.top);

	//结束记录窗口
	m_dcGrid.EndPath();
	CBrush *pOldBrush;
	CBrush brush1(::GetSysColor(COLOR_3DSHADOW));//构造画刷
	pOldBrush=m_dcGrid.SelectObject(&brush1); *///本次没有用这种背景框!

	
	//确定画图区大小 m_rectPlot:****
	//长1000,宽800
	//边框:左 100,上 140,右200,下300
	//字:左 60,上 100(两行),右80,下100(两行)
	m_rectPlot.left   = m_rectGrid.left   + 100+80+40;//原来+ 100+80+60
	m_rectPlot.top    = m_rectGrid.top    + 140 ;//+ 140+ 100
	m_rectPlot.right  = m_rectGrid.right  - 120;//- 200
	m_rectPlot.bottom = m_rectGrid.bottom - 300-40 ;//- 300 - 100

    //确定格子的大小
	m_nXdiv=m_rectPlot.Width()/100;
	m_nYdiv=m_rectPlot.Height()/80;
    //准备画格子
	m_dcGrid.SelectObject(&m_penGrid);

	//画格子:
	//horizontal
    int i,x,y;
	for(i = 0 ; i <= 80; i++)
	{ 
		y = m_rectPlot.top + i * m_nYdiv;
    	if(i % 10 == 0)//???
		{//长格子
			m_dcGrid.MoveTo(m_rectPlot.left, y);
			m_dcGrid.LineTo(m_rectPlot.right, y);
		}		
		//短格子		
		x = (m_rectPlot.left + m_rectPlot.right)/2;
		m_dcGrid.MoveTo(x - m_nXdiv, y);
     	m_dcGrid.LineTo(x + m_nXdiv, y);		
	} 
	//vertical
	for(i = 0 ; i <= 100; i++)
	{
		x = m_rectPlot.left + i * m_nXdiv ;
		if(i % 10 == 0)//???
		{//长格子
			m_dcGrid.MoveTo(x, m_rectPlot.top);
			m_dcGrid.LineTo(x, m_rectPlot.bottom);
		}//短格子
		y = (m_rectPlot.top + m_rectPlot.bottom)/2;
		m_dcGrid.MoveTo(x, y - m_nYdiv);
		m_dcGrid.LineTo(x, y + m_nYdiv);
	}  
    
	CFont font, *pOldFont;
	//选择字体
	font.CreateFont(40,14,0,0,400,FALSE,FALSE,0,ANSI_CHARSET,
		OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
		DEFAULT_PITCH|FF_ROMAN,NULL);
	pOldFont = m_dcGrid.SelectObject(&font);
	//left: 30div, 20div, 10div, 0, -10div, -20div, -30div
	//颜色和排列方式
	m_dcGrid.SetTextColor(m_clrPlot);
	m_dcGrid.SetTextAlign(TA_RIGHT|TA_BOTTOM);
	//30div
	m_dcGrid.TextOut(m_rectPlot.left-10,
		m_rectPlot.top + 10 * m_nYdiv + 25,"30div");
	//20div
	m_dcGrid.TextOut(m_rectPlot.left-10,
		m_rectPlot.top + 20 * m_nYdiv + 25, "20div");
	//10div
	m_dcGrid.TextOut(m_rectPlot.left-10,
		m_rectPlot.top + 30 * m_nYdiv + 25, "10div");
	//0
	m_dcGrid.TextOut(m_rectPlot.left-10,
		m_rectPlot.top + 40 * m_nYdiv + 25, "0");
	//-10div
	m_dcGrid.TextOut(m_rectPlot.left-10,
		m_rectPlot.top + 50 * m_nYdiv + 25, "-10div");
	//-20div
	m_dcGrid.TextOut(m_rectPlot.left-10,
		m_rectPlot.top + 60 * m_nYdiv + 25, "-20div");
	//-30div
	m_dcGrid.TextOut(m_rectPlot.left-10,
		m_rectPlot.top + 70 * m_nYdiv , "-30div");
	//top

	
	//right

	//bottom
	//排列方式
	m_dcGrid.SetTextAlign(TA_CENTER|TA_TOP);
	//"0"
	m_dcGrid.TextOut(m_rectPlot.left, m_rectPlot.bottom + 10, "0");
	//"50div"
	m_dcGrid.TextOut(m_rectPlot.left + 50 * m_nXdiv,
						m_rectPlot.bottom + 10, "50div");
	//"100div"
	m_dcGrid.TextOut(m_rectPlot.left + 100 * m_nXdiv,
						m_rectPlot.bottom + 10, "100div");


}

BOOL CBkgd::Create(CWnd* pParentWnd,UINT ctlID,UINT nID)
{
	m_ctlID = ctlID;//保存以备后用
	BOOL bResult;
	/*CRect rect;
	pParentWnd->GetDlgItem(ctlID)->GetWindowRect(&rect);//得到窗口坐标
	pParentWnd->ScreenToClient(&rect);//转换为父窗口内坐标	
	bResult = CWnd::CreateEx( NULL , 
		AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW) ,
		NULL, WS_VISIBLE | WS_CHILD, rect,
		pParentWnd, nID);
	pParentWnd->GetDlgItem(ctlID)->ShowWindow(SW_HIDE);//隐藏基准按钮
	if(bResult != 0)
		InvalidateCtrl();*/


	return bResult;
}

void CBkgd::AppendPoints(double dNewPoints[501])//更新格子图
{
    int i ;
	for(i = 0; i <= 500; i++)
	{
		m_dCurrentPoints[i] = dNewPoints[i];
	}	
	//调用DrawPoints()画曲线
	DrawPoints() ;
}

void CBkgd::DrawPoints()//不起作用啊??
{
  InvalidateCtrl();//更新格子图
	if((m_bRun == TRUE) && (m_dcPlot.GetSafeHdc() != NULL))
	{
		//**清除背景(重画背景)
		m_dcPlot.SetBkColor(m_clrBk);//可有可无,设置的是字的背景
		m_dcPlot.FillRect(m_rectGrid,&m_brushBk);
		//**准备画笔
		CPen* pOldPen;
		pOldPen = m_dcPlot.SelectObject(&m_penPlot);
		//**画曲线
		for(int i = 0; i < 500; i++)
		{
			m_dcPlot.MoveTo(i * 2 + m_rectPlot.left, 
				(int)( - m_dCurrentPoints[i] * m_nYdiv / m_dVdiv)
				+ (m_rectPlot.top + m_rectPlot.bottom)/2);
			m_dcPlot.LineTo((i+1) * 2 + m_rectPlot.left,
				(int)( - m_dCurrentPoints[i + 1] * m_nYdiv / m_dVdiv) 
				+ (m_rectPlot.top + m_rectPlot.bottom)/2);
		}
		//**清除画出画图区的图(即用背景覆盖)
		//top
		CRect rectCleanUp;
		rectCleanUp = CRect(m_rectGrid.left, m_rectGrid.top,
			m_rectGrid.right, m_rectPlot.top);
		m_dcPlot.FillRect(rectCleanUp, &m_brushBk);
		//bottom
		rectCleanUp = CRect(m_rectGrid.left, m_rectPlot.bottom,
			m_rectGrid.right, m_rectGrid.bottom);
		m_dcPlot.FillRect(rectCleanUp, &m_brushBk);
	}
		
}


void CBkgd::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	// TODO: Add your message handler code here

	CDC memDC;
    CBitmap memBitamp,* pOldBitmap;
	memDC.CreateCompatibleDC(&dc);
	memBitmap.CreateCompatibleBitmap(&dc,m_rectClient.Width(),m_rectClient.Height());
    pOldBitmap=memDC.SelectObject(&memBitmap);

   if(memDC.GetSafeHdc() != NULL)
   {
		//贴格子图
		memDC.StretchBlt( 0, 0, 
			m_rectClient.Width(), m_rectClient.Height(), 
			&m_dcGrid, 0, 0, 1440, 1440, SRCCOPY );
		//贴曲线图
		memDC.StretchBlt( 0, 0, 
			m_rectClient.Width(), m_rectClient.Height(), 
			&m_dcPlot, 0, 0, 1440, 1440, SRCPAINT );
		
		dc.BitBlt(0, 0,
			m_rectClient.Width(), m_rectClient.Height(),
			&memDC, 0, 0, SRCCOPY);
   }
   memDC.SelectObject(&pOldBitmap);
	
	// Do not call CWnd::OnPaint() for painting messages


}






⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -