Partager via


Utilisation d'une barre de boîte de dialogue avec un contrôle rebar

Comme mentionné dans Contrôles rebar et bandes, chaque bande peut contenir qu'une seule fenêtre enfant (contrôle ou).Il peut s'agir d'une limitation si vous voulez avoir plusieurs fenêtre enfant par bande.Une solution pratique consiste à créer une ressource de barre de boîte de dialogue avec plusieurs contrôles puis d'ajouter une bande rebar (contenant la barre de boîte de dialogue) au contrôle rebar.

Normalement, si vous souhaitez que la bande de barre de boîte de dialogue à afficher transparent, vous définissez le style étendu par WS_EX_TRANSPARENT pour l'objet de la barre de boîte de dialogue.Toutefois, étant donné que WS_EX_TRANSPARENT a des problèmes avec correctement peindre l'arrière-plan d'une barre de boîte de dialogue, vous devrez exécuter le travail une petite portion supplémentaire pour obtenir le résultat souhaité.

La procédure suivante détaille les étapes nécessaires pour obtenir la transparence sans utiliser le style étendu par WS_EX_TRANSPARENT .

Pour implémenter une barre de boîte de dialogue transparente dans une bande rebar

  1. À l'aide de ajoutez la boîte de dialogue de classe, ajoutez une nouvelle classe (par exemple, CMyDlgBar) qui implémente votre objet de la barre de boîte de dialogue.

  2. Ajoutez un gestionnaire pour le message d' WM_ERASEBKGND .

  3. Dans le nouveau gestionnaire, remplacez le code existant afin qu'elle corresponde à l'exemple suivant :

    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. Ajoutez un gestionnaire pour le message d' WM_MOVE .

  5. Dans le nouveau gestionnaire, remplacez le code existant afin qu'elle corresponde à l'exemple suivant :

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

Les nouveaux gestionnaires simulent la transparence de la barre de boîte de dialogue en transférant le message d' WM_ERASEBKGND à la fenêtre parente et en forçant à repeindre chaque fois que l'objet de la barre de boîte de dialogue est déplacé.

Voir aussi

Référence

Utilisation CReBarCtrl

Concepts

Contrôles (MFC)