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
Usando a caixa de diálogo Adicionar Classe, adicione uma classe (por exemplo,
CMyDlgBar
) que implementa o objeto da barra de diálogo.Adicione um manipulador para a mensagem WM_ERASEBKGND.
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; }
Adicione um manipulador para a mensagem WM_MOVE.
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.