搭配使用對話方塊列與 Rebar 控制項
如 Rebar 控制項和頻帶 中所述 ,每個樂隊只能包含一個子視窗(或控制項)。 如果您想要每個頻帶有多個子視窗,這可能是一項限制。 方便的因應措施是建立具有多個控制項的對話方塊列資源,然後將 Rebar 帶(包含對話方塊列)新增至 Rebar 控制項。
一般而言,如果您想要讓對話方塊列區區顯示為透明,您可以設定對話方塊列物件的WS_EX_TRANSPARENT延伸樣式。 不過,由於WS_EX_TRANSPARENT有一些問題,無法正確繪製對話方塊列的背景,因此您必須執行一些額外的工作,才能達到所需的效果。
下列程式詳述不需要使用WS_EX_TRANSPARENT擴充樣式即可達到透明度所需的步驟。
在 Rebar 帶中實作透明對話列
使用 [ 新增類別] 對話方塊 ,新增實作對話列物件的新類別(例如
CMyDlgBar
)。新增WM_ERASEBKGND訊息的處理常式。
在新處理常式中,修改現有的程式碼以符合下列範例:
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; }
新增WM_MOVE訊息的處理常式。
在新處理常式中,修改現有的程式碼以符合下列範例:
void CMyDlgBar::OnMove(int x, int y) { UNREFERENCED_PARAMETER(x); UNREFERENCED_PARAMETER(y); Invalidate(); }
新的處理常式會藉由將WM_ERASEBKGND訊息轉送至父視窗,並在每次移動對話方塊列物件時強制重繪,來模擬對話方塊列的透明度。