程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> 如何去掉浮動工具條中的“關閉”按鈕

如何去掉浮動工具條中的“關閉”按鈕

編輯:vc教程

  在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;
  }
}   
下圖是最終的運行結果圖:

  圖二

本文示例代碼或素材下載

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved