VC MFC 工具欄上動態新增組合框等控制項的方法

2021-09-08 01:12:20 字數 2927 閱讀 3124

引言

工具條作為大多數標準的windows應用程式的乙個重要組成部分,使其成為促進人機介面友好的乙個重要工具。通過工具條極大方便了使用者對程式的操作,但是在由microsoft visual c++開發環境所建立的應用程式框架中的工具條只是乙個簡單的按鈕的集合,在功能上也僅僅是起到了選單快捷方式的作用,而沒有做到象vc、word等軟體的工具條那樣,提供多種不同型別的標準控制項如組合框、編輯框等。尤其是組合框在新增到工具條上後,可將原本需要在彈出對話方塊中完成的互動操作在工具條上就可以進行,從而在很大程度上改善了應用程式的介面友好程度。本文就此給出一種在普通應用程式的工具條上動態建立組合框、編輯框等標準控制項的一般方法,並使應用程式能夠響應由這些控制項所觸發的事件。

組合框的新增

組合框是新增到工具條中最常見的一種標準控制項,彌補了列表框控制項占用較大空間和編輯控制項的資料輸入煩瑣等弊端,可以在工具條的有限區域內提供全部備選資料,使用者一般情況下只需通過滑鼠操作即可實現對資料的選取。因此,多數情況下都是需要向工具條新增組合框控制項來改善程式的介面友好程度的。

由於是在工具條上動態建立組合框控制項,而工具條又非標準客戶區,因此動態建立過程就存在一定的困難。這裡的處理方式是先在vc的資源檢視中為工具條新增乙個空按鈕idc_combox,然後通過c*******類的setbuttoninfo()函式來對此空白按鈕進行設定,其目的是為後面將要建立的組合框在工具條上佔據一塊空間,然後再通過c*******類的getitemrect()函式得到經過修改後的按鈕區域座標,該座標值在後面建立動態組合框時將指定在工具條的什麼地方建立乙個多大的組合框。經過這些準備工作後,接下來組合框在工具條上的動態建立過程則完全同在客戶區中的處理,即以ccombobox類的create()函式動態完成。

根據前面的設計思路不難寫出實現**。顯然,這部分**應當與工具條的建立**一起新增到主框架類的建立函式oncreate()中,下面結合注釋給出部分關鍵**:

……// 工具條m_wnd*******的建立**

……//設定組合框的寬度,四個引數依次為控制項在工具條中的索引號、id號、風格、寬度 

m_wnd*******.setbuttoninfo(8, idc_combox, tbbs_separator, 160 ); 

//得到組合框的位置 

m_wnd*******.getitemrect(8, &rect); 

//設定組合框的下拉高度 

rect.bottom += 100;

//建立組合框,四個引數依次為視窗風格、組合框位置、父視窗、id號 

m_combobox.create(cbs_dropdown|ws_visible|ws_tabstop|cbs_autohscroll,rect, &m_wnd*******, idc_combox);

//在組合框中加入字串 

m_combobox.addstring("第一條記錄"); 

m_combobox.addstring("第二條記錄"); 

//選中第1條記錄

m_combobox.setcursel(0);

對組合框事件的響應

經過上述編碼,已經在工具條上空白按紐處動態建立出了乙個組合框,但是僅僅建立出組合框還是不夠的,為了能通過此組合框實現同使用者的互動還必須編寫相關**,使其嫩夠響應由組合框發出的事件訊息。通常情況下對此類控制項事件的響應處理是通過classwizard類嚮導來完成的,但由於此處是通過ccombobox類的create()函式動態建立的,因此只能手動新增事件響應**。對於組合框,其比較常用的兩個事件訊息是在選中一條記錄時發出的cbn_selchange事件和在對組合框內文字進行編輯時產生的cbn_editchange事件,下面就以這兩個事件為例對其進行講解,至於其他訊息的處理過程可參照其進行。

首先在標頭檔案中給出訊息響應函式的宣告:

//}afx_msg

然後在實現檔案中完成訊息對映:

begin_message_map(caddto*******view, cview)

//}afx_msg_map

end_message_map()

最後在訊息處理函式中完成對事件的處理過程:

void caddto*******view::onselchangecombo() 

void caddto*******view::oneditchangecombo() 

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

對於其他控制項的處理

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

……// 工具條m_wnd*******的建立**

……//設定組合框的寬度,四個引數依次為控制項在工具條中的索引號、id號、風格、寬度 

m_wnd*******.setbuttoninfo(9, idc_edit, tbbs_separator, 160 ); 

//得到組合框的位置 

m_wnd*******.getitemrect(9, &rect); 

//建立組合框,四個引數依次為視窗風格、組合框位置、父視窗、id號 

m_edit.create (ws_visible|ws_tabstop,rect, &m_wnd*******, idc_edit);

小結

本文主要通過利用vc的資源檢視來先視覺化編輯標準控制項在工具條中的位置,然後再把標準控制項作為工具條的乙個子視窗進行動態建立。基於這種思想,可以很方便地在工具條中進行其他類似處理。本文所述**在windows 2000 professional下,由microsoft visual c++ 6.0編譯通過。

VC MFC 工具欄上動態新增組合框等控制項的方法

引言 工具條作為大多數標準的windows應用 程式的乙個重要組成部分,使其成為促進人機介面友好的乙個重要工具。通過工具條極大方便了使用者對程式的操作,但是在由microsoft visual c 開發環境所建立的應用程式框架中的工具條只是乙個簡單的按鈕的集合,在功能上也僅僅是起到了選單快捷方式的作...

VC MFC 工具欄上動態新增組合框等控制項的方法

引言 工具條作為大多數標準的windows應用 程式的乙個重要組成部分,使其成為促進人機介面友好的乙個重要工具。通過工具條極大方便了使用者對程式的操作,但是在由microsoft visual c 開發環境所建立的應用程式框架中的工具條只是乙個簡單的按鈕的集合,在功能上也僅僅是起到了選單快捷方式的作...

mfc 工具欄中新增組合框

在int cmainframe oncreate lpcreatestruct lpcreatestruct 函式中 加入一下 原理 在新加的按鈕的位置插入了組合框 create the zoom combo box in the 在按鈕上建立組合框,按鈕位置決定了組合框的位置 int index1...