Teechart动态设计方法
以前搞Qt或者MFC,不明白為何大牛做界面時不用工具箱生成和設計控件,反而要花大量的精力用代碼動態生成。經過一段時間的編程體驗后,會發現動態生成更好控制,更好的根據開發人員的意愿在代碼修改屬性,而且不容易出一些莫名其妙的bug。但是也并不就是說工具箱可不用,工具箱自然是最簡單,最方便的使用方式,如果窗體的控件變化不大,大可以拖來拖去設置屬性。
本篇筆記將總結Teechart繪圖工具的動態創建和設計方法。介紹其中幾個常見功能的動態設計方法,希望能達到舉一反三的效果。
一、準備工作
1.新建一個MFC基于dialog的工程TeechartTest。
2.為工程添加一個類,選擇來自Typelib的MFC 類,選擇TeeChart ActiveX ControlV5,將下面左右的類全部添加進來。(本例中需要用哪個就Include哪個為了學習方便,這樣會導致工程比較大。在實際開發時需要用哪個添加哪個。)
3.在TeechartTestDlg.cpp中的初始化函數OnInitDialog里新建個函數TeechartSetup,用來寫我們的動態代碼。
4.在TeechartTestDlg.h中聲明該函數,在TeechartTestDlg.cpp中定義該函數TeechartSetup。
二、動態創建一個Tchart
1.右鍵工程添加類,與添加其他Teechart類不同,此處選擇ActiveX控件中的MFC類。
2.選擇TeeChart Pro ActiveXControl V5<1.0>,發現只有一個ITchart,將它添加進來,在工程中多了一個CTChart0類。
3.在Dlg.h中添加#include"CTChart0.h",聲明一個對象該類的對象CTChart0 m_tchart;
4.在dlg.cpp中的TeechartSetup里調用Create函數創建表格。我們可以在.h文件中在定義一個CTChart0 m_tchart1,生成兩個表格。
CRect rect;
GetClientRect(&rect);
m_tchart.Create(NULL,WS_CHILD|WS_VISIBLE,CRect(0,0,rect.Width(),rect.Height()/2),this,1000);
m_tchart1.Create(NULL,WS_CHILD|WS_VISIBLE,CRect(0,rect.Height()/2,rect.Width(),rect.Height()),this,1001);
三、表格屬性設置
1.默認是三維的,想把它改成二維的。在.h文件中添加#include"CAspect.h",在TeechartSetup函數里獲取該Aspect,設置View3D為False。
/*設置D/3D顯示*/
?????? CAspect m_aspect = m_tchart.get_Aspect(); //得到表體
?????? m_aspect.put_View3D(FALSE); //設置D關閉
2.設置表格標題內容。獲取標題需要用到Ctitles和CStrings這兩個類。自然先Include這兩個頭文件。原理是先用chart的get_header獲取一個Ctitles對象,再用其成員函數得到其CStrings,通過CStrings設置其內容。注意Add函數變量是variant類型,可以用_variant_t轉化即可。
/*設置表格標題內容*/
?????? CTitles m_title = m_tchart.get_Header(); //得到標題
?????? CStrings m_titlestring = m_title.get_Text(); //得到標題內容
?????? m_titlestring.Clear(); //先清除
?????? m_titlestring.Add(_variant_t("MyTest")); //添加新標題
3.設置標題樣式。獲取其標題Font,用到CTeeFont類。
/*設置表格標題字體樣式*/
?????? CTeeFont m_titleFont = m_title.get_Font(); //得到樣式
?????? m_titleFont.put_Bold(TRUE); //加粗
?????? m_titleFont.put_Color(RGB(0,0,255)); //顏色
?????? m_titleFont.put_Size(14); //字號
四、動態添加曲線Series
1.添加Series類頭文件#include"CSeries.h"
2.調用AddSeries添加曲線。其參數ESeriesClass是曲線類型,見sc宏定義
ESeriesClass
{
??? scLine = 0,
??? scBar = 1,
??? scHorizBar = 2,
??? scArea = 3,
??? scPoint = 4,
??? scPie = 5,
??? scFastLine = 6,
??? scShape = 7,
??? scGantt = 8,
??? scBubble = 9,
??? scArrow = 10,
??? scCandle = 11,
??? scPolar = 12,
??? scSurface = 13,
??? scVolume = 14,
??? scErrorBar = 15,
??? scBezier = 16,
??? scContour = 17,
??? scError = 18,
??? scPoint3D = 19,
??? scRadar = 20,
??? scClock = 21,
??? scWindRose = 22,
??? scBar3D = 23,
??? scImageBar = 24,
??? scDonut = 25,
??? scTriSurface = 26,
??? scBox = 27,
??? scHorizBox = 28,
??? scHistogram = 29,
??? scColorGrid = 30,
??? scBarJoin = 31,
??? scHighLow = 32,
??? scWaterfall = 33,
??? scSmith = 34,
??? scPyramid = 35,
??? scMap = 36,
??? scHorizLine = 37,
??? scFunnel = 38,
??? scCalendar = 39
3.用CSeries獲取曲線對象,調用AddXY添加數據。
/*動態添加曲線Series,并添加數據源進行顯示*/
?????? m_teechart.AddSeries(scFastLine); //SC宏定義
?????? CSeries m_series = m_teechart.Series(0);
?????? for (int i=0; i<100; i++)
?????? {
????????????? m_series.AddXY(i,rand()%50,NULL,RGB(255,0,0));
?????? }
五、舉一反三
是時候舉一反三了。
如果你是新手,你應該不知道設置某一個控件需要獲取哪些對象(句柄),怎么獲得,獲得了又該怎么設置。
一個很好的突破口就是Teechart自帶的幫助文檔,就像所有其他工具的幫助文檔一樣。打開開始菜單中的teechart tutorials.lnk,也即打開了Teechart的面紗。
那么幫助文檔怎么用呢?舉個例子:
目的:我們想設置下表格的坐標軸。
我們大概可以直到坐標軸應該累屬于表格,也就是說表格類CTChart0應該有其對應的獲取函數。模型一般都是get_hanshu。我們可以在CTChart0下找其成員函數,很快就會發現get_Axis,會點英文應該大概直到這跟獲取坐標軸對象有關。
我們可以在幫助文檔的索引中輸入Axis,雙擊ITchart,可以看到一個鮮活的示例。
可以看到Tchart的確有個Axis對象,也就是有對應的類,而要獲取縱軸,它還調用了Left。如果你有點好奇心你肯定點開了property Axis:IAxes看了。
這時,你應該明白了怎么寫代碼了。如果你還是不知道調用哪個函數。你可以在搜索中輸入Axis,點開tutorial 15看看,應該很明確了吧。
按照這個思路,整理代碼如下:
/*動態設置坐標軸*/
?????? CAxes m_Axis = m_tchart.get_Axis(); //得到坐標軸
?????? CAxis m_left = m_Axis.get_Left(); //得到縱軸
?????? CAxis m_bottom = m_Axis.get_Bottom(); //得到橫軸
?
?????? m_left.put_Automatic(FALSE); //設置不自動適應
?????? m_left.put_Minimum(0); //設置縱軸起始值
?????? m_left.put_Maximum(100); //設置縱軸結束值
?????? m_left.put_Increment(20); //設置增量
?????? m_left.put_StartPosition(20); //設置起始位置%
?????? m_left.put_EndPosition(80); //設置結束位置%
?
?????? CAxisTitle m_AxisLeftTitle = m_left.get_Title(); //得到縱軸標題
?????? m_AxisLeftTitle.put_Caption(_T("隨機數"));//設置縱軸標題
?????? CAxisTitle m_AxisBottomTitle = m_bottom.get_Title(); //得到橫軸標題
?????? m_AxisBottomTitle.put_Caption(_T("時刻")); //設置橫軸標題
?
?????? CTeeFont m_LeftTitleFont = m_AxisLeftTitle.get_Font(); //得到坐標軸樣式
?????? m_LeftTitleFont.put_Size(14);
?????? m_LeftTitleFont.put_Bold(TRUE);
?????? CTeeFont m_BottomTitleFont = m_AxisBottomTitle.get_Font(); //得到坐標軸樣式
?????? m_BottomTitleFont.put_Size(14);
?????? m_BottomTitleFont.put_Bold(TRUE);
六、還有個方法
找到安裝目錄下的.\Utilities\New VC Classes文件夾,里面是對應的C++源碼。只要把所有文件拷貝到建立的公工程下,并把這些文件添加到工程里,在應用的.h文件里添加你需要的頭文件,如#include"tchart.h"。這樣在具體設置時就可以直接用“.”了,而且成員函數比較好找。例如:
m_tchart.GetHeader().GetText().Clear();
m_tchart.GetHeader().GetText().Add(_variant_t("MyTest"));
m_tchart.GetHeader().GetFont().SetBold(TRUE);
m_tchart.GetHeader().GetFont().SetSize(20);
但是我覺得這樣顯得工程比較大。而且比如上面的getfont之后,如果須設置多項,還得重新從頭“點”一遍,執行的時候也是從新獲取一遍,覺得有點浪費資源。而且從代碼長度看也沒簡便到哪去,可能好的一點就是不用去管get到的是個啥類型的變量了。
?
總結
以上是生活随笔為你收集整理的Teechart动态设计方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何把数据库从sql变成mysql_如何
- 下一篇: 教育部统考 计算机应用,9月教育部统考《