Discussão do artigo "Interfaces Gráficas XI: Controles renderizados (build 14.2)" - página 2

 
Artyom Trishkin:

E outra pergunta ao mesmo tempo: ao desenhar um rótulo de texto (CTextLabel) no plano de fundo de uma janela que tem alguma transparência, os rótulos são desenhados em seu plano de fundo opaco, que não reage ao método Alpha() e não parece bom... É possível fazer com que o plano de fundo dos rótulos também tenha transparência?

Do artigo:

"A transparência nesta versão se aplica somente ao preenchimento e ao quadro do plano de fundo. O texto e as imagens permanecerão completamente opacos e nítidos em qualquer valor de canal alfa definido."

 
Artyom Trishkin:

Hi. Tol, não encontrei nada nos exemplos sobre como posso desenhar uma linha divisória na janela agora.

O que significa índice?

Que parâmetro de índice, índice de quê, deve ser passado para lá?

E outra pergunta ao mesmo tempo: ao desenhar um rótulo de texto (CTextLabel) no plano de fundo de uma janela que tem alguma transparência, os rótulos são desenhados em seu plano de fundo opaco, que não responde ao método Alpha() e não parece bom .... É possível fazer com que o plano de fundo dos rótulos também tenha transparência?


O parâmetro com o índice não deveria estar lá. Esqueci de removê-lo. Agora você pode passar qualquer valor para lá. Removerei esse parâmetro em uma das próximas atualizações.

Exemplo:

//+------------------------------------------------------------------+
//| Cria uma linha divisória|
//+------------------------------------------------------------------+
bool CProgram::CreateSepLine1(const int x_gap,const int y_gap)
  {
//--- Salvar o ponteiro da janela
   m_sep_line1.MainPointer(m_window);
//--- Dimensões
   int x_size=2;
   int y_size=72;
//--- Propriedades
   m_sep_line1.DarkColor(C'150,150,150');
   m_sep_line1.LightColor(clrWhite);
   m_sep_line1.TypeSepLine(V_SEP_LINE);
//--- Criando um elemento
   if(!m_sep_line1.CreateSeparateLine(0,x_gap,y_gap,x_size,y_size))
      return(false);
//--- Adicione um ponteiro ao elemento na base
   CWndContainer::AddToElementsArray(0,m_sep_line1);
   return(true);
  }

//---

Artyom Trishkin:

...

E outra pergunta ao mesmo tempo: ao desenhar um rótulo de texto (CTextLabel) no plano de fundo de uma janela que tenha alguma transparência, os rótulos são desenhados em seu próprio plano de fundo opaco, que não reage ao método Alpha(), e isso não parece bom .... É possível fazer com que o plano de fundo dos rótulos também tenha transparência?

Agora a transparência de cada elemento pode ser definida manualmente. No exemplo abaixo, o plano de fundo da janela é definido como canal alfa 200. O plano de fundo do rótulo de texto está definido como 0.

//---

Exemplo:

//+------------------------------------------------------------------+
//|| Cria um rótulo de texto 1|
//+------------------------------------------------------------------+
#resource "\\Images\\EasyAndFastGUI\\Icons\\bmp16\\line_chart.bmp"
//---
bool CProgram::CreateTextLabel(const int x_gap,const int y_gap,string text)
  {
//--- Salvar o ponteiro para o elemento principal
   m_text_label.MainPointer(m_window);
//--- Propriedades
   m_text_label.Alpha(0);
   m_text_label.XSize(190);
   m_text_label.YSize(20);
   m_text_label.LabelXGap(21);
   m_text_label.LabelYGap(3);
   m_text_label.IconFile("Images\\EasyAndFastGUI\\Icons\\bmp16\\line_chart.bmp");
//--- Criando um elemento
   if(!m_text_label.CreateTextLabel(text,x_gap,y_gap))
      return(false);
//--- Adicione um ponteiro ao elemento na base
   CWndContainer::AddToElementsArray(0,m_text_label);
   return(true);
  }
 
Oleksii Chepurnyi:

Do artigo:

"A transparência nesta versão se aplica somente ao preenchimento e à borda do plano de fundo. O texto e as imagens permanecerão completamente opacos e nítidos em qualquer configuração de canal alfa."

Essa é a regra para todos os itens da biblioteca. Ou seja, o canal alfa pode ser definido para cada item separadamente.
 
Anatoli Kazharski:
Essa é a regra para todos os itens da biblioteca. Ou seja, o canal alfa pode ser definido para cada item separadamente.

Obrigado pelo esclarecimento. Mais uma pergunta:

Em que sistema de coordenadas as coordenadas dos objetos são retornadas?

Por exemplo, se eu pegar a coordenada da borda direita do botão m_button_text.X2(), então a coordenada do botão é retornada em qual sistema de coordenadas? A janela do formulário ou a janela do gráfico?

Este é o meu ponto: estou criando objetos em uma janela de formulário. Se os botões forem consecutivos um após o outro, considero a coordenada X() do segundo botão como a coordenada X2()+2 do primeiro botão. A coordenada X() do terceiro botão é a coordenada X2()+2 do segundo botão, e assim por diante... .

Tudo está bem, desde que o painel esteja na coordenada 0 do gráfico de símbolos. Se você o mover para a direita e mudar o TF, os botões se moverão para a direita. E quanto mais a forma de janela estiver distante da borda esquerda do gráfico, mais os botões se afastarão uns dos outros.

Como faço para definir as coordenadas de cada botão de modo que eles não se movam pela tela ao mover a janela do formulário para um novo local e depois mudar o TF?

 
Artyom Trishkin:

Obrigado pelo esclarecimento. Mais uma pergunta:

...

As coordenadas absolutas são retornadas. Preciso convertê-las em coordenadas relativas. Relativas ao elemento ao qual o elemento a ser criado está anexado.

Se o elemento principal for um formulário, então:

...
   int x=(m_button1.X2()+5)-m_window.X();
   if(!CreateButton2(x,50,"Button 2"))
      return(false);
...

//---


 
Anatoli Kazharski:

São retornadas coordenadas absolutas. Elas devem ser convertidas em coordenadas relativas. Relativas ao elemento ao qual o elemento a ser criado está anexado.

Se o elemento principal for um formulário, então:

//---


Obrigado. Estranho, tentei fazer dessa forma - os botões foram para a borda esquerda da janela do gráfico ao alterar o tf. Vou tentar novamente com mais cuidado.
 
Anatoli Kazharski:

São retornadas coordenadas absolutas. Elas devem ser convertidas em coordenadas relativas. Relativas ao elemento ao qual o elemento a ser criado está anexado.

Se o elemento principal for um formulário, então:

//---


Estranho. Quando eu passo a coordenada calculada por esse método para o método de construção de objeto, tudo fica bem....

int x=(m_button1.X2()+5)-m_window.X();

Mas se eu passar apenas a coordenada calculada para o método:

int x=m_button1.X2()+5;

... e, em seguida, no método, subtrair imediatamente o valor de m_window.X() da coordenada passada, tudo fica flutuante.... Mas que diferença faz onde subtrair? Imediatamente ou já no método de compilação....

Talvez eu tenha comido alguma coisa, mas não consigo entender por que é assim?

 

Se você escrever uma linha em Program.mqh em TestLibrary14 - alteração da cor do título da janela:

//+------------------------------------------------------------------+
//|| Cria a GUI do programa
//+------------------------------------------------------------------+
bool CProgram::CreateGUI(void)
  {
//--- Criando um painel
   if(!CreateWindow("EXPERT PANEL"))
      return(false);
   m_window.CaptionColor(clrDimGray);
   

Então, minimizar a janela retorna a cor para o valor padrão. E as dicas de ferramentas, os botões minimizar/não modificar e fechar são repintados na cor do título da janela que foi definida programaticamente. E a cor desses botões muda para a cor padrão somente quando o cursor é passado sobre eles.

A propósito, é possível tornar o plano de fundo desses botões transparente? Por exemplo, o cabeçalho da janela é cinza, mas os botões são azuis....

 

Tol, em qual dos artigos desta série você pode ler sobre as CKeys?

Às vezes, ao inserir NÚMEROS no campo de entrada, os caracteres dessas teclas numéricas, que estão na tecla+Shift, são inseridos. Por exemplo, eu digito 2, mas @ é digitado em ....

Em algumas situações - não sei quais são (provavelmente depende do número e do tipo de controles na janela do formulário), pressionar a tecla Backspace faz com que os controles sejam excluídos da janela do formulário na ordem inversa de sua adição. Não entendo por que ele vê o pressionamento de Backspace não como um caractere de controle para o campo de entrada quando o cursor está nele, mas como um comando para excluir os controles na janela do formulário. Ou seja: eu inicio o programa e começo a pressionar Backspace - todos os controles são excluídos a cada pressionamento de Backspace, começando pelo último adicionado. Eventualmente, a janela do formulário já vazia também é excluída.

É possível desativar a reação ao Backspace enquanto o cursor não estiver no campo de entrada?

 
Artyom Trishkin:

...

A propósito, é possível tornar o plano de fundo desses botões transparente? Por exemplo, o título da janela é cinza, mas os botões são azuis....

Use métodos para obter ponteiros de elementos compostos. A mesma regra se aplica a todos os elementos.