今天再看官網推薦的Teechart的使用方式寓盗,感覺他們還是推薦使用VC++6.0的導出頭文件格式系馆,來引入所有的類像鸡,并操作teechart控件粉渠。
All the files necessary can be found under the New VC classes folder below the utilities folder; these files should be copied to your project folder (using Windows Explorer) and then should be added in to the project (in Solution Explorer -> right click over "Source Files" & "Header Files" folders -> Add Existing Item...).
長期使用teechart原押,2010年之前在Delphi使用胁镐,這幾年使用的是VC++。有段時間自繪了曲線顯示窗口,但是要處理的動作和效果實在是太多了盯漂,雖然可以自定義的東西很多颇玷,但是工作量實在是太大,現在已經是大齡程序員了就缆,沒有那么多的時間和精力去自己畫了帖渠,只好重用teechart。
VS使用上的困惑:有幾個軟件用的是VS2005及以上版本開發(fā)的竭宰,但是因為在這些編譯器中teechart導出的函數接口有改動空郊,導致變成效率底下:
添加相關類MFC Class From Typelib--->add class from registry---->available type libraries選中teechart pro activex control v8,后面會顯示具體的注冊路徑切揭。把接口interfaces IAxes之類的全部選中狞甚,導入到程序中,就可以使用了廓旬。導出文件舉例如下:
VS版本的導出文件:
// Machine generated IDispatch wrapper class(es) created with Add Class from Typelib Wizard
#import "C:\\Windows\\SysWow64\\TeeChart8.ocx" no_namespace
// CAxes wrapper class
class CAxes : public COleDispatchDriver
{
public:
CAxes(){} // Calls COleDispatchDriver default constructor
CAxes(LPDISPATCH pDispatch) : COleDispatchDriver(pDispatch) {}
CAxes(const CAxes& dispatchSrc) : COleDispatchDriver(dispatchSrc) {}
// Attributes
public:
// Operations
public:
// IAxes methods
public:
LPDISPATCH get_Left()
{
LPDISPATCH result;
InvokeHelper(0x1, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
return result;
}
LPDISPATCH get_Right()
{
LPDISPATCH result;
InvokeHelper(0x2, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
return result;
}
LPDISPATCH get_Top()
{
LPDISPATCH result;
InvokeHelper(0x3, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
return result;
}
LPDISPATCH get_Bottom()
{
LPDISPATCH result;
InvokeHelper(0x4, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
return result;
}
BOOL get_Visible()
{
BOOL result;
InvokeHelper(0xa, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}
void put_Visible(BOOL newValue)
{
static BYTE parms[] = VTS_BOOL ;
InvokeHelper(0xa, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
LPDISPATCH get_Depth()
{
LPDISPATCH result;
InvokeHelper(0x5, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
return result;
}
BOOL get_DrawAxesBeforeSeries()
{
BOOL result;
InvokeHelper(0x6, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}
void put_DrawAxesBeforeSeries(BOOL newValue)
{
static BYTE parms[] = VTS_BOOL ;
InvokeHelper(0x6, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
long AddCustom(BOOL IsHorizontal)
{
long result;
static BYTE parms[] = VTS_BOOL ;
InvokeHelper(0x7, DISPATCH_METHOD, VT_I4, (void*)&result, parms, IsHorizontal);
return result;
}
LPDISPATCH get_Custom(long CustomAxisIndex)
{
LPDISPATCH result;
static BYTE parms[] = VTS_I4 ;
InvokeHelper(0x8, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, parms, CustomAxisIndex);
return result;
}
long get_CustomCount()
{
long result;
InvokeHelper(0x9, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL);
return result;
}
void RemoveCustom(long CustomAxisIndex)
{
static BYTE parms[] = VTS_I4 ;
InvokeHelper(0xb, DISPATCH_METHOD, VT_EMPTY, NULL, parms, CustomAxisIndex);
}
void RemoveAllCustom()
{
InvokeHelper(0xc, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
}
LPDISPATCH get_DepthTop()
{
LPDISPATCH result;
InvokeHelper(0xc9, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
return result;
}
BOOL get_FastCalc()
{
BOOL result;
InvokeHelper(0xca, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}
void put_FastCalc(BOOL newValue)
{
static BYTE parms[] = VTS_BOOL ;
InvokeHelper(0xca, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
void SetIsometric(long aVertical, long aHorizontal)
{
static BYTE parms[] = VTS_I4 VTS_I4 ;
InvokeHelper(0xcb, DISPATCH_METHOD, VT_EMPTY, NULL, parms, aVertical, aHorizontal);
}
void Hide()
{
InvokeHelper(0xcc, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
}
BOOL get_Behind()
{
BOOL result;
InvokeHelper(0xcd, DISPATCH_PROPERTYGET, VT_BOOL, (void*)&result, NULL);
return result;
}
void put_Behind(BOOL newValue)
{
static BYTE parms[] = VTS_BOOL ;
InvokeHelper(0xcd, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);
}
// IAxes properties
public:
};
VC++6.0的的導出文件如下:
#if !defined(AFX_AXES_H__6F4A532C_9E89_4968_9E14_E83C63437874__INCLUDED_)
#define AFX_AXES_H__6F4A532C_9E89_4968_9E14_E83C63437874__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// Machine generated IDispatch wrapper class(es) created by Microsoft Visual C++
// NOTE: Do not modify the contents of this file. If this class is regenerated by
// Microsoft Visual C++, your modifications will be overwritten.
// Dispatch interfaces referenced by this interface
class CAxis;
/////////////////////////////////////////////////////////////////////////////
// CAxes wrapper class
class CAxes : public COleDispatchDriver
{
public:
CAxes() {} // Calls COleDispatchDriver default constructor
CAxes(LPDISPATCH pDispatch) : COleDispatchDriver(pDispatch) {}
CAxes(const CAxes& dispatchSrc) : COleDispatchDriver(dispatchSrc) {}
// Attributes
public:
// Operations
public:
CAxis GetLeft();
CAxis GetRight();
CAxis GetTop();
CAxis GetBottom();
BOOL GetVisible();
void SetVisible(BOOL bNewValue);
CAxis GetDepth();
BOOL GetDrawAxesBeforeSeries();
void SetDrawAxesBeforeSeries(BOOL bNewValue);
long AddCustom(BOOL IsHorizontal);
CAxis GetCustom(long CustomAxisIndex);
long GetCustomCount();
void RemoveCustom(long CustomAxisIndex);
void RemoveAllCustom();
CAxis GetDepthTop();
BOOL GetFastCalc();
void SetFastCalc(BOOL bNewValue);
void SetIsometric(long aVertical, long aHorizontal);
void Hide();
BOOL GetBehind();
void SetBehind(BOOL bNewValue);
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_AXES_H__6F4A532C_9E89_4968_9E14_E83C63437874__INCLUDED_)
幾大變化:
VC++ 6.0 | VS2005及更高版本 | |
---|---|---|
頭文件和源文件 | axes.h axes.cpp |
axes.h |
函數名稱1 | GetLeft() |
get_Left() |
函數返回值1 | CAxis |
LPDISPATCH |
函數名稱2 | SetBehind(BOOL bNewValue) |
put_Behind(BOOL newValue) |
函數返回值2 | void |
void |
語句的不同
VC++ 6.0 | VS2005及更高版本 | |
---|---|---|
語句1 | `mChart.GetAxis().GetLeft().SetVisible(FALSE); | ((CAxis)((CAxes)mChart.get_Axis()).get_Left()).put_Visible(FALSE);` |
語句2 | CAxes ChartAxis = mChart.GetAxis(); CAxis asLeft = ChartAxis.GetLeft(); asLeft.SetVisible(FALSE); |
CAxes ChartAxis = mChart.get_Axis(); CAxis asLeft = ChartAxis.get_Left(); asLeft.put_Visible(FALSE); |
使用高版本的VS導出的頭文件使用過程比較繁瑣哼审,尤其是返回值,需要查詢具體的類型嗤谚。
官網推薦還是使用VC++6.0的版本棺蛛,并且附上了一個文件夾,可以直接使用New VC Classes
具體的使用過程還是查詢Tutorial 15 - MS VC++ Applications
官方文檔中幾個有用的例子:
標題的更改
#include "Titles.h"
#include "Strings.h"
COleVariant var1(CString ("ACME Monthly Sales"));
COleVariant var2(CString ("Year: 2014"));
CTitles hd = m_Chart.GetHeader();
hd.GetText().Clear();
hd.GetText().Add(*(LPCVARIANT)var1);
hd.GetText().Add(*(LPCVARIANT)var2);
//if items (header lines) already in list (+ alternative COleVariant declare syntax)
m_Chart1.GetHeader().GetText().SetItem(0, COleVariant("ACME Monthly Sales"));
m_Chart1.GetHeader().GetText().SetItem(1, COleVariant("Year: 2014"));
Canvas繪圖
#include "Canvas.h"
m_Chart1.GetCanvas().MoveTo(0,0);
m_Chart1.GetCanvas().LineTo(100,100);
m_Chart1.GetCanvas().TextOut(50,50,"My output text");
坐標軸label的文字修改
CString strLabel(*LabelText);
strLabel += " Period";
strLabel.SetSysString(LabelText);
坐標軸label 的數值更改
{
if (Axis == atLeft)
{
*MoreLabels = true;
//Only label if following cases are true
switch( LabelIndex )
{
case 0: *LabelValue = 900; break;
case 2: *LabelValue = 5000; break;
case 1: *LabelValue = 10000; break;
default: *MoreLabels=false;
}
}
}
界面繪圖:
CString text;
int value1,value2,total;
value1 = 4;
value2 = 6;
total = value1+value2;
text.Format(_T("Serie : %d"),total);
m_Chart1.GetCanvas().TextOut(10,10,text));
常量定義部分:官方給出一個頭文件TeeChartDefines.h
巩步,為什么不能通過添加類的方式引入旁赊,原因是MS VC++ doesn't natively support import of TeeChart constants. You need to create you own defines file and #include it in your project. We offer a pre built defines file in the Examples\Visual C++ folder. Including the file in your project will allow you to use constants by name as matching the Enum declarations in the Online help file.
附上幾個常見問題的解答:
MicroSoft Visual C++ specific
- How to use TeeChart constants in MS VC++.
- Where are descriptions of functions such as GetSeries(), Add() and other similar functions?
- Changes made at design time with the Chart Editor do not always save.
- How do I add/change text of the Chart Header and Footer at runtime in MS VC++ ?
- Can I obtain any additional examples with use of TeeChart Pro for VC++?