Discussão do artigo "Interfaces gráficas X: Seleção de texto na caixa de texto multilinha (build 13)" - página 13

 
Konstantin:

Sim, eu tentei, mas já estou com a cabeça quebrada, pois entendi que os métodos X(...) e Y(...) vinculam rigidamente os elementos às coordenadas X e Y e, ao receber eventos sobre a alteração do tamanho da janela do formulário principal, eles não reagem de forma alguma à localização das coordenadas X e Y.

Você pode mostrar uma analogia do que precisa no exemplo de algum aplicativo pronto do Windows? Não tenho certeza se entendi o que você precisa. Ou descreva isso graficamente de alguma forma.

Se entendi corretamente, o elemento_2 deve ser vinculado à borda inferior do formulário, e o elemento_1 deve ser redimensionado automaticamente na vertical com um recuo para a altura do elemento_2.

 
Anatoli Kazharski:

Você pode mostrar um análogo do que precisa no exemplo de algum aplicativo pronto do Windows? Porque não tenho certeza se entendi corretamente o que você precisa. Ou descrevê-lo graficamente de alguma forma.

Se entendi corretamente, o elemento_2 deve ser vinculado à borda inferior do formulário, e o elemento_1 deve ser redimensionado automaticamente na vertical com um recuo para a altura do elemento_2.


Você entendeu certo, ou seja, quando o tamanho da janela muda, o elemento_1 muda o tamanho em Y, e você precisa que o elemento_2 acompanhe essa redução, ou seja, o dimensionamento normal dos elementos dentro do formulário. Até o momento, construí uma muleta para que o elemento_1 não seja dimensionado )). Tratarei desse problema mais tarde.
 
A biblioteca não tem a configuração de prioridade de exibição, pois os ícones de ordens/posições abertas têm prioridade mais alta e, portanto, são colocados no topo de todos os elementos gráficos da biblioteca.
 
Konstantin:
a biblioteca carece de prioridades de exibição, pois os ícones de ordens/posições abertas têm prioridade mais alta e, portanto, são colocados no topo de todos os elementos gráficos da biblioteca.

Tente fazer o seguinte:

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Discussão do artigo "GUI X: Seleção de texto em um campo de entrada de várias linhas (compilação 13)".

Anatoli Kazharski, 2017.05.08 21:40

Na classe do aplicativo personalizado, você precisa criar um método CProgram::OnTradeEvent().

E no arquivo principal ele deve ser chamado na função OnTrade():

//+------------------------------------------------------------------+
//| Função comercial|
//+------------------------------------------------------------------+
void OnTrade(void)
  {
   program.OnTradeEvent();
  }

//---

Por exemplo, tenho este conteúdo do método CProgram::OnTradeEvent():

//+------------------------------------------------------------------+
//| Evento de transação comercial|
//+------------------------------------------------------------------+
void CProgram::OnTradeEvent(void)
  {
//--- Envio de um evento de negociação para todos os gráficos
   m_events.SendEventToAllCharts(0,ON_TRADE_EVENT,0,0.0,m_program_name);
//--- Definir as transações da última posição
   if(m_show_deals.CheckButtonState())
      if(m_vdeals.ShowDealsLastPosition())
         ResetWindow();
//--- Verificando a distância do stop loss
   if(m_trailing_stop.CheckButtonState())
      m_ctrade.CheckStopLossSize(::Symbol());
//--- Zeragem de variáveis para operações comerciais
   m_ctrade.ZeroCalcPositionVariables();
//--- Inicialização da matriz de saldo e atualização da série no gráfico
   InitBalanceArray();
   m_line_chart.SeriesUpdate(0,m_balance_data,"Balance",clrCornflowerBlue);
  }

 
Anatoli Kazharski:

Tente fazer assim:


Eu já vi isso, mas acho que você precisa complementar o uso no "núcleo" da biblioteca, ou seja, ao criar objetos gráficos:

bool  ObjectSetInteger( 
   long                             chart_id,      // identificador de gráfico 
   string                           name,          // nome 
   ENUM_OBJECT_PROPERTY_INTEGER     prop_id,       // propriedade 
   long                             prop_value     // valor 
   );

property:

OBJPROP_BACK

 
Konstantin:

Já vi isso, mas acho que no "núcleo" da biblioteca, ou seja, ao criar objetos gráficos, você precisa complementar o uso:

property:

OBJPROP_BACK

Assim, os gráficos ficarão sobre os objetos gráficos da interface.

//---

Faça ResetWindow() por enquanto. Tentarei incorporá-lo ao kernel mais tarde para que ele seja atualizado automaticamente.

 
Anatoli Kazharski:

Em seguida, os gráficos estarão sobre os objetos gráficos da interface.

//---

Faça ResetWindow() por enquanto. Tentarei incorporá-lo ao kernel mais tarde para que ele seja atualizado automaticamente.


Não é bem assim, você precisa colocar todos os objetos gráficos em primeiro plano e, em seguida, os gráficos ficarão atrás; implementei isso muitas vezes em minha biblioteca de gráficos ))
 
Konstantin:

não exatamente, você precisa priorizar todos os objetos gráficos em primeiro plano, então os gráficos ficarão para trás, já implementei isso muitas vezes em minha biblioteca gráfica))

Não sei o que você fez e como fez, mas, por padrão, eles estão em primeiro plano. Os criados mais recentemente estão no topo. A única maneira de alterar a prioridade após a criação é ocultar e mostrar os objetos novamente, exceto aqueles que deveriam estar na parte inferior.

 

No método da classe CTabs:

void CTabs::CalculatingPatch(int &x,int &y,int &x_size,int &y_size)
  {
   if(ArraySize(m_tabs) == 0)
      return;

   if(m_position_mode==TABS_TOP)
     {
      x      =m_tabs[m_selected_tab].X()+1;
      y      =m_tabs[m_selected_tab].Y2()-1;
      x_size =m_tabs[m_selected_tab].XSize()-2;
      y_size =1;
     }
   else if(m_position_mode==TABS_BOTTOM)
     {
      x      =m_tabs[m_selected_tab].X()+1;
      y      =m_tabs[m_selected_tab].Y();
      x_size =m_tabs[m_selected_tab].XSize()-2;
      y_size =1;
     }
   else if(m_position_mode==TABS_LEFT)
     {
      x      =m_tabs[m_selected_tab].X2()-1;
      y      =m_tabs[m_selected_tab].Y()+1;
      x_size =1;
      y_size =m_tabs[m_selected_tab].YSize()-2;
     }
   else if(m_position_mode==TABS_RIGHT)
     {
      x      =m_tabs[m_selected_tab].X();
      y      =m_tabs[m_selected_tab].Y()+1;
      x_size =1;
      y_size =m_tabs[m_selected_tab].YSize()-2;
     }
  }

deve ser adicionado um destaque, que é uma verificação de matriz nula, pois sem essa verificação, no caso de não haver guias, o formulário inteiro trava com um erro.

 
Konstantin:

No método da classe CTabs:

deve ser adicionado um destaque, que é uma verificação de matriz nula, porque sem essa verificação, em caso de ausência de guias, o formulário inteiro trava com um erro.

Não está claro como você criou um elemento do tipo CTabs se há uma verificação no método de criação de guias:

...
//--- Se não houver guias no grupo, informe isso
   if(TabsTotal()<1)
     {
      ::Print(__FUNCTION__," > Esse método deve ser chamado, "
              "quando houver pelo menos uma guia no grupo! Use o método CTabs::AddTab()");
      return(false);
     }
...