Compartir por


Usar una barra de cuadro de diálogo con un control Rebar

Como se mencionó en Controles y bandas de rebar, cada banda puede contener solo una ventana secundaria (o control). Esto puede ser una limitación si quieres tener más de una ventana secundaria por banda. Una solución práctica consiste en crear un recurso de barra de diálogo con varios controles y, a continuación, agregar una banda de barra de rebar (que contiene la barra de diálogo) al control de la barra de diálogo.

Normalmente, si quieres que la banda de la barra de diálogo aparezca transparente, establecerías el estilo extendido WS_EX_TRANSPARENT para el objeto de barra de diálogo. Sin embargo, dado que WS_EX_TRANSPARENT tiene algunos problemas con pintar correctamente el fondo de una barra de diálogo, deberás realizar un poco de trabajo adicional para lograr el efecto deseado.

En el procedimiento siguiente se detallan los pasos necesarios para lograr la transparencia sin usar el estilo extendido WS_EX_TRANSPARENT.

Para implementar una barra de diálogo transparente en una banda de rebar

  1. Con el cuadro de diálogo Agregar clase, agrega una nueva clase (por ejemplo, CMyDlgBar) que implemente el objeto de barra de diálogo.

  2. Agrega un controlador para el mensaje de WM_ERASEBKGND.

  3. En el nuevo controlador, modifica el código existente para que coincida con el ejemplo siguiente:

    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. Agrega un controlador para el mensaje de WM_MOVE.

  5. En el nuevo controlador, modifica el código existente para que coincida con el ejemplo siguiente:

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

Los nuevos controladores simulan la transparencia de la barra de diálogo reenviando el mensaje WM_ERASEBKGND a la ventana primaria y forzando un reintentos cada vez que se mueve el objeto de barra de diálogos.

Consulte también

Uso de CReBarCtrl
Controles