Bibliotecas: EasyAndFastGUI - biblioteca para criar interfaces gráficas do usuário - página 14

 

Olá.

//+------------------------------------------------------------------+
//| Criação de uma tela para desenhar um elemento
//+------------------------------------------------------------------+
bool CElement::CreateCanvas(const string name,const int x,const int y,
                            const int x_size,const int y_size,ENUM_COLOR_FORMAT clr_format=COLOR_FORMAT_ARGB_NORMALIZE)
  {
//--- Ajuste de tamanho
   int xsize =(x_size<1)? 50 : x_size;
   int ysize =(y_size<1)? 20 : y_size;
//--- Redefinir o último erro
   ::ResetLastError();
//--- Criando um objeto
   if(!m_canvas.CreateBitmapLabel(m_chart_id,m_subwin,name,x,y,xsize,ysize,clr_format))
     {
      ::Print(__FUNCTION__," > Falha ao criar uma tela para desenhar o item (""+m_class_name+"): ",::GetLastError());
      return(false);
     }
//--- Redefinir o último erro
   ::ResetLastError();
//--- Obter um ponteiro para a classe base
   if(!m_canvas.Attach(m_chart_id,name,clr_format))
     {
      ::Print(__FUNCTION__," > Falha ao anexar uma tela de desenho ao gráfico: ",::GetLastError());
      return(false);
     }
//--- Propriedades
   ::ObjectSetString(m_chart_id,m_canvas.ChartObjectName(),OBJPROP_TOOLTIP,"\n");
   ::ObjectSetInteger(m_chart_id,m_canvas.ChartObjectName(),OBJPROP_CORNER,m_corner);
   ::ObjectSetInteger(m_chart_id,m_canvas.ChartObjectName(),OBJPROP_SELECTABLE,false);
//--- Todos os elementos, exceto o formulário, têm uma prioridade mais alta do que o elemento principal
   Z_Order((dynamic_cast<CWindow*>(&this)!=NULL)? 0 : m_main.Z_Order()+1);
//--- Coordenadas
   m_canvas.X(x);
   m_canvas.Y(y);
//--- Dimensões
   m_canvas.XSize(x_size);
   m_canvas.YSize(y_size);
//--- Recuos a partir do ponto final
   m_canvas.XGap(CalculateXGap(x));
   m_canvas.YGap(CalculateYGap(y));
   return(true);
  }

CreateBitmapLabel - cria um recurso gráfico

Attach - lê o mesmo recurso e grava no mesmo recurso novamente.

Ou estou entendendo algo errado?

 

Olá novamente :)

class CMouse
  {

...............

   //--- (1) Retorna o número da janela onde o cursor está localizado, (2) o tempo correspondente à coordenada X, 
   // (3) nível (preço) correspondente à coordenada Y
   int               SubWindowNumber(void) const { return(m_subwin);                        }
   datetime          Time(void)            const { return(m_time);                          }
   double            Level(void)           const { return(m_level);                         }

O Time and Level é usado em algum lugar? Não consegui encontrá-lo em lugar algum...

Para que é usado o SubWindowNumber?

O que quero dizer é que ChartXYToTimePrice é uma operação bastante cara para ser executada a cada movimento do mouse...

 
Oleksii Chepurnyi:

Está tudo nos comentários. Não há nada a acrescentar.

 
Anatoli Kazharski:

Está tudo nos comentários. Não há nada a acrescentar.

Se você se refere aos comentários no código, tudo está claro lá, mas não é disso que se trata a pergunta :)

 
Oleksii Chepurnyi:

...

O que quero dizer é que ChartXYToTimePrice é uma operação bastante cara para ser executada a cada movimento do mouse...

Para obter a coordenada relativa se a GUI não estiver na janela principal.

 
Anatoli Kazharski:

Para obter a coordenada relativa quando a GUI não estiver na janela principal.

Então, talvez seja possível calcular somente quando a GUI não estiver na janela principal? :)


Estou mais interessado em saber por que Attach? Pelo que entendi, ele repete as ações de CreateBitmapLabel

 
Oleksii Chepurnyi:
Então, talvez seja possível calcular apenas quando a GUI não estiver na janela principal? :)

Também há variantes quando a janela principal da GUI está na subjanela do gráfico e as caixas de diálogo estão na janela principal.

Estou mais interessado em saber por que o Attach? Pelo que entendi, ele repete as ações de CreateBitmapLabel

Há um código do método CCanvas::Attach():

//+------------------------------------------------------------------+
//| Anexar novo objeto com recurso de bitmap
//+------------------------------------------------------------------+
bool CCanvas::Attach(const long chart_id,const string objname,ENUM_COLOR_FORMAT clrfmt=COLOR_FORMAT_XRGB_NOALPHA)
  {
   if(OBJ_BITMAP_LABEL==ObjectGetInteger(chart_id,objname,OBJPROP_TYPE))
     {
      string rcname=ObjectGetString(chart_id,objname,OBJPROP_BMPFILE);
      rcname=StringSubstr(rcname,StringFind(rcname,"::"));
      if(ResourceReadImage(rcname,m_pixels,m_width,m_height))
        {
         m_chart_id=chart_id;
         m_objname=objname;
         m_rcname=rcname;
         m_format=clrfmt;
         m_objtype=OBJ_BITMAP_LABEL;
         //--- sucesso
         return(true);
        }
     }
//--- falhou
   return(false);
  }
 
Anatoli Kazharski:


Aqui está o código do método CCanvas::Attach():

Sim, e acima de CreateBitmapLabel. Eu dei uma olhada neles. Pelo que entendi, CreateBitmapLabel cria um recurso vazio, e Attach lê o recurso (qualquer um) e o grava em m_pixels. E, como escrevi acima, criamos um recurso (CreateBitmapLabel) com o nome name, depois lemos o mesmo recurso (Attach) e novamente gravamos a leitura no mesmo m_pixels

Ou estou entendendo algo errado?

PS: Experimentalmente, sem o Attach, tudo funciona :)

 
Oleksii Chepurnyi:

...

PS: Experimentalmente, sem o Attach, tudo funciona :)

Sério? Então houve algumas mudanças novamente. Algo não funcionava antes, com certeza.

E depois de excluir a GUI do gráfico, os objetos são excluídos?

 
Anatoli Kazharski:

É mesmo? Então houve outra mudança. Algo definitivamente não estava funcionando antes.

E depois de remover a GUI do gráfico, os objetos são excluídos?

Tudo parece estar limpo :)

Arquivos anexados:
35.png  11 kb
36.png  6 kb