引言
工具条作为大多数标准的Windows应用程序的一个重要组成部分,使其成为促进人机界面友好的一个重要工具。通过工具条极大方便了用户对程序的操作,但是在由Microsoft Visual C++开发环境所创建的应用程序框架中的工具条只是一个简单的按钮的集合,在功能上也仅仅是起到了菜单快捷方式的作用,而没有做到象VC、Word等软件的工具条那样,提供多种不同类型的标准控件如组合框、编辑框等。尤其是组合框在添加到工具条上后,可将原本需要在弹出对话框中完成的交互操作在工具条上就可以进行,从而在很大程度上改善了应用程序的界面友好程度。本文就此给出一种在普通应用程序的工具条上动态创建组合框、编辑框等标准控件的一般方法,并使应用程序能够响应由这些控件所触发的&&事件。
组合框的添加
组合框是添加到工具条中最常见的一种标准控件,弥补了列表框控件占用较大空间和编辑控件的数据输入烦琐等弊端,可以在工具条的有限区域内提供全部备选数据,用户一般情况下只需通过鼠标操作即可实现对数据的选取。因此,多数情况下都是需要向工具条添加组合框控件来改善程序的界面友好程度的。
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)由于是在工具条上动态创建组合框控件,而工具条又非标准客户区,因此动态创建过程就存在一定的困难。这里的处理方式是先在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消息的&&函数
/