Partager via


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

Comme mentionné dans Les contrôles et bandes rebar, chaque bande ne peut contenir qu’une seule fenêtre enfant (ou contrôle). Il peut s’agir d’une limitation si vous souhaitez avoir plusieurs fenêtres enfants par bande. Une solution de contournement pratique consiste à créer une ressource de barre de dialogue avec plusieurs contrôles, puis à ajouter une bande de barres de rebar (contenant la barre de dialogue) au contrôle de barre de dialogue.

Normalement, si vous souhaitez que la bande de barres de dialogue apparaisse transparente, vous définissez le style étendu WS_EX_TRANSPARENT pour l’objet de barre de dialogue. Toutefois, étant donné que WS_EX_TRANSPARENT a quelques problèmes avec la peinture correcte de l’arrière-plan d’une barre de dialogue, vous devrez faire un peu de travail supplémentaire pour obtenir l’effet souhaité.

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

Pour implémenter une barre de dialogue transparente dans une bande de barres de rebar

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

  2. Ajoutez un gestionnaire pour le message WM_ERASEBKGND.

  3. Dans le nouveau gestionnaire, modifiez le code existant pour qu’il 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 WM_MOVE.

  5. Dans le nouveau gestionnaire, modifiez le code existant pour qu’il 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 dialogue en transférant le message WM_ERASEBKGND à la fenêtre parente et en forçant un repaint chaque fois que l’objet de barre de dialogue est déplacé.

Voir aussi

Utilisation de CReBarCtrl
Contrôles