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

 

A compilação do ExampleEAF.mq5 resolveu o problema.

Eu estava supondo que teria de compilar uma biblioteca quando quisesse criar coisas próprias com ela.

No entanto, muito obrigado!

Ah, e eu estava me deparando com essa linha de código na parte superior da maioria dos arquivos de biblioteca:

class CWindow;

A criação de uma "classe falsa" é um truque para evitar o pesadelo do #include? Como o compilador pode, posteriormente, vincular a classe correta que realmente está sendo usada?

 

Primeiro, eu gostaria de finalizar o que temos... Afinal de contas, ainda há muitas deficiências.

Tenho algumas observações sobre a arquitetura. As propriedades especificadas do objeto e a imagem exibida têm vida própria, independentemente uma da outra. E uma chamada obrigatória para Update() é necessária, caso contrário, elas permanecerão em realidades paralelas. Acho que isso é errado, considerando que temos um modelo baseado em eventos.A atualização manual (redesenho) não deve ser um pré-requisito, pois só permite que você exiba as alterações imediatamente, mas todas as alterações devem ser exibidas de qualquer forma. Para isso, uma mensagem (evento) deve ser enviada para redesenhar esse objeto, que será processado posteriormente.

Ou seja, mais ou menos assim:

class CSomeControl
{
  int  m_property;
  bool m_changed;
  bool m_event_sent;
 public:
  void Property(int value)  { m_property= value;  m_changed=true;  if (!m_event_sent) m_event_sent= EventChartCustom(m_chart_id, ON_CHANGE, m_id, 0, 0); }  

  void Update()             { /*...Redesenhando...*/.  m_changed=false; }

  void OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {  
    if (id==CHARTEVENT_CUSTOM+ON_CHANGE) { m_event_sent=false;  if (m_changed) Update(); }
  }                       
};
 

Usando ChangeWindowWidth, altero a largura da janela de modo que ela fique fora do gráfico atual. Depois disso, quando tento mover essa janela, ela se fixa automaticamente na borda esquerda do gráfico. Como desativar isso? Não consigo encontrar um lugar no código.

 
Alexey Navoykov:

Usando ChangeWindowWidth, altero a largura da janela de modo que ela saia do gráfico atual. Depois disso, quando tento mover essa janela, ela se fixa automaticamente na borda esquerda do gráfico. Como desativar isso? Não consigo encontrar um lugar no código.

Você precisa reescrever o método CWindow::UpdateWindowXY(). Atualmente, ele está implementado de tal forma que as bordas da janela não podem sair do gráfico quando a janela é movida.

 

A propósito, sobre a alteração da largura da janela

   m_window1.ChangeWindowWidth(NEW_WIDTH);
   m_window1.Update(true);

No MT5 está tudo bem, mas no MT4 é assim

Depois de clicar no cabeçalho, os botões são movidos para o local correto. Você pode me dizer para que lado devo olhar? Onde está implementado o movimento desses botões?

 
Oleksii Chepurnyi:

A propósito, sobre a alteração da largura da janela

No MT5 está tudo bem, mas no MT4 é assim

Depois de clicar no cabeçalho, os botões são movidos para o local correto. Você pode me dizer para que lado devo olhar? Onde está implementado o movimento desses botões?

Dê uma olhada no método Moving().

Tente acessar os botões da janela por meio de ponteiros e chame esse método.

 
Alexey Navoykov:

Sim, você precisa de um aumento proporcional na largura de todas as colunas ou apenas da última coluna. É preferível a última opção.

Mas, na versão atual, é problemático implementar isso sozinho, porque não encontrei um método em sua classe para obter a largura atual da coluna, e todos os campos são privados. Em geral, pelo menos esse método deve ser adicionado.

É assim que você pode tentar implementar o que precisa agora:

//--- Eventos de redimensionamento da janela
   if(id==CHARTEVENT_CUSTOM+ON_WINDOW_CHANGE_YSIZE)
     {
      //--- Ajustar a largura da coluna da tabela de resumo
      if(m_table_symbols.RowsTotal()>(uint)m_table_symbols.VisibleRowsTotal())
        {
         int width[]={79};
         m_table_symbols.ColumnsWidth(width);
        }
      else
        {
         int width[]={95};
         m_table_symbols.ColumnsWidth(width);
        }
      //---
      m_table_symbols.Update(true);
      m_table_symbols.GetScrollVPointer().CurrentPos(0);
      m_table_symbols.GetScrollVPointer().Update(true);
      return;
     }
 
Anatoli Kazharski:

Observe o método Moving().

Tente acessar os botões da janela por meio de ponteiros e chame esse método.

Sim, é isso :) Obrigado!

Achei que já tinha examinado tudo e deixado passar o mais óbvio :)

 
Anatoli Kazharski:

É assim que você pode tentar perceber o que precisa agora:

É apenas uma largura de coluna fixa, mas estávamos falando sobre alterar dinamicamente a largura das colunas com base em sua largura anterior. No entanto, já completei a classe adicionando o método int ColumnWidth(int i)

 

Boa tarde.

O problema é maior :)

Criamos um objeto dinâmico, por exemplo, um rótulo

   labels[i] = new CTextLabel;
   labels[i].MainPointer(m_window1);
   labels[i].XSize(SYMBOLS_COL_WIDTH);
   labels[i].YSize(HEAD_HIGHT);
   labels[i].Alpha(SYMBOLS_HEAD_BACK_ALPHA);
   labels[i].FontSize(SYMBOLS_HEAD_FONT_SIZE);
   labels[i].TextAlign(SYMBOLS_HEAD_TEXT_ALIGN,HORIZONTAL_SPACE,0);
   labels[i].FontStyle(SYMBOLS_HEAD_FONT_STYLE);
   labels[i].BackColor(SYMBOLS_HEAD_BACK_COLOR);
   labels[i].CreateTextLabel("0",x_gap,ProfitHeadGap);
   CWndContainer::AddToElementsArray(0,labels[i]);
   labels[i].Update(true);

Mas como excluí-lo?

Eu o excluo dessa forma.

      labels[i].Delete();
      delete labels[i];

Mas depois de excluí-lo, ele trava e diz que o acesso ao ponteiro está incorreto.

Pelo que entendi, CWndContainer::AddToElementsArray adiciona o objeto às matrizes comuns, mas Delete() não o exclui de lá, e a janela tenta acessar o objeto. Não consigo encontrar nenhuma outra função semelhante a Delete().

Como excluir um objeto corretamente?