文章 "图形界面 X: 标准图表控件 (集成编译 4)" - 页 4 123456 新评论 Anatoli Kazharski 2016.10.27 11:48 #31 Реter Konow:非常非常奇怪。在我的接口实现中,没有一次调用ChartRedraw() 函数。直到现在我才知道为什么需要....。我在使用画布(位图对象)时不需要它。当有疑问时,您可以通过标准库的发展来追溯这种或那种必要性。例如,CCanvas 类。//+------------------------------------------------------------------+// 更新屏幕上的对象(重绘)|//+------------------------------------------------------------------+void CCustomCanvas::Update(const bool redraw) {//--- 检查 if(m_rcname==NULL) return;//--- 更新资源并重新绘制 if(ResourceCreate(m_rcname,m_pixels,m_width,m_height,0,0,0,m_format) && redraw) ChartRedraw(); }//---如果您在工作中不使用它,您将会在某些最不恰当的时刻遇到某些内容无法显示的情况。Konow 标签:假设ChartRedraw() 函数是必要的,那么每个对象的每次更改都需要重新绘制所有对象吗?我不知道。终端系统会这样做。您可以尝试询问 MQ 开发人员。) 文章 "MQL5 中的统计分布 - Discussion of article "Statistical Discussion of article "Graphical Реter Konow 2016.10.27 12:02 #32 Anatoli Kazharski:当有一些疑问时,您可以通过标准库的发展来追溯这种或那种必要性。例如,CCanvas 类。//+------------------------------------------------------------------+// 更新屏幕上的对象(重绘)|//+------------------------------------------------------------------+void CCustomCanvas::Update(const bool redraw) {//--- 检查 if(m_rcname==NULL) return;//--- 更新资源并重新绘制 if(ResourceCreate(m_rcname,m_pixels,m_width,m_height,0,0,0,m_format) && redraw) ChartRedraw(); }//---如果你在工作中没有使用它,那么在某些时候,你就会遇到在最不恰当的时刻无法显示某些内容的情况。我不知道。终端系统会处理这个问题。您可以尝试询问开发人员。)在我的技术中,这种事情不会带来任何负担。对象的更改是逐点进行的。在任何地方都不会调用ChartRedraw(),也没有这个必要。因此,这个问题应该问你们的开发人员)。我认为,要进一步优化您的程序库,就必须解决每个对象每次变化时都要重新绘制图表的问题,而这只会增加处理器的负担。不过,我的建议是:不要太喜欢优化库代码。这可能会导致对整个技术概念的全面反思。) Anatoli Kazharski 2016.10.27 12:17 #33 Реter Konow:在我的技术中,没有与此类事情相关的负载。对象的更改是逐点进行的。任何地方都不会调用ChartRedraw(),也不需要它。因此,这个问题应该问你们的开发人员)。我认为,要进一步优化你们的程序库,就必须解决每次更改对象时都要重新绘制图表的问题,而这只会增加处理器的负担。除了你自己,没人知道你是在什么环境下测试的。如果您没有遇到任何与重绘有关的问题,那您就万事大吉了。我确信这一点,因为我早就经历过这一切。当然,你会对此保持沉默,因为你不会向任何人展示你的代码。不过,我给你的建议是:不要太喜欢优化库代码。这可能会导致你对整个技术概念的全面反思。)确保你不必自己重新思考技术的概念。) Реter Konow 2016.10.27 12:31 #34 Anatoli Kazharski:除了你自己,别人不知道你在什么环境下进行测试。如果你在重绘过程中没有遇到任何问题,那么你就万事大吉了。我确信这一点,因为我已经经历了很长时间。 当然,你会对此保持沉默,因为你不会向任何人展示你的代码。只要确保你不必自己修改你的技术概念就可以了。)我真不明白你在说什么。你已经看过我的作品了。在他们的实现中,重绘没有问题,而程序的任何地方都没有调用 ChartRedrow()。我不知道该给你看什么代码才能说服你。告诉我该给你看什么,我会给你看的。 Реter Konow 2016.10.27 12:38 #35 下面是我实现的 "定位器 "功能的一个示例。(为了证明我不是瞎编的)。void Имя_объекта_под_курсором(){ static int Номер_окна, Номер_последнего_объекта_в_окне, Прежний_объект, Прежнее_окно; //------------------- //////Alert(" All_open_windows ",All_open_windows); // 如果至少有一个窗口打开,则进入循环以搜索光标所在的窗口。 // 如果未找到此类窗口,且循环交互计数器已达到窗口总数,则返回 -1、 //这意味着光标位于图表的自由空间上。 //注意:数组 "队列中的窗口编号 "从 0 开始索引,而 "所有打开窗口的计数器 "从 1 开始计数。 //因此,根据计数器,包含窗口编号的数组单元格编号总是比计数器值少一个。 if(Всех_открытых_окон > 0) { for(int b = 0; b <= Всех_открытых_окон; b++) {//////Alert("Object_name_under_cursor() 窗口搜索交互次数 b = ",b); //I if the number of interactions reaches the value of the window counter, it means that we have gone beyond the array where the numbers of these windows are stored、 // 并因此发现光标下没有窗口。 if(b == Всех_открытых_окон) { Номер_окна = -1; //由于在离开窗口区时没有将这些变量清零,因此出现了一个严重的错误。 //------------------------------ ОКНО = 0; ОБЪЕКТ = 0; ЭЛЕМЕНТ = 0; ТИП_ЭЛЕМЕНТА = 0; КАТЕГОРИЯ_ОБЪЕКТА = 0; ПОДКАТЕГОРИЯ_ОБЪЕКТА = 0; ПОДГРУППА_ОБЪЕКТА = 0; КАТЕГОРИЯ_ЭЛЕМЕНТА = 0; КООРДИНАТА_ОКНА_X = 0; КООРДИНАТА_ОКНА_Y = 0; ШИРИНА_ОКНА = 0; ВЫСОТА_ОКНА = 0; НИЖНЯЯ_ТОЧКА_ОКНА = 0; ПРАВАЯ_ТОЧКА_ОКНА = 0; //------------------- ТИП_ОКНА = 0; КАТЕГОРИЯ_ОКНА = 0; ОКНО_ВСЕГДА_СВЕРХУ = 0; ОКНО_ПРИКРЕПЛЕНО = 0; МАТЕРИНСКОЕ_ОКНО = 0; ЗОНА_ОКНА = 0; РЕЖИМ_ОТОБРАЖЕНИЯ_ОКНА = 0; КАТЕГОРИЯ_МАТЕРИНСКОГО_ОКНА = 0; //------------------------------ НОМЕР_ВЫЗЫВАЕМОГО_ОБЪЕКТОМ_ОКНА = 0; КАТЕГОРИЯ_ВЫЗЫВАЕМОГО_ОБЪЕКТОМ_ОКНА = 0; СОБЫТИЕ_СМЕНЫ_СОСТОЯНИЙ_ЭЛЕМЕНТА = 0; ТЕКУЩЕЕ_СОСТОЯНИЕ_ЭЛЕМЕНТА = 0; ЭЛЕМЕНТ_АКТИВИРОВАН = 0; КАНВАС = 0; //--------------------- if(Иконка_ручки) { ObjectDelete(Иконка_ручки); Иконка_ручки = 0; } // return(-1); }/**/ //------------ //检查窗口是否在光标下方。 if( X > G_CORE[Номер_окна_в_очереди[b]][_MAIN_FRAME][_X] && X < G_CORE[Номер_окна_в_очереди[b]][_MAIN_FRAME][_X] + G_CORE[Номер_окна_в_очереди[b]][_MAIN_FRAME][_X_SIZE] && Y > G_CORE[Номер_окна_в_очереди[b]][_MAIN_FRAME][_Y] && Y < G_CORE[Номер_окна_в_очереди[b]][_MAIN_FRAME][_Y] + G_CORE[Номер_окна_в_очереди[b]][_MAIN_FRAME][_Y_SIZE] ) { //--------------------------- ОКНО = Номер_окна_в_очереди[b]; //--------------------------- ТИП_ОКНА = G_CORE[ОКНО][_W_Properties][_WINDOW_TYPE]; КАТЕГОРИЯ_ОКНА = G_CORE[ОКНО][_W_Properties][_WINDOW_CATEGORY]; ОКНО_ВСЕГДА_СВЕРХУ = G_CORE[ОКНО][_W_Properties][_WINDOW_ALWAYS_ON_TOP]; //------------------------------ КООРДИНАТА_ОКНА_X = G_CORE[ОКНО][_MAIN_FRAME][_X]; КООРДИНАТА_ОКНА_Y = G_CORE[ОКНО][_MAIN_FRAME][_Y]; ШИРИНА_ОКНА = G_CORE[ОКНО][_MAIN_FRAME][_X_SIZE]; ВЫСОТА_ОКНА = G_CORE[ОКНО][_MAIN_FRAME][_Y_SIZE]; НИЖНЯЯ_ТОЧКА_ОКНА = КООРДИНАТА_ОКНА_Y + ВЫСОТА_ОКНА; ПРАВАЯ_ТОЧКА_ОКНА = КООРДИНАТА_ОКНА_X + ШИРИНА_ОКНА; //------------------------------ ОКНО_ПРИКРЕПЛЕНО = G_CORE[ОКНО][_W_Properties][_WINDOW_BIND_TO_WINDOW_NUMBER]; МАТЕРИНСКОЕ_ОКНО = ОКНО_ПРИКРЕПЛЕНО; КАТЕГОРИЯ_МАТЕРИНСКОГО_ОКНА = G_CORE[МАТЕРИНСКОЕ_ОКНО][_W_Properties][_WINDOW_CATEGORY]; ЗОНА_ОКНА = G_CORE[ОКНО][_W_Properties][_WINDOW_ZONE]; //------------------------------ РЕЖИМ_ОТОБРАЖЕНИЯ_ОКНА = G_CORE[ОКНО][_W_Properties][_WINDOW_CURRENT_SIZE_MODE]; //------------------------------ break; } } //----------------------------------------- if(Прежнее_окно != ОКНО) {//////Alert("Window_number != WINDOW"); for(int d = 1; d < 500; d++) { if(G_CORE[ОКНО][d][_NAME] == 0) { Номер_последнего_объекта_в_окне = d - 1; break; } } // ////Alert("Number_last_object_in_window ",Number_last_object_in_window);// Previous_window = Window.Window; } //-------------------------------------------------------------------------------------- // 从窗口的最后一个对象开始循环搜索光标下的对象。 //选择光标下的第一个匹配对象,并检查其创建时间是否正确。 // 比任何其他对象的最后一次创建时间都要新 //在光标下并在前面检查过的,是全局变量 OBJECT 所接受的编号。 //在循环结束时,光标下最后一个也是最新的一个对象将保留在 OBJECT 变量中。 //这种方法不仅可以确定在游标下找到的第一个对象,还可以确定该对象 //这可能会使找到的第一个对象模糊不清,因为它是通过手柄或滚动事件重新绘制的、 //但它在窗口中的编号要早于光标下对象的编号,因此如果我们中断循环、 //那我们就不去了。 //--------------------------------------------------------------------------------------- int Последний_объект_под_курсором; //-------------------------------------- for(int c = Номер_последнего_объекта_в_окне; c >= 1; c--) { if( ((G_CORE[ОКНО][c][_OBJ_TYPE] != Obj_Pixel && !G_CORE[ОКНО][c][_OBJECT_HIDE]) ||( G_CORE[ОКНО][c][_OBJ_TYPE] == Obj_Pixel && !G_CORE[ОКНО][c][_OBJECT_HIDE] && !G_CORE[ОКНО][G_CORE[ОКНО][c][_GROUP_MAIN_OBJECT]][_OBJECT_HIDE] )) && G_CORE[ОКНО][c][_OBJECT_CATEGORY] != _DEC // 替换此条目,使对象的属性对协调函数不可见。 && X > G_CORE[ОКНО][c][_X] && X < (G_CORE[ОКНО][c][_X] + G_CORE[ОКНО][c][_X_SIZE]) && Y > G_CORE[ОКНО][c][_Y] && Y < (G_CORE[ОКНО][c][_Y] + G_CORE[ОКНО][c][_Y_SIZE]) ) { if(c != 1)Последний_объект_под_курсором = c; ОБЪЕКТ = c; //--------------------------------------------------------------- //设置元素、对象、属性和参数的焦点。 //--------------------------------------------------------------- ЭЛЕМЕНТ = G_CORE[ОКНО][ОБЪЕКТ] [_GROUP_MAIN_OBJECT]; КАНВАС = G_CORE[ОКНО][ОБЪЕКТ] [_DROWING_CANVAS]; ТИП_ЭЛЕМЕНТА = G_CORE[ОКНО][ЭЛЕМЕНТ][_OBJECT_GROUP]; КАТЕГОРИЯ_ОБЪЕКТА = G_CORE[ОКНО][ОБЪЕКТ] [_OBJECT_CATEGORY]; ПОДКАТЕГОРИЯ_ОБЪЕКТА = G_CORE[ОКНО][ОБЪЕКТ] [_OBJECT_SUBCATEGORY]; ПОДГРУППА_ОБЪЕКТА = G_CORE[ОКНО][ОБЪЕКТ] [_OBJECT_SUBGROUP]; КАТЕГОРИЯ_ЭЛЕМЕНТА = G_CORE[ОКНО][ЭЛЕМЕНТ][_OBJECT_CATEGORY]; //------------------------------ СОБЫТИЕ_СМЕНЫ_СОСТОЯНИЙ_ЭЛЕМЕНТА = G_CORE[ОКНО][ЭЛЕМЕНТ][_OBJECT_CHANGE_STATE_STANDART_EVENT]; ТЕКУЩЕЕ_СОСТОЯНИЕ_ЭЛЕМЕНТА = G_CORE[ОКНО][ЭЛЕМЕНТ][_CURRENT_STATE]; ЭЛЕМЕНТ_АКТИВИРОВАН = ТЕКУЩЕЕ_СОСТОЯНИЕ_ЭЛЕМЕНТА; //------------------------------ НОМЕР_ВЫЗЫВАЕМОГО_ОБЪЕКТОМ_ОКНА = G_CORE[ОКНО][ОБЪЕКТ][_WON]; КАТЕГОРИЯ_ВЫЗЫВАЕМОГО_ОБЪЕКТОМ_ОКНА = G_CORE[НОМЕР_ВЫЗЫВАЕМОГО_ОБЪЕКТОМ_ОКНА][_W_Properties][_WINDOW_CATEGORY]; //------------------------------ _Имя_объекта_под_курсором = G_CORE[ОКНО][ОБЪЕКТ][_NAME]; //------------------------------ if(!G_CORE[ОКНО][c][_OBJECT_SCROLLED] && ОБЪЕКТ != _MAIN_FRAME)break; //------------------------------ if(c == 1 && Последний_объект_под_курсором != 0)ОБЪЕКТ = Последний_объект_под_курсором; if(c == 1 && Последний_объект_под_курсором == 0)ОБЪЕКТ = _MAIN_FRAME; } //--------------------------------------------------------------- } ///Alert("_Object_Name_under_Cursor ",_Object_Name_under_Cursor); //-----------------------------------------if(РЕЖИМ_ОТОБРАЖЕНИЯ_ОКНА != _MAXIMIZED_MODE){ int Тип_иконки = _NO_ICON; //Верхний левый уголок-----------------------------------------if(КАТЕГОРИЯ_ОБЪЕКТА == _OBJECT_CATEGORY_WINDOW_HANDLE || КАТЕГОРИЯ_ОБЪЕКТА == _OBJECT_CATEGORY_WINDOW_RESIZE_HANDLE) { //---------------------- if(ПОДКАТЕГОРИЯ_ОБЪЕКТА == _OBJECT_SUBCATEGORY_WINDOW_LEFT_HANDLE || ПОДКАТЕГОРИЯ_ОБЪЕКТА == _OBJECT_SUBCATEGORY_WINDOW_RIGHT_HANDLE)Тип_иконки = _RIGHT_n_LEFT_ARROW; //----------------------------------------- if(ПОДКАТЕГОРИЯ_ОБЪЕКТА == _OBJECT_SUBCATEGORY_WINDOW_BOTTOM_HANDLE)Тип_иконки = _UP_n_DOWN_ARROW; //---------------------------- if(ПОДГРУППА_ОБЪЕКТА == _OBJECT_SUBCATEGORY_4_POINTS_TOOLBAR_HANDLE)Тип_иконки = _CROSSED_ARROWS; //---------------------------- //Левый верхний уголок----------------------------------------- if(X >= КООРДИНАТА_ОКНА_X && X <= КООРДИНАТА_ОКНА_X + 6 && Y >= КООРДИНАТА_ОКНА_Y && Y <= КООРДИНАТА_ОКНА_Y + 6) { Тип_иконки = _UP_LEFT_to_DOWN_RIGHT_ARROW; ОБЪЕКТ = 400000; } //Левый нижний уголок----------------------------------------- if(X >= КООРДИНАТА_ОКНА_X && (X <= КООРДИНАТА_ОКНА_X + 5) && Y >= (НИЖНЯЯ_ТОЧКА_ОКНА - 5) && Y <= НИЖНЯЯ_ТОЧКА_ОКНА) { Тип_иконки = _UP_RIGHT_to_DOWN_LEFT_ARROW; ОБЪЕКТ = 500000; } //Правый верхний уголок----------------------------------------- if(X >= (ПРАВАЯ_ТОЧКА_ОКНА - 5) && X <= ПРАВАЯ_ТОЧКА_ОКНА && Y >= КООРДИНАТА_ОКНА_Y && Y <= (КООРДИНАТА_ОКНА_Y + 5)) { Тип_иконки = _UP_RIGHT_to_DOWN_LEFT_ARROW; ОБЪЕКТ = 600000; } //Правый нижний уголок----------------------------------------- if(X >= (ПРАВАЯ_ТОЧКА_ОКНА - 5) && X <= ПРАВАЯ_ТОЧКА_ОКНА && Y >= (НИЖНЯЯ_ТОЧКА_ОКНА - 5)&& Y <= НИЖНЯЯ_ТОЧКА_ОКНА) { Тип_иконки = _UP_LEFT_to_DOWN_RIGHT_ARROW; ОБЪЕКТ = 700000; } //----------------------------------------- if(X >= (КООРДИНАТА_ОКНА_X + 6) && X <= (ПРАВАЯ_ТОЧКА_ОКНА - 6) && Y >= КООРДИНАТА_ОКНА_Y && Y <= (КООРДИНАТА_ОКНА_Y + 6)) { Тип_иконки = _UP_n_DOWN_ARROW; ОБЪЕКТ = 800000; } //----------------------------------------- if(ОКНО_ПРИКРЕПЛЕНО) { if(ЗОНА_ОКНА == 1 || ЗОНА_ОКНА == 10) { if((ПОДКАТЕГОРИЯ_ОБЪЕКТА == _OBJECT_SUBCATEGORY_WINDOW_LEFT_HANDLE || ПОДКАТЕГОРИЯ_ОБЪЕКТА == _OBJECT_SUBCATEGORY_WINDOW_RIGHT_HANDLE) && ((X >= КООРДИНАТА_ОКНА_X && X <= (КООРДИНАТА_ОКНА_X + 2)) || (X >= ((ПРАВАЯ_ТОЧКА_ОКНА) - 2) && X <= (ПРАВАЯ_ТОЧКА_ОКНА)))) { Тип_иконки = _MULTI_HANDLE_LR; } } //----------------------------------------- if(ЗОНА_ОКНА == 6 || ЗОНА_ОКНА == 3) { if(ПОДКАТЕГОРИЯ_ОБЪЕКТА == _OBJECT_SUBCATEGORY_WINDOW_BOTTOM_HANDLE && ((Y >= (НИЖНЯЯ_ТОЧКА_ОКНА) - 2) && (Y <= (НИЖНЯЯ_ТОЧКА_ОКНА)))) { Тип_иконки = _MULTI_HANDLE_UD; } } //----------------------------------------- if(ЗОНА_ОКНА == 7 || ЗОНА_ОКНА == 4) { if((ПОДКАТЕГОРИЯ_ОБЪЕКТА == _OBJECT_SUBCATEGORY_WINDOW_BOTTOM_HANDLE || ОБЪЕКТ == _STANDART_OBJECT_HEAD_DOWN_HANDLE) && (((Y >= (НИЖНЯЯ_ТОЧКА_ОКНА) - 2) && Y <= (НИЖНЯЯ_ТОЧКА_ОКНА)) ||(Y >= КООРДИНАТА_ОКНА_Y && Y <= (КООРДИНАТА_ОКНА_Y + 3)))) { Тип_иконки = _MULTI_HANDLE_UD; } } //----------------------------------------- if(ЗОНА_ОКНА == 8 || ЗОНА_ОКНА == 5) { if(Y >= КООРДИНАТА_ОКНА_Y && Y <= (КООРДИНАТА_ОКНА_Y + 3)) { Тип_иконки = _MULTI_HANDLE_UD; } } } //----------------------------------------- //----------------------------------------- if(Иконка_ручки != Тип_иконки && Тип_иконки != _NO_ICON) { ObjectDelete(Иконка_ручки); Иконка_ручки = Тип_иконки; Создать_иконку(Иконка_ручки); } Перемещать_иконку_за_курсором(); //------------------------------------------ } if(Событие_Left_Click && Тип_иконки != _NO_ICON)Перемещение_окна = 1; //------------------------------------------ if(Иконка_ручки && Тип_иконки == _NO_ICON) { ObjectDelete(Иконка_ручки); Иконка_ручки = 0; } //----------------------------- } //Fix _OBJECT_DISAPPOINTED 和 _OBJECT_POINTED 事件,以及对象是否有针对这些事件的脚本、 // 调用对象行为块来实现它。//----------------------------------------------------- if(Прежний_объект != ОБЪЕКТ) { int Номер_вызываемого_окна_прежнего_объекта = G_CORE[Прежнее_окно][Прежний_объект][_OBJECT_OPEN_CLOSE_WINDOW_FUNCTION]; int Категория_вызываемого_окна_прежнего_объекта = G_CORE[Номер_вызываемого_окна_прежнего_объекта][_W_Properties][_WINDOW_CATEGORY]; int Номер_вызываемого_окна = G_CORE[ОКНО][ОБЪЕКТ][_OBJECT_OPEN_CLOSE_WINDOW_FUNCTION]; int Категория_вызываемого_окна = G_CORE[Номер_вызываемого_окна][_W_Properties][_WINDOW_CATEGORY]; int Сценарий_DISAPPOINTED_прежнего_объекта = G_CORE[Прежнее_окно][Прежний_объект][_OBJECT_DISAPPOINTED]; int Тип_элемента_прежнего_объекта = G_CORE[Прежнее_окно][Прежний_объект][_OBJECT_GROUP]; //--------------------------------------------------------- //------------------------------------------------------------------------------------------------------------- //当设置 "Open_window_menu "标志时,修改主菜单窗口的行为 --------------------------- // 如果光标下的新对象是主菜单选项卡,则关闭前一个选项卡的菜单窗口,打开此选项卡的菜单。 // 当光标在主菜单选项卡中移动时,该代码块实现了菜单窗口的顺序打开和关闭。 //------------------------------------------------------------------------------------------------------------- if(Открыто_окно_меню) {//////Alert(OBJECT); //--------------- if( Открыто_окно[Номер_вызываемого_окна_прежнего_объекта] && Категория_вызываемого_окна_прежнего_объекта == _CONTEXT_MENU && ОКНО != Номер_вызываемого_окна_прежнего_объекта ) { Явление_окон(_CONTEXT_MENU_WINDOWS_TOTAL_CLOSE,_CONTEXT_MENU); } //--------------- //////Alert("Called_window_number ",Called_window_number, " Called_window_category ",Called_window_category); //---------------------------------------------------------------------------------------------------------- if(Категория_вызываемого_окна == _MAIN_MENU && !Открыто_окно[Номер_вызываемого_окна]) { Явление_окон(_MAIN_MENU_WINDOWS_TOTAL_CLOSE,_MAIN_MENU); Явление_окон(_WINDOW_OPEN,Номер_вызываемого_окна); } //--------------- if(Категория_вызываемого_окна == _CONTEXT_MENU && !Открыто_окно[Номер_вызываемого_окна]) { Явление_окон(_WINDOW_OPEN,Номер_вызываемого_окна); } //--------------- } //----------------------------------------------- СОБЫТИЕ = _OBJECT_DISAPPOINTED; //----------------------------------------------- if(Сценарий_DISAPPOINTED_прежнего_объекта) { if(!((Тип_элемента_прежнего_объекта == _TAB || Тип_элемента_прежнего_объекта == _MENU_ITEM) && Открыто_окно[Номер_вызываемого_окна_прежнего_объекта])) { Поведение_объектов(_STOPABLE_SINGLE_PLAY_MODE,_OBJECT_DISAPPOINTED, Прежнее_окно,Прежний_объект); } //-------------------------- if(Открыто_окно[_TOOLTIP_WINDOW])Закрыть_окно_Tooltip(); //-------------------------- } //--------------------------------------------------------- СОБЫТИЕ = _OBJECT_POINTED; //--------------------------------------------------------- if(G_CORE[ОКНО][ОБЪЕКТ][_OBJECT_POINTED]) { if(!((ТИП_ЭЛЕМЕНТА == _TAB || ТИП_ЭЛЕМЕНТА == _MENU_ITEM) && Открыто_окно[НОМЕР_ВЫЗЫВАЕМОГО_ОБЪЕКТОМ_ОКНА])) { Поведение_объектов(_STOPABLE_SINGLE_PLAY_MODE,_OBJECT_POINTED); } //-------------------------- if(G_CORE[ОКНО][ОБЪЕКТ][_TOOLTIP_TEXT])Открыть_окно_Tooltip(); } //-------------------------- //-------------------------------------------------------------------------------------------------------------- Прежний_объект = ОБЪЕКТ; Прежнее_окно = ОКНО; //-------------------------- } }} Discussion of article "Graphical 在Canvas上做一个众包项目 Making a crowdsourced project Anatoli Kazharski 2016.10.27 12:40 #36 Реter Konow:我真的不知道你在说什么。你已经看过我的作品了。在他们的实现中,即使程序中没有调用 ChartRedrow(),也不存在重绘问题。我在你的作品中看到的东西根本不符合任何门。此外,从您的演示中我们可以得出一个明确的结论,您只在MetaTrader 4 中进行了测试。Retag Konow:我不知道该给你看什么代码才能说服你。告诉我给你看什么,我就给你看。你不应该给我看,而应该给你要卖给的人看。我不想测试我自己开发时不会用到的东西。首先,把一切都调整到可接受的水平,并详细描述您的开发能力,至少我是这样做的。然后,我们才能对您的工作得出结论。 Anatoli Kazharski 2016.10.27 12:45 #37 Реter Konow:下面是我实现的 "定位器 "功能的一个示例。(为了证明我没有胡编乱造)。 不幸的是,它并没有告诉我任何东西。一切都要通过测试和比较不同的方法来学习。当你以演示模式展示你的库的第一个版本时,我就知道了。当然,我不会买任何东西。) Реter Konow 2016.10.27 13:01 #38 Anatoli Kazharski: 遗憾的是,这并不能说明什么。一切都要通过测试和比较不同的方法来学习。当你以演示模式展示你的库的第一个版本时,我就知道了。当然,我不会买任何东西。)你跑题了。你可以批评我的工作,但不能说我的工作速度慢。(奇怪的批评:"不可能")。我个人不会向你推销任何东西,但会让你尝试使用--是的。你所说的我的 "图书馆 "并不是一个真正的图书馆。它是一个封闭的、自给自足的机制,你无法连接别人的代码,也无法连接自己的代码。现在,我以自己的解决方案为例,建设性地批评了你们的解决方案。如果你不需要它,讨论就结束了。 Anatoli Kazharski 2016.10.27 13:21 #39 Реter Konow:你跑题了。你可以批评我的作品,但不能说它们慢。(奇怪的批评:"不可能")。那就不要偏离主题。我已经在几十篇文章中详细描述了我的主题。这与你们的封闭式、不可访问的技术有什么关系?你们在发售这些技术之前,不断地提前做广告。我不是说你们有什么东西慢下来了。我的意思是,你不知道它是否在减速。你什么都可以说。测试文件在哪里?它在哪里变慢/不变慢?在 MetaTrader 4/5 中?在 Windows 7/8/10 中?这就是问题所在。)Konow Retag:这是一个封闭的、自给自足的机制,你不能插入别人的代码,也不能插入自己的代码。我相信这是它最大的缺点。再说一遍,对谁来说是自给自足?只对你?现在就对所有人说这些还为时过早。只有当使用它的人告诉你,它对其他人来说才是自给自足的。雷塔格-科诺现在,我以自己的解决方案为例,建设性地批评了你们的解决方案。如果你们不需要,那么讨论就结束了。 当然,这很有趣,也很有用。特别是对您和其他新来者。通过提出问题并得到答案,您也帮助其他人获得了新知识。但是你的批评却没有提供任何材料来证实你的说法,这并不具有建设性。谢谢。 Реter Konow 2016.10.27 13:38 #40 Anatoli Kazharski: 1.那就不要转移话题。我已经在几十篇文章中详细描述了我的主题。这和你们那些在发售之前就不断提前做广告的封闭式、不可访问的技术有什么关系?2.我并没有说你们有什么东西在减速。我的意思是,你不知道它是否在减速。 你说什么都行。测试文件在哪里?它在哪里变慢/不变慢?在 MetaTrader 4/5 中?在 Windows 7/8/10 中?这就是问题所在。)3.我相信这是它最大的缺点。再说一遍,自给自足是为了谁?只对你?现在对每个人都说这些还为时过早。只有当使用它的人告诉你,它对其他人来说才是自给自足的。 4.它当然非常有趣和有用。特别是对您和其他新手。通过提出问题并获得答案,您也可以帮助他人获得新知识。5.但你的批评没有提供任何材料来支持你的论断,是没有建设性的。6.谢谢。1. 没有必要...2. 从视频中可以看出,我的执行速度并不慢。3. 多余...4.没错。这就是我和你争论的原因。在我看来,你在每个对象发生事件时重绘整个图形的解决方案并不高效,而且会给处理器带来额外负担。优化取决于能否正确解决这个问题。我没有调用 ChartRedrow()函数(请相信你的话),界面也没有变慢(你可以在视频中看到),所有需要更新的东西都没有变慢。因此我建议:不要不断重绘图表,因为你可以不使用它。5.我说我不使用 ChartRedrow(),并在视频中展示了不使用 该函数的结果,这就证明了我的说法是有道理的。6.谢谢。 123456 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
非常非常奇怪。在我的接口实现中,没有一次调用ChartRedraw() 函数。
直到现在我才知道为什么需要....。我在使用画布(位图对象)时不需要它。
当有疑问时,您可以通过标准库的发展来追溯这种或那种必要性。例如,CCanvas 类。
// 更新屏幕上的对象(重绘)|
//+------------------------------------------------------------------+
void CCustomCanvas::Update(const bool redraw)
{
//--- 检查
if(m_rcname==NULL)
return;
//--- 更新资源并重新绘制
if(ResourceCreate(m_rcname,m_pixels,m_width,m_height,0,0,0,m_format) && redraw)
ChartRedraw();
}
//---
如果您在工作中不使用它,您将会在某些最不恰当的时刻遇到某些内容无法显示的情况。
Konow 标签:
假设ChartRedraw() 函数是必要的,那么每个对象的每次更改都需要重新绘制所有对象吗?
我不知道。终端系统会这样做。您可以尝试询问 MQ 开发人员。)
当有一些疑问时,您可以通过标准库的发展来追溯这种或那种必要性。例如,CCanvas 类。
// 更新屏幕上的对象(重绘)|
//+------------------------------------------------------------------+
void CCustomCanvas::Update(const bool redraw)
{
//--- 检查
if(m_rcname==NULL)
return;
//--- 更新资源并重新绘制
if(ResourceCreate(m_rcname,m_pixels,m_width,m_height,0,0,0,m_format) && redraw)
ChartRedraw();
}
//---
如果你在工作中没有使用它,那么在某些时候,你就会遇到在最不恰当的时刻无法显示某些内容的情况。
我不知道。终端系统会处理这个问题。您可以尝试询问开发人员。)
在我的技术中,这种事情不会带来任何负担。对象的更改是逐点进行的。在任何地方都不会调用ChartRedraw(),也没有这个必要。因此,这个问题应该问你们的开发人员)。
我认为,要进一步优化您的程序库,就必须解决每个对象每次变化时都要重新绘制图表的问题,而这只会增加处理器的负担。
不过,我的建议是:不要太喜欢优化库代码。这可能会导致对整个技术概念的全面反思。)
在我的技术中,没有与此类事情相关的负载。对象的更改是逐点进行的。任何地方都不会调用ChartRedraw(),也不需要它。因此,这个问题应该问你们的开发人员)。
我认为,要进一步优化你们的程序库,就必须解决每次更改对象时都要重新绘制图表的问题,而这只会增加处理器的负担。
除了你自己,没人知道你是在什么环境下测试的。如果您没有遇到任何与重绘有关的问题,那您就万事大吉了。我确信这一点,因为我早就经历过这一切。当然,你会对此保持沉默,因为你不会向任何人展示你的代码。
不过,我给你的建议是:不要太喜欢优化库代码。这可能会导致你对整个技术概念的全面反思。)
确保你不必自己重新思考技术的概念。)
除了你自己,别人不知道你在什么环境下进行测试。如果你在重绘过程中没有遇到任何问题,那么你就万事大吉了。我确信这一点,因为我已经经历了很长时间。 当然,你会对此保持沉默,因为你不会向任何人展示你的代码。
只要确保你不必自己修改你的技术概念就可以了。)
我真不明白你在说什么。你已经看过我的作品了。在他们的实现中,重绘没有问题,而程序的任何地方都没有调用 ChartRedrow()。
我不知道该给你看什么代码才能说服你。告诉我该给你看什么,我会给你看的。
下面是我实现的 "定位器 "功能的一个示例。(为了证明我不是瞎编的)。
{
static int Номер_окна,
Номер_последнего_объекта_в_окне,
Прежний_объект,
Прежнее_окно;
//-------------------
//////Alert(" All_open_windows ",All_open_windows);
// 如果至少有一个窗口打开,则进入循环以搜索光标所在的窗口。
// 如果未找到此类窗口,且循环交互计数器已达到窗口总数,则返回 -1、
//这意味着光标位于图表的自由空间上。
//注意:数组 "队列中的窗口编号 "从 0 开始索引,而 "所有打开窗口的计数器 "从 1 开始计数。
//因此,根据计数器,包含窗口编号的数组单元格编号总是比计数器值少一个。
if(Всех_открытых_окон > 0)
{
for(int b = 0; b <= Всех_открытых_окон; b++)
{//////Alert("Object_name_under_cursor() 窗口搜索交互次数 b = ",b);
//I if the number of interactions reaches the value of the window counter, it means that we have gone beyond the array where the numbers of these windows are stored、
// 并因此发现光标下没有窗口。
if(b == Всех_открытых_окон)
{
Номер_окна = -1;
//由于在离开窗口区时没有将这些变量清零,因此出现了一个严重的错误。
//------------------------------
ОКНО = 0;
ОБЪЕКТ = 0;
ЭЛЕМЕНТ = 0;
ТИП_ЭЛЕМЕНТА = 0;
КАТЕГОРИЯ_ОБЪЕКТА = 0;
ПОДКАТЕГОРИЯ_ОБЪЕКТА = 0;
ПОДГРУППА_ОБЪЕКТА = 0;
КАТЕГОРИЯ_ЭЛЕМЕНТА = 0;
КООРДИНАТА_ОКНА_X = 0;
КООРДИНАТА_ОКНА_Y = 0;
ШИРИНА_ОКНА = 0;
ВЫСОТА_ОКНА = 0;
НИЖНЯЯ_ТОЧКА_ОКНА = 0;
ПРАВАЯ_ТОЧКА_ОКНА = 0;
//-------------------
ТИП_ОКНА = 0;
КАТЕГОРИЯ_ОКНА = 0;
ОКНО_ВСЕГДА_СВЕРХУ = 0;
ОКНО_ПРИКРЕПЛЕНО = 0;
МАТЕРИНСКОЕ_ОКНО = 0;
ЗОНА_ОКНА = 0;
РЕЖИМ_ОТОБРАЖЕНИЯ_ОКНА = 0;
КАТЕГОРИЯ_МАТЕРИНСКОГО_ОКНА = 0;
//------------------------------
НОМЕР_ВЫЗЫВАЕМОГО_ОБЪЕКТОМ_ОКНА = 0;
КАТЕГОРИЯ_ВЫЗЫВАЕМОГО_ОБЪЕКТОМ_ОКНА = 0;
СОБЫТИЕ_СМЕНЫ_СОСТОЯНИЙ_ЭЛЕМЕНТА = 0;
ТЕКУЩЕЕ_СОСТОЯНИЕ_ЭЛЕМЕНТА = 0;
ЭЛЕМЕНТ_АКТИВИРОВАН = 0;
КАНВАС = 0;
//---------------------
if(Иконка_ручки)
{
ObjectDelete(Иконка_ручки);
Иконка_ручки = 0;
}
// return(-1);
}/**/
//------------
//检查窗口是否在光标下方。
if(
X > G_CORE[Номер_окна_в_очереди[b]][_MAIN_FRAME][_X]
&& X < G_CORE[Номер_окна_в_очереди[b]][_MAIN_FRAME][_X] + G_CORE[Номер_окна_в_очереди[b]][_MAIN_FRAME][_X_SIZE]
&& Y > G_CORE[Номер_окна_в_очереди[b]][_MAIN_FRAME][_Y]
&& Y < G_CORE[Номер_окна_в_очереди[b]][_MAIN_FRAME][_Y] + G_CORE[Номер_окна_в_очереди[b]][_MAIN_FRAME][_Y_SIZE]
)
{
//---------------------------
ОКНО = Номер_окна_в_очереди[b];
//---------------------------
ТИП_ОКНА = G_CORE[ОКНО][_W_Properties][_WINDOW_TYPE];
КАТЕГОРИЯ_ОКНА = G_CORE[ОКНО][_W_Properties][_WINDOW_CATEGORY];
ОКНО_ВСЕГДА_СВЕРХУ = G_CORE[ОКНО][_W_Properties][_WINDOW_ALWAYS_ON_TOP];
//------------------------------
КООРДИНАТА_ОКНА_X = G_CORE[ОКНО][_MAIN_FRAME][_X];
КООРДИНАТА_ОКНА_Y = G_CORE[ОКНО][_MAIN_FRAME][_Y];
ШИРИНА_ОКНА = G_CORE[ОКНО][_MAIN_FRAME][_X_SIZE];
ВЫСОТА_ОКНА = G_CORE[ОКНО][_MAIN_FRAME][_Y_SIZE];
НИЖНЯЯ_ТОЧКА_ОКНА = КООРДИНАТА_ОКНА_Y + ВЫСОТА_ОКНА;
ПРАВАЯ_ТОЧКА_ОКНА = КООРДИНАТА_ОКНА_X + ШИРИНА_ОКНА;
//------------------------------
ОКНО_ПРИКРЕПЛЕНО = G_CORE[ОКНО][_W_Properties][_WINDOW_BIND_TO_WINDOW_NUMBER];
МАТЕРИНСКОЕ_ОКНО = ОКНО_ПРИКРЕПЛЕНО;
КАТЕГОРИЯ_МАТЕРИНСКОГО_ОКНА = G_CORE[МАТЕРИНСКОЕ_ОКНО][_W_Properties][_WINDOW_CATEGORY];
ЗОНА_ОКНА = G_CORE[ОКНО][_W_Properties][_WINDOW_ZONE];
//------------------------------
РЕЖИМ_ОТОБРАЖЕНИЯ_ОКНА = G_CORE[ОКНО][_W_Properties][_WINDOW_CURRENT_SIZE_MODE];
//------------------------------
break;
}
}
//-----------------------------------------
if(Прежнее_окно != ОКНО)
{//////Alert("Window_number != WINDOW");
for(int d = 1; d < 500; d++)
{
if(G_CORE[ОКНО][d][_NAME] == 0)
{
Номер_последнего_объекта_в_окне = d - 1;
break;
}
}
// ////Alert("Number_last_object_in_window ",Number_last_object_in_window);// Previous_window = Window.Window;
}
//--------------------------------------------------------------------------------------
// 从窗口的最后一个对象开始循环搜索光标下的对象。
//选择光标下的第一个匹配对象,并检查其创建时间是否正确。
// 比任何其他对象的最后一次创建时间都要新
//在光标下并在前面检查过的,是全局变量 OBJECT 所接受的编号。
//在循环结束时,光标下最后一个也是最新的一个对象将保留在 OBJECT 变量中。
//这种方法不仅可以确定在游标下找到的第一个对象,还可以确定该对象
//这可能会使找到的第一个对象模糊不清,因为它是通过手柄或滚动事件重新绘制的、
//但它在窗口中的编号要早于光标下对象的编号,因此如果我们中断循环、
//那我们就不去了。
//---------------------------------------------------------------------------------------
int Последний_объект_под_курсором;
//--------------------------------------
for(int c = Номер_последнего_объекта_в_окне; c >= 1; c--)
{
if(
((G_CORE[ОКНО][c][_OBJ_TYPE] != Obj_Pixel && !G_CORE[ОКНО][c][_OBJECT_HIDE])
||(
G_CORE[ОКНО][c][_OBJ_TYPE] == Obj_Pixel
&& !G_CORE[ОКНО][c][_OBJECT_HIDE]
&& !G_CORE[ОКНО][G_CORE[ОКНО][c][_GROUP_MAIN_OBJECT]][_OBJECT_HIDE]
))
&& G_CORE[ОКНО][c][_OBJECT_CATEGORY] != _DEC // 替换此条目,使对象的属性对协调函数不可见。
&& X > G_CORE[ОКНО][c][_X] && X < (G_CORE[ОКНО][c][_X] + G_CORE[ОКНО][c][_X_SIZE])
&& Y > G_CORE[ОКНО][c][_Y] && Y < (G_CORE[ОКНО][c][_Y] + G_CORE[ОКНО][c][_Y_SIZE])
)
{
if(c != 1)Последний_объект_под_курсором = c;
ОБЪЕКТ = c;
//---------------------------------------------------------------
//设置元素、对象、属性和参数的焦点。
//---------------------------------------------------------------
ЭЛЕМЕНТ = G_CORE[ОКНО][ОБЪЕКТ] [_GROUP_MAIN_OBJECT];
КАНВАС = G_CORE[ОКНО][ОБЪЕКТ] [_DROWING_CANVAS];
ТИП_ЭЛЕМЕНТА = G_CORE[ОКНО][ЭЛЕМЕНТ][_OBJECT_GROUP];
КАТЕГОРИЯ_ОБЪЕКТА = G_CORE[ОКНО][ОБЪЕКТ] [_OBJECT_CATEGORY];
ПОДКАТЕГОРИЯ_ОБЪЕКТА = G_CORE[ОКНО][ОБЪЕКТ] [_OBJECT_SUBCATEGORY];
ПОДГРУППА_ОБЪЕКТА = G_CORE[ОКНО][ОБЪЕКТ] [_OBJECT_SUBGROUP];
КАТЕГОРИЯ_ЭЛЕМЕНТА = G_CORE[ОКНО][ЭЛЕМЕНТ][_OBJECT_CATEGORY];
//------------------------------
СОБЫТИЕ_СМЕНЫ_СОСТОЯНИЙ_ЭЛЕМЕНТА = G_CORE[ОКНО][ЭЛЕМЕНТ][_OBJECT_CHANGE_STATE_STANDART_EVENT];
ТЕКУЩЕЕ_СОСТОЯНИЕ_ЭЛЕМЕНТА = G_CORE[ОКНО][ЭЛЕМЕНТ][_CURRENT_STATE];
ЭЛЕМЕНТ_АКТИВИРОВАН = ТЕКУЩЕЕ_СОСТОЯНИЕ_ЭЛЕМЕНТА;
//------------------------------
НОМЕР_ВЫЗЫВАЕМОГО_ОБЪЕКТОМ_ОКНА = G_CORE[ОКНО][ОБЪЕКТ][_WON];
КАТЕГОРИЯ_ВЫЗЫВАЕМОГО_ОБЪЕКТОМ_ОКНА = G_CORE[НОМЕР_ВЫЗЫВАЕМОГО_ОБЪЕКТОМ_ОКНА][_W_Properties][_WINDOW_CATEGORY];
//------------------------------
_Имя_объекта_под_курсором = G_CORE[ОКНО][ОБЪЕКТ][_NAME];
//------------------------------
if(!G_CORE[ОКНО][c][_OBJECT_SCROLLED] && ОБЪЕКТ != _MAIN_FRAME)break;
//------------------------------
if(c == 1 && Последний_объект_под_курсором != 0)ОБЪЕКТ = Последний_объект_под_курсором;
if(c == 1 && Последний_объект_под_курсором == 0)ОБЪЕКТ = _MAIN_FRAME;
}
//---------------------------------------------------------------
}
///Alert("_Object_Name_under_Cursor ",_Object_Name_under_Cursor);
//-----------------------------------------
if(РЕЖИМ_ОТОБРАЖЕНИЯ_ОКНА != _MAXIMIZED_MODE)
{
int Тип_иконки = _NO_ICON;
//Верхний левый уголок-----------------------------------------
if(КАТЕГОРИЯ_ОБЪЕКТА == _OBJECT_CATEGORY_WINDOW_HANDLE || КАТЕГОРИЯ_ОБЪЕКТА == _OBJECT_CATEGORY_WINDOW_RESIZE_HANDLE)
{
//----------------------
if(ПОДКАТЕГОРИЯ_ОБЪЕКТА == _OBJECT_SUBCATEGORY_WINDOW_LEFT_HANDLE || ПОДКАТЕГОРИЯ_ОБЪЕКТА == _OBJECT_SUBCATEGORY_WINDOW_RIGHT_HANDLE)Тип_иконки = _RIGHT_n_LEFT_ARROW;
//-----------------------------------------
if(ПОДКАТЕГОРИЯ_ОБЪЕКТА == _OBJECT_SUBCATEGORY_WINDOW_BOTTOM_HANDLE)Тип_иконки = _UP_n_DOWN_ARROW;
//----------------------------
if(ПОДГРУППА_ОБЪЕКТА == _OBJECT_SUBCATEGORY_4_POINTS_TOOLBAR_HANDLE)Тип_иконки = _CROSSED_ARROWS;
//----------------------------
//Левый верхний уголок-----------------------------------------
if(X >= КООРДИНАТА_ОКНА_X && X <= КООРДИНАТА_ОКНА_X + 6 && Y >= КООРДИНАТА_ОКНА_Y && Y <= КООРДИНАТА_ОКНА_Y + 6)
{
Тип_иконки = _UP_LEFT_to_DOWN_RIGHT_ARROW;
ОБЪЕКТ = 400000;
}
//Левый нижний уголок-----------------------------------------
if(X >= КООРДИНАТА_ОКНА_X && (X <= КООРДИНАТА_ОКНА_X + 5) && Y >= (НИЖНЯЯ_ТОЧКА_ОКНА - 5) && Y <= НИЖНЯЯ_ТОЧКА_ОКНА)
{
Тип_иконки = _UP_RIGHT_to_DOWN_LEFT_ARROW;
ОБЪЕКТ = 500000;
}
//Правый верхний уголок-----------------------------------------
if(X >= (ПРАВАЯ_ТОЧКА_ОКНА - 5) && X <= ПРАВАЯ_ТОЧКА_ОКНА && Y >= КООРДИНАТА_ОКНА_Y && Y <= (КООРДИНАТА_ОКНА_Y + 5))
{
Тип_иконки = _UP_RIGHT_to_DOWN_LEFT_ARROW;
ОБЪЕКТ = 600000;
}
//Правый нижний уголок-----------------------------------------
if(X >= (ПРАВАЯ_ТОЧКА_ОКНА - 5) && X <= ПРАВАЯ_ТОЧКА_ОКНА && Y >= (НИЖНЯЯ_ТОЧКА_ОКНА - 5)&& Y <= НИЖНЯЯ_ТОЧКА_ОКНА)
{
Тип_иконки = _UP_LEFT_to_DOWN_RIGHT_ARROW;
ОБЪЕКТ = 700000;
}
//-----------------------------------------
if(X >= (КООРДИНАТА_ОКНА_X + 6) && X <= (ПРАВАЯ_ТОЧКА_ОКНА - 6) && Y >= КООРДИНАТА_ОКНА_Y && Y <= (КООРДИНАТА_ОКНА_Y + 6))
{
Тип_иконки = _UP_n_DOWN_ARROW;
ОБЪЕКТ = 800000;
}
//-----------------------------------------
if(ОКНО_ПРИКРЕПЛЕНО)
{
if(ЗОНА_ОКНА == 1 || ЗОНА_ОКНА == 10)
{
if((ПОДКАТЕГОРИЯ_ОБЪЕКТА == _OBJECT_SUBCATEGORY_WINDOW_LEFT_HANDLE || ПОДКАТЕГОРИЯ_ОБЪЕКТА == _OBJECT_SUBCATEGORY_WINDOW_RIGHT_HANDLE)
&& ((X >= КООРДИНАТА_ОКНА_X && X <= (КООРДИНАТА_ОКНА_X + 2)) || (X >= ((ПРАВАЯ_ТОЧКА_ОКНА) - 2) && X <= (ПРАВАЯ_ТОЧКА_ОКНА))))
{
Тип_иконки = _MULTI_HANDLE_LR;
}
}
//-----------------------------------------
if(ЗОНА_ОКНА == 6 || ЗОНА_ОКНА == 3)
{
if(ПОДКАТЕГОРИЯ_ОБЪЕКТА == _OBJECT_SUBCATEGORY_WINDOW_BOTTOM_HANDLE && ((Y >= (НИЖНЯЯ_ТОЧКА_ОКНА) - 2) && (Y <= (НИЖНЯЯ_ТОЧКА_ОКНА))))
{
Тип_иконки = _MULTI_HANDLE_UD;
}
}
//-----------------------------------------
if(ЗОНА_ОКНА == 7 || ЗОНА_ОКНА == 4)
{
if((ПОДКАТЕГОРИЯ_ОБЪЕКТА == _OBJECT_SUBCATEGORY_WINDOW_BOTTOM_HANDLE || ОБЪЕКТ == _STANDART_OBJECT_HEAD_DOWN_HANDLE)
&& (((Y >= (НИЖНЯЯ_ТОЧКА_ОКНА) - 2) && Y <= (НИЖНЯЯ_ТОЧКА_ОКНА)) ||(Y >= КООРДИНАТА_ОКНА_Y && Y <= (КООРДИНАТА_ОКНА_Y + 3))))
{
Тип_иконки = _MULTI_HANDLE_UD;
}
}
//-----------------------------------------
if(ЗОНА_ОКНА == 8 || ЗОНА_ОКНА == 5)
{
if(Y >= КООРДИНАТА_ОКНА_Y && Y <= (КООРДИНАТА_ОКНА_Y + 3))
{
Тип_иконки = _MULTI_HANDLE_UD;
}
}
}
//-----------------------------------------
//-----------------------------------------
if(Иконка_ручки != Тип_иконки && Тип_иконки != _NO_ICON)
{
ObjectDelete(Иконка_ручки);
Иконка_ручки = Тип_иконки;
Создать_иконку(Иконка_ручки);
}
Перемещать_иконку_за_курсором();
//------------------------------------------
}
if(Событие_Left_Click && Тип_иконки != _NO_ICON)Перемещение_окна = 1;
//------------------------------------------
if(Иконка_ручки && Тип_иконки == _NO_ICON)
{
ObjectDelete(Иконка_ручки);
Иконка_ручки = 0;
}
//-----------------------------
}
//Fix _OBJECT_DISAPPOINTED 和 _OBJECT_POINTED 事件,以及对象是否有针对这些事件的脚本、
// 调用对象行为块来实现它。
//-----------------------------------------------------
if(Прежний_объект != ОБЪЕКТ)
{
int Номер_вызываемого_окна_прежнего_объекта = G_CORE[Прежнее_окно][Прежний_объект][_OBJECT_OPEN_CLOSE_WINDOW_FUNCTION];
int Категория_вызываемого_окна_прежнего_объекта = G_CORE[Номер_вызываемого_окна_прежнего_объекта][_W_Properties][_WINDOW_CATEGORY];
int Номер_вызываемого_окна = G_CORE[ОКНО][ОБЪЕКТ][_OBJECT_OPEN_CLOSE_WINDOW_FUNCTION];
int Категория_вызываемого_окна = G_CORE[Номер_вызываемого_окна][_W_Properties][_WINDOW_CATEGORY];
int Сценарий_DISAPPOINTED_прежнего_объекта = G_CORE[Прежнее_окно][Прежний_объект][_OBJECT_DISAPPOINTED];
int Тип_элемента_прежнего_объекта = G_CORE[Прежнее_окно][Прежний_объект][_OBJECT_GROUP];
//---------------------------------------------------------
//-------------------------------------------------------------------------------------------------------------
//当设置 "Open_window_menu "标志时,修改主菜单窗口的行为 ---------------------------
// 如果光标下的新对象是主菜单选项卡,则关闭前一个选项卡的菜单窗口,打开此选项卡的菜单。
// 当光标在主菜单选项卡中移动时,该代码块实现了菜单窗口的顺序打开和关闭。
//-------------------------------------------------------------------------------------------------------------
if(Открыто_окно_меню)
{//////Alert(OBJECT);
//---------------
if(
Открыто_окно[Номер_вызываемого_окна_прежнего_объекта]
&& Категория_вызываемого_окна_прежнего_объекта == _CONTEXT_MENU
&& ОКНО != Номер_вызываемого_окна_прежнего_объекта
)
{
Явление_окон(_CONTEXT_MENU_WINDOWS_TOTAL_CLOSE,_CONTEXT_MENU);
}
//---------------
//////Alert("Called_window_number ",Called_window_number, " Called_window_category ",Called_window_category);
//----------------------------------------------------------------------------------------------------------
if(Категория_вызываемого_окна == _MAIN_MENU && !Открыто_окно[Номер_вызываемого_окна])
{
Явление_окон(_MAIN_MENU_WINDOWS_TOTAL_CLOSE,_MAIN_MENU);
Явление_окон(_WINDOW_OPEN,Номер_вызываемого_окна);
}
//---------------
if(Категория_вызываемого_окна == _CONTEXT_MENU && !Открыто_окно[Номер_вызываемого_окна])
{
Явление_окон(_WINDOW_OPEN,Номер_вызываемого_окна);
}
//---------------
}
//-----------------------------------------------
СОБЫТИЕ = _OBJECT_DISAPPOINTED;
//-----------------------------------------------
if(Сценарий_DISAPPOINTED_прежнего_объекта)
{
if(!((Тип_элемента_прежнего_объекта == _TAB || Тип_элемента_прежнего_объекта == _MENU_ITEM) && Открыто_окно[Номер_вызываемого_окна_прежнего_объекта]))
{
Поведение_объектов(_STOPABLE_SINGLE_PLAY_MODE,_OBJECT_DISAPPOINTED, Прежнее_окно,Прежний_объект);
}
//--------------------------
if(Открыто_окно[_TOOLTIP_WINDOW])Закрыть_окно_Tooltip();
//--------------------------
}
//---------------------------------------------------------
СОБЫТИЕ = _OBJECT_POINTED;
//---------------------------------------------------------
if(G_CORE[ОКНО][ОБЪЕКТ][_OBJECT_POINTED])
{
if(!((ТИП_ЭЛЕМЕНТА == _TAB || ТИП_ЭЛЕМЕНТА == _MENU_ITEM) && Открыто_окно[НОМЕР_ВЫЗЫВАЕМОГО_ОБЪЕКТОМ_ОКНА]))
{
Поведение_объектов(_STOPABLE_SINGLE_PLAY_MODE,_OBJECT_POINTED);
}
//--------------------------
if(G_CORE[ОКНО][ОБЪЕКТ][_TOOLTIP_TEXT])Открыть_окно_Tooltip();
}
//--------------------------
//--------------------------------------------------------------------------------------------------------------
Прежний_объект = ОБЪЕКТ;
Прежнее_окно = ОКНО;
//--------------------------
}
}
}
我真的不知道你在说什么。你已经看过我的作品了。在他们的实现中,即使程序中没有调用 ChartRedrow(),也不存在重绘问题。
我在你的作品中看到的东西根本不符合任何门。此外,从您的演示中我们可以得出一个明确的结论,您只在MetaTrader 4 中进行了测试。
Retag Konow:
我不知道该给你看什么代码才能说服你。告诉我给你看什么,我就给你看。
你不应该给我看,而应该给你要卖给的人看。我不想测试我自己开发时不会用到的东西。首先,把一切都调整到可接受的水平,并详细描述您的开发能力,至少我是这样做的。然后,我们才能对您的工作得出结论。
下面是我实现的 "定位器 "功能的一个示例。(为了证明我没有胡编乱造)。
遗憾的是,这并不能说明什么。一切都要通过测试和比较不同的方法来学习。当你以演示模式展示你的库的第一个版本时,我就知道了。当然,我不会买任何东西。)
你跑题了。你可以批评我的工作,但不能说我的工作速度慢。(奇怪的批评:"不可能")。
我个人不会向你推销任何东西,但会让你尝试使用--是的。
你所说的我的 "图书馆 "并不是一个真正的图书馆。它是一个封闭的、自给自足的机制,你无法连接别人的代码,也无法连接自己的代码。
现在,我以自己的解决方案为例,建设性地批评了你们的解决方案。如果你不需要它,讨论就结束了。
你跑题了。你可以批评我的作品,但不能说它们慢。(奇怪的批评:"不可能")。
那就不要偏离主题。我已经在几十篇文章中详细描述了我的主题。这与你们的封闭式、不可访问的技术有什么关系?你们在发售这些技术之前,不断地提前做广告。
我不是说你们有什么东西慢下来了。我的意思是,你不知道它是否在减速。你什么都可以说。测试文件在哪里?它在哪里变慢/不变慢?在 MetaTrader 4/5 中?在 Windows 7/8/10 中?这就是问题所在。)
Konow Retag:
这是一个封闭的、自给自足的机制,你不能插入别人的代码,也不能插入自己的代码。
我相信这是它最大的缺点。再说一遍,对谁来说是自给自足?只对你?现在就对所有人说这些还为时过早。只有当使用它的人告诉你,它对其他人来说才是自给自足的。
雷塔格-科诺
现在,我以自己的解决方案为例,建设性地批评了你们的解决方案。如果你们不需要,那么讨论就结束了。
当然,这很有趣,也很有用。特别是对您和其他新来者。通过提出问题并得到答案,您也帮助其他人获得了新知识。
但是你的批评却没有提供任何材料来证实你的说法,这并不具有建设性。
谢谢。
1.那就不要转移话题。我已经在几十篇文章中详细描述了我的主题。这和你们那些在发售之前就不断提前做广告的封闭式、不可访问的技术有什么关系?
2.我并没有说你们有什么东西在减速。我的意思是,你不知道它是否在减速。 你说什么都行。测试文件在哪里?它在哪里变慢/不变慢?在 MetaTrader 4/5 中?在 Windows 7/8/10 中?这就是问题所在。)
3.我相信这是它最大的缺点。再说一遍,自给自足是为了谁?只对你?现在对每个人都说这些还为时过早。只有当使用它的人告诉你,它对其他人来说才是自给自足的。
4.它当然非常有趣和有用。特别是对您和其他新手。通过提出问题并获得答案,您也可以帮助他人获得新知识。
5.但你的批评没有提供任何材料来支持你的论断,是没有建设性的。
6.谢谢。
1. 没有必要...
2. 从视频中可以看出,我的执行速度并不慢。
3. 多余...
4.没错。这就是我和你争论的原因。在我看来,你在每个对象发生事件时重绘整个图形的解决方案并不高效,而且会给处理器带来额外负担。优化取决于能否正确解决这个问题。我没有调用 ChartRedrow()函数(请相信你的话),界面也没有变慢(你可以在视频中看到),所有需要更新的东西都没有变慢。
因此我建议:不要不断重绘图表,因为你可以不使用它。
5.我说我不使用 ChartRedrow(),并在视频中展示了不使用 该函数的结果,这就证明了我的说法是有道理的。
6.谢谢。