Teechart在VC++中使用的碎碎念

今天再看官網推薦的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++?
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市椅野,隨后出現的幾起案子终畅,更是在濱河造成了極大的恐慌,老刑警劉巖竟闪,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件离福,死亡現場離奇詭異,居然都是意外死亡炼蛤,警方通過查閱死者的電腦和手機妖爷,發(fā)現死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來理朋,“玉大人絮识,你說我怎么就攤上這事∷陨希” “怎么了次舌?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長兽愤。 經常有香客問我彼念,道長挪圾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任逐沙,我火速辦了婚禮哲思,結果婚禮上,老公的妹妹穿的比我還像新娘吩案。我一直安慰自己也殖,他們只是感情好,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布务热。 她就那樣靜靜地躺著,像睡著了一般己儒。 火紅的嫁衣襯著肌膚如雪崎岂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天闪湾,我揣著相機與錄音冲甘,去河邊找鬼。 笑死途样,一個胖子當著我的面吹牛江醇,可吹牛的內容都是我干的。 我是一名探鬼主播何暇,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼陶夜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了裆站?” 一聲冷哼從身側響起条辟,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宏胯,沒想到半個月后羽嫡,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡肩袍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年杭棵,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氛赐。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡魂爪,死狀恐怖,靈堂內的尸體忽然破棺而出鹰祸,到底是詐尸還是另有隱情甫窟,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布蛙婴,位于F島的核電站粗井,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜浇衬,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一懒构、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧耘擂,春花似錦胆剧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蚁阳,卻和暖如春铃绒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背螺捐。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工颠悬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人定血。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓赔癌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親澜沟。 傳聞我的和親對象是個殘疾皇子灾票,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內容