www.pudn.com > aaa.rar > Bkgd.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 
 
 
}