1. 程式人生 > >vs2010 CMFCToolBar 工具欄 如何修改背景顏色

vs2010 CMFCToolBar 工具欄 如何修改背景顏色

vs2010 所建立的MFC工程,在建立住框架視窗時,通常會是呼叫OnApplicationLook函式。在此函式中呼叫CMFCVisualManager選件完成軟體介面的管理,這樣工具欄的顏色由CMFCVisualManager採取的風格有關,就被不能更改,無論是在子類中覆蓋OnEraseBkgnd函式都無效。

實現的原始碼下載地址:http://download.csdn.net/download/chenyixin121738/9947967

具體解決辦法:工具欄背景重繪其實需要兩個部分:客戶區和非客戶區的繪製。

首先自己寫一個類CMyToolBar派生於CMFCToolBar,覆蓋DoPaint和

OnNcPaint函式。

1.客戶區的繪製依賴DoPaint函式,找到CMFCVisualManager::GetInstance()->OnFillBarBackground(pDC, this, rectClient, rectClip)函式,將其註釋,在下方與填充工具欄按鈕背景紙前,加入以下程式碼,其中RGB(83,84,85)是需要修改的工具欄客戶區背景顏色。

       CRect rect;
	GetClientRect(rect);    
	//填充客戶區 
	pDC->FillSolidRect(rect,RGB(83,84,85));


2.非客戶區的繪製依賴OnNcPaint函式

,在這個函式內部使用了CControlbariml物件的DrawNcArea()函式完成繪製,該函式並不是虛擬函式,覆蓋也無效。所以我直接自己找到庫裡面的程式碼拷貝了一份寫成了CMyControlbariml類,將CMFCToolBar中的CControlbariml物件換成CMyControlbariml型別。在CMyControlbariml類中的DrawNcArea()函式中找到CMFCVisualManager::GetInstance()->OnDrawPaneBorder(&dc, m_pBar, rectWindow)和CMFCVisualManager::GetInstance()->OnFillBarBackground(&dc, m_pBar, rectWindow, CRect(0, 0, 0, 0), TRUE /* NC area ),將其註釋掉,換成以下程式碼,其中RGB(83,84,85)是需要修改的工具欄非客戶區背景顏色。

dc.IntersectClipRect(rectWindow);
	dc.FillSolidRect(rectWindow,RGB(83,84,85));