Partilhar via


Usando uma caixa de diálogo com um controle rebar

Conforme mencionado em Controles Rebar e Faixas, cada banda pode conter apenas uma janela filho (ou controle). Isso poderá ser uma limitação se você quiser ter mais de uma janela filho por banda. Uma solução alternativa conveniente é criar um recurso de barra de diálogo com vários controles e adicionar uma faixa de barras (contendo a barra de diálogo) ao controle rebar.

Normalmente, se você quisesse que a banda da barra de diálogo fosse transparente, definiria o estilo estendido WS_EX_TRANSPARENT para o objeto da barra de diálogo. No entanto, como WS_EX_TRANSPARENT tem alguns problemas com a pintura correta da tela de fundo de uma barra de diálogo, você precisará fazer um trabalho extra para alcançar o efeito desejado.

O procedimento a seguir detalha as etapas necessárias para obter transparência sem usar o estilo estendido WS_EX_TRANSPARENT.

Para implementar uma barra de diálogo transparente em uma faixa rebar

  1. Usando a caixa de diálogo Adicionar Classe, adicione uma classe (por exemplo, CMyDlgBar) que implementa o objeto da barra de diálogo.

  2. Adicione um manipulador para a mensagem WM_ERASEBKGND.

  3. No novo manipulador, modifique o código para corresponder ao seguinte exemplo:

    BOOL CMyDlgBar::OnEraseBkgnd(CDC *pDC)
    {
       CWnd *pParent = GetParent();
       ASSERT_VALID(pParent);
       CPoint pt(0, 0);
       MapWindowPoints(pParent, &pt, 1);
       pt = pDC->OffsetWindowOrg(pt.x, pt.y);
       LRESULT lResult = pParent->SendMessage(WM_ERASEBKGND,
                                              (WPARAM)pDC->m_hDC, 0L);
       pDC->SetWindowOrg(pt.x, pt.y);
       return (BOOL)lResult;
    }
    
  4. Adicione um manipulador para a mensagem WM_MOVE.

  5. No novo manipulador, modifique o código para corresponder ao seguinte exemplo:

    void CMyDlgBar::OnMove(int x, int y)
    {
       UNREFERENCED_PARAMETER(x);
       UNREFERENCED_PARAMETER(y);
    
       Invalidate();
    }
    

Os novos manipuladores simulam a transparência da barra de diálogo encaminhando a mensagem WM_ERASEBKGND para a janela pai e forçando uma nova pintura sempre que o objeto da barra de diálogo é movido.

Confira também

Usando CReBarCtrl
Controles