共用方式為


搭配使用對話方塊列與 Rebar 控制項

如 Rebar 控制項和頻帶 中所述 ,每個樂隊只能包含一個子視窗(或控制項)。 如果您想要每個頻帶有多個子視窗,這可能是一項限制。 方便的因應措施是建立具有多個控制項的對話方塊列資源,然後將 Rebar 帶(包含對話方塊列)新增至 Rebar 控制項。

一般而言,如果您想要讓對話方塊列區區顯示為透明,您可以設定對話方塊列物件的WS_EX_TRANSPARENT延伸樣式。 不過,由於WS_EX_TRANSPARENT有一些問題,無法正確繪製對話方塊列的背景,因此您必須執行一些額外的工作,才能達到所需的效果。

下列程式詳述不需要使用WS_EX_TRANSPARENT擴充樣式即可達到透明度所需的步驟。

在 Rebar 帶中實作透明對話列

  1. 使用 [ 新增類別] 對話方塊 ,新增實作對話列物件的新類別(例如 CMyDlgBar )。

  2. 新增WM_ERASEBKGND訊息的處理常式。

  3. 在新處理常式中,修改現有的程式碼以符合下列範例:

    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. 新增WM_MOVE訊息的處理常式。

  5. 在新處理常式中,修改現有的程式碼以符合下列範例:

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

新的處理常式會藉由將WM_ERASEBKGND訊息轉送至父視窗,並在每次移動對話方塊列物件時強制重繪,來模擬對話方塊列的透明度。

另請參閱

使用 CReBarCtrl
Controls