期貨量化軟件:赫茲量化中單個(gè)控制點(diǎn)移動擴(kuò)展圖形對象
我實(shí)現(xiàn)了依據(jù)控件窗體移動擴(kuò)展圖形對象軸點(diǎn)的功能。 不過,我還未完成將這種圖形對象作為一個(gè)整體進(jìn)行移動的功能。 任何標(biāo)準(zhǔn)圖形對象在移動其中心點(diǎn)時(shí)都可以整體移動。 類似地,這里我將制作一個(gè)管控圖形對象的單一中心點(diǎn),從而能夠通過移動該點(diǎn)來移動整個(gè)圖形對象(而非其軸點(diǎn))。 為了執(zhí)行測試,我選擇了一個(gè)復(fù)合圖形對象,該對象由一條趨勢線組成,其末端帶有價(jià)格標(biāo)簽對象。 考慮到這一點(diǎn),整個(gè)工作將針對圖形對象完成,而該圖形對象有兩個(gè)軸點(diǎn)用于重新定位其端點(diǎn),單個(gè)中心點(diǎn)用于整體移動圖形對象(兩個(gè)點(diǎn)用于修改對象端點(diǎn),一個(gè)中心點(diǎn)用于移動對象)。 稍后,我將為擁有三個(gè)以上控制點(diǎn)的圖形對象創(chuàng)建含有相同控制點(diǎn)的窗體。
并非所有在此實(shí)現(xiàn)的東西都會像預(yù)期的那樣工作。 但本文的目標(biāo)是講述為了獲得必要結(jié)果,所進(jìn)行的開發(fā)和創(chuàng)建代碼的過程。 我相信,從規(guī)劃功能到實(shí)現(xiàn),幾乎所有的過程都比閱讀一篇枯燥的關(guān)于“最終一切如何如何”的演講要生動有趣得多。
由于獲取屏幕坐標(biāo)的 ChartTimePriceToXY() 函數(shù)僅返回圖表可視部分的坐標(biāo),因此我們無法計(jì)算圖表界限之外點(diǎn)線的屏幕坐標(biāo)。 如果我們請求位于可視圖表左側(cè)以外的屏幕時(shí)間像素中的 X 坐標(biāo),該函數(shù)始終返回 0。 由此,當(dāng)沿屏幕移動復(fù)合圖形對象時(shí),若其左側(cè)超出屏幕的左邊框時(shí),對象的左樞軸點(diǎn)將保持在圖表像素坐標(biāo) 0 處。 這將導(dǎo)致圖形對象失真。 這同樣適用于圖形對象右側(cè)和圖表屏幕右側(cè)(以及頂部和底部)部分。 因此,我將為復(fù)合圖形對象引入一個(gè)限制,限制把圖形對象移到圖表的可視區(qū)域之外。 這樣做是為了防止圖形對象的任何邊緣在移動時(shí)“撞到”屏幕邊框產(chǎn)生變形。
改進(jìn)庫類
由于用來顯示管理擴(kuò)展圖形對象軸點(diǎn)的管控點(diǎn)的對象窗體是函數(shù)庫對象中的一個(gè)重要對象,但這些窗體未包含在圖形對象集合當(dāng)中,故此我們需要為此類窗體定義一種新類型。 所有基準(zhǔn)函數(shù)庫對象都有自己的函數(shù)庫對象類型名稱,據(jù)其我們就能定義當(dāng)前處于活動狀態(tài)的對象。 我們來為管理函數(shù)庫擴(kuò)展圖形對象中管控點(diǎn)的窗體對象定義類型。
//+------------------------------------------------------------------+ //| List of library object types ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | //+------------------------------------------------------------------+ enum ENUM_OBJECT_DE_TYPE ?{ //--- Graphics ? OBJECT_DE_TYPE_GBASE = ?COLLECTION_ID_LIST_END+1, ? ? ? ? ? ? ?// "Base object of all library graphical objects" object type ? OBJECT_DE_TYPE_GELEMENT, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // "Graphical element" object type ? OBJECT_DE_TYPE_GFORM, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// Form object type ? OBJECT_DE_TYPE_GFORM_CONTROL, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// "Form for managing pivot points of graphical object" object type ? OBJECT_DE_TYPE_GSHADOW, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// Shadow object type //--- Animation ? OBJECT_DE_TYPE_GFRAME, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // "Single animation frame" object type ? OBJECT_DE_TYPE_GFRAME_TEXT, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// "Single text animation frame" object type ? OBJECT_DE_TYPE_GFRAME_QUAD, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// "Single rectangular animation frame" object type ? OBJECT_DE_TYPE_GFRAME_GEOMETRY, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// "Single geometric animation frame" object type ? OBJECT_DE_TYPE_GANIMATIONS, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// "Animations" object type //--- Managing graphical objects ? ... ? ... ? ... ?}