我用VC開發軟件已有兩年時間,自認為對Windows用戶界面技術也積累了不少經驗,下文就想從另一個角度談談工具條的制作。
其實,在VC的開發環境中,對工具條的支持并不是很方便,相比之下就不如其它的一些編程語言,如C++Build等。VC的應用程序向導(AppWizard)中基于單文檔和多文檔的程序為用戶創建了一個工具條,并提供了對工具條的可視化編輯,但它提供的工具條僅僅是按紐(Button)的簡單集合,不支持工具條中經常用到的編輯(Edit)控件、組合框(ComboBox)控件等,而在我們常見的軟件中,如Word等等,帶組合框(通常為下拉框,組合框的一種,不能編輯,只能選擇其中一條)等其它控件的工具條也大量用到,它大大方便了用戶的操作。本文提出了一個比較簡便的方法,利用VC的資源編輯器,可視化的確定控件在工具條中的位置,然后把控件作為工具條的子窗口創建,并實現控件的消息響應函數。
下文就以組合框為例,詳細介紹在工具條中加入組合框的步驟。用應用程序向導(AppWizard)生成一個基于單文檔的工程(Project),首先打開VC的工具條資源編輯器,在要加入組合框的地方加一個空按紐,分配一個ID號,在本文的實例中為IDC_COMBOX。
其次,從面向對象的思想出發,一個工具條作為一個整體,應該封裝為一個類,組合框控件應該作為這個類的一個成員變量。因此生成一個以CToolBar為基類的的新類CComboToolBar,這可以用VC的類向導(ClassWizard)來實現,先生成一個以CToolBarCtrl為基類的新類CComboToolBar,然后在文件編輯器中打開ComboToolBar.h和ComboToolBar.cpp文件,把CComboToolBar基類改為CToolBar。之所以有這番周折,是因為類向導不支持以CToolBar為基類生成新類。新類生成后,加入成員變量CComboBox
m_combobox。
然后把CMainFrame類中的工具條成員變量m_wndToolBar的類型由CToolBar改為CComboToolBar。編輯應用程序向導已經生成好的函數intCMainFrame::OnCreate(LPCREATESTRUCT
lpCreateStruct),這個函數通常用來產生工具條和狀態條,在創建工具條的函數后加入以下代碼:
CRect rect;
//設置組合框的寬度,四個參數依次為控件在工具條中的索引號、ID號、風格、寬度
m_wndToolBar.SetButtonInfo(4,IDC_COMBOX,TBBS_SEPARATOR,160);
//得到組合框的位置
m_wndToolBar.GetItemRect(4,&rect);
//設置組合框的高度
rect.bottom += 100; //COMBOHEIGHT;
//創建組合框,四個參數依次為窗口風格、組合框位置、父窗口、ID號
if(!m_wndToolBar.m_combobox.Create(CBS_DROPDOWN|WS_VISIBLE|
WS_TABSTOP|CBS_AUTOHSCROLL,rect,&m_wndToolBar,IDC_COMBOX))
return -1;
//在組合框中加入字符串
m_wndToolBar.m_combobox.AddString ("微波工程");
m_wndToolBar.m_combobox.AddString ("通信工程");
m_wndToolBar.m_combobox.AddString ("信號與信息處理專業");
至此就可以編譯運行這個單文檔程序了,運行結果就會產生帶有組合框的工具條。
但是僅僅產生組合框是不夠的,必須實現組合框的消息響應函數,才能方便地運用組合框。在VC中,消息響應函數通常都是用類向導來實現,但是此處由于組合框是用函數創建的,所以必須親自動手來寫代碼,也并不麻煩,與類向導生成的代碼格式是一樣的,可以參照來寫。下面在View類中實現響應組合框的CBN_SELCHANGE消息(當組合框選中一條字符串時,產生此消息)和CBN_EDITCHANGE消息(當對組合框內的字符進行編輯時,產生此消息)的函數。本實例中,當組合框選中一條字符串時,在下面的編輯(Edit)控件中立即顯示這一條字符串,而且在組合框中輸入字符時,下面的編輯控件也立即顯示相應的字符。為此,加入以下代碼即可。
1、在頭(.h)文件中加入消息響應函數的定義:
afx_msg void OnSelchangeCombo();
//響應CBN_SELCHANGE消息的函數
afx_msg void OnEditchangeCombo();
//響應CBN_EDITCHANGE消息的函數
2、在實現(.cpp)文件中加入消息映射宏:
BEGIN_MESSAGE_MAP(CToolComboView,CFormView)
//{{AFX_MSG_MAP(CToolComboView)
ON_CBN_SELCHANGE(IDC_COMBOX,OnSelchangeCombo)
ON_CBN_EDITCHANGE(IDC_COMBOX,OnEditchangeCombo)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
3、在實現(.cpp)文件中加入函數實體:
void CToolComboView::OnSelchangeCombo()
{
CMainFrame*frame=(CMainFrame*)AfxGetMainWnd();
frame->m_wndToolBar.m_combobox.GetLBText(
frame->m_wndToolBar.m_combobox.GetCurSel(),m_text);
UpdateData(0);
}
void CToolComboView::OnEditchangeCombo()
{
CMainFrame*frame=(CMainFrame*)AfxGetMainWnd();
CString cs;
frame->m_wndToolBar.m_combobox.GetWindowText(cs);
m_edit.SetWindowText(cs);
}
這樣,當選中組合框的字符串和編輯組合框內的字符時,程序就會執行相應的消息響應函數。至此,我們已經成功地在工具條中加入了組合框控件,并實現了對它的應用?!?nbsp;