股票量化軟件:赫茲量化中移動和刪除復合圖形對象
我將把自己的工作從功能方面劃分成幾個部分。 首先,我將創(chuàng)建必要的工具箱,用于管理和創(chuàng)建復合圖形對象。 接下來,我將添加此類對象的預定義類(事實上,所有這些都取決于用戶的個人需求,預定義復合圖形對象類在這里僅用作示例)。 再接下來,我將開始實現(xiàn)該功能,令我們能夠直觀、手動、實時地在圖表上直接創(chuàng)建復合圖形對象。
實際上,在此,我還會把前一篇文章中實現(xiàn)的東西進行微調(diào)。 我將講解如何為從屬對象設(shè)置并接收定位點坐標。 此外,我還將測試移動帶有從屬對象的基準對象(在此階段,我還需要以更復雜的形式移動復合對象坐標點的功能,而非簡單地跟蹤單一對象事件),以及創(chuàng)建移除復合圖形對象的功能。
僅當松開鼠標按鈕時,移動圖形對象的坐標點才會觸發(fā) CHARTEVENT_OBJECT_DRAG 事件。 相應(yīng)地,當我們僅跟蹤此事件時,移動基準圖形對象(且不釋放鼠標按鈕)會導致所有附加于它的對象保持不變。 釋放按鈕時事件出現(xiàn),綁定的對象將移動到其基準對象的定位點。 這意味著我們應(yīng)該跟蹤按住鼠標按鈕并移動鼠標。 此外,我們需要知道按鈕是在基準圖形對象上按下的,即在其坐標(或中心)定位點上。 我們還應(yīng)該能夠重新計算對象坐標點,及其從屬對象定位點的位置 CHARTEVENT_OBJECT_DRAG 事件也應(yīng)該在重新定位的最后進行處理,以便固定基準對象的最終坐標,并用它們重新計算綁定于其上的所有從屬圖形對象的坐標。
在本文中,我將實現(xiàn)處理 CHARTEVENT_OBJECT_DRAG 事件,并根據(jù)基準對象坐標的新位置重新計算其余綁定對象的坐標。 如果刪除了基準對象,一個復合圖形對象也會被刪除。 如果發(fā)生此類事件,需刪除綁定于其上的所有圖形對象。 現(xiàn)在,我禁用鼠標選擇所有圖形對象(綁定到基準對象)的功能來簡化操作。 因此,我們需要選擇基準對象并將其刪除,以便刪除復合圖形對象。 我們將無法再使用鼠標選擇任何綁定對象。 這是防止復合圖形對象被破壞的首選也是最簡單的方式。 不過,可以打開對象列表(Ctrl+B),選擇任何綁定對象的屬性,并立即允許其可選擇、或從圖形對象列表窗口中刪除。 稍后,我還將實現(xiàn)針對復合圖形對象的有意破壞的處理。 當移除任何綁定到基準圖形對象上的圖形對象時,我們將移除參與構(gòu)建復合圖形對象的所有對象。 換言之,我將把整個復合對象構(gòu)成時的任何對象都刪除。 在后續(xù)的文章中,我還將講解如何從基準對象里刪除綁定的圖形對象功能
改進庫類
如往常一樣,我們先實現(xiàn)新的函數(shù)庫消息。 在 \MQL5\Include\DoEasy\Data.mqh 里,添加新消息的索引:
//--- CGraphElementsCollection ? MSG_GRAPH_OBJ_FAILED_GET_ADDED_OBJ_LIST, ? ? ? ? ? // Failed to get the list of newly added objects ? MSG_GRAPH_OBJ_FAILED_DETACH_OBJ_FROM_LIST, ? ? ? ? // Failed to remove a graphical object from the list ? MSG_GRAPH_OBJ_FAILED_DELETE_OBJ_FROM_LIST, ? ? ? ? // Failed to remove a graphical object from the list ? MSG_GRAPH_OBJ_FAILED_DELETE_OBJ_FROM_CHART, ? ? ? ?// Failed to remove a graphical object from the chart ? MSG_GRAPH_OBJ_FAILED_ADD_OBJ_TO_DEL_LIST, ? ? ? ? ?// Failed to set a graphical object to the list of removed objects ? MSG_GRAPH_OBJ_FAILED_ADD_OBJ_TO_RNM_LIST, ? ? ? ? ?// Failed to set a graphical object to the list of renamed objects
...
//--- CLinkedPivotPoint ? MSG_GRAPH_OBJ_EXT_NOT_ANY_PIVOTS_X, ? ? ? ? ? ? ? ?// Not a single pivot point is set for the object along the X axis ? MSG_GRAPH_OBJ_EXT_NOT_ANY_PIVOTS_Y, ? ? ? ? ? ? ? ?// Not a single pivot point is set for the object along the Y axis ? MSG_GRAPH_OBJ_EXT_NOT_ATACHED_TO_BASE, ? ? ? ? ? ? // The object is not attached to the basic graphical object ? MSG_GRAPH_OBJ_EXT_FAILED_CREATE_PP_DATA_OBJ, ? ? ? // Failed to create a data object for the X and Y pivot points ? MSG_GRAPH_OBJ_EXT_NUM_BASE_PP_TO_SET_X, ? ? ? ? ? ?// Number of base object pivot points for calculating the X coordinate: ? MSG_GRAPH_OBJ_EXT_NUM_BASE_PP_TO_SET_Y, ? ? ? ? ? ?// Number of base object pivot points for calculating the Y coordinate: ? ?}; //+------------------------------------------------------------------+