www.pudn.com > CMyChartView_ocx.rar > CMyChartViewCtl.cpp


// CMyChartViewCtl.cpp : Implementation of the CCMyChartViewCtrl ActiveX Control class. 
 
#include "stdafx.h" 
#include "CMyChartView.h" 
#include "CMyChartViewCtl.h" 
#include "CMyChartViewPpg.h" 
 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
 
IMPLEMENT_DYNCREATE(CCMyChartViewCtrl, COleControl) 
 
 
///////////////////////////////////////////////////////////////////////////// 
// Message map 
 
BEGIN_MESSAGE_MAP(CCMyChartViewCtrl, COleControl) 
	//{{AFX_MSG_MAP(CCMyChartViewCtrl) 
	//}}AFX_MSG_MAP 
	ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties) 
END_MESSAGE_MAP() 
 
 
///////////////////////////////////////////////////////////////////////////// 
// Dispatch map 
 
BEGIN_DISPATCH_MAP(CCMyChartViewCtrl, COleControl) 
	//{{AFX_DISPATCH_MAP(CCMyChartViewCtrl) 
	DISP_FUNCTION(CCMyChartViewCtrl, "SetAxisRang", SetAxisRang, VT_EMPTY, VTS_R4 VTS_R4 VTS_R4 VTS_R4) 
	DISP_FUNCTION(CCMyChartViewCtrl, "SetAxisColor", SetAxisColor, VT_EMPTY, VTS_COLOR) 
	DISP_FUNCTION(CCMyChartViewCtrl, "SetBgrnd", SetBgrnd, VT_EMPTY, VTS_COLOR) 
	DISP_FUNCTION(CCMyChartViewCtrl, "SetGridCount", SetGridCount, VT_EMPTY, VTS_I2 VTS_I2) 
	DISP_FUNCTION(CCMyChartViewCtrl, "SetTitleText", SetTitleText, VT_EMPTY, VTS_BSTR) 
	DISP_FUNCTION(CCMyChartViewCtrl, "AddChartCutline", AddChartCutline, VT_EMPTY, VTS_BSTR VTS_COLOR VTS_I2) 
	DISP_FUNCTION(CCMyChartViewCtrl, "AddChartData", AddChartData, VT_EMPTY, VTS_I2 VTS_R4 VTS_R4) 
	DISP_STOCKFUNC_REFRESH() 
	//}}AFX_DISPATCH_MAP 
END_DISPATCH_MAP() 
 
 
///////////////////////////////////////////////////////////////////////////// 
// Event map 
 
BEGIN_EVENT_MAP(CCMyChartViewCtrl, COleControl) 
	//{{AFX_EVENT_MAP(CCMyChartViewCtrl) 
	//}}AFX_EVENT_MAP 
END_EVENT_MAP() 
 
 
///////////////////////////////////////////////////////////////////////////// 
// Property pages 
 
BEGIN_PROPPAGEIDS(CCMyChartViewCtrl, 1) 
	PROPPAGEID(CCMyChartViewPropPage::guid) 
END_PROPPAGEIDS(CCMyChartViewCtrl) 
 
 
///////////////////////////////////////////////////////////////////////////// 
// Initialize class factory and guid 
 
IMPLEMENT_OLECREATE_EX(CCMyChartViewCtrl, "CMYCHARTVIEW.CMyChartViewCtrl.1", 
	0xcd900cf3, 0xfba8, 0x4d8f, 0x8e, 0xe2, 0xa, 0x9e, 0x1a, 0xf8, 0x9e, 0x3d) 
 
 
///////////////////////////////////////////////////////////////////////////// 
// Type library ID and version 
 
IMPLEMENT_OLETYPELIB(CCMyChartViewCtrl, _tlid, _wVerMajor, _wVerMinor) 
 
 
///////////////////////////////////////////////////////////////////////////// 
// Interface IDs 
 
const IID BASED_CODE IID_DCMyChartView = 
		{ 0x2ea875b3, 0x38d8, 0x4bd3, { 0xa7, 0x10, 0x5f, 0xa1, 0x18, 0x4a, 0x8d, 0xf4 } }; 
const IID BASED_CODE IID_DCMyChartViewEvents = 
		{ 0x73d70692, 0x637d, 0x4e0b, { 0xa1, 0x39, 0x9e, 0x8b, 0xfc, 0x6c, 0x50, 0x4d } }; 
 
 
///////////////////////////////////////////////////////////////////////////// 
// Control type information 
 
static const DWORD BASED_CODE _dwCMyChartViewOleMisc = 
	OLEMISC_ACTIVATEWHENVISIBLE | 
	OLEMISC_SETCLIENTSITEFIRST | 
	OLEMISC_INSIDEOUT | 
	OLEMISC_CANTLINKINSIDE | 
	OLEMISC_RECOMPOSEONRESIZE; 
 
IMPLEMENT_OLECTLTYPE(CCMyChartViewCtrl, IDS_CMYCHARTVIEW, _dwCMyChartViewOleMisc) 
 
 
///////////////////////////////////////////////////////////////////////////// 
// CCMyChartViewCtrl::CCMyChartViewCtrlFactory::UpdateRegistry - 
// Adds or removes system registry entries for CCMyChartViewCtrl 
 
BOOL CCMyChartViewCtrl::CCMyChartViewCtrlFactory::UpdateRegistry(BOOL bRegister) 
{ 
	// TODO: Verify that your control follows apartment-model threading rules. 
	// Refer to MFC TechNote 64 for more information. 
	// If your control does not conform to the apartment-model rules, then 
	// you must modify the code below, changing the 6th parameter from 
	// afxRegApartmentThreading to 0. 
 
	if (bRegister) 
		return AfxOleRegisterControlClass( 
			AfxGetInstanceHandle(), 
			m_clsid, 
			m_lpszProgID, 
			IDS_CMYCHARTVIEW, 
			IDB_CMYCHARTVIEW, 
			afxRegApartmentThreading, 
			_dwCMyChartViewOleMisc, 
			_tlid, 
			_wVerMajor, 
			_wVerMinor); 
	else 
		return AfxOleUnregisterClass(m_clsid, m_lpszProgID); 
} 
 
 
///////////////////////////////////////////////////////////////////////////// 
// CCMyChartViewCtrl::CCMyChartViewCtrl - Constructor 
 
CCMyChartViewCtrl::CCMyChartViewCtrl() 
{ 
	InitializeIIDs(&IID_DCMyChartView, &IID_DCMyChartViewEvents); 
 
	///////////////// 
	m_crBackground=RGB(0,0,0); //默认背景颜色:黑色 
	m_AxisColor=RGB(255,255,255); 
	m_PenCoordinate.CreatePen(PS_SOLID,2,RGB(255,255,255)); //坐标轴画笔 
	mf_MinX=0;mf_MaxX=100;	//初始化用户坐标范围 
	mf_MinY=-10;mf_MaxY=10; 
	m_PenGrid.CreatePen(PS_DOT,1,RGB(255,255,255));	//初始化栅格画笔 
	m_XgridCount=10;m_YgridCount=4; //初始化栅格数量 
	m_GridTitle.CreatePointFont(100,""); //初始化栅格字体 
	m_strTitleText=_T("动态曲线显示视图"); //初始化标题 
	m_cfontTitleText.CreatePointFont(150,"");	//初始化标题字体 
	m_crTitleText=RGB(0,0,255);   //初始化标题文本颜色 
	mi_CurveCount=0;  //初始化曲线数量 
	for(int i=0;i<10;i++) 
		sx[i]=0,sy[i]=0; 
} 
 
 
///////////////////////////////////////////////////////////////////////////// 
// CCMyChartViewCtrl::~CCMyChartViewCtrl - Destructor 
 
CCMyChartViewCtrl::~CCMyChartViewCtrl() 
{ 
} 
 
 
///////////////////////////////////////////////////////////////////////////// 
// CCMyChartViewCtrl::OnDraw - Drawing function 
 
void CCMyChartViewCtrl::OnDraw( 
			CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid) 
{ 
	CBrush bgrnd(m_crBackground); 
	CRect rc; 
	//GetClientRect(rc); 
	HWND hWnd=GetSafeHwnd(); 
	::GetClientRect(hWnd,&rc); 
	//坐标范围设置 (真实显示) 
	mi_MinX=60; 
	mi_MaxX=rc.Width()-50; 
	mi_MinY=40; 
	mi_MaxY=rc.Height()-60; 
	//背景 
	pdc->SelectObject(&bgrnd); 
	pdc->FillRect(rc,&bgrnd); 
	//画坐标 
	pdc->SelectObject(&m_PenCoordinate); 
	pdc->MoveTo(mi_MinX,mi_MinY); 
	pdc->LineTo(mi_MinX,mi_MaxY); 
	pdc->LineTo(mi_MaxX,mi_MaxY); 
	//画箭头 
	CPoint points[3]; 
	points[0].x=mi_MaxX;   points[0].y=mi_MaxY; 
	points[1].x=mi_MaxX-3;	points[1].y=mi_MaxY-3; 
	points[2].x=mi_MaxX-3;	points[2].y=mi_MaxY+3; 
	pdc->Polygon(points,3); 
	points[0].x=mi_MinX;   points[0].y=mi_MinY; 
	points[1].x=mi_MinX-3;	points[1].y=mi_MinY+3; 
	points[2].x=mi_MinX+3;	points[2].y=mi_MinY+3; 
	pdc->Polygon(points,3); 
	//计算比例尺 
	kx=float(mi_MaxX-mi_MinX)/(mf_MaxX-mf_MinX); 
	ky=float(mi_MaxY-mi_MinY)/(mf_MaxY-mf_MinY); 
	//画栅格 
	pdc->SelectObject(&m_PenGrid); 
	pdc->SelectObject(&m_GridTitle);		//字体 
	pdc->SetBkColor(m_crBackground);		//文本背景 
	pdc->SetTextColor(m_AxisColor);	//文本颜色 
	int x,y,i,j; 
	CString str; 
	for(i=0;iSetPixel(x,j,m_AxisColor); 
		str.Format("%.2f",mf_MinX+i*(mf_MaxX-mf_MinX)/m_XgridCount); 
		pdc->TextOut(x-int(kx*((mf_MaxX-mf_MinX)/m_XgridCount))-3*str.GetLength(),mi_MaxY+2,str); 
	} 
	x=mi_MinX+int(kx*(i+1)*((mf_MaxX-mf_MinX)/m_XgridCount)); 
	str.Format("%.2f",mf_MinX+i*(mf_MaxX-mf_MinX)/m_XgridCount); 
	pdc->TextOut(x-int(kx*((mf_MaxX-mf_MinX)/m_XgridCount))-3*str.GetLength(),mi_MaxY+2,str); 
 
	for(i=0;iSetPixel(j,y,m_AxisColor); 
		str.Format("%.2f",mf_MaxY-i*(mf_MaxY-mf_MinY)/m_YgridCount); 
		pdc->TextOut(mi_MinX-8*str.GetLength(),mi_MinY+int(ky*i*((mf_MaxY-mf_MinY)/m_YgridCount))-6,str); 
	} 
	str.Format("%3.2f",mf_MaxY-i*(mf_MaxY-mf_MinY)/m_YgridCount); 
	pdc->TextOut(mi_MinX-8*str.GetLength(),mi_MinY+int(ky*i*((mf_MaxY-mf_MinY)/m_YgridCount))-10,str); 
 
	//标题 
	CFont *oldfont=pdc->SelectObject(&m_cfontTitleText); 
	pdc->SetTextColor(m_crTitleText); 
	pdc->TextOut(rc.Width()/2-int(5*m_strTitleText.GetLength()),10,m_strTitleText); 
	pdc->SelectObject(oldfont); 
 
	//曲线说明(标注) 
	if(mi_CurveCount>0){ 
		int nx; 
		nx=(mi_MaxX-mi_MinX)/mi_CurveCount; 
		for(i=0;iSelectObject(&m_crLinePen[i]); 
			pdc->SelectObject(&b); 
			pdc->Rectangle(mi_MinX+i*nx,mi_MaxY+30,mi_MinX+i*nx+30,mi_MaxY+45); 
			pdc->SetTextColor(m_crLinePoint[i]); 
			pdc->TextOut(mi_MinX+i*nx+33,mi_MaxY+30,m_crLineTitleText[i]); 
		} 
	} 
} 
 
 
///////////////////////////////////////////////////////////////////////////// 
// CCMyChartViewCtrl::DoPropExchange - Persistence support 
 
void CCMyChartViewCtrl::DoPropExchange(CPropExchange* pPX) 
{ 
	ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor)); 
	COleControl::DoPropExchange(pPX); 
 
} 
 
 
///////////////////////////////////////////////////////////////////////////// 
// CCMyChartViewCtrl::OnResetState - Reset control to default state 
 
void CCMyChartViewCtrl::OnResetState() 
{ 
	COleControl::OnResetState();  // Resets defaults found in DoPropExchange 
} 
 
 
///////////////////////////////////////////////////////////////////////////// 
// CCMyChartViewCtrl message handlers 
 
void CCMyChartViewCtrl::SetAxisRang(float minX, float maxX, float minY, float maxY)  
{ 
	mf_MaxX=maxX; 
	mf_MinX=minX; 
	mf_MaxY=maxY; 
	mf_MinY=minY; 
	Invalidate(); 
} 
 
void CCMyChartViewCtrl::SetAxisColor(OLE_COLOR color)  
{ 
	m_AxisColor=color; 
	m_PenGrid.DeleteObject(); 
	m_PenCoordinate.DeleteObject(); 
	m_PenCoordinate.CreatePen(PS_SOLID,2,color); 
	m_PenGrid.CreatePen(PS_DOT,1,color); 
	Invalidate(); 
} 
 
void CCMyChartViewCtrl::SetBgrnd(OLE_COLOR bgrnd)  
{ 
	m_crBackground=bgrnd; 
	Invalidate(); 
} 
 
void CCMyChartViewCtrl::SetGridCount(short mx, short my)  
{ 
	m_XgridCount=mx; 
	m_YgridCount=my; 
	Invalidate(); 
} 
 
void CCMyChartViewCtrl::SetTitleText(LPCTSTR strTitle)  
{ 
	m_strTitleText=strTitle; 
	Invalidate(); 
/*	CRgn crTitleText; 
	crTitleText.CreateRectRgn(0,0,mi_MaxX+50,mi_MinY-2); 
	CDC* pDC=GetDC(); 
	pDC->SelectClipRgn(&crTitleText); //只刷新标题部分 
	OnDraw(pDC);*/ 
} 
 
void CCMyChartViewCtrl::AddChartCutline(LPCTSTR szName, OLE_COLOR crColor, short nLineWidth)  
{ 
	if(mi_CurveCount<10){ 
		m_crLinePoint[mi_CurveCount]=crColor;		//曲线颜色 
		m_crLinePen[mi_CurveCount].CreatePen(PS_SOLID,nLineWidth,crColor); 
		m_crLineTitleText[mi_CurveCount]=szName;  //曲线标题 
		mi_CurveCount++; 
		Invalidate(); 
		/*CRect rc; 
		GetClientRect(rc); 
		CRgn crTextRect; 
		crTextRect.CreateRectRgn(mi_MinX,mi_MaxY+25,mi_MaxX+50,mi_MaxY+60); 
		CDC* pDC=GetDC(); 
		pDC->SelectClipRgn(&crTextRect); 
		OnDraw(pDC); 
		*/ 
	} 
	else{ 
		MessageBox("曲线数不能大于10!"); 
		return; 
	} 
} 
 
void CCMyChartViewCtrl::AddChartData(short nIndex, float fValueX, float fValueY)  
{ 
	//选择裁剪区域 
	static CDC* pDC=GetDC(); 
	CRgn rect; 
	rect.CreateRectRgn(mi_MinX,mi_MinY,mi_MaxX,mi_MaxY); 
	pDC->SelectClipRgn(&rect); 
 
	if(fValueX>mf_MaxX) 
		return; 
 
	 
	if(nIndex>=mi_CurveCount||nIndex<0) 
	{ 
		MessageBox("nIndex is error!"); 
		return ;} 
	//计算该数据在屏幕上的坐标 
	int x=mi_MinX+int(kx*(fValueX-mf_MinX)); 
	int y=mi_MaxY-int(ky*(fValueY-mf_MinY)); 
 
		//计算上一数据的坐标 
		int x1=mi_MinX+int(kx*(sx[nIndex]-mf_MinX)); 
		int y1=mi_MaxY-int(ky*(sy[nIndex]-mf_MinY)); 
		pDC->SelectObject(&m_crLinePen[nIndex]); 
		//连线 
		pDC->MoveTo(x1,y1); 
		pDC->LineTo(x,y); 
		sx[nIndex]=fValueX; 
		sy[nIndex]=fValueY; 
}