版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 High-speed Charti ng Con trol-MFC繪 制圖表(折線圖、餅圖、柱形圖)控件 綜述 詁于揑件是用來(lái)展示2嚼據(jù)-如下面的圖片. PiKGme ove-r 200S Wif?ir 階陽(yáng)0刖Q Lipi ape Totiltfecofti1! 9090TO605040 PBW55 Min inCBirni - 3 ikt . n 1 Cardhitind. wiNi 介紹 對(duì)于我之前的一個(gè)項(xiàng)目, 我需要在圖表控件上顯示連續(xù)的數(shù)據(jù)流。我決定開發(fā)自己的控件, 因?yàn)槲艺也坏饺魏慰梢蕴峁┧桁`活性的自由軟件控件。其中一個(gè)主要的限制是,控件必 須繪制大量的數(shù)據(jù),并能夠迅速顯示它(
2、在 Pocket PC上)。控件能夠通過(guò)僅繪制新的數(shù)據(jù) 點(diǎn)而不是完整的數(shù)據(jù)序列來(lái)做到這一點(diǎn)并且圖表還能夠顯示靜態(tài)數(shù)據(jù)。 這種控件是我長(zhǎng)時(shí)間工作的結(jié)果,而且費(fèi)盡周折地為了提供足夠的靈活性來(lái)供需要它的人使 用。對(duì)于使用者反饋我表示由衷的感謝:一個(gè)郵件,留言板中的一一句話或只是對(duì)本文評(píng) 級(jí)。當(dāng)我不知道是否還有人使用它時(shí),我就沒(méi)有必要維護(hù)這個(gè)控件了。 免責(zé)聲明 這個(gè)控件是我花費(fèi)很長(zhǎng)時(shí)間的開發(fā)的結(jié)果,因此我對(duì)代碼的使用放置一些小條件: 該代碼可以以編譯的形式用于任何非商業(yè)和商業(yè)目的。代碼可以被重新開發(fā),只要它提供作 者名字和完整的免責(zé)聲明。更改源代碼需要得到作者的同意。 此代碼不提供任何安全保證。我不會(huì)
3、對(duì)使用此代碼造成的損失負(fù)責(zé)。使用它需要自己承擔(dān) 風(fēng)險(xiǎn)。 This code may be used for any non-commercial and commercial purposes in a compiled form. The code may be redistributed as long as it rema ins unm odified and providi ng that the author n ame and the disclaimer remai n in tact. The sources can be modified with the author c
4、onsent only. This code is provided without any guara ntees. I cannot be held resp on sible for the damage or the loss of time it causes. Use it at your own risks. 鑒于開發(fā)這個(gè)控件所付出的努力,下面的要求并不過(guò)分: 如果你在在商業(yè)應(yīng)用程序中使用 這個(gè)控件,那么請(qǐng)給我發(fā)郵件讓我知道。 主要特點(diǎn) 控件的主要特點(diǎn)是: 高速繪圖(軸固定時(shí)) ,允許快速繪制數(shù)據(jù) 無(wú)限數(shù)量的數(shù)據(jù)序列(內(nèi)存是限制) 每個(gè)數(shù)據(jù)序列的數(shù)據(jù)量不受限制 支持線圖,點(diǎn)圖,平
5、面圖,柱狀圖, K 線圖 和甘特圖系列 最多四個(gè)軸(左,下,右和上軸) 標(biāo)準(zhǔn)軸,對(duì)數(shù)軸或日期 /時(shí)間軸 自動(dòng)伸縮的坐標(biāo)軸 , 翻轉(zhuǎn)的坐標(biāo)軸(相互獨(dú)立) 軸標(biāo)簽 點(diǎn)標(biāo)簽 平滑的曲線 網(wǎng)格 圖例和標(biāo)題 交互性(在控件中發(fā)生特定事件時(shí)的通知) 支持手動(dòng)縮放和鼠標(biāo)平移 支持鼠標(biāo)指針 支持軸上的滾動(dòng)條 高度可定制(顏色,標(biāo)題,標(biāo)簽,邊緣,字體等) 支持 UNICODE 支持打印和保存到圖像文件 文檔結(jié)構(gòu) 本文通過(guò)一系列簡(jiǎn)短的教程來(lái)涵蓋控件的大部分功能。 閱讀本文后,您將能夠快速地在自 己的應(yīng)用程序中使用本控件。 我決定從文章中刪除所有的類和函數(shù)的文檔, 因?yàn)樗皇欠浅S押貌⑶椅液茈y維護(hù)。 此外, 隨著代
6、碼的增長(zhǎng),要記錄的類和函數(shù)的列表變得過(guò)于廣泛以至于不能將所有內(nèi)容放在文章 中。 作為替代,我提供了一個(gè) doxygen 文檔,您可以從本文中(文章的開頭)下載:只需 下載“ Doxygen 文檔” zip 文件,解壓所有文件,雙擊“”文件,進(jìn)行查看。 入門學(xué)習(xí) 此圖表控件允許您在屏幕上繪制一系列數(shù)據(jù)。 此控件可以添加幾個(gè)不同類型數(shù)據(jù)序列并且 最多可以使用四個(gè)軸。 添加到圖表的數(shù)據(jù)序列與一個(gè)水平軸(底部或頂部)和一個(gè)垂直軸 (右側(cè)或左側(cè))相關(guān)聯(lián)。 這兩個(gè)軸控制數(shù)據(jù)序列在圖表上的顯示方式。 為了能夠在應(yīng)用程序中使用次圖表控件, 您首先需要在自己的工程里添加源代碼 zip 中包含 的文件。 注意:控
7、件在內(nèi)部使用動(dòng)態(tài)轉(zhuǎn)型, 因此必須啟用 RTTI ( Run Time Type In formation 運(yùn)行時(shí)自 動(dòng)類型識(shí)別的機(jī)制),否則可能會(huì)發(fā)生崩潰。默認(rèn)情況下,VC6沒(méi)有啟用RTTI,因此要啟 用它打開項(xiàng)目設(shè)置 - “C / C + ”選項(xiàng)卡- “C +語(yǔ)言”類別,并確保Enable Run-Time Type In formatio n (RTTI) 選項(xiàng)已選中。 在應(yīng)用程序中使用圖表控件有兩種方法:手動(dòng)插入,或通過(guò)資源編輯器插入。 手動(dòng)插入 1. #include ChartCtrl添加在對(duì)話框(Dialog )類的頭文件中 2. 在對(duì)話框類中添加變量CChartCtrl: 對(duì)話框
8、類的OnlnitDialog方法中添加這個(gè)控件的Create方法。 并為Class屬性指定ChartCtrl。 為 樣式(0 x02000000L),如圖所示。 使用資源管理器 1. 向?qū)υ捒蛸Y源添加自定義控件,打開控件的屬性, 了避免滾動(dòng)條上的閃爍,必須設(shè)置WS_CLIPCHILDREN 事 X J*聾 曰 Ah Fflr-nMr O DwfiM F-sIhi 応】D Fjke Trw 6 Mnt E Gr m_pPo in tsSeries =(); double YValues10; for (in ti=0;iSetPoi nts(XValues,YValues,10); void C
9、MyClass:O nDataReceived(double X, double Y) m_pPoi ntsSeries-AddPoi nt(X, Y); 所有系列類繼承自同一抽象基類: CChartSerie。該類處理所有系列通用的功能, 但對(duì)具 體的數(shù)據(jù)點(diǎn)沒(méi)有任何處理功能。點(diǎn)的概念在子類CChartSerieBase中引入,它是一個(gè)模板類, 模板參數(shù)是要操作為點(diǎn)的數(shù)據(jù)類型。 這很重要,因?yàn)樾蛄锌赡鼙仨毺幚聿煌臄?shù)據(jù)類型: 例 如點(diǎn)序列操作具有 X和Y值的點(diǎn),但是 K線圖系列操縱具有 5個(gè)值(打開,關(guān)閉,高,低 和時(shí)間值)的點(diǎn)。其他系列繼承自CChartSerieBase并提供他們操作的數(shù)據(jù)
10、類型。 CChartSerieBase類已經(jīng)處理了大多數(shù)數(shù)據(jù)管理,并通過(guò)純虛函數(shù)將渲染委托給子類。每個(gè) 系列在創(chuàng)建時(shí)也會(huì)分配一個(gè)Id。此標(biāo)識(shí)可通過(guò) CChartSerie : GetSerieId ()檢索,并可用于 從圖表中刪除該系列。 該系列的一個(gè)重要特征是控制點(diǎn)的順序:該系列中的所有點(diǎn)將根據(jù)它們的值重新排序。 默認(rèn)情況下,點(diǎn)是基于它們的X值排序的,但您可以通過(guò)對(duì)它們的Y值排序或不對(duì)它們進(jìn) 行排序來(lái)改變這種行為(在這種情況下,系列保持將點(diǎn)添加到系列中的順序)。對(duì)點(diǎn)進(jìn)行 排序會(huì)對(duì)性能產(chǎn)生影響: 如果點(diǎn)是有序的,則控件能夠從完整系列中檢索第一個(gè)和最后一個(gè) 可見點(diǎn),并且僅繪制兩個(gè)點(diǎn)之間的點(diǎn)。另一
11、方面,你將不能繪制像橢圓形的曲線。您可以 通過(guò)調(diào)用 CChartSerieBase : SetSeriesOrdering 來(lái)更改點(diǎn)的順序。 然而,柱狀圖系列需要一些解釋。 控件中的不同系列的功能通常是不言自明的。 柱狀圖系列 這個(gè)系列有點(diǎn)特別,如果其中幾個(gè)在同一個(gè)控件上繪制在一起,他們將互相影響。目 的是能夠繪制多個(gè)條形圖系列,而不會(huì)重疊:它們是彼此相鄰繪制的。為此,您需要指定 每個(gè)所屬的組(一個(gè)簡(jiǎn)單的整數(shù)標(biāo)識(shí)符)。同一組的系列彼此相鄰地繪制(或者對(duì)于水平條 在彼此的頂部):參見兩個(gè)圖形的示例。設(shè)置組ID是通過(guò)SetGroupId函數(shù)完成的。 ser-! es wi tli Ike saae
12、 gxoxip Id Blt s eri e s. vi th d.i. ffereiLt. ;gr omp Id 您還可以通過(guò)調(diào)用SetInterSpace靜態(tài)函數(shù)來(lái)控制所有柱形圖之間剩余的空間的寬度。 這將為所有系列設(shè)置以像素為單位的空間(因此,如果顯示多于兩個(gè)系列,則在任何位置使 用相同的空間)。注意,您可以通過(guò)調(diào)用SetBarWidth單獨(dú)設(shè)置柱狀圖系列的寬度。 在點(diǎn)上添加標(biāo)簽 一旦使用數(shù)據(jù)填充您的系列,您還可以在系列的特定點(diǎn)上添加標(biāo)簽:這個(gè)標(biāo)簽始終附 加到特定點(diǎn)?,F(xiàn)在,只提供一種類型的標(biāo)簽,氣泡標(biāo)簽:包含文本的圓角矩形并用線連接 到特定點(diǎn)上。 當(dāng)然,如果需要,您也可以提供自己的自定義
13、標(biāo)簽(參見“擴(kuò)展功能” 一節(jié))。 有兩種方式創(chuàng)建文本標(biāo)簽:靜態(tài)創(chuàng)建標(biāo)簽時(shí),或動(dòng)態(tài)注冊(cè)一個(gè)對(duì)象,當(dāng)標(biāo)簽請(qǐng)求時(shí), 它將提供文本。第一種方法是最簡(jiǎn)單的,但也不太靈活。下面是一個(gè)代碼片段,顯示如何 做(假設(shè)m_pSeries已經(jīng)創(chuàng)建并填充足夠的數(shù)據(jù)): void CMyClass:l nit() m_pSeries-CreateBalloo nLabel(5,_T(This is a simple label); 此調(diào)用將創(chuàng)建一個(gè)帶有“ This is a simple label ”文本的標(biāo)簽,并將其附加到帶索引為 5 的點(diǎn)。該函數(shù)返回一個(gè)指向新創(chuàng)建的標(biāo)簽的指針, 以便您可以修改其某些屬性或存儲(chǔ)以供
14、以 后使用。 第二種方法有點(diǎn)復(fù)雜,但提供了更多的靈活性:例如,您可以以更方便的方式在標(biāo)簽 中顯示點(diǎn)屬性(例如 X值,Y值,)。為此,您必須創(chuàng)建一個(gè)繼承自CChartLabelProvider 的類,并在創(chuàng)建標(biāo)簽時(shí)提供此類的實(shí)例。 此類是模板類,模板參數(shù)是標(biāo)簽附加 到的系列的點(diǎn) 類型。 這個(gè)類是一個(gè)簡(jiǎn)單的接口 , 你必須覆蓋 TChartString GetText (CChartSerieBase * pSerie,unsigned uPtIndex)方法。 此函數(shù)應(yīng)返回必須在標(biāo) 簽中顯示的文本。 它接收指向標(biāo)簽所附加的系列和點(diǎn)索引的指針。 這里有一個(gè)這樣的標(biāo)簽 提供程序類的例子: class
15、 CCustomLabelProvider : public CChartLabelProvider public: TChartString GetText(CChartSerieBase* pSeries, unsigned uPtIndex) TChartStringStream ssText; SChartXYPoint Point = pSeries-GetPoint(uPtIndex); ssText _T(X value=) CreateBalloonLabel(5, m_pLabelProvider); 控件不獲取指針的所有權(quán),因此,當(dāng)你不再需要時(shí),你有責(zé)任刪除它。在上面的例子
16、 中,它通常會(huì)在 CMyClass 析構(gòu)函數(shù)中被刪除。 在上面的示例中,您可以為所有要添加的 標(biāo)簽地方重復(fù)使用相同的標(biāo)簽類, 這也帶來(lái)另一個(gè)優(yōu)點(diǎn):如果你想在運(yùn)行時(shí)改變標(biāo)簽的格 式,你只需要在 CustomLabelProvider 中添加代碼。 不需要遍歷所有現(xiàn)有標(biāo)簽并更改其文本。 當(dāng)然,在這種情況下, 需要刷新控件, 因?yàn)楸仨氈匦吕L制標(biāo)簽。 還要注意 TChartStringStream 類的用法, TChartStringStream 類是由控件提供的別名 (類似于 TChartString )。 當(dāng) UNICODE 被定義時(shí),它解析為std : wstringstream,當(dāng)未定義 UN
17、ICODE時(shí),解析為std : stringstream。 對(duì)軸的操作 軸是圖表的一個(gè)重要特征,因?yàn)樗鼈兛刂撇煌盗性诳刂浦械娘@示方式。 控件中最多 可使用四個(gè)軸:底部,頂部,左側(cè)和右側(cè)。 控件的每個(gè)系列必須和一個(gè)水平軸和一個(gè)垂直 軸相連接。 在圖表中添加系列時(shí)指定這些軸。 底部和左側(cè)軸是主軸, 頂部和右側(cè)軸是輔助 軸(您將在控件的某些功能中遇到此問(wèn)題) 。 現(xiàn)在有三種類型的軸供選擇: 標(biāo)準(zhǔn)軸,對(duì)數(shù)軸 和日期 /時(shí)間軸。 您可以在不同位置選用不同類型的軸。 一旦您選擇了在不同位置使用哪些軸,您需要先創(chuàng)建它們,然后才能向控件添加任何 數(shù)據(jù)。 為此,通過(guò)指定軸附加在哪個(gè)位置, 簡(jiǎn)單地調(diào)用 Crea
18、teStandardAxis , CreateLogarithmicAxis 或 CreateDateTimeAxis 。 如果已經(jīng)在該位置創(chuàng)建了軸, 則控件將銷毀 它并且用新的軸替換它。 這里有一個(gè)簡(jiǎn)單的代碼片段,顯示如何在底部創(chuàng)建日期/時(shí)間,在 左側(cè)創(chuàng)建一個(gè)標(biāo)準(zhǔn)軸: void CMyClass:Init() CChartStandardAxis* pBottomAxis = (CChartCtrl:BottomAxis); CChartLogarithmicAxis* pLeftAxis = (CChartCtrl:LeftAxis); 一旦創(chuàng)建了這些軸,就可以對(duì)它們?cè)O(shè)置一些屬性。 大多數(shù)
19、屬性在所有軸類型之間共享 (例如自動(dòng)模式,最小值和最大值,軸標(biāo)簽,)。軸可以設(shè)置為三種“自動(dòng)”模式:全自 動(dòng),屏幕自動(dòng)和手動(dòng)模式。 全自動(dòng)模式基于附加到該軸的所有系列計(jì)算軸最小值和最大值(所有系列的所有點(diǎn)的 最小值用作軸的最小值,并使用所有系列的所有點(diǎn)的最大值作為軸的最大值) 。 屏幕自動(dòng)模式基于與該軸相關(guān)的所有系列的所有可見點(diǎn)計(jì)算軸最小值和最大值。例 如,如果圖表僅顯示連接到手動(dòng)底部軸和屏幕自動(dòng)左側(cè)軸的一個(gè)系列,則左側(cè)軸將自適應(yīng)于 當(dāng)前可見的點(diǎn), 并且不考慮這些點(diǎn)有可能超過(guò)底軸的范圍 (在全自動(dòng)模式下, 底軸外部的點(diǎn) 將被考慮)。 警告:如果系列的兩個(gè)軸都處于屏幕自動(dòng)模式,則結(jié)果未定義。 在
20、手動(dòng)模式下,軸最小和最大值由用戶設(shè)置,不由控件計(jì)算。 在使用自動(dòng)軸模式下,如果將數(shù)據(jù)動(dòng)態(tài)添加到控件,如果新的數(shù)據(jù)點(diǎn)位于軸的范圍之 外,那么控件將自動(dòng)刷新。 這里是一個(gè)代碼片段(繼續(xù)前一個(gè)代碼段) ,顯示一個(gè)全自動(dòng)軸 (底部軸)和一個(gè)手動(dòng)軸(左軸,它是一個(gè)對(duì)數(shù)軸) : void CMyClass:Init() pBottomAxis-SetAutomaticMode(CChartAxis:FullAutomatic); pLeftAxis-SetAutomaticMode(CChartAxis:NotAutomatic); pLeftAxis-SetMinMax,1000); 處于離散模式下的軸
21、 軸有一個(gè)模式是離散模式(默認(rèn)禁用)。此模式指定軸不顯示連續(xù)值,而只顯示離散值, 這些值是軸上刻度指定的值,而軸將不顯示其他的值。嘗試?yán)L制不同于顯示的節(jié)拍值的值是 不可能的。讓我們舉一個(gè)例子:假設(shè)你有一個(gè)底部標(biāo)準(zhǔn)軸,間隔為(所以,顯示的蜱是1, 2, 3等等)。嘗試?yán)L制X值為的點(diǎn)將在相同位置顯示該點(diǎn),就好像它的值為。事實(shí)上,你可 以認(rèn)為兩個(gè)刻度之間的區(qū)域是一個(gè)常量值。這就是為什么刻度標(biāo)簽顯示在兩個(gè)刻度的中間, 而不是刻度本身。 這里有一個(gè)小代碼片段,顯示離散軸對(duì)系列顯示方式的影響。代碼片段下的兩個(gè)圖像 顯示啟用離散模式(第一個(gè)圖像)或禁用(第二個(gè)圖像)的結(jié)果。 void CMyClass:l
22、nit() CChartSta ndardAxis* pBottomAxis = (CChartCtrl:BottomAxis); pBottomAxis-SetMi nM ax(0, 10); CChartSta ndardAxis* pLeftAxis = (CChartCtrl:LeftAxis); pLeftAxis-SetMi nM ax(0, 10); pBottomAxis-SetTickl ncreme nt(false,; pBottomAxis-SetDiscrete(true); CChartL in eSerie* pSeries =(); double XVal20;
23、 double YVal20; for (int i=0; iSetPoi nts(XVal,YVal,20); Discre te nodle di sa.bJLed. 使用日期/時(shí)間軸 使用日期/時(shí)間軸有點(diǎn)特別,下面是如何利用這個(gè)功能的解釋。要了解日期/時(shí)間軸的重 要一點(diǎn)是它們?cè)?COleDateTime對(duì)象內(nèi)部工作。 原因很簡(jiǎn)單:COleDateTime中有DATE類型 的類, DATE 類型是一個(gè)雙精度型。由于圖表中的點(diǎn)表示為雙精度值,因此它非常適合:使 用標(biāo)準(zhǔn)點(diǎn)(非日期 /時(shí)間)和日期 /時(shí)間點(diǎn)之間沒(méi)有差異,這使得后者的使用不太復(fù)雜。所有 點(diǎn)仍然存儲(chǔ)為雙精度型,無(wú)論是否是日期 /時(shí)間
24、。 創(chuàng)建日期 / 時(shí)間軸后,可以在控件中填充數(shù)據(jù)。 為此目的,沒(méi)有改變:你必須從 CChartSerie 類調(diào)用 void AddPoint (double X , double Y )或 void SetPoints (double * X , double * Y , int Count)。 CChartCtrl 類提供了兩個(gè)靜態(tài)函數(shù),讓你從 COleDateTime 轉(zhuǎn)換為雙精度,反之亦 然: double DateToValue(const COleDateTime COleDateTime maxValue(2007,12,31,0,0,0); pBottomAxis-SetMinM
25、ax(CChartCtrl:DateToValue(minValue), CChartCtrl:DateToValue(maxValue); CChartCrossHairCursor* pCrossHair = (); CChartDragLineCursor* pDragLine = (CChartCtrl:BottomAxis); (false); 注意到對(duì) CChartCtrl : ShowMouseCursor 的調(diào)用結(jié)束。 默認(rèn)情況下, 鼠標(biāo)總是可見的, 但是當(dāng)您使用十字光標(biāo)時(shí),當(dāng)它在繪圖區(qū)域時(shí)隱藏有時(shí)是需要的。 如果希望在光標(biāo)位置更改時(shí)收到通知,則必須實(shí)現(xiàn) CChartCurso
26、rListener 接口,創(chuàng)建其 實(shí)例并使用光標(biāo)注冊(cè)它: class CCustomCursorListener : public CChartCursorListener public: void OnCursorMoved(CChartCursor *pCursor, double xValue, double yValue) TChartStringStream ssText; ssText _T(Cursor moved: xPos=) xValue _T(, yPos=) RegisterListener(pCursorListener); OnCursorMoved 函數(shù)接收一個(gè)
27、X 和 Y 值,但對(duì)于拖動(dòng)光標(biāo),只使用這些值中的一個(gè): 如果光標(biāo)與水平軸相關(guān)聯(lián),則使用 X 值,否則使用 Y 值。 使用平移和縮放功能 在版本的控件中,縮放和平移功能已被添加到控件。 使用鼠標(biāo)左鍵控制縮放,用鼠標(biāo) 右鍵控制平移。 要縮放圖表的特定部分,只需左鍵單擊圖表(這將是縮放矩形的左上角) , 然后拖動(dòng)到右下角。 將出現(xiàn)一個(gè)矩形。 一旦松開鼠標(biāo)按鈕, 四個(gè)軸將自動(dòng)調(diào)整到您選擇的 區(qū)域。 默認(rèn)情況下啟用縮放,但您可以通過(guò)調(diào)用 CChartCtrl : SetZoomEnabled ( bool bEnabled)來(lái)禁用縮放。您還可以通過(guò)調(diào)用 CChartAxis : SetZoomLimit
28、 (double dLimit )為 每個(gè)軸指定縮放限制。 它指定縮放時(shí)軸的最小范圍。 默認(rèn)值為。 要平移控件,右鍵單擊控件上的某處并移動(dòng)鼠標(biāo)。 鼠標(biāo)下的點(diǎn)將“跟隨”鼠標(biāo)的移動(dòng) (實(shí)際上,軸的最小和最大值將改變)。 默認(rèn)情況下啟用平移,但您可以通過(guò)調(diào)用 CChartCtrl : SetPanEnabled (bool bEnabled)來(lái)禁用它。 如果您左鍵單擊圖表(例如開始縮放) ,但如果您移動(dòng)到左上角,所有使用縮放和平移 功能所做的修改將被取消(控制將處于它的狀態(tài) 在使用平移和縮放操作之前) 。 最后,還 有一種方法通過(guò)調(diào)用 CChartAxis : SetPanZoomEnabled (
29、bool bEnabled )禁用特定軸的平移 和縮放功能。 利用高速功能 線和點(diǎn)系列允許以高速率繪制數(shù)據(jù)。 這通常在要繪制來(lái)自外部設(shè)備(例如,傳感器) 的數(shù)據(jù)時(shí)完成。 這是可能的,因?yàn)楫?dāng)您向此類系列添加點(diǎn)時(shí),控件不會(huì)完全刷新,只會(huì)繪 制最后一個(gè)點(diǎn)(或最后一個(gè)線段) ,這是非常有效的。 但是,如果希望控件能夠足夠快地繪 制數(shù)據(jù),則必須考慮幾點(diǎn)。 一個(gè)重要的事情是,使用自動(dòng)軸可能會(huì)降低很多性能。這是因?yàn)槿绻粋€(gè)點(diǎn)繪制在軸 范圍之外, 則軸范圍將被自動(dòng)調(diào)整, 這意味著控制將被完全刷新。 因此,如果您使用自動(dòng)底 部軸線并具有“滾動(dòng)”軌跡,則每個(gè)新點(diǎn)都將位于軸的當(dāng)前范圍之外, 并且將對(duì)每個(gè)點(diǎn)執(zhí)行 控制
30、刷新。處理的更好的方法是使用固定軸并且每秒手動(dòng)地增加軸的范圍(或以合理的速 率)。 另一個(gè)重要的點(diǎn)是, 你不應(yīng)該在向一個(gè)系列添加一個(gè)新點(diǎn)之后調(diào)用RefreshCtrl 。這當(dāng)然 會(huì)完全地刷新控件, 但是應(yīng)該避免這樣做。 最后, 如果您需要同時(shí)應(yīng)用幾個(gè)修改或添加幾個(gè) 點(diǎn)到控件,您應(yīng)該在 EnableRefresh (false)和EnableRefresh (true)之間圭寸裝這些調(diào)用(請(qǐng) 參閱“自定義外觀”部分) 。 擴(kuò)展功能 在某些特定情況下,您需要使用新功能擴(kuò)展控件,例如新的系列類型。目前,您可以 自定義四個(gè)組件:序列,軸,點(diǎn)標(biāo)簽和光標(biāo)。 要提供 新軸,新標(biāo)簽或新光標(biāo) ,您只需繼承基類(
31、 CChartAxis , CChartLabel 或 CChartCursor )并實(shí)現(xiàn)所需的虛擬函數(shù)。一旦完成,您可以通過(guò)調(diào)用不同函數(shù)的自定義版本 ( CChartCtrl : AttachCustomAxis , CChartCtrl : AttachCustomLabel 或 CChartCtrl : AttachCustomCursor )附加您的新對(duì)象。 CChartLabel 類是一個(gè)模板類。 這個(gè)主題有點(diǎn)廣泛, 進(jìn)入了很多細(xì)節(jié),但最簡(jiǎn)單的方法是看看不同的現(xiàn)有類。 如果你想提供新的系列,這有點(diǎn)不同:你首先要考慮你想要在你的系列中操縱的點(diǎn)的 類型。如果你只需要使用 X 和 Y 值來(lái)
32、操作點(diǎn),那么你可以繼承 CChartXYSerie ,它提供了 很多功能來(lái)操作這些點(diǎn)。 然后, 您必須實(shí)現(xiàn)所需的虛擬函數(shù)。 看看下面的系列: CChartLineSerie , CChartPointSerie , CChartSurfaceSerie 和 CChartBarSerie 具體示例。 如果你的系列操縱其他類型的點(diǎn),那么你首先必須為點(diǎn)包含以下方法創(chuàng)建一個(gè)結(jié)構(gòu): double GetX() , double GetXMin() , double GetXMax() , double GetY() , double GetYMin() 和 double GetYMax() 。一旦完成,
33、您必須繼承 CChartSerieBase 并將此點(diǎn)作為模板參數(shù)。然后, 您必須提供 所需的 虛擬功 能。 看看 下面的 系列具 體 例子: CChartCandlestickSerie 和 CChartGanttSerie。 Upgrading from Versionto Version 在版本中,對(duì)控件進(jìn)行重構(gòu),導(dǎo)致 API 的更改。 主要的可見變化是每個(gè)軸類型現(xiàn)在有 其單獨(dú)的類( CChartStandardAxis , CChartDateTimeAxis 和 CChartLogarithmicAxis )。 這也 意味著默認(rèn)情況下沒(méi)有創(chuàng)建軸, 并且您必須在向圖表添加系列之前自己創(chuàng)建
34、軸 (否則代碼將 斷言)。 這包括在“操縱軸”部分。 另一個(gè)變化是添加系列到圖表的方式: AddSerie 已經(jīng)在 CChartCtrl 類中刪除, 并已被幫 助函數(shù)替代,以創(chuàng)建特定的系列類型(CreateLineSerie, CreatePointsSerie,)。這些函數(shù) 返回確切的系列類型,因此不再需要鑄造。這在“操縱系列”一節(jié)中有詳細(xì)描述。 Upgrading from Version to Version 版本 3.0.0 的主要變化是,系列基類現(xiàn)在已經(jīng)作為模板類,模板參數(shù)是系列操作的點(diǎn)類 型。如果您沒(méi)有通過(guò)提供新的系列類型擴(kuò)展控件, 這將不會(huì)在您的代碼中有所不同。 如果你 提供了一
35、個(gè)新的系列類型,你的類必須繼承 CCharSerieBase 并提供它操作的點(diǎn)的類型。如 果你的系列使用只有 X 和 Y 值的點(diǎn),你可以簡(jiǎn)單地繼承 CChartXYSerie ??纯船F(xiàn)有的系列 更多的例子。 另一個(gè)小的修改是標(biāo)簽提供程序現(xiàn)在也是模板類(出于同樣的原因)。并且監(jiān)聽系列中 的鼠標(biāo)事件現(xiàn)在從圖表上的鼠標(biāo)事件中分離出來(lái)。 這兩點(diǎn)在“在點(diǎn)上添加標(biāo)簽”部分和 “鼠 標(biāo)事件通知”部分中有很好的解釋。 最后, CChartAxis : SetAutomatic 方法已被標(biāo)記為已棄用,您應(yīng)該使用 CChartAxis : SetAutomaticMode (已經(jīng)引入了一個(gè)額外的自動(dòng)模式)。 例子
36、 本節(jié)只是兩個(gè)代碼片段,顯示了如何使用控件。第一個(gè)片段再現(xiàn)了示波器示例的圖像 (參見本文頂部) ,第二個(gè)示例再現(xiàn)了“ 2008 年收入”圖像。 代碼是文檔化的,所以它不 應(yīng)該太難理解。 Oscilloscope example: (false); .) COLORREF BackColor = RGB(0,50,0); COLORREF GridColor = RGB(0,180,0); COLORREF TextColor = RGB(0,180,0); COLORREF SerieColor = RGB(0,255,0); This will refresh the (true); “ I
37、ncome over 2008 ” example: srand(unsigned int)time(NULL); TChartStringStream labelStream; labelStream _T(Min income: ) lowVal; CChartBalloonLabel* pLabel = pLineSeries-CreateBalloonLabel(lowIndex, () + _T( kEuros); CChartFont labelFont; (_T(Microsoft Sans Serif),100,false,true,false); pLabel-SetFont
38、(labelFont); If you encounter such a problem, please let me know (even if you fixed it yourself) so that I can fix the issue as soon as possible. Other users of the control will thank you for that. The same if you encounter errors in the documentation or typos in the article. I malso more or less co
39、nstantly working on this control to add new features. If you have some requirement for a nice feature that could be useful for others, please let me know and I it to my wishlist. However, as I m working on this control in my spare timye,time is rather limited. Finally, if you liked this control, do
40、not hesitate to drop me a word in the discussion forum or to rate the article, this is much appreciated. Thank you. History 08/05/2006: Release of version 19/08/2006: Release of version Bug fix in ScreenToValue function (CChartAxis) Bug fix in RemoveAllSeries function (CChartCtrl) Added support for
41、manual zoom Added support for mouse panning Ability to specify a tick increment on the axis Added support for resizing the control 09/04/2007: Release of version GDI leak corrected Invisible series are not taken in account for auto axis and legend (thanks to jerminator-jp) Ability to change the text
42、 color of the axis Ability to change the color of the border of the drawing area Surface series added 16/02/2008: Release of version Added date/time axis Bug fix in how the logarithmic labels are displayed (trailing 0) Ability to change the color of the zoom rectangle Removed compiler warnings for V
43、C2005 Bug fix in the zoom 14/04/2008: Release of version Added support for scrollbars Bar series added Legend can be docked on any side or floating Support for legend in horizontal mode Support for transparent background on the legend Support for shadow for several objects RemovePointsFromBegin, Rem
44、ovePointsFromEnd and AddPoints in the CChartSeries class Support for gradient background EnableRefresh and UndoPanZoom functions added in CChartCtrl Possibility to enable/disable the zoom for a specific axis and to set its limit Speed improvement on the series (min and max cached, ordering of the se
45、ries) Series can be removed using their pointers Bug fix for invisible series in the legend Bug fix for logarithmic axis (1 digit was not displayed) Bug fix when removing series from the control Bug fix if the pen width is bigger than 1 for line series Bug fix for automatic axis 20/08/2008: Release
46、of version Added support for UNICODE Added support for printing Auto-hide scrollbars Baseline selection for bar series Performance patch Scrollbar flickering removed (see here) Bug fix: scrollbar is now updated when axis is panned Bug fix: calling AddPoint was not drawing the new point Bug fix: tick
47、 labels for log axis were not always correct (rounding error) Bug fix: last point of ChartPointSerie was not displayed Bug fix: moving the mouse outside the control doesne zoom tosrtpopanthoperation (the button can be released the control) 13/04/2009: Release of version The different axis types are
48、now separated into different classes Modified the way to add series to the control for improved flexibility Added cursors Ability to display discrete axes Ability to be notified about mouse events occurring on the control Added labels on points Ability to display a smooth curve Added ChartFont: allo
49、ws for italic, bold or underlined fonts Added the SetReferenceTick function for date/time axis Ability to store user data for each point Series now have an Id Removed the CChartObject class Points are now stored in a standard array instead of a std:vector for efficiency Binary search implemented for
50、 finding the first and last visible points (for efficiency) The line series now uses PolyLine instead of MoveTo/LineTo (efficiency) Bug fix when using date/time axis with a tick interval in years Bug fix: bar series were drawn from the wrong axis 11/06/2009: Release of version 2.0.1 Optimization: th
51、e pan feature has been smoothed Optimization: points with the same X and Y values are not plotted anymore for the line series. Bug fix: in some situations, the code was crashing when accessing points outside the valid range Bug fix: when series were removed, the legend was accessing removed series (
52、which crashed) Bug fix: when a series was cleared, new points were not drawn properly Bug fix: inserting a point for which the X value already existed in the series did not add the point properly Bug fix with the CChartFont class 07/08/2009: Release of version 2.0.2 Bug fix: the control was crashing
53、 when a series with no points and no ordering was added Bug fix: the shadow of the line was not drawn correctly Bug fix: when an automatic date/time axis was used without any data, the code crashed 28/12/2009: Release of version 3.0.0 Series are now template classes with the template parameter being the point type. This allows the control to manipulate any type of points Added candlestick and Gantt series Added support to save the chart to an image file Bar series can be stacked Added a new automatic mode for axes: the screen automatic mode Listening
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 傳統(tǒng)民族風(fēng)格室內(nèi)設(shè)計(jì)技巧
- Calcium-phosphate-Secondary-calcium-生命科學(xué)試劑-MCE
- BRD-K44839765-生命科學(xué)試劑-MCE
- 青海柴達(dá)木職業(yè)技術(shù)學(xué)院《金融營(yíng)銷》2023-2024學(xué)年第一學(xué)期期末試卷
- 青島職業(yè)技術(shù)學(xué)院《動(dòng)物生物化學(xué)實(shí)驗(yàn)》2023-2024學(xué)年第一學(xué)期期末試卷
- 青島求實(shí)職業(yè)技術(shù)學(xué)院《建筑工程BM計(jì)量與計(jì)價(jià)》2023-2024學(xué)年第一學(xué)期期末試卷
- 互聯(lián)網(wǎng)產(chǎn)品的設(shè)計(jì)與開發(fā)流程
- 臨床病例分析與診斷思路
- 青島農(nóng)業(yè)大學(xué)海都學(xué)院《工程項(xiàng)目經(jīng)濟(jì)與管理》2023-2024學(xué)年第一學(xué)期期末試卷
- 心理疾病預(yù)防與心理健康促進(jìn)匯報(bào)
- 2024-2025學(xué)年人教版數(shù)學(xué)五年級(jí)上冊(cè)期末檢測(cè)試卷(含答案)
- 【MOOC】犯罪心理學(xué)-中南財(cái)經(jīng)政法大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 【MOOC】跨文化交際入門-華中師范大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 護(hù)理脊柱外科出科
- 2024年陜西省初中學(xué)業(yè)水平考試·數(shù)學(xué)
- 中職語(yǔ)文基礎(chǔ)上冊(cè)《寫作:記敘文-人物描寫(篇章)》課件
- 劇院安全隱患排查治理工作方案
- 快遞員合同協(xié)議書格式
- 企業(yè)三年規(guī)劃方案
- 剪刀式登高車安全技術(shù)交底
- 農(nóng)產(chǎn)品生鮮冷鏈倉(cāng)儲(chǔ)物流項(xiàng)目可行性研究報(bào)告
評(píng)論
0/150
提交評(píng)論