Fazendo um projeto de crowdsourced em Tela - página 22

 
Nikolai Semko:
Quase terminou o exemplo da classe GButton, mas tem que fugir. Terminarei amanhã e o apresentarei.
Ótimo. Muito interessante. )
 
Реter Konow:
Ótimo. Muito interessante. )


Isto é o que você recebe.


O botão pode ser exibido no fundo ou em primeiro plano, com ou sem uma função de travamento.

No arquivo de exemplo CanvasButton.mq5 é possível arrastar o botão com o mouse. Para fazer isso, basta segurar Ctrl para mover o botão azul, e Shift para mover o botão vermelho.

Como a classe GButton é descendente da classe CCanvas, o exemplo demonstra a capacidade de usar as funções da classe CCanvas no exemplo CircleWu (Isto é implementado no OnInit). Assim, é possível escrever texto no botão usando as funções da classe CCanvas.

Esta classe, é claro, não finge estar limpa. Os gráficos não brilham com perfeição e o 3D é muito convencional; as sombras não são implementadas, a velocidade de execução não é otimizada. E o mais provável é que haja muitas arestas ásperas e falta de vários controles. Portanto, não julgue severamente.

Se você passar um pouco mais de tempo, é claro que isso pode ser feito:


Eu só estava tentando... poderia-se dizer - definir a direção.


O arquivo Canvas.mqh difere do original apenas no que diz respeito à matriz m_pixels definida como pública.

Arquivos anexados:
GButton.mqh  20 kb
Canvas.mqh  152 kb
 
Nikolai Semko:


Eis o que temos aqui.


O botão pode ser exibido em segundo plano ou em primeiro plano e pode ser clicado ou não bloqueado.

No arquivo de exemplo CanvasButton.mq5 é possível arrastar o botão com o mouse. Para fazer isso, basta pressionar Ctrl para mover o botão azul, e Shift para mover o botão vermelho.

Como a classe GButton é descendente da classe CCanvas, o exemplo demonstra a capacidade de usar as funções da classe CCanvas no exemplo CircleWu (Isto é implementado no OnInit). Assim, é possível escrever texto no botão usando as funções da classe CCanvas.

Esta classe, é claro, não finge estar limpa. Os gráficos não brilham com perfeição e o 3D é muito convencional; as sombras não são implementadas, a velocidade de execução não é otimizada. E o mais provável é que haja muitas arestas ásperas e falta de vários controles. Portanto, não julgue de forma muito dura.

Se você passar um pouco mais de tempo, é claro, você pode fazer isso:


Eu só estava tentando... poderia-se dizer - definir a direção.


O arquivo Canvas.mqh difere do original apenas no que diz respeito à matriz m_pixels definida como pública.

Nikolay, na minha opinião, acabou sendo muito bom. Começamos bem e podemos ir mais longe. Eu chamaria este tipo de botão de chave. Se você tiver 4 linhas de moldura claras: - superior, luz esquerda e direita, a inferior - escura para o estado pressionado e vice-versa, será ainda melhor (basta adicionar um fundo claro, caso contrário as linhas escuras em uma tabela de fundo preto não serão visíveis). E então você pode definir texto e imagem.

De qualquer forma, boa tentativa. )

 
Реter Konow:

. Se você dividir as 4 linhas claras da moldura ao longo das bordas: - superior, esquerda clara e direita, inferior escura para o estado prensado e vice-versa para o estado prensado, será ainda melhor (basta adicionar um fundo claro, caso contrário as linhas escuras não serão visíveis contra o gráfico preto).

Sim, é claro que você pode desenhar da maneira que quiser. Neste caso, eu não me propus a realizar uma obra-prima. Mas a primeira coisa que eu gostaria de melhorar, é gerar todas as matrizes de imagem de botões (duas matrizes neste caso) e depois copiá-las somente através do ArrayCopy, para que não tenhamos que criar uma imagem toda vez. Isto reduzirá muito o trabalho, mas ao custo de consumo adicional de RAM, mas como agora é comum nos computadores 16 GB de RAM, e se houver mesmo muitos botões, é improvável que o consumo adicional de memória exceda 1-2 MB, especialmente se os mesmos botões usarem as mesmas matrizes. Portanto, eu não acho que seja um problema. O principal é a velocidade.
 
Nikolai Semko:
Sim, é claro que você pode desenhar como quiser. Neste caso, eu não estabeleci um objetivo para alcançar uma obra-prima. Mas a primeira coisa que eu gostaria de melhorar, é gerar todas as matrizes de imagem de botões (duas matrizes neste caso) e depois copiá-las somente através do ArrayCopy, para que não tenhamos que criar uma imagem toda vez. Isto reduzirá muito o trabalho, mas ao custo de consumo adicional de RAM, mas como agora é comum nos computadores 16 GB de RAM, e se houver mesmo muitos botões, é improvável que o consumo adicional de memória exceda 1-2 MB, especialmente se os mesmos botões usarem as mesmas matrizes. Portanto, eu não acho que seja um problema. O principal é a velocidade.

Entendo. Quando fiz a pergunta sobre o botão, quis saber se era possível fazer isso com uma tela:


Pressionado:

Pressionado:

Neste exemplo, cada lado da moldura é composto por várias linhas. Há um total de 4 linhas gradientes em cada lado da estrutura. Cada linha tem uma tonalidade diferente que depende do estado do botão e da forma dada à moldura. Se o CCanvas tem a capacidade de definir a cor para linhas específicas de gradiente do quadro, então fazer o exemplo acima é fácil. Isso é exatamente o que eu queria descobrir.

 
Реter Konow:

Entendo. Quando fiz a pergunta sobre o botão, quis saber se era possível fazer isso com uma tela:


Pressionado:

Pressionado:

Neste exemplo, cada lado da moldura é composto por várias linhas. Há um total de 4 linhas de gradiente em cada lado da estrutura. Cada linha tem uma tonalidade diferente, que depende do estado do botão e da forma dada à moldura. Se o CCanvas tem a capacidade de definir a cor para linhas específicas de gradiente do quadro, então fazer o exemplo acima é fácil. Isso é exatamente o que eu queria descobrir.

Eu não o entendo, Peter. Você está falando de carne e eu estou falando do esqueleto. Se você tivesse ossos, você poderia cultivar carne. O meu exemplo não tem os estados pressionados, pressionados? Você já olhou dentro da classe GButton? Peter, meu conselho: deixe tudo e estude urgentemente o OOP. Você acaba de atingir um teto em seu projeto, que é chamado de código inchado. É facilmente superado pelo OOP.
E com CCanvas você pode fazer tudo, até mesmo escrever Windows dentro da janela MT5, em modo de emulação visual completa, é claro :), porque não há acesso ao hardware

 
Nikolai Semko:
Eu não o entendo, Peter. Você está falando de carne e eu estou falando de esqueleto. Se você tivesse ossos, você poderia acumular carne. O meu exemplo não tem os estados pressionados, pressionados? Você já olhou dentro da classe GButton? Peter, meu conselho: deixe tudo e estude urgentemente o OOP. Você acaba de atingir um teto em seu projeto, que é chamado de código inchado, ele é facilmente superado com a ajuda do OOP.
E com Canvas você pode fazer tudo, até mesmo Windows pode ser escrito dentro da janela MT5.

))) Então por que eu comecei este tópico? ) Estarei estudando o OOP agora.

Seu exemplo tem botões, eventos de clique e estados desses botões. Tudo está bem. Mas Nikolai, eu ainda não entendo o que estava perguntando - existe uma opção na classe CCcanvas para definir uma cor específica para as linhas de gradiente da moldura? Olhando para o seu exemplo, você pode pensar que há... Em caso afirmativo, você pode desenhar algo semelhante ao meu exemplo? Estou interessado na facilidade e possibilidades de desenhar como tal usando a funcionalidade desta classe, e você está falando de velocidade e melhorias na funcionalidade da classe. Esse é um tópico ligeiramente diferente.

 
Реter Konow:

))) Então por que eu comecei este tópico? ) Vou estudar agora o OOP.

É melhor começar a aprender OOP com algo mais fácil, não com Tela.
 
Vasiliy Sokolov:
É melhor começar a aprender OOP com algo mais simples do que Tela.
Você está certo. Talvez seja melhor eu começar com um livro didático. Realmente, o OOP é uma coisa complicada. É confuso...
 
Nikolai Semko:
Você já olhou dentro da classe GButton?


Eu olhei dentro da classe. Parece legal, mas eu não entendo todo o mecanismo da classe CCanvas. Foi por isso que não vi a resposta à minha pergunta.