在C++/MFC框架應用程序裡,當浮動工具條被拖離主窗口後,一般都有一個“關閉”按鈕,如圖一所示:
圖一
本來這個按鈕完全是按照Windows應用程序的UI設計規范而設計的,也就是說所有的窗口都應該有一個地方讓用戶可以關閉這個窗口。但是有的用戶提出來不想要這個“關閉”按鈕。既然用戶有這種需要,那麼我們就想辦法實現吧......
首先,我們來確定實現的思路,因為我們要實現的功能與工具條有關,所以涉及的類肯定與 CToolBar有關。其次,為了判斷工具條浮動後“關閉”按鈕的狀態,我們需要一個表示狀態的成員變量;第三,實現工具條的浮動特性,需要對工具條窗口的ON_WM_WINDOWPOSCHANGED消息進行處理。這個消息負責CToolBar窗口大小、位置或Z坐標的變化,這裡為什麼不用WM_SIZE/OnSize來處理窗口大小的改變呢?因為僅當涉及窗口大小改變而不涉及窗口位置也改變時才這樣調用,所以當浮動工具條時不一定每次都調用處理WM_SIZE/OnSize。我們可以利用 CControlBar 基類的m_pDockBar成員來調用GetParent()以獲取工具條的父窗口。從而改變父窗口的式樣——屏蔽系統菜單——來達到我們的目的——去掉“關閉”按鈕。
有了思路,下面來看看具體的實現代碼,我們先從CToolBar派生一個新類CToolBarEx,因為我們的目的是在浮動工具條時去掉“關閉”按鈕,所以僅僅判斷工具條是否浮動就可以了,這一點用CControlBar類的屬性判斷函數可以做到:
BOOL IsFloating() const;在新類中添加一個成員變量,用它表示“關閉”按鈕的狀態:
BOOL m_bMenuRemoved;當我們去掉主框架的系統菜單屬性時,它的值為TRUE。
接著,我們需要一個m_pDockBar成員父窗口的指針,以便檢查它是否確實為CDockFrameWnd,此時我們用到了 m_pDockBar,用它來判斷父窗口類型,注意保證它是一個有效指針。這樣我們就可以放心地從CToolBar中去掉系統菜單。下面是處理ON_WM_WINDOWPOSCHANGED消息的代碼:
void CToolBarEx::OnWindowPosChanged(WINDOWPOS FAR* lpwndpos) { CToolBar::OnWindowPosChanged(lpwndpos); // should only be called once, when floated. if( IsFloating() ) { if( m_pDockBar && !m_bMenuRemoved ) { CWnd* pParent = m_pDockBar->GetParent(); if( pParent->IsKindOf(RUNTIME_CLASS(CMiniFrameWnd))) { pParent->ModifyStyle( WS_SYSMENU, 0, 0 ); m_bMenuRemoved = TRUE; } } } else if( m_bMenuRemoved ) { m_bMenuRemoved = FALSE; } }下圖是最終的運行結果圖:
圖二
本文示例代碼或素材下載