引言
工具條作為大多數標准的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編譯通過。 |