文章 "图形界面 X: 标准图表控件 (集成编译 4)" - 页 4

 
Ре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 开发人员。)

 
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(),也没有这个必要。因此,这个问题应该问你们的开发人员)。

我认为,要进一步优化您的程序库,就必须解决每个对象每次变化时都要重新绘制图表的问题,而这只会增加处理器的负担。

不过,我的建议是:不要太喜欢优化库代码。这可能会导致对整个技术概念的全面反思。)

 
Реter Konow:

在我的技术中,没有与此类事情相关的负载。对象的更改是逐点进行的。任何地方都不会调用ChartRedraw(),也不需要它。因此,这个问题应该问你们的开发人员)。

我认为,要进一步优化你们的程序库,就必须解决每次更改对象时都要重新绘制图表的问题,而这只会增加处理器的负担。

除了你自己,没人知道你是在什么环境下测试的。如果您没有遇到任何与重绘有关的问题,那您就万事大吉了。我确信这一点,因为我早就经历过这一切。当然,你会对此保持沉默,因为你不会向任何人展示你的代码。

不过,我给你的建议是:不要太喜欢优化库代码。这可能会导致你对整个技术概念的全面反思。)

确保你不必自己重新思考技术的概念。)

 
Anatoli Kazharski:

除了你自己,别人不知道你在什么环境下进行测试。如果你在重绘过程中没有遇到任何问题,那么你就万事大吉了。我确信这一点,因为我已经经历了很长时间。 当然,你会对此保持沉默,因为你不会向任何人展示你的代码。

只要确保你不必自己修改你的技术概念就可以了。)

我真不明白你在说什么。你已经看过我的作品了。在他们的实现中,重绘没有问题,而程序的任何地方都没有调用 ChartRedrow()。

我不知道该给你看什么代码才能说服你。告诉我该给你看什么,我会给你看的。

 

下面是我实现的 "定位器 "功能的一个示例。(为了证明我不是瞎编的)。


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();
        }  
      //--------------------------

//--------------------------------------------------------------------------------------------------------------
Прежний_объект = ОБЪЕКТ;
Прежнее_окно = ОКНО;
//--------------------------
}  
}
}  
 
Реter Konow:

我真的不知道你在说什么。你已经看过我的作品了。在他们的实现中,即使程序中没有调用 ChartRedrow(),也不存在重绘问题。

我在你的作品中看到的东西根本不符合任何门。此外,从您的演示中我们可以得出一个明确的结论,您只在MetaTrader 4 中进行了测试。

Retag Konow

我不知道该给你看什么代码才能说服你。告诉我给你看什么,我就给你看。

你不应该给我看,而应该给你要卖给的人看。我不想测试我自己开发时不会用到的东西。首先,把一切都调整到可接受的水平,并详细描述您的开发能力,至少我是这样做的。然后,我们才能对您的工作得出结论。

 
Реter Konow:

下面是我实现的 "定位器 "功能的一个示例。(为了证明我没有胡编乱造)。

不幸的是,它并没有告诉我任何东西。一切都要通过测试和比较不同的方法来学习。当你以演示模式展示你的库的第一个版本时,我就知道了。当然,我不会买任何东西。)
 
Anatoli Kazharski:
遗憾的是,这并不能说明什么。一切都要通过测试和比较不同的方法来学习。当你以演示模式展示你的库的第一个版本时,我就知道了。当然,我不会买任何东西。)

你跑题了。你可以批评我的工作,但不能说我的工作速度慢。(奇怪的批评:"不可能")。

我个人不会向你推销任何东西,但会让你尝试使用--是的。

你所说的我的 "图书馆 "并不是一个真正的图书馆。它是一个封闭的、自给自足的机制,你无法连接别人的代码,也无法连接自己的代码

现在,我以自己的解决方案为例,建设性地批评了你们的解决方案。如果你不需要它,讨论就结束了。

 
Реter Konow:

你跑题了。你可以批评我的作品,但不能说它们慢。(奇怪的批评:"不可能")。

那就不要偏离主题。我已经在几十篇文章中详细描述了我的主题。这与你们的封闭式、不可访问的技术有什么关系?你们在发售这些技术之前,不断地提前做广告。

我不是说你们有什么东西慢下来了。我的意思是,你不知道它是否在减速。你什么都可以说。测试文件在哪里?它在哪里变慢/不变慢?在 MetaTrader 4/5 中?在 Windows 7/8/10 中?这就是问题所在。)

Konow Retag

这是一个封闭的、自给自足的机制,你不能插入别人的代码,也不能插入自己的代码

我相信这是它最大的缺点。再说一遍,对谁来说是自给自足?只对你?现在就对所有人说这些还为时过早。只有当使用它的人告诉你,它对其他人来说才是自给自足的。

雷塔格-科诺

现在,我以自己的解决方案为例,建设性地批评了你们的解决方案。如果你们不需要,那么讨论就结束了。

当然,这很有趣,也很有用。特别是对您和其他新来者。通过提出问题并得到答案,您也帮助其他人获得了新知识。

但是你的批评却没有提供任何材料来证实你的说法,这并不具有建设性。

谢谢。

 
Anatoli Kazharski:

1.那就不要转移话题。我已经在几十篇文章中详细描述了我的主题。这和你们那些在发售之前就不断提前做广告的封闭式、不可访问的技术有什么关系?

2.我并没有说你们有什么东西在减速。我的意思是,你不知道它是否在减速。 你说什么都行。测试文件在哪里?它在哪里变慢/不变慢?在 MetaTrader 4/5 中?在 Windows 7/8/10 中?这就是问题所在。)

3.我相信这是它最大的缺点。再说一遍,自给自足是为了谁?只对你?现在对每个人都说这些还为时过早。只有当使用它的人告诉你,它对其他人来说才是自给自足的。

4.它当然非常有趣和有用。特别是对您和其他新手。通过提出问题并获得答案,您也可以帮助他人获得新知识。

5.但你的批评没有提供任何材料来支持你的论断,是没有建设性的。

6.谢谢。

1. 没有必要...

2. 从视频中可以看出,我的执行速度并不慢。

3. 多余...

4.没错。这就是我和你争论的原因。在我看来,你在每个对象发生事件时重绘整个图形的解决方案并不高效,而且会给处理器带来额外负担。优化取决于能否正确解决这个问题。我没有调用 ChartRedrow()函数(请相信你的话),界面也没有变慢(你可以在视频中看到),所有需要更新的东西都没有变慢。

因此我建议:不要不断重绘图表,因为你可以不使用它。

5.我说我不使用 ChartRedrow(),并在视频中展示了不使用 该函数的结果,这就证明了我的说法是有道理的。

6.谢谢。