Bibliotecas: Easy Canvas - página 14

 
Mighty7:

Tenho que agradecer. Agora está perfeito. Melhor trabalho.

Você poderia responder a uma última pergunta? O que é mais rápido, deslocar para a esquerda/direita ou deslocar para cima/baixo? Mais uma vez, obrigado.

 
Mighty7:

Você pode responder a uma última pergunta? O que é mais rápido, deslocar para a esquerda/direita ou deslocar para cima/baixo? Mais uma vez, obrigado.

Deslocar para cima/para baixo é um pouco mais rápido do que deslocar para a esquerda/direita. O deslocamento completo leva cerca de 0,3 milissegundos (1/3000 de segundo) em um computador comum de uma janela de tela FullHD padrão.

O deslocamento para cima e para baixo é ligeiramente mais rápido do que para a esquerda e para a direita. O deslocamento completo leva cerca de 0,3 milissegundos (1/3000 de segundo) em um computador médio de uma janela FullHD padrão.

 
Nikolai Semko:

A mudança para baixo e para cima é um pouco mais rápida do que para a esquerda e para a direita. A mudança completa leva cerca de 0,3 milissegundos (1/3000 de segundo) em um computador médio de uma janela de tela FullHD padrão.

O deslocamento para cima e para baixo é um pouco mais rápido do que para a esquerda e para a direita. Toda a mudança leva cerca de 0,3 milissegundos (1/3000 de segundo) em um computador médio de uma janela FullHD padrão.

Obrigado.

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

Recebi a divisão por 0 algumas vezes aqui, mas depois de reiniciar o terminal, ela não se reproduziu)

 
Oleksii Chepurnyi:

Recebi a divisão por 0 algumas vezes aqui, mas depois de reiniciar o terminal, ela não se reproduziu)

estranho, isso nunca aconteceu comigo.
bem, então substitua-o assim por enquanto:

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

Não, é melhor assim:

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);
  }
Infelizmente, não consigo atualizar a versão no QB. Algo está quebrado mais uma vez.
Arquivos anexados:
iCanvas.mqh  52 kb
 

Seria interessante ver uma solução universal com monitores de 4k e 8k.

Por exemplo, desenhamos um retângulo, nele dois botões e dois campos de entrada. Os botões são objetos em pixels, respectivamente.

Se estiverem em pixels, tudo será reduzido em 2 vezes na resolução de 4k, exceto os campos de entrada.

Mas se você traduzir automaticamente toda a tela x2, em qualquer resolução de tela, tudo parecerá como em um monitor normal.

Outro problema pode ser o fato de alguns usuários acessarem as configurações do Windows e aumentarem a fonte (o que aumenta o campo de entrada padrão).

Portanto, há uma solução ainda mais universal para alterar a pixelização da folha de tela com um multiplicador, dependendo do tamanho da fonte.


A principal condição é desenhar como em um monitor full HD normal com as dimensões de pixel usuais. Procuramos uma solução:

1. alterar a escala da folha estritamente x2 (em 4k), x4 (em 8k)

2. dimensionar a planilha com um multiplicador dinâmico vinculado ao tamanho da fonte.


Para que serve. Para painéis de controle, painéis de negociação e outras coisas que são desenhadas por objetos em pixels.

 
Vitaliy Kuznetsov:

Seria interessante ver uma solução universal com monitores 4k e 8k.

Por exemplo, desenhamos um retângulo, nele dois botões e dois campos de entrada. Os botões são objetos em pixels, respectivamente.

Se eles estiverem em pixels, tudo será reduzido em 2 vezes na resolução de 4k, exceto os campos de entrada.

Mas se você traduzir automaticamente toda a tela x2, em qualquer resolução de tela, tudo parecerá como em um monitor normal.

Também pode ser um problema o fato de alguns usuários acessarem as configurações do Windows e aumentarem a fonte (o que aumenta o campo de entrada padrão).

Daí a solução ainda mais universal de alterar a pixelização da planilha do kanvas com um multiplicador que depende do tamanho da fonte.


A principal condição é desenhar como em um monitor full HD normal com as dimensões de pixel usuais. Uma solução está sendo buscada:

1. alterar a escala da folha estritamente x2 (em 4k), x4 (em 8k)

2. dimensionar a planilha com um multiplicador dinâmico vinculado ao tamanho da fonte


Para que serve. Para painéis de controle, painéis de negociação e outras coisas que são desenhadas por objetos em pixels.

A chave para a solução é TERMINAL_SCREEN_DPI.
Não há complexidade aqui. Já tenho tudo implementado há muito tempo.
Não há tempo para demonstrações.
Se você tiver dificuldades para entender o processo, pesquise no Google como ele é implementado em JS.
 
Nikolai Semko:
A chave para a solução é TERMINAL_SCREEN_DPI.
Não há complexidade aqui. Eu implementei tudo por um longo tempo .
Não há tempo para exemplos de demonstração.
Se você tiver dificuldades para entender o processo, pesquise no Google como ele é implementado em JS.

Sim, encontrei isso em uma pesquisa posterior. Obrigado. Há um exemplo aqui - https://www.mql5.com/pt/docs/constants/environment_state/terminalstatus

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

Olá, muito interessante, é possível converter uma tela em um objeto? Quero dizer, por exemplo, um retângulo de tela convertido em um retângulo de objeto padrão para gerenciá-lo.

 
Facundo Laje # :

Olá, muito interessante, é possível converter uma tela em um objeto? Quero dizer, por exemplo, um retângulo de tela convertido em um retângulo de objeto padrão para gerenciá-lo.

Se literalmente em um objeto retangular, então não.
A tela também é um objeto.
Você só pode "transformar" um objeto de tela em um objeto retangular programaticamente para que seu conteúdo se mova e seja dimensionado.
Visualmente, ele pode se parecer exatamente com um objeto retangular com pequenos quadrados nos cantos para controle. Mas somente alguns programadores desta comunidade poderão implementar isso, inclusive eu.

Se estivermos falando sobre a transformação do conteúdo interno do retângulo. Se estivermos falando de um simples retângulo preenchido ou vazio, qualquer programador pode fazer isso.