Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Para mim, é mais fácil criar uma equipe de desenvolvimento de produto, cujos membros, em um grau acordado, receberão um lucro com a venda do produto (talvez alguém seja o ideólogo do projeto, alguém financia por uma ação, alguém é o programador).
E como todos estão motivados financeiramente, implementar as bibliotecas necessárias para a interface também como parte do projeto.
Para mim, é mais fácil criar uma equipe de desenvolvimento de produto, cujos membros, até certo ponto, receberão um lucro com a venda do produto (talvez alguém seja o ideólogo do projeto, alguém financia por uma ação, alguém é o programador).
E como todos estão motivados financeiramente - para implementar dentro do projeto e as bibliotecas necessárias para a interface.
Eu li o fio e ainda não entendo por que é necessário desenhar um botão na Tela do zero. Você pode explicar sem emoções?
porque os desenvolvedores de MT não são onipotentes e é demorado aborrecê-los com pedidos mesquinhos
Por que isso pode vir a ser útil:
1. A interface no bitmap é rápida. Tão rápido que é quase indistinguível do sistema. Por exemplo, implementei elementos semi-transparentes com gradientes emesmo quando eles se movem são suavemente renderizados sem atrasos visíveis, levando em conta a mistura de cores e o cálculo do canal alfa em outros objetos com gradientes semi-transparentes.
2. A interface é escalável. Você pode tornar a aplicação mais complexa e não vai diminuir a velocidade devido à eliminação e criação de um grande número de objetos gráficos. Os custos de redesenho são mínimos, apenas um milésimo de segundo.
3. Controles prontos podem ser criados e novos controles podem ser criados, pois você pode fornecer seu próprio pool de eventos, por exemplo:
OnMouseDown - pressionado o LKM
OnMouseUp - pressionou o LKM
OnMouseHoverOn - passe o cursor do mouse sobre um objeto
OnMouseHoverOut - mover o cursor do mouse para longe do objeto
OnMouseClick - pressione e clique dentro dos limites do objeto
OnMouseDblClick - clique duplo do mouse dentro dos limites do objeto
OnDragStart - evento que ocorre uma vez no início do movimento com o botão esquerdo do mouse pressionado
OnDragMove - evento gerado durante o movimento com o botão esquerdo do mouse
OnDragEnd - evento gerado após mudança com LKM
OnPut - objeto é lançado para outro objeto
OnGet - objeto é jogado em outro objeto
OnFocus - objeto tem foco
OnBlur - objeto perde o foco
OnResize - o objeto mudou de tamanho
OnParentResize - o objeto pai mudou de tamanho
OnKeyPress - tecla pressionada
OnChange - valor de um campo alterado
etc.
Por que isso pode vir a ser útil:
1. A interface no bitmap é rápida. Tão rápido que é praticamente indistinguível da interface do sistema. Por exemplo, implementei elementos semi-transparentes com gradientes e,mesmo quando se movem, são suavemente renderizados sem qualquer atraso visível, levando em conta a mistura de cores e o cálculo do canal alfa em outros objetos com gradientes semi-transparentes.
2. A interface é escalável. Você pode tornar a aplicação mais complexa e não vai diminuir a velocidade devido à eliminação e criação de um grande número de objetos gráficos. Os custos de redesenho são mínimos, é apenas a substituição de um quadro em um milésimo de segundo.
3. Controles prontos podem ser criados e novos controles podem ser criados, pois você pode fornecer seu próprio pool de eventos, por exemplo:
OnMouseDown - pressionado o LKM
OnMouseUp - pressionou o LKM
OnMouseHoverOn - passe o cursor do mouse sobre um objeto
OnMouseHoverOut - mover o cursor do mouse para longe do objeto
OnMouseClick - pressione e clique dentro dos limites do objeto
OnMouseDblClick - clique duplo do mouse dentro dos limites do objeto
OnDragStart - evento que ocorre uma vez no início do movimento com o botão esquerdo do mouse pressionado
OnDragMove - evento gerado durante o movimento com o botão esquerdo do mouse
OnDragEnd - evento gerado após mudança com LKM
OnPut - objeto é lançado para outro objeto
OnGet - objeto é jogado em outro objeto
OnFocus - objeto tem foco
OnBlur - objeto perde o foco
OnResize - o objeto mudou de tamanho
OnParentResize - o objeto pai mudou de tamanho
OnKeyPress - uma tecla pressionada
OnChange - valor de um campo alterado
etc.
Exaustivo, obrigado!
@Igor Volodin, @Combinator, @Anatoli Kazharski
Vou começar com o assunto doloroso).
A questão que mais me preocupa é algum tipo de universalidade/abstração para armazenar parâmetros de renderização.
----
Como entendemos que todos os controles utilizam a fonte, a cor do fundo e a cor do texto igualmente, etc.
Quando todos estes parâmetros são os mesmos para todos os controles, então a interface tem uma aparência comum com um único conceito.
Mas como armazená-las? porque os controles nem sempre utilizam todos os parâmetros.
+ O sistema é complicado pelo fato de que os elementos têm estados diferentes que devem usar fontes e cores de fundo diferentes. Eles são Ativos, Desativados, Desativados, Over, ou Selecionados, etc.
+ há grupos de controladores - alívio (como Botão) e campos de entrada (como Editar, Listar), e quando é o fundo para torná-los
----
Na idéia de trabalho atual eu tenho um elemento de atributo mínimo da classe GAttribBase, que contém 5 parâmetros básicos (fonte/tamanho, cor do fundo/borda, tamanho da borda)
Estes elementos básicos são usados para formar uma matriz para os estados da classe GAttribut(Ativo/Disabvle/Over/Select, etc.).
E então o GAttribut é preenchido para os diferentes tipos de elementos - Alívio, Editable, etc.
Assim, preenchemos uma vez os parâmetros de renderização (os armazenamos em xml), eles podem ser editados para criar diferentes designs e os usamos globalmente sem defini-los para cada controlador.
É claro, se algum controlador precisa ter seus próprios parâmetros de renderização definidos - basta criar seu próprio objeto GAttribut no controle e especificar as cores desejadas.
----
Este modelo funciona, o projeto unificado é alcançado em pouco tempo, todos os controles tiram as cores da matriz comum.
Mas, na minha opinião, não é universal. O usuário não entende quais parâmetros da base GAttribBase são usados para a renderização deste ou daquele controle.
Para que o codificador saiba exatamente qual a cor a ser mudada, ele teria que procurar a função de renderização do controle, o que é realmente incômodo.
-----
De qualquer forma, quaisquer idéias para que o codificador fique livre do gerenciamento de cores (para usar cores predefinidas imediatamente e não se incomodar com elas no início).
Por outro lado, se ele quiser colorir novamente alguns dos controles na tela, ele não precisa investigar o que GAttribBase é usado e em que caso.
@Igor Volodin, @Combinator, @Anatoli Kazharski
Em geral - que idéias você tem para que o codificador esteja livre do trabalho de cores por um lado (para que ele use as cores dispostas imediatamente e não se preocupe com elas no início)
E por outro lado, se quiserem colorir novamente alguns dos controles na tela, podem fazê-lo sem entrar no labirinto de funções de desenho e procurar o que GAttribBase é usado e em que caso.
Ok, temas.
Por exemplo, o objeto principal de nossa aplicação, vamos chamá-lo App, está associado ao objeto ConcreteTheme.
O que é um objeto temático:
cores (fundo, primeiro plano, desabilitar, ativo, etc.), tamanhos de base, tamanhos de fonte para caixas padrão: tamanho de títulos, tamanho comum, etc. sprites para: painéis, botões, caixas de seleção, etc.
Um novo tema é uma nova classe/estrutura com valores alterados. Mas é melhor que os temas possam ser herdados prevalecendo apenas certos parâmetros.
O resto - a hierarquia de controles na qual cada controlador utiliza um dos valores necessários do objeto-tema por padrão. Se for necessário anular isto, chamamos um método para trabalhar com aquele imóvel, especificando o novo valor.
Por exemplo, SetBgColor(XRGB(255,0,128));
CView - uma classe básica que proporciona interação básica baseada em eventos
- CRect - coordenadas
- Cpanel tem um bgcolor
- O CButton tem um objeto de estado, cada estado tem bg
- CText tem uma cor de texto e propriedades da fonte
- CCircle
E assim por diante.
Se você quiser usar xml para descrever os elementos,
então para cada controle de classe ou primitivo precisamos criar uma classe geradora, vamos chamá-la de "build-container" que irá mapear atributos (bgcolor="(255,0,128)") para os métodos correspondentes ( SetBgColor(attrValue) ) da classe. Tais recipientes construídos serão analisados pelo analisador XML, a saída será um objeto inicializado com valores necessários, ou com valores padrão se nenhum valor for especificado.
Aqui o Tema é o mesmo que o meu - um conjunto de GAttributors para diferentes tipos de controles e seus estados.
mas você já sugere o primeiro passo no caminho da transparência para o codificador - adicionar funções ao controle específico para alterar suas propriedades de renderização (SetBgColor etc.)
Basicamente, concordo que ficará claro que cores tem e o que pode ser mudado.
tal pergunta então - o tema implica redundância de parâmetros não utilizados?
Digamos que em meu GAttribBase básico para algum controle (por exemplo, botão) usamos apenas a cor e o tamanho do fundo, e outros parâmetros - espessura da borda, etc. - não são usados neste controle.
Isto é - você tem um elemento básico para todos os controles? onde são armazenadas as informações "para todos os casos", ou todos os controles têm apenas seus parâmetros sem a sobrecarga da universalidade?
...
Em geral - quais são algumas idéias para que o codificador fique livre do manuseio de cores (para que use cores padrão e não se preocupe com elas no início)
E por outro lado - para que se ele quiser colorir novamente algum controlador na tela, ele não tenha que mergulhar no deserto das funções de renderização e descobrir o que GAttribBase é usado e em que caso.
Defina os valores padrão para cada item. Se o usuário precisar mudar alguma coisa, para cada item de propriedade deve haver um método para definir um novo valor. É assim que eu tenho feito agora.
Eu ainda não tenho isto:
Mas tudo isso é o meu raciocínio em relação ao meu esquema. Não descarto que isso ainda mude muito quando eu iniciar a transição. Portanto, tudo o que escrevi acima pode não ser mais relevante para o tópico em discussão aqui. )