Библиотеки: EasyAndFastGUI - библиотека для создания графических интерфейсов - страница 13

 
Привет друзья
Я внес следующие изменения

В файле Table.mqh

      string            m_header_text;    // Column header text
      color             m_header_color;   // Column header text color //André
      CTCell            m_rows[];         // Array of the table rows

----------------------------------------------------------------------------------------------------------------------
   void              HeadersColorPressed(const color clr)    { m_headers_color_pressed=clr;      }
   //void              HeadersTextColor(const color clr)       { m_headers_text_color=clr;         } //André

----------------------------------------------------------------------------------------------------------
   void              SetHeaderText(const uint column_index,const string value);
   //--- Setting the color text to the specified header //André
   void              HeadersTextColor(const color &array[]);
--------------------------------------------------------------------------------------------------------------------
//André  
//+------------------------------------------------------------------+
//| Fills the array of text alignment modes                          |
//+------------------------------------------------------------------+
void CTable::HeadersTextColor(const color &array[])
  {
   int total=0;
//--- Leave, if a zero-sized array was passed
   if((total=CheckArraySize(array))==WRONG_VALUE)
      return;
//--- Store the value into the array
   for(int c=0; c<total; c++)
      m_columns[c].m_header_color=array[c];
  }
------------------------------------------------------------------------------------------------------------------------
      //André
      //--- Text color
      uint clr=::ColorToARGB(m_columns[c].m_header_color);

В файле Window.mqh

//--- Handling the even of clicking the form buttons
   if(id==CHARTEVENT_CUSTOM+ON_CLICK_BUTTON)
     {
      //André
      if(StringFind(sparam, CElementBase::ProgramName(), 0)<0)
         return;
      //--- Close the window
-------------------------------------------------------------------------------
   int subwin=(CElementBase::ProgramType()==PROGRAM_INDICATOR)? ::ChartWindowFind() : m_subwin;
//--- Send a message about it
   //André
   //Print(__FUNCTION__, " ", subwin, " ", PROGRAM_NAME);
   //::EventChartCustom(m_chart_id,ON_WINDOW_COLLAPSE,CElementBase::Id(),subwin,"");
   ::EventChartCustom(m_chart_id,ON_WINDOW_COLLAPSE,CElementBase::Id(),subwin, PROGRAM_NAME);
//--- Send a message about the change in the graphical interface
   ::EventChartCustom(m_chart_id,ON_CHANGE_GUI,CElementBase::Id(),0.0,"");
  }
---------------------------------------------------------------------------------------
   int subwin=(CElementBase::ProgramType()==PROGRAM_INDICATOR)? ::ChartWindowFind() : m_subwin;
//--- Send a message about it
   //André
   //::EventChartCustom(m_chart_id,ON_WINDOW_EXPAND,CElementBase::Id(),subwin,"");
   ::EventChartCustom(m_chart_id,ON_WINDOW_EXPAND,CElementBase::Id(),subwin,PROGRAM_NAME);
//--- Send a message about the change in the graphical interface
   ::EventChartCustom(m_chart_id,ON_CHANGE_GUI,CElementBase::Id(),0.0,"");

В файле WndEvents.mqh

      return(false);
//--- If the window identifier and the sub-window number match
   //André
   if(m_sparam!=m_windows[0].ProgramName()) 
      return(false);
   if(m_lparam==m_windows[0].Id() && (int)m_dparam==m_subwin)


Я прокомментировал строки с моим именем, чтобы облегчить локализацию

Прикреплены файлы с измененным полным кодом.

Надеюсь, вы помогли

Файлы:
WndEvents.mqh  144 kb
Window.mqh  129 kb
Table.mqh  304 kb
 

Здравствуйте.

//+------------------------------------------------------------------+
//| Создание холста для рисования элемента                           |
//+------------------------------------------------------------------+
bool CElement::CreateCanvas(const string name,const int x,const int y,
                            const int x_size,const int y_size,ENUM_COLOR_FORMAT clr_format=COLOR_FORMAT_ARGB_NORMALIZE)
  {
//--- Корректировка размеров
   int xsize =(x_size<1)? 50 : x_size;
   int ysize =(y_size<1)? 20 : y_size;
//--- Сбросить последнюю ошибку
   ::ResetLastError();
//--- Создание объекта
   if(!m_canvas.CreateBitmapLabel(m_chart_id,m_subwin,name,x,y,xsize,ysize,clr_format))
     {
      ::Print(__FUNCTION__," > Не удалось создать холст для рисования элемента ("+m_class_name+"): ",::GetLastError());
      return(false);
     }
//--- Сбросить последнюю ошибку
   ::ResetLastError();
//--- Получим указатель на базовый класс
   if(!m_canvas.Attach(m_chart_id,name,clr_format))
     {
      ::Print(__FUNCTION__," > Не удалось присоединить холст для рисования к графику: ",::GetLastError());
      return(false);
     }
//--- Свойства
   ::ObjectSetString(m_chart_id,m_canvas.ChartObjectName(),OBJPROP_TOOLTIP,"\n");
   ::ObjectSetInteger(m_chart_id,m_canvas.ChartObjectName(),OBJPROP_CORNER,m_corner);
   ::ObjectSetInteger(m_chart_id,m_canvas.ChartObjectName(),OBJPROP_SELECTABLE,false);
//--- У всех элементов, кроме формы, приоритет больше, чем у главного элемента
   Z_Order((dynamic_cast<CWindow*>(&this)!=NULL)? 0 : m_main.Z_Order()+1);
//--- Координаты
   m_canvas.X(x);
   m_canvas.Y(y);
//--- Размеры
   m_canvas.XSize(x_size);
   m_canvas.YSize(y_size);
//--- Отступы от крайней точки
   m_canvas.XGap(CalculateXGap(x));
   m_canvas.YGap(CalculateYGap(y));
   return(true);
  }

CreateBitmapLabel - создаем графический ресурс

Attach - читаем этот же ресурс и еще раз пишем в этот же ресурс

Или я что-то не так понимаю?

 

И снова здравствуйте :)

class CMouse
  {

...............

   //--- (1) Возвращает номер окна, в котором находится курсор, (2) время соответствующее координате X, 
   //    (3) уровень (цена) соответствующий координате Y
   int               SubWindowNumber(void) const { return(m_subwin);                        }
   datetime          Time(void)            const { return(m_time);                          }
   double            Level(void)           const { return(m_level);                         }

Time и Level вообще где-то используется? Не нашел нигде...

Для чего используется SubWindowNumber?

Я это к тому, что ChartXYToTimePrice достаточно затратная операция для выполнения при каждом движении мыши...

 
Oleksii Chepurnyi:

Всё ведь в комментариях написано. Добавить даже нечего.

 
Anatoli Kazharski:

Всё ведь в комментариях написано. Добавить даже нечего.

Если Вы про комментарии в коде, то там все понятно, но вопросы ж не про то :)

 
Oleksii Chepurnyi:

...

Я это к тому, что ChartXYToTimePrice достаточно затратная операция для выполнения при каждом движении мыши...

Для получения относительной координаты, если GUI не в главном окне.

 
Anatoli Kazharski:

Для получения относительной координаты, если GUI не в главном окне.

Так может и вычислять только когда GUI не в главном окне? :)


Больше интересует, зачем Attach? На сколько я понял, он повторяет действия CreateBitmapLabel

 
Oleksii Chepurnyi:
Так может и вычислять только когда GUI не в главном окне? :)

Поэкспериментируйте. Бывают ещё такие варианты, когда главное окно GUI в подокне графика, а диалоговые в главном. 

Больше интересует, зачем Attach? На сколько я понял, он повторяет действия CreateBitmapLabel

Есть же код метода CCanvas::Attach():

//+------------------------------------------------------------------+
//| Attach new object with bitmap resource                           |
//+------------------------------------------------------------------+
bool CCanvas::Attach(const long chart_id,const string objname,ENUM_COLOR_FORMAT clrfmt=COLOR_FORMAT_XRGB_NOALPHA)
  {
   if(OBJ_BITMAP_LABEL==ObjectGetInteger(chart_id,objname,OBJPROP_TYPE))
     {
      string rcname=ObjectGetString(chart_id,objname,OBJPROP_BMPFILE);
      rcname=StringSubstr(rcname,StringFind(rcname,"::"));
      if(ResourceReadImage(rcname,m_pixels,m_width,m_height))
        {
         m_chart_id=chart_id;
         m_objname=objname;
         m_rcname=rcname;
         m_format=clrfmt;
         m_objtype=OBJ_BITMAP_LABEL;
         //--- success
         return(true);
        }
     }
//--- failed
   return(false);
  }
 
Anatoli Kazharski:


Есть же код метода CCanvas::Attach():

Да, а выше CreateBitmapLabel. Я их смотрел. И на сколько я разобрался, CreateBitmapLabel создает пустой ресурс, а Attach читает ресурс (какой-либо) и пишет его в m_pixels. И как уже писал выше, создаем ресурс (CreateBitmapLabel) с именем name, потом читаем этот же ресурс (Attach)  и опять пишем прочитанное в тот же m_pixels

Или я что-то не так понимаю?

PS Экспериментально без Attach все работает :)

 
Oleksii Chepurnyi:

...

PS Экспериментально без Attach все работает :)

На самом деле? Значит снова произошли, какие-то изменения. Раньше точно, что-то не работало.

А после удаления GUI с графика объекты удаляются?

Причина обращения: