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

 
Oleksii Chepurnyi:
Для начала спрошу, может я просто не нашел :) Есть ли выравнивание текста, в лейбле, например, кроме как по центру? И есть ли возможность задать стиль текста, жирный, курсив и тп?

Пока только так:

//--- Свойства шрифта
   m_canvas.FontSet(m_font,-m_font_size*10,FW_NORMAL);
//--- Нарисовать текст с учётом режима выравнивания по центру
   if(m_is_center_text)
     {
      x =m_x_size>>1;
      y =m_y_size>>1;
      m_canvas.TextOut(x,y,m_label_text,::ColorToARGB(clr),TA_CENTER|TA_VCENTER);
     }
   else
      m_canvas.TextOut(x,y,m_label_text,::ColorToARGB(clr),TA_LEFT);
 
Anatoli Kazharski:

Пока только так:

Тогда первое предложение.

Enums.mqh

//+------------------------------------------------------------------+
//| Выравнивание текста                                              |
//+------------------------------------------------------------------+
enum ENUM_TEXT_ALIGN
  {
   AT_LEFT_TOP,
   AT_CENTER_TOP,
   AT_RIGHT_TOP,
   AT_LEFT_CENTER,
   AT_CENTER_CENTER,
   AT_RIGHT_CENTER,
   AT_LEFT_BOTTOM,
   AT_CENTER_BOTTOM,
   AT_RIGHT_BOTTOM,
  };

Element.mqh

protected:
   ENUM_TEXT_ALIGN   m_text_align;
   int               m_hor_space;
   int               m_ver_space;
public:
   void              SetTextAlign(const ENUM_TEXT_ALIGN align, const int hspace, const int vspace) { m_text_align=align; m_hor_space=hspace; m_ver_space=vspace; }
   if(m_is_center_text)
     {
      x =m_x_size>>1;
      y =m_y_size>>1;
      m_canvas.TextOut(x,y,m_label_text,::ColorToARGB(clr),TA_CENTER|TA_VCENTER);
     }
   else
     {
      switch(m_text_align)
        {
         case 0: m_canvas.TextOut(x+m_hor_space,         y+m_ver_space,         m_label_text,::ColorToARGB(clr),TA_LEFT|TA_TOP);       break;  // AT_LEFT_TOP
         case 1: m_canvas.TextOut((int)round(m_x_size/2),y+m_ver_space,         m_label_text,::ColorToARGB(clr),TA_CENTER|TA_TOP);     break;  // AT_CENTER_TOP
         case 2: m_canvas.TextOut(m_x_size-m_hor_space,  y+m_ver_space,         m_label_text,::ColorToARGB(clr),TA_RIGHT|TA_TOP);      break;  // AT_RIGHT_TOP
         case 3: m_canvas.TextOut(x+m_hor_space,         (int)round(m_y_size/2),m_label_text,::ColorToARGB(clr),TA_LEFT|TA_VCENTER);   break;  // AT_LEFT_CENTER
         case 4: m_canvas.TextOut(m_x_size>>1,           m_y_size>>1,           m_label_text,::ColorToARGB(clr),TA_CENTER|TA_VCENTER); break;  // AT_CENTER_CENTER
         case 5: m_canvas.TextOut(m_x_size-m_hor_space,  (int)round(m_y_size/2),m_label_text,::ColorToARGB(clr),TA_RIGHT|TA_VCENTER);  break;  // AT_RIGHT_CENTER
         case 6: m_canvas.TextOut(x+m_hor_space,         m_y_size-m_ver_space,  m_label_text,::ColorToARGB(clr),TA_LEFT|TA_BOTTOM);    break;  // AT_LEFT_BOTTOM
         case 7: m_canvas.TextOut((int)round(m_x_size/2),m_y_size-m_ver_space,  m_label_text,::ColorToARGB(clr),TA_CENTER|TA_BOTTOM);  break;  // AT_CENTER_BOTTOM
         case 8: m_canvas.TextOut(m_x_size-m_hor_space,  m_y_size-m_ver_space,  m_label_text,::ColorToARGB(clr),TA_RIGHT|TA_BOTTOM);   break;  // AT_RIGHT_BOTTOM
         default: m_canvas.TextOut(x,y,m_label_text,::ColorToARGB(clr),TA_LEFT); break;
        }
     }

Стили еще не делал.

 
Oleksii Chepurnyi:

Тогда первое предложение.

тогда 2-е предложение: сделать GUI-редактор с ф-цией drag-and-drop  

 
Igor Makanu:

тогда 2-е предложение: сделать GUI-редактор с ф-цией drag-and-drop  

Хорошее предложение :)

Со стилем все проще.

protected:
   uint              m_font_style;
public:
   void              FontStyle(const int font_style)                 { m_font_style=font_style;         }

//--- Свойства шрифта
   m_canvas.FontSet(m_font,-m_font_size*10,m_font_style);
 
Oleksii Chepurnyi:

Тогда первое предложение.

Стили еще не делал.

Возможно, включу в ближайшее обновление.

Igor Makanu:

тогда 2-е предложение: сделать GUI-редактор с ф-цией drag-and-drop  

Не могу обещать. Попробую найти время для этого. 

 
Anatoli Kazharski:

Не могу обещать. Попробую найти время для этого. 

хм, думал откажете, а тут... круто!

 

Сначала бы довести до ума то что имеется... Ведь там ещё полно недоработок.

У меня вот есть замечания по архитектуре.  Задаваемые свойства объектов и отображаемая картинка живут своими жизнями, независимо друг от друга.  И требуется обязательный вызов Update(), иначе они так и останутся жить в параллельных реальностях.  Считаю, это неправильно, учитывая что у нас событийная модель.  Ручное обновление (перерисовка) не должно быть обязательным условием.  Оно лишь позволяет отобразить изменения немедленно, но все изменения в любом случае должны быть отображены.  Для этого должно отсылаться сообщение (событие) на перерисовку данного объекта, которое будет обработано позднее. 

Т.е. примерно так:

class CSomeControl
{
  int  m_property;
  bool m_changed;
  bool m_event_sent;
 public:
  void Property(int value)  { m_property= value;  m_changed=true;  if (!m_event_sent) m_event_sent= EventChartCustom(m_chart_id, ON_CHANGE, m_id, 0, 0); }  

  void Update()             { /*...Перерисовка...*/  m_changed=false; }

  void OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {  
    if (id==CHARTEVENT_CUSTOM+ON_CHANGE) { m_event_sent=false;  if (m_changed) Update(); }
  }                       
};
 

Анатолий, подскажите, пожалуйста.  С помощью ChangeWindowWidth меняю ширину окна таким образом, что оно выходит за пределы текущего чарта.  После этого при попытке передвинуть это окно, оно автоматически прилипает к левому краю чарта.  Как отключить это?  Не могу найти место в коде.

 
Alexey Navoykov:

Анатолий, подскажите, пожалуйста.  С помощью ChangeWindowWidth меняю ширину окна таким образом, что оно выходит за пределы текущего чарта.  После этого при попытке передвинуть это окно, оно автоматически прилипает к левому краю чарта.  Как отключить это?  Не могу найти место в коде.

Нужно переписывать метод CWindow::UpdateWindowXY(). Он сейчас реализован таким образом, что края окна не могут выйти за пределы графика при перемещении окна.

 

Кстати, по поводу изменения ширины окна

   m_window1.ChangeWindowWidth(NEW_WIDTH);
   m_window1.Update(true);

В МТ5 все нормально, а вот в МТ4 вот такое

После клика на заголовке кнопки перемещаются на положеное место. Не подскажите, в какую сторону смотреть? Где реализовано перемещение этих кнопок?

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