引言

  工具条作为大多数标准的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/MFC 工具栏上动态添加组合框等控件的方法的更多相关文章

  1. VC/MFC 工具栏上动态添加组合框等控件的方法

    引言 工具条作为大多数标准的Windows应用程序的一个重要组成部分,使其成为促进人机界面友好的一个重要工具.通过工具条极大方便了用户对程序的操作,但是在由Microsoft Visual C++开发 ...

  2. winform PictureBox图片上动态添加Label或其他控件

    效果图: 代码: //分页或者多次加载时,需要删除之前产生的lable等控件 ; tabID < ; tabID++) { foreach (Control control in this.ta ...

  3. Android 在程序中动态添加 View 布局或控件

    有时我们需要在程序中动态添加布局或控件等,下面用程序来展示一下相应的方法: 1.addView 添加View到布局容器 2.removeView 在布局容器中删掉已有的View 3.LayoutPar ...

  4. asp.net 动态添加多个用户控件

    动态添加多个相同用户控件,并使每个用户控件获取不同的内容. 用户控件代码: 代码WebControls using System; using System.Collections.Generic;  ...

  5. 向ArcGIS的ToolBarControl中添加任意的windows控件的方法

    概要:在使用ArcEngine开发中,给ToolbarControl添加按钮形式的命令项相信大家都很熟悉了,因为网上的例子很多.但这种使用click调用功能的方式只能满足大部分用户在体验方面的需求,除 ...

  6. vue组件上动态添加和删除属性

    1.vue组件上动态添加和删除属性 // 添加 this.$set(this.obj, 'propName', val) // 删除 this.$delete(this.obj, 'propName' ...

  7. VC++ MFC SQL ADO数据库访问技术使用的基本步骤及方法

    1.首先,要用#import语句来引用支持ADO的组件类型库(*.tlb),其中类型库可以作为可执行程序 (DLL.EXE等)的一部分被定位在其自身程序中的附属资源里,如:被定位在msado15.dl ...

  8. ASP.NET#在设计窗口上添加了一个SqlDataSource控件后,没有显示出来?

    在设计窗口上添加了一个SqlDataSource控件后,没有显示出来,但后台代码是有的 处理的办法:菜单栏->视图->可视辅助->ASP.NET非可视控件 (我用的是VS2012)

  9. ASP.NET动态添加用户控件的方法

    本文实例讲述了ASP.NET动态添加用户控件的方法.分享给大家供大家参考.具体实现方法如下: 为了让用户控件能ASP.NET页面实现动态添加,首先写一个接口IGetUCable,这个接口有一个函数,返 ...

随机推荐

  1. Codevs 4600 [NOI2015]程序自动分析

    4600 [NOI2015]程序自动分析 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 传送门 题目描述 Description 在实现程序自动分析的过程中,常常需 ...

  2. jquery 之事件 多库共存(noConflict)

    /*jquery 之 简单事件jquery 与其它库共存,提供了 .noConflict() 方法,用法如下<script src="jquery 库"><scr ...

  3. yii之srbac详解

    一.安装篇 1.下载http://www.yiiframework.com/extension/srbac/ 将解压得到的srbac文件夹放在moudles目录下. 2.在项目的主配置文件中mai.p ...

  4. C#语言特性-运算符重载

    一.C#当中可以进行重载和不可重载的运算符: 1.简单的说明: 1.从上图中可以看到,可以重载的和不可以进行重载的运算符,比较特殊的是第二行和倒数第三行,的运算符,为什么会说它们特殊,是因为(第三行) ...

  5. __construct()和__initialize()

    ThinkPHP中的__initialize()和类的构造函数__construct()网上有很多关于__initialize()的说法和用法,总感觉不对头,所以自己测试了一下.将结果和大家分享.不对 ...

  6. osg学习笔记3 简单几何模型

    osg::Geode (geometry node) osg::Geode类表示场景中的渲染几何叶节点,它包含了渲染用的几何信息,没有子节点. 要绘制的几何数据保存在osg::Geode管理的一组os ...

  7. sqlsever2008数据库的备份与还原

    本文数据库的名称为ProjectControl  public static SqlConnection conn = new SqlConnection("server=(local);u ...

  8. Sql server中DateDiff用法【转】

    记录下来.每次使用都忘记.... DATEDIFF 函数 [日期和时间] 功能 返回两个日期之间的间隔. 语法 DATEDIFF ( date-part, date-expression-1, dat ...

  9. 关于ADMM的研究(一)

    关于ADMM的研究(一) 最近在研究正则化框架如何应用在大数据平台上.找到了<Distributed Optimization and Statistical Learning via the ...

  10. 【网络流24题】No.19 负载平衡问题 (费用流)

    [题意] G 公司有 n 个沿铁路运输线环形排列的仓库, 每个仓库存储的货物数量不等. 如何用最少搬运量可以使 n 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运. 输入文件示例input ...