Librerías: Easy Canvas - página 14

 
Mighty7:

Tengo que dar las gracias. Ahora está perfecto. El mejor trabajo.

¿Puedes responder a una última pregunta? ¿Qué es más rápido, cambiar a la izquierda/derecha o cambiar arriba/abajo? Gracias de nuevo.

 
Mighty7:

¿Puede responder a una última pregunta? ¿Qué es más rápido, cambiar a la izquierda/derecha o cambiar arriba/abajo? Gracias de nuevo.

El cambio arriba/abajo es ligeramente más rápido que el cambio izquierda/derecha. El desplazamiento completo tarda unos 0,3 milisegundos (1/3000 de segundo) en un ordenador medio con una ventana de pantalla FullHD estándar.

El desplazamiento arriba y abajo es ligeramente más rápido que el desplazamiento izquierda y derecha. El desplazamiento completo tarda unos 0,3 milisegundos (1/3000 de segundo) en un ordenador medio de una ventana FullHD estándar.

 
Nikolai Semko:

El desplazamiento hacia abajo y hacia arriba es ligeramente más rápido que hacia la izquierda y hacia la derecha. El desplazamiento completo tarda unos 0,3 milisegundos (1/3000 de segundo) en un ordenador medio de una ventana de pantalla FullHD estándar.

El desplazamiento hacia arriba y hacia abajo es ligeramente más rápido que hacia la izquierda y hacia la derecha. El desplazamiento completo tarda unos 0,3 milisegundos (1/3000 de segundo) en un ordenador medio de una ventana estándar FullHD.

Gracias.

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

Aquí me ha salido división por 0 unas cuantas veces, pero después de reiniciar el terminal no se reproduce )

 
Oleksii Chepurnyi:

Aquí me ha salido división por 0 unas cuantas veces, pero después de reiniciar el terminal no se reproduce )

extraño, nunca he tenido esto suceda.
bien entonces reemplazarlo así por ahora:

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

No, es mejor así:

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);
  }
Lamentablemente no puedo actualizar la versión en QB. Algo está roto una vez más.
Archivos adjuntos:
iCanvas.mqh  52 kb
 

Sería interesante ver una solución universal con monitores 4k y 8k.

Por ejemplo, dibujamos un rectángulo, en él dos botones y dos campos de entrada. Botones respectivamente objetos en píxeles.

Si en píxeles, entonces todo se reducirá en 2 veces en la resolución 4k, a excepción de los campos de entrada.

Pero si se traduce automáticamente todo el lienzo x2, a continuación, en cualquier resolución de pantalla todo se verá como en un monitor normal.

Otro problema puede ser que algunos usuarios van a la configuración de Windows y agrandan la fuente (lo que agranda el campo de entrada estándar).

Por lo tanto, hay una solución aún más universal para cambiar la pixelización de la hoja de lienzo con un multiplicador en función del tamaño de la fuente.


La condición principal es dibujar como en un monitor Full HD normal con las dimensiones de píxel habituales. Se busca una solución

1. cambiar la escala de la hoja estrictamente x2 (a 4k), x4 (a 8k)

2. escalar la hoja con un multiplicador dinámico ligado al tamaño de la fuente.


Para qué. Para cuadros de mando, paneles comerciales y otras cosas que se dibujan con objetos en píxeles.

 
Vitaliy Kuznetsov:

Sería interesante ver una solución universal con monitores 4k y 8k.

Por ejemplo, dibujamos un rectángulo, en él dos botones y dos campos de entrada. Los botones respectivamente objetos en píxeles.

Si están en píxeles, entonces todo se reducirá en 2 veces en la resolución 4k, excepto los campos de entrada.

Pero si se traduce automáticamente todo el lienzo x2, a continuación, en cualquier resolución de pantalla todo se verá como en un monitor normal.

También puede ser un problema que algunos usuarios van a la configuración de Windows y aumentar la fuente (que aumenta el campo de entrada estándar).

Por lo tanto, hay una solución aún más universal para cambiar la pixelización de la hoja de lienzo con un multiplicador dependiente del tamaño de la fuente.


La condición principal es dibujar como en un monitor Full HD normal con las dimensiones de píxel habituales. Se está buscando una solución:

1. cambiar la escala de la hoja estrictamente x2 (a 4k), x4 (a 8k)

2. escalar la hoja con un multiplicador dinámico vinculado al tamaño de la fuente


Para qué. Para cuadros de mando, paneles de operaciones y otras cosas que se dibujan con objetos en píxeles.

La clave de la solución es TERMINAL_SCREEN_DPI.
Aquí no hay ninguna complejidad. Lo tengo todo implementado desde hace tiempo.
No hay tiempo para demos.
Si tienes dificultades para entender el proceso, busca en google cómo se implementa en JS.
 
Nikolai Semko:
La clave de la solución es TERMINAL_SCREEN_DPI.
Aquí no hay ninguna complejidad. He implementado todo durante mucho tiempo .
No hay tiempo para ejemplos de demostración.
Si tiene dificultades para entender el proceso, google cómo se implementa en JS.

Sí, lo encontré en una búsqueda posterior. Gracias. Hay un ejemplo aquí - https://www.mql5.com/es/docs/constants/environment_state/terminalstatus

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

Hola, muy interesante. ¿Se podría convertir un lienzo en un objeto? Me refiero, por ejemplo, a un rectángulo de lienzo convertido en un rectángulo de objeto estándar para administrarlo.

 
Facundo Laje # :

Hola, muy interesante. ¿Se podría convertir un lienzo en un objeto? Me refiero, por ejemplo, a un rectángulo de lienzo convertido en un rectángulo de objeto estándar para administrarlo.

Si literalmente en un objeto rectangular, entonces no.
El lienzo es también un objeto.
Solo puede "transformar" un objeto de lienzo en un objeto de rectángulo mediante programación para que su contenido se mueva y se escale.
Visualmente, puede verse exactamente como un objeto rectangular con pequeños cuadrados en las esquinas para controlarlo. Pero solo unos pocos programadores en esta comunidad podrán implementar esto, incluyéndome a mí.

Si estamos hablando de la transformación de los contenidos internos del rectángulo. Si estamos hablando de un simple rectángulo lleno o vacío, cualquier programador puede hacerlo.