(转载)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消息的函数 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 工具栏上动态添加组合框等控件的方法的更多相关文章
- VC/MFC 工具栏上动态添加组合框等控件的方法
引言 工具条作为大多数标准的Windows应用程序的一个重要组成部分,使其成为促进人机界面友好的一个重要工具.通过工具条极大方便了用户对程序的操作,但是在由Microsoft Visual C++开发 ...
- winform PictureBox图片上动态添加Label或其他控件
效果图: 代码: //分页或者多次加载时,需要删除之前产生的lable等控件 ; tabID < ; tabID++) { foreach (Control control in this.ta ...
- Android 在程序中动态添加 View 布局或控件
有时我们需要在程序中动态添加布局或控件等,下面用程序来展示一下相应的方法: 1.addView 添加View到布局容器 2.removeView 在布局容器中删掉已有的View 3.LayoutPar ...
- asp.net 动态添加多个用户控件
动态添加多个相同用户控件,并使每个用户控件获取不同的内容. 用户控件代码: 代码WebControls using System; using System.Collections.Generic; ...
- 向ArcGIS的ToolBarControl中添加任意的windows控件的方法
概要:在使用ArcEngine开发中,给ToolbarControl添加按钮形式的命令项相信大家都很熟悉了,因为网上的例子很多.但这种使用click调用功能的方式只能满足大部分用户在体验方面的需求,除 ...
- vue组件上动态添加和删除属性
1.vue组件上动态添加和删除属性 // 添加 this.$set(this.obj, 'propName', val) // 删除 this.$delete(this.obj, 'propName' ...
- VC++ MFC SQL ADO数据库访问技术使用的基本步骤及方法
1.首先,要用#import语句来引用支持ADO的组件类型库(*.tlb),其中类型库可以作为可执行程序 (DLL.EXE等)的一部分被定位在其自身程序中的附属资源里,如:被定位在msado15.dl ...
- ASP.NET#在设计窗口上添加了一个SqlDataSource控件后,没有显示出来?
在设计窗口上添加了一个SqlDataSource控件后,没有显示出来,但后台代码是有的 处理的办法:菜单栏->视图->可视辅助->ASP.NET非可视控件 (我用的是VS2012)
- ASP.NET动态添加用户控件的方法
本文实例讲述了ASP.NET动态添加用户控件的方法.分享给大家供大家参考.具体实现方法如下: 为了让用户控件能ASP.NET页面实现动态添加,首先写一个接口IGetUCable,这个接口有一个函数,返 ...
随机推荐
- SQL的经典操作——批量复制同行的其它列数据到其它列数据
看图说话比较直观: 对比复制前后的数据表: 使用SQL语句:UPDATE OR ROLLBACK Content SET YINBIAO = YINBIAO2, GESHU = GESHU2 WHER ...
- html标签data大写获取不到值:只能小写+横杠命名
html标签data大写获取不到值:只能小写+横杠命名 例如: <i class="glyphicon glyphicon-question-sign" data-tip-t ...
- 如何判断list中是否包含某个元素
在python中可以通过in和not in关键字来判读一个list中是否包含一个元素: str = ['s','i','m','o','n'] if 'e' in str: print("e ...
- php设计模式笔记:单例模式
php设计模式笔记:单例模式 意图: 保证一个类仅有一个实例,并且提供一个全局访问点 单例模式有三个特点: 1.一个类只有一个实例2.它必须自行创建这个实例3.必须自行向整个系统提供这个实例 主要实现 ...
- jinja2 宏的简单使用总结(macro)
Table of Contents 1. 简介 2. 用法 3. 参数和变量 4. 注意事项 4.1. macro的变量只能为如下三种: 4.2. 和block的关系: 5. 参考文档 1 简介 ji ...
- python数据库操作之pymysql模块和sqlalchemy模块(项目必备)
pymysql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同. 1.下载安装 pip3 install pymysql 2.操作数据库 (1).执行sql #! ...
- Linux下find指令
Linux是一个“一切皆文件”的操作系统,find(查找文件)指令就尤为重要了.find命令在目录结构中搜索文件,并执行指定的操作. 1.命令格式: find pathname -options [- ...
- android SurfaceView绘制 重新学习--基础绘制
自从大二写了个android游戏去参加比赛,之后就一直写应用,一直没用过SurfaceView了,现在进入了游戏公司,准备从基础开始重新快速的学一下这个,然后再去研究openGL和游戏引擎. 直接上代 ...
- C语言写解一元二次方程程序心得
前言:在网上看到不少解一元二次方程的小程序,在使用时总得出一大堆小数,感觉很不爽,遂自己重新写了一遍. 首先,先回忆一下一元二次方程的求根公式: 分别读取二次项.一次项和常数项系数并且求出delta ...
- js写分页
jsp:< input value ="1" id ="current" type ="hidden"/> <div id ...