Teste CGraphic - perguntas e sugestões - página 5

 
o_O:

- É difícil com o zoomo. Como não há barras de rolagem. E para ser honesto, eu não gostaria que eles fossem implementados nesta classe. Neste momento, ele só usa CCanvas, e não pede outros objetos. E isto é muito bom.

Pretendo implementar o zoom independentemente por herança, colocar barras de rolagem e rescalque conforme necessário.

As barras de rolagem são más. Você pode girar um gráfico normal sem nenhuma barra - com mouse e teclado.
 
fxsaber:
As barras de rolagem são más. Você pode girar um gráfico normal sem nenhuma barra - com o mouse e o teclado.

não há eventos gráficos para rolagem. A MQL não os envia.

Mas você pode simplesmente arrastar com o mouse em vez de girar a roda.

 
o_O:

mas você pode simplesmente arrastar com o mouse em vez de girar a roda.

Sim, é assim que eu pergunto e faço zoom no ZoomPrice.
 

@Roman Konopelko


Que tal #36?


E encontrou outra divisão zero

 

Posso esclarecer (para reproduzir)

uma curva CurveAdd(arrY, CURVE_HISTOGRAM, "P/L") foi adicionada; ela tem um arrY de array de elementos de tamanho 1 ou 0.

e a julgar por este construtor de curvas m_xmax=m_xmin=0.

 
o_O:

@Roman Konopelko

Que tal #36?
E encontrou outra divisão zero

Implementado #36 e corrigido o erro de divisão zero.

A única coisa é que ValuesFunctionFormat não mudou para:

void              ValuesFunctionFormat(DoubleToStringFunction func, void* cbdata) { m_values_func=func; m_cbdata=cbdata; }

E métodos implementados para obter/fixar um ponteiro para uma função e um ponteiro para um objeto para ele separadamente:

   DoubleToStringFunction ValuesFunctionFormat(void)    const { return(m_values_func);    }
   void              ValuesFunctionFormat(DoubleToStringFunction func) { m_values_func=func; }
   void             *ValuesFunctionFormatCBData(void)   const { return(m_values_cbdata);  }
   void              ValuesFunctionFormatCBData(void *cbdata) { m_values_cbdata=cbdata;   }
Arquivos anexados:
Axis.mqh  12 kb
Curve.mqh  21 kb
Graphic.mqh  86 kb
 

Por favor, conserte o manuseio de cores em kanvas.

Agora ele não leva em conta o canal alfa. cor em vez de uint está em toda parte.

Devido a isso, ao desenhar sobre tela, há lacunas em toda parte (grades e quadros transparentes, porque em cores o canal alfa =0, ou seja, completamente transparente)

Somente em algumas funções você o fixa chamando constantemente o ColorToARGB

por exemplo

void CGraphic::CreateBackground(void)
  {
...
//--- create background
   m_canvas.FillRectangle(0,0,m_width,m_up-1,ColorToARGB(m_background.clr,255));
   m_canvas.FillRectangle(0,m_height-m_down+1,m_width,m_height,ColorToARGB(m_background.clr,255));
   m_canvas.FillRectangle(0,m_up,m_left-1,m_height-m_down,ColorToARGB(m_background.clr,255));
   m_canvas.FillRectangle(m_width-m_right+1,m_up,m_width,m_height-m_down,ColorToARGB(m_background.clr,255));


Mas por quê? se você quer fazer da cor um tipo uint e defini-la com canal alfa

Como aqui (e em outras funções de cor)

void CGraphic::SetDefaultParameters(void)
  {
...
//--- sets the default values for grid
   m_grid.clr_line=ColorToARGB(clrWhiteSmoke);
   m_grid.clr_axis_line=ColorToARGB(clrSilver);
   m_grid.clr_frame=ColorToARGB(clrBlack);
   m_grid.clr_background=ColorToARGB(clrWhite);

----

PS.

O fato de a tela em si ter COLOR_FORMAT_XRGB_NOALPHA não é importante neste caso.

 

decidiu verificar as correções na atualização do terminal 1502

onde são feitas todas as melhorias?

Sem valoresFunçãoFormato, sem correção de erros zerodevide

LOL

férias felizes )

 

instalado 1510.

ValoresFunçãoFormato está lá, está tudo bem.

--

@Roman Konopelko ver frase por favor.

Em código gráfico CGraphic são apenas algumas variáveis e funções. A substituição não é difícil.

Mas isso elimina o problema da transparência na renderização. Porque em canal alfa colorido =100% de transparência, o que é errado.

 
o_O:

@Roman Konopelko ver frase por favor.

Há apenas algumas variáveis e funções no código gráfico CG. A substituição não é difícil.

Mas isso elimina o problema da transparência na renderização. Na verdade, em canal alfa colorido = 100% de transparência, o que é errado.

Na classe CGraphic eu substituí o tipo de cor por uint em todos os lugares, como você sugeriu.

Também acrescentei novos métodos na classe CCanvas, que permitem desenhar primitivos com uma determinada espessura:
   void              LineThickVertical(const int x,const int y1,const int y2,const int size,const uint clr,const uint style,ENUM_LINE_END end_style);
   void              LineThickHorizontal(const int x1,const int x2,const int y,const int size,const uint clr,const uint style,ENUM_LINE_END end_style);
   void              LineThick(const int x1,const int y1,const int x2,const int y2,const int size,const uint clr,const uint style,ENUM_LINE_END end_style);
   void              PolylineThick(const int &x[],const int &y[],const int size,const uint clr,const uint style,ENUM_LINE_END end_style);
   void              PolygonThick(const int &x[],const int &y[],const int size,const uint clr,const uint style,ENUM_LINE_END end_style);
Em linha com a inovação do CCanvas, eu ampliei as propriedades do CCurve:
   ENUM_LINE_END     LinesEndStyle(void)                      const { return(m_lines_end_style); }
   int               LinesWidth(void)                         const { return(m_lines_width);     }
   void              LinesEndStyle(ENUM_LINE_END end_style)   { m_lines_end_style=end_style; }
   void              LinesWidth(const int width)              { m_lines_width=width;         }
Agora você pode especificar a espessura das linhas e o estilo de suas extremidades ao desenhar uma curva com linhas.

Exemplo:
#include <Graphics\Graphic.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   double x[] = { -100, -40, -10, 20, 30, 40, 50, 60, 70, 80, 120 };
   double y[] = { -5, 4, -10, 23, 17, 18, -9, 13, 17, 4, 9 };
   CGraphic graphic;
   graphic.Create(0,"G",0,30,30,780,380);
//--- plot curve
   CCurve *curve=graphic.CurveAdd(x,y,CURVE_LINES);
   curve.LinesSmooth(true);
   curve.LinesStyle(STYLE_DOT);
   curve.LinesEndStyle(LINE_END_ROUND);
   curve.LinesWidth(10);
   graphic.CurvePlotAll();
   graphic.Update();
  }
Resultado:


A implementação destes métodos é baseada no algoritmo Fast Prefiltered Lines, no qual o grau de lisura da linha é baseado no filtro selecionado. Se necessário, vou descrevê-lo com mais detalhes.
Arquivos anexados:
Canvas.mqh  144 kb
Axis.mqh  12 kb
Curve.mqh  22 kb
Graphic.mqh  86 kb