Freigeben über


Verwenden einer Dialogleiste mit einem Grundleisten-Steuerelement

Wie in Rebar-Steuerelementen und -Bändern Erwähnung, kann jedes Band nur ein untergeordnetes Fenster (oder Steuerelement) enthalten. Dies kann eine Einschränkung sein, wenn Sie mehr als ein untergeordnetes Fenster pro Band haben möchten. Eine bequeme Problemumgehung besteht darin, eine Dialogleistenressource mit mehreren Steuerelementen zu erstellen und dann dem Rebar-Steuerelement ein Rebar-Band (mit der Dialogleiste) hinzuzufügen.

Wenn das Dialogfeldleistenband normalerweise transparent angezeigt werden soll, würden Sie die WS_EX_TRANSPARENT erweiterte Formatvorlage für das Dialogfeldleistenobjekt festlegen. Da WS_EX_TRANSPARENT jedoch einige Probleme mit dem ordnungsgemäßen Zeichnen des Hintergrunds einer Dialogfeldleiste hat, müssen Sie ein wenig zusätzliche Arbeit ausführen, um den gewünschten Effekt zu erzielen.

Im folgenden Verfahren werden die Schritte beschrieben, die erforderlich sind, um Transparenz zu erreichen, ohne den erweiterten Stil WS_EX_TRANSPARENT zu verwenden.

So implementieren Sie eine transparente Dialogleiste in einem Leistenband

  1. Fügen Sie mithilfe des Dialogfelds "Klasse hinzufügen" eine neue Klasse (z. B. ) hinzu, CMyDlgBardie das Dialogfeldleistenobjekt implementiert.

  2. Fügen Sie einen Handler für die WM_ERASEBKGND Nachricht hinzu.

  3. Ändern Sie im neuen Handler den vorhandenen Code so, dass er dem folgenden Beispiel entspricht:

    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. Fügen Sie einen Handler für die WM_MOVE Nachricht hinzu.

  5. Ändern Sie im neuen Handler den vorhandenen Code so, dass er dem folgenden Beispiel entspricht:

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

Die neuen Handler simulieren die Transparenz der Dialogfeldleiste, indem sie die WM_ERASEBKGND Nachricht an das übergeordnete Fenster weiterleitet und jedes Mal, wenn das Dialogfeldleistenobjekt verschoben wird, eine Neuformatierung erzwingen.

Siehe auch

Verwenden von CReBarCtrl
Steuerelemente