引言
工具條做爲大多數標準的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的資源視圖來先可視化編輯標準控件在工具條中的位置,而後再把標準控件做爲工具條的一個子窗口進行動態建立。基於這種思想,能夠很方便地在工具條中進行其餘相似處理。本文所述代碼在Windows 2000 Professional下,由Microsoft Visual C++ 6.0編譯經過。 |