Обсуждение статьи "Графические интерфейсы XI: Нарисованные элементы управления (build 14.2)" - страница 2

 
Artyom Trishkin:

И ещё вопрос заодно: при рисовании текстовой метки (CTextLabel) на фоне окна, имеющего некую прозрачность, метки рисуются на своём непрозрачном фоне, который не реагирует на метод Alpha(), и выглядит это не ахти ... Есть возможность сделать фон меток так же с прозрачностью?

Из статьи:

"Прозрачность в этой версии применяется только к заливке фона и рамке. Текст и изображения будут оставаться полностью непрозрачными и чёткими при любом установленном значении альфа-канала."

 
Artyom Trishkin:

Привет. Толь, не нашёл что-то в примерах как теперь разделительную линию могу нарисовать в окне.

Что означает index?

Параметр какого индекса, индекса чего, туда передавать?

И ещё вопрос заодно: при рисовании текстовой метки (CTextLabel) на фоне окна, имеющего некую прозрачность, метки рисуются на своём непрозрачном фоне, который не реагирует на метод Alpha(), и выглядит это не ахти ... Есть возможность сделать фон меток так же с прозрачностью?


Параметра с индексом не должно было быть. Забыл убрать. Сейчас можно любое значение туда передавать. В одном из следующих обновлений уберу этот параметр.

Пример:

//+------------------------------------------------------------------+
//| Создаёт разделительную линию                                     |
//+------------------------------------------------------------------+
bool CProgram::CreateSepLine1(const int x_gap,const int y_gap)
  {
//--- Сохраним указатель на окно
   m_sep_line1.MainPointer(m_window);
//--- Размеры
   int x_size=2;
   int y_size=72;
//--- Свойства
   m_sep_line1.DarkColor(C'150,150,150');
   m_sep_line1.LightColor(clrWhite);
   m_sep_line1.TypeSepLine(V_SEP_LINE);
//--- Создание элемента
   if(!m_sep_line1.CreateSeparateLine(0,x_gap,y_gap,x_size,y_size))
      return(false);
//--- Добавим указатель на элемент в базу
   CWndContainer::AddToElementsArray(0,m_sep_line1);
   return(true);
  }

//---

Artyom Trishkin:

...

И ещё вопрос заодно: при рисовании текстовой метки (CTextLabel) на фоне окна, имеющего некую прозрачность, метки рисуются на своём непрозрачном фоне, который не реагирует на метод Alpha(), и выглядит это не ахти ... Есть возможность сделать фон меток так же с прозрачностью?

Сейчас прозрачность каждого элемента можно настраивать вручную. На примере ниже фону окна установлено значения альфа-канала 200. Фону текстовой метки - 0.

//---

Пример:

//+------------------------------------------------------------------+
//| Создаёт текстовую метку 1                                        |
//+------------------------------------------------------------------+
#resource "\\Images\\EasyAndFastGUI\\Icons\\bmp16\\line_chart.bmp"
//---
bool CProgram::CreateTextLabel(const int x_gap,const int y_gap,string text)
  {
//--- Сохраним указатель на главный элемент
   m_text_label.MainPointer(m_window);
//--- Свойства
   m_text_label.Alpha(0);
   m_text_label.XSize(190);
   m_text_label.YSize(20);
   m_text_label.LabelXGap(21);
   m_text_label.LabelYGap(3);
   m_text_label.IconFile("Images\\EasyAndFastGUI\\Icons\\bmp16\\line_chart.bmp");
//--- Создание элемента
   if(!m_text_label.CreateTextLabel(text,x_gap,y_gap))
      return(false);
//--- Добавим указатель на элемент в базу
   CWndContainer::AddToElementsArray(0,m_text_label);
   return(true);
  }
 
Oleksii Chepurnyi:

Из статьи:

"Прозрачность в этой версии применяется только к заливке фона и рамке. Текст и изображения будут оставаться полностью непрозрачными и чёткими при любом установленном значении альфа-канала."

Это правило для всех элементов библиотеки. То есть альфа-канал можно настроить для каждого элемента отдельно.
 
Anatoli Kazharski:
Это правило для всех элементов библиотеки. То есть альфа-канал можно настроить для каждого элемента отдельно.

Спасибо за пояснения. Ещё вопрос:

В какой системе координат возвращаются координаты объектов?

Допустим, если беру координату правого края кнопки m_button_text.X2(), то возвращается координата кнопки в какой системе координат? Окна-формы, или окна графика?

Я к чему: строю объекты в окне-форме. Если кнопки идут подряд одна за другой, то я беру за координату Х() второй кнопки координату Х2()+2 первой кнопки. Координата Х() третьей кнопки - это координата Х2()+2 второй, и т.д. ...

Всё хорошо пока панель находится на координате 0 графика символа. Стоит её сместить правее и переключить ТФ, как кнопки уходят правее. И чем дальше окно-форма от левого края графика, тем сильнее разъезжаются кнопки - дальше друг от друга.

Как теперь нужно задавать координаты каждой кнопки так, чтобы они на гуляли по экрану при перемещении окна-формы на новое место и последующем переключении ТФ?

 
Artyom Trishkin:

Спасибо за пояснения. Ещё вопрос:

...

Возвращаются абсолютные координаты. Их нужно преобразовать в относительные. Относительно элемента, к которому присоединяется создаваемый элемент.

Если главным элементом является форма, то:

...
   int x=(m_button1.X2()+5)-m_window.X();
   if(!CreateButton2(x,50,"Button 2"))
      return(false);
...

//---


 
Anatoli Kazharski:

Возвращаются абсолютные координаты. Их нужно преобразовать в относительные. Относительно элемента, к которому присоединяется создаваемый элемент.

Если главным элементом является форма, то:

//---


Спасибо. Странно, пробовал так делать - кнопки уходили к левому краю окна чарта при смене тф. Попробую ещё раз внимательнее.
 
Anatoli Kazharski:

Возвращаются абсолютные координаты. Их нужно преобразовать в относительные. Относительно элемента, к которому присоединяется создаваемый элемент.

Если главным элементом является форма, то:

//---


Странно. Когда в метод построения объекта передаю координату, рассчитанную этим способом, то всё нормально...

int x=(m_button1.X2()+5)-m_window.X();

Но если в метод передать только рассчитанную координату:

int x=m_button1.X2()+5;

... а затем в методе сразу же отнять от переданной координаты значение m_window.X(), то всё плывёт... Хотя какая разница где отнять? Сразу, или уже в методе построения...

Мож я чего съел, но понять не могу что-то почему так?

 

Если в TestLibrary14 в Program.mqh вписать одну строчку - изменение цвета заголовка окна:

//+------------------------------------------------------------------+
//| Создаёт графический интерфейс программы                          |
//+------------------------------------------------------------------+
bool CProgram::CreateGUI(void)
  {
//--- Создание панели
   if(!CreateWindow("EXPERT PANEL"))
      return(false);
   m_window.CaptionColor(clrDimGray);
   

То сворачивание окна возвращает цвет к значению по умолчанию. А кнопки подсказок, сворачивания/разворачивания и закрытия окна перекрашиваются в цвет заголовка окна, который был программно установлен. А затем цвет этих кнопок изменяется на цвет по-умолчанию только при наведении курсора.

Кстати - а возможно ли фон этих кнопок сделать прозрачным? А то заголовок окна, например, серый, а кнопки синие...

 

Толь, в какой из статей этого цикла можно почитать о CKeys ?

Иногда при вводе ЧИСЕЛ в поле ввода, вводятся символы этих числовых клавиш, которые на клавише+Shift. Т.е., ввожу 2, а вводится @ ...

В некоторых ситуациях - не понял в каких (наверное зависит от количества и типа управляющих элементов на окне-форме), нажатие клавиши Backspace приводит к удалению управляющих элементов с окна-формы в обратном порядке их добавления. Не пойму почему он видит нажатие Backspace не как управляющий символ для поля ввода когда курсор в нём, а как команду на удаление управляющих элементов, находящихся на окне-форме. Т.е,: запускаю программу и начинаю нажимать Backspace- все управляющие элементы с каждым нажатием Backspace удаляются, начиная с последнего добавленного. В конечном итоге удаляется и уже ставшее пустым окно-форма.

ЗЫ. Возможно ли отключить реакцию на Backspace пока курсор не находится в поле ввода?

 
Artyom Trishkin:

...

Кстати - а возможно ли фон этих кнопок сделать прозрачным? А то заголовок окна, например, серый, а кнопки синие...

Воспользоваться методами для получения указателей составных элементов. Это же правило распространяется на все элементы.

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