引言
工具條作為大多數標准的Windows應用程序的一個重要組成部分,使其成為促進人機界面友好的一個重要工具。通過工具條極大方便了用戶對程序的操作,但是在由Microsoft Visual C++開發環境所創建的應用程序框架中的工具條只是一個簡單的按鈕的集合,在功能上也僅僅是起到了菜單快捷方式的作用,而沒有做到象VC、Word等軟件的工具條那樣,提供多種不同類型的標准控件如組合框、編輯框等。尤其是組合框在添加到工具條上後,可將原本需要在彈出對話框中完成的交互操作在工具條上就可以進行,從而在很大程度上改善了應用程序的界面友好程度。本文就此給出一種在普通應用程序的工具條上動態創建組合框、編輯框等標准控件的一般方法,並使應用程序能夠響應由這些控件所觸發的&&事件。
組合框的添加
組合框是添加到工具條中最常見的一種標准控件,彌補了列表框控件占用較大空間和編輯控件的數據輸入煩瑣等弊端,可以在工具條的有限區域內提供全部備選數據,用戶一般情況下只需通過鼠標操作即可實現對數據的選取。因此,多數情況下都是需要向工具條添加組合框控件來改善程序的界面友好程度的。
由於是在工具條上動態創建組合框控件,而工具條又非標准客戶區,因此動態創建過程就存在一定的困難。這裡的處理方式是先在VC的資源視圖中為工具條添加一個空按鈕IDC_COMBOX,然後通過CToolBar類的SetButtonInfo()&&函數來對此空白按鈕進行設置,其目的是為後面將要創建的組合框在工具條上占據一塊空間,然後再通過CToolBar類的GetItemRect()&&函數得到經過修改後的按鈕區域坐標,該坐標值在後面創建動態組合框時將指定在工具條的什麼地方創建一個多大的組合框。經過這些准備工作後,接下來組合框在工具條上的動態創建過程則完全同在客戶區中的處理,即以CComboBox類的Create()&&函數動態完成。
根據前面的設計思路不難寫出實現代碼。顯然,這部分代碼應當與工具條的創建代碼一起添加到主框架類的創建&&函數OnCreate()中,下面結合注釋給出部分關鍵代碼:
……
// 工具條m_wndToolBar的創建代碼
……
//設置組合框的寬度,四個參數依次為控件在工具條中的索引號、ID號、風格、寬度
m_wndToolBar.SetButtonInfo(8, IDC_COMBOX, TBBS_SEPARATOR, 160 );
//得到組合框的位置
m_wndToolBar.GetItemRect(8, &rect);
//設置組合框的下拉高度
rect.bottom += 100;
//創建組合框,四個參數依次為窗口風格、組合框位置、父窗口、ID號
m_combobox.Create(CBS_DROPDOWN|WS_VISIBLE|WS_TABSTOP|CBS_AUTOHSCROLL,rect, &m_wndToolBar, IDC_COMBOX);
//在組合框中加入字符串
m_combobox.AddString("第一條記錄");
m_combobox.AddString("第二條記錄");
//選中第1條記錄
m_combobox.SetCurSel(0);
對組合框&&事件的響應
經過上述編碼,已經在工具條上空白按紐處動態創建出了一個組合框,但是僅僅創建出組合框還是不夠的,為了能通過此組合框實現同用戶的交互還必須編寫相關代碼,使其嫩夠響應由組合框發出的&&事件消息。通常情況下對此類控件&&事件的響應處理是通過ClassWizard類向導來完成的,但由於此處是通過CComboBox類的Create()&&函數動態創建的,因此只能手動添加&&事件響應代碼。對於組合框,其比較常用的兩個&&事件消息是在選中一條記錄時發出的CBN_SELCHANGE&&事件和在對組合框內文字進行編輯時產生的CBN_EDITCHANGE&&事件,下面就以這兩個&&事件為例對其進行講解,至於其他消息的處理過程可參照其進行。
首先在頭文件中給出消息響應&&函數的聲明:
//{{AFX_MSG(CAddToToolBarVIEw)
afx_msg void OnSelchangeCombo();//響應CBN_SELCHANGE消息的&&函數
afx_msg void OnEditchangeCombo();//響應CBN_EDITCHANGE消息的&&函數
//}}AFX_MSG
然後在實現文件中完成消息映射:
BEGIN_MESSAGE_MAP(CAddToToolBarView, CVIEw)
//{{AFX_MSG_MAP(CAddToToolBarVIEw)
ON_CBN_SELCHANGE(IDC_COMBOX, OnSelchangeCombo)
ON_CBN_EDITCHANGE(IDC_COMBOX, OnEditchangeCombo)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
最後在消息處理&&函數中完成對&&事件的處理過程:
void CAddToToolBarVIEw::OnSelchangeCombo()
{
CString cs;
CMainFrame* frame=(CMainFrame*)AfxGetMainWnd();
frame->m_combobox.GetLBText(frame->m_combobox.GetCurSel(), cs);
AfxMessageBox(cs);
}
void CAddToToolBarVIEw::OnEditchangeCombo()
{
CMainFrame* frame=(CMainFrame*)AfxGetMainWnd();
CString cs;
frame->m_combobox.GetWindowText(cs);
}
從上述處理過程可以看出,對於在工具條上動態創建控件所發出&&事件的響應處理過程同手工處理消息響應的過程是非常相似的。
對於其他控件的處理
前面關於組合框控件在工具條上動態創建的介紹是比較有代表性的,其他標准控件的處理過程與之相比並沒有什麼太大的變化,只是由於控件類別的不同而在空間的創建和對控件本身的處理過程上有所不同,其思路則是完全一致的。下面再給出編輯框在工具條的創建過程。通過對這兩段代碼的比較可以對控件在工具條的動態創建過程有一個更好的認識:
……
// 工具條m_wndToolBar的創建代碼
……
//設置組合框的寬度,四個參數依次為控件在工具條中的索引號、ID號、風格、寬度
m_wndToolBar.SetButtonInfo(9, IDC_EDIT, TBBS_SEPARATOR, 160 );
//得到組合框的位置
m_wndToolBar.GetItemRect(9, &rect);
//創建組合框,四個參數依次為窗口風格、組合框位置、父窗口、ID號
m_edit.Create (WS_VISIBLE|WS_TABSTOP,rect, &m_wndToolBar, IDC_EDIT);
小結
本文主要通過利用VC的資源視圖來先可視化編輯標准控件在工具條中的位置,然後再把標准控件作為工具條的一個子窗口進行動態創建。基於這種思想,可以很方便地在工具條中進行其他類似處理。