一、前 言
對於工具欄,我想大家一定不陌生,它直觀,使用方便,它給應用程序的用戶帶來極大的方便.對VC++程序員來說,為自己開發的軟件加上一個工具欄並不難,幾乎每本介紹VC++的書都少不了介紹這方面的內容,並且,如果在開發初期就想加入工具欄的話,就更簡單了,MFC 可自動為您生成工具欄.可是我們所說的這些工具欄都有一個共同的特點,它們的每個工具按鈕上只有一個位圖直觀地向用戶顯示它的功能,將鼠標移動到某個工具按鈕上後,很快就彈出一個標簽(ToolTips),以文字的形式表明它的功能.
作為微軟用戶,我們最熟悉的莫過於微軟的浏覽器了,它的工具欄是可以定制的,可以在工具按鈕上只顯示位圖,並采取ToolTips技術,也可在工具欄上同時顯示位圖和文本標簽(可謂"圖文並茂").我想如果我們的軟件也有這個功能的話,會不會使得我們的軟件對用戶更友好,使用更方便呢? 本文詳細介紹了實現的具體步驟並給出完整的示例工程供參考。
示例代碼運行效果圖
二、主要函數
下面我們就來介紹這個功能的實現,首先介紹幾個相關的函數:
1.CToolBar::SetSizes(SIZE sizeButton,SIZE sizeImage)
我想不用介紹,朋友們也都能猜出這個函數的功能了吧.它用於設置工具按鈕的大小以及它上面的位圖的大小.這個函數有兩個參數,其中,sizeButton用於指定按鈕的大小,sizeImage用於指定位圖的大小.需注意的是:這兩個參數的cx域和cy域都必須大於零,並且,sizeButton的寬度(cx)至少要比sizeImage的寬度大7,高度(cy)至少大6.
2.CToolBar::SetButtonText(int nIndex , LPCTSTR lpstText)
這個函數用於設置工具按鈕上所顯示的文字,nIndex用於指定所設置的工具按鈕在工具欄中基於0的索引值(包括分割符),即第nIndex+1個工具按鈕將被設置,lpstText就是指定所要顯示的文字了.
3.CToolBar::EnableToolTips(BOOL bEnable)
這個函數用於設置/取消工具按鈕的ToolTips功能.
4.CMainFrame::ShowControlBar(CControlBar * pBar,BOOL bShow, BOOL bDelay)
這個函數用於設置工具欄或狀態欄的顯示與否.
pBar: 指向被設置工具欄或狀態欄對象的指針
bShow: 為TRUE,則顯示工具欄或狀態欄 否則隱藏;
bDelay: 為TRUE,則延遲顯示時間,否則立刻顯示工具欄或狀態欄
三、前期工作
了解了這幾個函數後,我們就可以為工具欄添加文本標簽了.
首先我們為CMainFrame類添加兩個變量
1)BOOL類型的成員變量m_bTextTips,可以是私有變量,用於存儲文本標簽顯示與否的狀態.
2)SIZE類型的成員變量m_sizeMax,用於存儲按鈕的最大尺寸
方法:在Workspace窗口的ClassView視圖中右鍵單擊CMainFrame類,在彈出的快捷菜單中單擊Add Member Variable...菜單項.在彈出的對話框中如下輸入即可:
我們先進行用戶界面的編寫,如下:
1.在CMainFrame類的結構函數CMainFrame()中加入m_bTextTips的初始化代碼,如下:
CMainFrame::CMainFrame() {
在此我們使用了函數CWinApp::GetProfileInt("Setting","m_bTextTips",1),它的原形是這樣的:
m_bTextTips=AfxGetApp()->GetProfileInt("Setting","m_bTextTips",1);
}
UINT GetProfileInt( LPCTSTR lpszSection, LPCTSTR lpszEntry, int nDefault );
它和下面的函數CWinApp::Write rofileInt("Setting","m_bTextTips",m_bTextTips)搭配使用,
對該函數的使用,您可參考幫助文件,本文不再贅述.
2.在CMainFrame類的析構函數~CMainFrame()中加入如下代碼保存文本標簽的顯示狀態:
CMainFrame::~CMainFrame() { AfxGetApp()->WriteProfileInt("Setting","m_bTextTips",m_bTextTips);
}
3.加入相應的菜單項,用於控制文本標簽的顯示與否,如下:
在屬性對話框中,選中Checked復選框,ID號為:ID_TOOL_TEXTTIPS.
4.用ClassWizard加入該菜單項的命令處理函數和接口更新處理函數,並加入以下代碼:
void CMainFrame::OnToolTexttips()
{
m_bTextTips = !m_bTextTips; } void CMainFrame::OnUpdateToolTexttips(CCmdUI* pCmdUI) {
pCmdUI->SetCheck(m_bTextTips);
}
三、功能實現
以上完成了用戶接口的編寫工作,然後添加文本標簽,步驟如下:
1.在CMainFrame類的實現文件開始部分假如靜態數組,用於存放文本標簽,如下:
#ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__;
2.用ClassWizard為CMainFrame添加一成員函數:void CMainFrame::UpdateToolBar(BOOL bRecalc = TRUE);用於更新工具條
#endif static TCHAR *TextTips[] = {"新建","打開","存盤","","剪切","復制","粘貼","","打印","","關於",""};
void CMainFrame::UpdateToolBar(BOOL bRecalc) //bRecalc用於指示是否重新計算最大尺寸 {
3.在CMainFrame::OnCreate()函數中,就在return 0;之前加入如下代碼:
CRect rect;
SIZE sizeButton,sizeImage;
if(bRecalc) {
m_sizeMax.cx = 0;
m_sizeMax.cy = 0;
//取得最大尺寸
for (int i=0;i<m_wndToolBar.GetCount();i++) {
m_wndToolBar.SetButtonText(i,TextTips[i]);
m_wndToolBar.GetItemRect(i,rect);
m_sizeMax.cx = __max(rect.Size().cx, m_sizeMax.cx);
m_sizeMax.cy = __max(rect.Size().cy, m_sizeMax.cy);
}
}
//設置按鈕尺寸 sizeButton.cx = m_bTextTips ? m_sizeMax.cx : 23;
sizeButton.cy = m_bTextTips ? m_sizeMax.cy : 22;
sizeImage.cx = 16;
sizeImage.cy = 15;
m_wndToolBar.SetSizes(sizeButton,sizeImage); ShowControlBar(&m_wndToolBar,FALSE,FALSE); ShowControlBar(&m_wndToolBar,TRUE,FALSE);
m_wndToolBar.RedrawWindow();
}
UpdateToolBar();///更新工具條
4.實現控制菜單的功能,在菜單的命令處理函數中加入粗體代碼:
return 0;
void CMainFrame::OnToolTexttips()
5.為了使WINDOWS系統參數改變後能夠自動調整工具條大小,我們需要添加WM_SETTINGCHANGE消息處理函數OnSettingChange,並加入粗體代碼:
{ m_bTextTips = !m_bTextTips; UpdateToolBar(FALSE);///FALSE參數表示不重新計算最大按鈕 }
void CMainFrame::OnSettingChange(UINT uFlags, LPCTSTR lpszSection)
至此,所有任務已經完成,請編譯並運行該程序,單擊TextTips按鈕,OK!
{ CFrameWnd::OnSettingChange(uFlags, lpszSection); UpdateToolBar();
}
注:本文假定您的程序已經加入了工具欄.