Библиотеки: Easy Canvas - страница 14

 
Mighty7:

I have to say thanks. Now it's perfect. Top work.

Can you please answer 1 last question? What is faster, shifting left/right or shifting up/down? Thanks again.

 
Mighty7:

Can you please answer 1 last question? What is faster, shifting left/right or shifting up/down? Thanks again.

Сдвиг вниз-вверх немного быстрее чем влево-вправо. Весь сдвиг занимает примерно 0.3 милисекунды (1/3000 секунды) на среднем компьютере стандартного окна FullHD экрана.

Shift up and down is slightly faster than left and right. The entire shift takes about 0.3 milliseconds (1/3000 of a second) on an average computer of a standard FullHD window.

 
Nikolai Semko:

Сдвиг вниз-вверх немного быстрее чем влево-вправо. Весь сдвиг занимает примерно 0.3 милисекунды (1/3000 секунды) на среднем компьютере стандартного окна FullHD экрана.

Shift up and down is slightly faster than left and right. The entire shift takes about 0.3 milliseconds (1/3000 of a second) on an average computer of a standard FullHD window.

Thank you.

 
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if (sparam=="0") W.MouseStatus=NO_PRESSED;
   else if (sparam=="1") W.MouseStatus=LEFT_BUTTON_PRESSED;
   else if (sparam=="2") W.MouseStatus=RIGHT_BUTTON_PRESSED;
   else if (sparam=="3") W.MouseStatus=LEFT_AND_RIGHT_BUTTONS_PRESSED;
   else W.MouseStatus=KEY_PRESSED;
   W.IdEvent=id;
   W.lparam=lparam;
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      W.MouseX=(int)lparam;
      W.MouseY=(int)dparam;
      W.MouseBar=(double)W.Left_bar+1-(double)W.MouseX/(double)W.dx_pix;
      W.MouseSubWin=XYToTimePrice(W.MouseX,W.MouseY,W.MouseTime,W.MousePrice,id);
      if(W.MouseSubWin>0) for(int i=0;i<W.MouseSubWin;i++) W.MouseY=W.MouseY-W.height[i]-2;
     }
   if(id==CHARTEVENT_CHART_CHANGE) ChartChanged();
   if(OnZ) SetOnChart(sizeArr);
   if(OnChart) MyChartEvent(id,lparam,dparam,sparam);
  }

Несколько раз получил тут деление на 0, но после перезапуска терминала не воспроизводится )

 
Oleksii Chepurnyi:

Несколько раз получил тут деление на 0, но после перезапуска терминала не воспроизводится )

странно, у меня такого не было.
ну тогда замените пока так:

void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if (W.dx_pix==0) return;
   if (sparam=="0") W.MouseStatus=NO_PRESSED;
   else if (sparam=="1") W.MouseStatus=LEFT_BUTTON_PRESSED;
   else if (sparam=="2") W.MouseStatus=RIGHT_BUTTON_PRESSED;
   else if (sparam=="3") W.MouseStatus=LEFT_AND_RIGHT_BUTTONS_PRESSED;
   else W.MouseStatus=KEY_PRESSED;
   W.IdEvent=id;
   W.lparam=lparam;
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      W.MouseX=(int)lparam;
      W.MouseY=(int)dparam;
      W.MouseBar=(double)W.Left_bar+1-(double)W.MouseX/W.dx_pix;
      W.MouseSubWin=XYToTimePrice(W.MouseX,W.MouseY,W.MouseTime,W.MousePrice,id);
      if(W.MouseSubWin>0) for(int i=0;i<W.MouseSubWin;i++) W.MouseY=W.MouseY-W.height[i]-2;
     }
   if(id==CHARTEVENT_CHART_CHANGE) ChartChanged();
   if(OnZ) SetOnChart(sizeArr);
   if(OnChart) MyChartEvent(id,lparam,dparam,sparam);
  }
//+------------------------------------------------------------------+

хотя нет, лучше так:

void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if (sparam=="0") W.MouseStatus=NO_PRESSED;
   else if (sparam=="1") W.MouseStatus=LEFT_BUTTON_PRESSED;
   else if (sparam=="2") W.MouseStatus=RIGHT_BUTTON_PRESSED;
   else if (sparam=="3") W.MouseStatus=LEFT_AND_RIGHT_BUTTONS_PRESSED;
   else W.MouseStatus=KEY_PRESSED;
   W.IdEvent=id;
   W.lparam=lparam;
   if(id==CHARTEVENT_CHART_CHANGE) ChartChanged();
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      W.MouseX=(int)lparam;
      W.MouseY=(int)dparam;
      W.MouseBar=(double)W.Left_bar+1-(double)W.MouseX/W.dx_pix;
      W.MouseSubWin=XYToTimePrice(W.MouseX,W.MouseY,W.MouseTime,W.MousePrice,id);
      if(W.MouseSubWin>0) for(int i=0;i<W.MouseSubWin;i++) W.MouseY=W.MouseY-W.height[i]-2;
     }
   if(OnZ) SetOnChart(sizeArr);
   if(OnChart) MyChartEvent(id,lparam,dparam,sparam);
  }
К сожалению не могу обновить версию в КБ. Что-то в очередной раз поломали.
Файлы:
iCanvas.mqh  52 kb
 

Было бы интересно увидеть универсальное решение с 4к и 8к мониторами.

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

Раз в пикселях, значит всё уменьшится в 2 раза на 4к разрешении, кроме полей ввода.

А вот если автоматически переводить всё полотно канваса x2, то при любом разрешении экрана всё будет выглядеть и как на обычном мониторе.

Ещё может быть проблема в том, что некоторые пользователи лезут в настройки виндоус и увеличивают шрифт (что увеличивает стандартное поле ввода).

Отсюда возникает ещё более универсальное решение изменять пикселизацию листа канваса со множителем, зависимым от размера шрифта.


Главное условие - рисование, как на обычном full HD мониторе с привычными размерами в пикселях. Ищется решение:

1. Изменение масштаба листа строго x2 (при 4к), x4 (при 8к)

2. Изменение масштаба листа с динамичным множителем, привязанным к размеру шрифта


Для чего? Для дэшбордов, торговых панелей и прочего, что рисуется объектами в пикселях.

 
Vitaliy Kuznetsov:

Было бы интересно увидеть универсальное решение с 4к и 8к мониторами.

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

Раз в пикселях, значит всё уменьшится в 2 раза на 4к разрешении, кроме полей ввода.

А вот если автоматически переводить всё полотно канваса x2, то при любом разрешении экрана всё будет выглядеть и как на обычном мониторе.

Ещё может быть проблема в том, что некоторые пользователи лезут в настройки виндоус и увеличивают шрифт (что увеличивает стандартное поле ввода).

Отсюда возникает ещё более универсальное решение изменять пикселизацию листа канваса со множителем, зависимым от размера шрифта.


Главное условие - рисование, как на обычном full HD мониторе с привычными размерами в пикселях. Ищется решение:

1. Изменение масштаба листа строго x2 (при 4к), x4 (при 8к)

2. Изменение масштаба листа с динамичным множителем, привязанным к размеру шрифта


Для чего? Для дэшбордов, торговых панелей и прочего, что рисуется объектами в пикселях.

Ключ к решению это TERMINAL_SCREEN_DPI.
Никакой сложности здесь нет. У меня давно все реализовано. 
Нет времени для демонстрационных примеров.
Если есть сложности с пониманием процесса, погуглите как это реализуется в JS.
 
Nikolai Semko:
Ключ к решению это TERMINAL_SCREEN_DPI.
Никакой сложности здесь нет. У меня давно все реализовано. 
Нет времени для демонстрационных примеров.
Если есть сложности с пониманием процесса, погуглите как это реализуется в JS.

Да, в поиске потом нашёл. Спасибо. Тут есть пример - https://www.mql5.com/ru/docs/constants/environment_state/terminalstatus

Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Состояние клиентского терминала
Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Состояние клиентского терминала
  • www.mql5.com
Состояние клиентского терминала - Состояние окружения - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Nikolai Semko #:
последняя версия 1.12

Здравствуйте, очень интересно, можно ли конвертировать холст в объект? То есть, например, прямоугольник холста преобразовать в стандартный прямоугольник объекта, чтобы управлять им.

 
Facundo Laje # :

Здравствуйте, очень интересно, возможно ли преобразовать холст в объект? Я имею в виду, например, прямоугольник холста преобразовать в стандартный прямоугольник объекта, чтобы управлять им.

Если буквально в прямоугольный объект, то нет.
Холст - это тоже объект.
Вы можете только программно "преобразовать" объект холста в прямоугольный объект, чтобы его содержимое перемещалось и масштабировалось.
Визуально он может выглядеть как прямоугольный объект с маленькими квадратиками по углам для управления им. Но реализовать это смогут лишь немногие программисты в этом сообществе, включая меня.

Если мы говорим о преобразовании внутреннего содержимого прямоугольника. Если мы говорим о простом заполненном или пустом прямоугольнике, то это может сделать любой программист.