Discussão do artigo "Melhoramos o trabalho com Painéis, adicionando transparência, alterando a cor do plano de fundo e herdando da CAppDialog/CWndClient" - página 2

 

Vladimir, obrigado pelos artigos, material muito útil. Talvez eu tenha uma pergunta mais ampla...

Há um objeto do tipo CBmpButton - um botão com uma imagem. Portanto, a própria imagem do botão funciona como um recurso aqui. Como obter acesso a suas propriedades? Ou isso é impossível?

Um exemplo da documentação.

Lá eu brinquei com o método CControlsDialog::CreateBmpButton1():

//+------------------------------------------------------------------+
//| Criar o botão "BmpButton1|
//+------------------------------------------------------------------+
bool CControlsDialog::CreateBmpButton1(void)
  {
//--- coordenadas
   int x1 = INDENT_LEFT;
   int y1 = INDENT_TOP + (EDIT_HEIGHT + CONTROLS_GAP_Y);
   int x2 = x1 + BUTTON_WIDTH;
   int y2 = y1 + BUTTON_HEIGHT;
//--- criar
   if(!m_bmpbutton1.Create(m_chart_id, m_name + "BmpButton1", m_subwin, x1, y1, x2, y2))
      return(false);
//--- define o nome dos arquivos bmp do controle CBmpButton
   string name1, name2;
   name1 = "\\Images\\euro.bmp";
   name2 = "\\Images\\dollar.bmp";
   m_bmpbutton1.BmpNames(name1, name2);
   if(!Add(m_bmpbutton1))
      return(false);
   m_chart.Redraw();
   if(ObjectFind(m_chart_id, name1) >= 0)
     {
      DebugBreak();
     }
//--- bem-sucedido
   return(true);
  }
//+------------------------------------------------------------------+

O objeto da própria imagem no painel não é encontrado usando ObjectFind(), o que é bastante natural. Como encontrá-lo, se é que isso é possível?

Obrigado.

 
Denis Kirichenko:

Vladimir, obrigado pelos artigos, material muito útil. Talvez eu tenha uma pergunta mais ampla.....

Há um objeto do tipo CBmpButton - um botão com uma imagem. Portanto, a própria imagem do botão funciona como um recurso aqui. Como obter acesso a suas propriedades? Ou não posso?

Exemplo da documentação.

Lá eu brinquei com o método CControlsDialog::CreateBmpButton1():

O objeto da própria imagem no painel não é encontrado usando ObjectFind(), o que é bastante natural. Como encontrá-lo, se é que isso é possível?

Obrigado.

Uma imagem (desenho) não é um objeto. Os objetos são linhas, retângulos ... elementos gráficos.

 

Olá, Vladimir. Você adicionou um ClientArea adicional à janela. Em seguida, você usa o método CMyWndClient::ShiftButton para rolar os botões. Isso não é muito conveniente, pois pode haver muitos botões na janela. Além disso, pode haver muitos elementos de IU além dos botões. Portanto, você vê que escrever métodos para cada elemento e não se esquecer de chamá-los nos manipuladores de rolagem é um desafio. Não é mais fácil rolar o ClientArea? Então, todos os elementos da interface do usuário contidos nela serão rolados automaticamente. É suficiente especificar apenas a rolagem do ClientArea nos manipuladores.

 
Mihail Matkovskij #:

Olá, Vladimir. Você adicionou um ClientArea adicional à janela. Em seguida, você usa o método CMyWndClient::ShiftButton para rolar os botões. Isso não é muito conveniente, pois pode haver muitos botões na janela. Além disso, pode haver muitos elementos de IU além dos botões. Portanto, você vê que escrever métodos para cada elemento e não se esquecer de chamá-los nos manipuladores de rolagem é um desafio. Não é mais fácil rolar o ClientArea? Então, todos os elementos da interface do usuário contidos nela serão rolados automaticamente. É suficiente especificar apenas a rolagem do ClientArea nos manipuladores.

Por favor, escreva um exemplo desse tipo. Acho que todos se interessarão por essa implementação.

 
Vladimir Karputov #:

Por favor, escreva um exemplo desse tipo. Acho que todos se interessarão por essa implementação.

Depois de pensar um pouco, descobri o problema. Essa rolagem não pode ser implementada devido à impossibilidade de ocultar parcialmente qualquer objeto do gráfico (nesse caso, são ClientArea e botões). Em outras interfaces de usuário, isso é implementado de forma diferente. Elas exibem uma área retangular que fica dentro da área de rolagem, e todo o resto fica oculto. Daí a confusão.

 
Perfeito
 
Obrigado, Vladimir, ótimo trabalho.
Como podemos obter transparência para o cabeçalho?