天天看點

VC/MFC 工具欄上動态添加組合框等控件的方法

引言

  工具條作為大多數标準的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消息的函數 

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 ;

cmainframe*

frame=(cmainframe*)afxgetmainwnd(); 

frame->m_combobox.getlbtext(frame->m_combobox.getcursel(),

cs); 

afxmessagebox(cs);

caddtotoolbarview::oneditchangecombo() 

cstring

cs; 

frame->m_combobox.getwindowtext(cs); 

}

  從上述處理過程可以看出,對于在工具條上動态建立控件所發出事件的響應處理過程同手工處理消息響應的過程是非常相似的。

  對于其他控件的處理

  前面關于組合框控件在工具條上動态建立的介紹是比較有代表性的,其他标準控件的處理過程與之相比并沒有什麼太大的變化,隻是由于控件類别的不同而在空間的建立和對控件本身的處理過程上有所不同,其思路則是完全一緻的。下面再給出編輯框在工具條的建立過程。通過對這兩段代碼的比較可以對控件在工具條的動态建立過程有一個更好的認識:

m_wndtoolbar.setbuttoninfo(9,

idc_edit, tbbs_separator, 160

m_wndtoolbar.getitemrect(9,

m_edit.create

(ws_visible|ws_tabstop,rect, &m_wndtoolbar,

idc_edit);

  小結

  本文主要通過利用vc的資源視圖來先可視化編輯标準控件在工具條中的位置,然後再把标準控件作為工具條的一個子視窗進行動态建立。基于這種思想,可以很友善地在工具條中進行其他類似處理。本文所述代碼在windows

2000 professional下,由microsoft visual c++ 6.0編譯通過。