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;
}