Spin box control本是用于对话框中的控件。但有时需要将它放到工具栏上。VC++ 2008里实现如下:

一、在工具栏上新增一个工具按钮项,资源命名为ID_TOOL_EDIT_TIME。再增加一个工具项,资源命名为ID_TOOL_INTEGRA_TIME。

二、在工程里增加一个新MFC Class,base class选CToolBar,新类命名为CMainToolBar。

三、在MainToolBar.h中声明两个对象:

CSpinButtonCtrl m_wndIntegrationTime;

CEdit m_wndEditTime;

四、在MainFrm.h中加上 #include "MainToolBar.h",然后找到CToolBar m_wndToolBar; 改为CMainToolBar m_wndToolBar;

五、在MainFrm.cpp中,CMainFrame::OnCreate函数里,后面(return TRUE 语句前)前添加:

int index = 0;

RECT rect;

//添加Edit控件

while(m_wndToolBar.GetItemID(index)!=ID_TOOL_EDIT_TIME)

index++;

m_wndToolBar.SetButtonInfo(index, ID_TOOL_EDIT_TIME, TBBS_SEPARATOR, 80);

m_wndToolBar.GetItemRect(index, &rect);

//设置位置,几个数字是调出来的,可以根据自己的情况改变

rect.left+=6;

rect.right+=10;

rect.top+=2;

rect.bottom -= 3;

if(!m_wndToolBar.m_wndEditTime.Create(ES_CENTER | ES_NUMBER |ES_LOWERCASE, rect, &m_wndToolBar, ID_TOOL_EDIT_TIME))                 //创建Edit控件

{

TRACE0("Failed to create spin-box\n");

return FALSE;

}

m_wndToolBar.m_wndEditTime.ShowWindow(SW_SHOW);

//添加Spin box control控件

// 创建并显示控件

if(!m_wndToolBar.m_wndIntegrationTime.Create(UDS_ALIGNRIGHT| UDS_NOTHOUSANDS |UDS_ARROWKEYS |UDS_SETBUDDYINT   , rect, &m_wndToolBar, ID_TOOL_INTEGRA_TIME))

{

TRACE0("Failed to create spin-box\n");

return FALSE;

}

m_wndToolBar.m_wndIntegrationTime.SetBuddy(m_wndToolBar.GetDlgItem(ID_TOOL_EDIT_TIME)); //set the Edit box to be the buddy window

m_wndToolBar.m_wndIntegrationTime.SetRange32(1,100000); //set the Edit time limits

UDACCEL v_accel={0,100};        //set the increasing step

m_wndToolBar.m_wndIntegrationTime.SetAccel(1,&v_accel); //set spin control interval/step to be 100

m_wndToolBar.m_wndIntegrationTime.ShowWindow(SW_SHOW);

六、编译,运行,此时工具栏上出现如下所示的Spin box和Edit Box。

上面语句中的UDACCEL v_accel={0,100};是指定加速键,即按下向上或向下的按钮后,每次增量步长为100,按下键0秒后开始加速。

m_wndToolBar.m_wndIntegrationTime.SetAccel(1,&v_accel);这句使加速设置有效。

注意到,此时的spin box控件是如下所示的2000风格,比较难看。

VC2008在Toolbar里添加XP风格spin box control控件 - freetrain_sk - sk

可根据需要改为XP风格。VS 2005和2008中,如果Project->Property  -- General -- Character Set 为Use Unicode Character Set,那么程序的界面自然就是XP风格,不需要手动添加任何东西。但是如果这里是Use Multi-Byte Character Set,那么就要自己动手加东西了。

1、建一个名为XPStyle.manifest的文件

2、把下面的内容拷到这个文件中

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

<assemblyIdentity

version="1.0.0.0"

processorArchitecture="X86"

type="win32"

/>

<description>Your app description here</description>

<dependency>

<dependentAssembly>

<assemblyIdentity

type="win32"

version="6.0.0.0"

processorArchitecture="X86"

publicKeyToken="6595b64144ccf1df"

language="*"

/>

</dependentAssembly>

</dependency>

</assembly>

3、Project->Add Existing Item...将XPStyle.manifest添加到工程中。

4、Project->***properties-> configuration properties ->Manifest tool->Input and Output->Embed Manifest选no

5、Rebuild.....就可以了。

VC2008在Toolbar里添加XP风格spin box control控件 - freetrain_sk - sk

此时的spin box和edit box其实什么都做不了,因为没有添加消息相应函数。很不幸,ClassWizard上看不到这些消息。所以我们只能写代码添加。由于spin box此时已与edit box是关联控件(buddy window),已实现联动,即spin box值的改变将自动引起edit box相应变化。所以,只需要添加edit box变化时的消息相应函数即可。

首先,在MainFrm.h里声明消息相应函数

protected:

afx_msg void OnEditIntegrationTimeChange();

再在MainFrm.cpp里的消息映射中添加语句

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)

ON_EN_CHANGE(ID_TOOL_EDIT_TIME, &CMainFrame::OnEditIntegrationTimeChange)

END_MESSAGE_MAP()

然后在MainFrm.cpp里加入消息函数的定义

void CMainFrame::OnEditIntegrationTimeChange()

{

//add your own code here

}

最后再次编译,运行。应该是正常工作了。

VC2008在Toolbar里添加XP风格spin box control控件 - freetrain_sk - sk

最后要说明的是,这里是利用了set buddy window功能,利用设置关联窗口实现编辑控件的自动更新变化。也可以稍作修改,不设置关联。添加spin box的消息处理函数,手动添加改变edit box的代码。最简单的spin box消息是UDN_DELTAPOS消息,对应函数映射方式为:

ON_NOTIFY(UDN_DELTAPOS , ID_TOOL_INTEGRA_TIME, &CMainFrame::OnSpinBoxChange)

但是这个消息有个缺点,就是它是在点击spin box上下箭头后,更新spin box value前发出消息的。所以,消息处理函数中得到的值仍是变化前的spin box position值。这样就会导致每次都滞后一个变化。还有一个消息是WM_VSCROLL,但是Windows消息的处理过程就稍复杂了,需要switch(uMsg)判断。所以,推荐最好还是尽量使用上面提到的关联来实现edit box的变化。

有问题请致skpsun@163.com

Reference web pages:

如何在工具栏上添加平面下拉控件:http://www.moon-soft.com/doc/10127.htm

VC中Spin控件的使用:http://www.cnblogs.com/adamite/archive/2008/12/23/1360711.html

使程序具有XP风格:http://www.cppblog.com/zgysx/archive/2006/10/31/14413.aspx

Manifest问题:http://blog.macd.cn/391424/viewspace-3445

Spin Control用法:  http://woshiyouyouchen.blog.163.com/blog/static/1039989420090161029903/

Spin Control使用心得: http://www.cppblog.com/gohan/archive/2008/02/06/42558.aspx

Customizing Toolbars: http://www.codeguru.com/cpp/controls/toolbar/

转载于:https://www.cnblogs.com/BIGFOOT/archive/2010/02/25/1673659.html

【转】VC2008在工具栏Toolbar里添加XP风格spin box control控件相关推荐

  1. MFC high-speed-charting控件使用(添加垂直游标,两个控件的联动)

    MFC high-speed-charting控件使用(添加垂直游标,两个控件的联动) 应用场景 最近参与的一个项目中涉及到在一个对话框中添加两个high-speed-charting控件,在两个控件 ...

  2. java控件数组_java通过复选框控件数组实现添加多个复选框控件示例分享

    思路如下: 创建JPanel面板对象: 使用JPanel类的setLayout(0,4)方法设置网格布局管理器,即列数为4,行数自动调节: 创建一个字符串型一维数组作为控件文本数组: 创建一个JChe ...

  3. java控件数组_java通过复选框控件数组实现添加多个复选框控件

    编写程序,通过复选框控件数组事先选择用户爱好信息的复选框,在该程序中,要求界面中的复选框数量可以根据指定复选框名称的字符串数组的长度来自动调节.方法如下: 创建JPanel面板对象: 使用JPanel ...

  4. java checkbox数组_Java通过复选框控件数组实现添加多个复选框控件

    编写程序,通过复选框控件数组事先选择用户爱好信息的复选框,在该程序中,要求界面中的复选框数量可以根据指定复选框名称的字符串数组的长度来自动调节. 思路如下: 创建JPanel面板对象: 使用JPane ...

  5. MFC List Control 控件添加单元格编辑,实现可编辑重写

    在实现随机生成四则运算的个人项目中,目前已经完成基本功能,想要把程序变成一个Windows界面的程序.原本以为学习过MFC,应该很快就能完成.但是由于以前用的都是VC6.0,这次用了VS2010,稍微 ...

  6. 修改注册表添加信任站点及启用Activex控件(转载)

    // //    添加信息站点及将指定IP添加到本地Intranet中, //    "*"=dword:00000002 表示受信任的站点区域 //    "*&quo ...

  7. vba quit此文件正由另一个应用程序或用户使用_VBA|如何添加外部对象库(或控件)引用来扩展VBA功能...

    VBA是VB的宏语言,基于对象,有大量的内部对象及其属性和方法可以使用,此外,还可以添加外部对象库引用来扩展VBA功能. 例如你在网上找了一个项目的文件,其中有对listview的使用,但你使用这个项 ...

  8. openlayers添加按钮_OpenLayers3加载常用控件使用方法详解

    本文实例为大家分享了OpenLayers3加载常用控件使用的具体代码,供大家参考,具体内容如下 1. 前言 地图控件就是对地图的缩放.全屏.坐标显示控件等,方便我们对地图进行操作.OpenLayers ...

  9. java添加一个复选框_java添加多个复选框控件

    java swing中在jTable中添加多个复选框的方式如下: import java.awt.Component; import java.awt.event.ActionEvent; impor ...

最新文章

  1. 目标定位--Deep Self-Taught Learning for Weakly Supervised Object Localization
  2. jQuery ajax 传递JSON数组到Spring Controller
  3. installshield 安装文件属性的原始文件名 如何修改_iPhone修改微信提示音,iOS12可用,无需越狱详细教程...
  4. 数学之美 系列一 -- 统计语言模型
  5. ListObject 多条件去重
  6. java 多文字水印_Java 如何给Word文档添加多行文字水印
  7. 微软为一人收购一公司?破解索尼程序、写黑客小说,看他彪悍的程序人生!...
  8. 设计模式之adapter模式
  9. 没有文件扩展“.vbs”的脚本引擎的解决方案
  10. monkey测试介绍
  11. 【图像去噪】基于matlab邻域+中值滤波图像去噪【含Matlab源码 961期】
  12. 微信小程序Axure元件库(2021最新版)
  13. 双11,立减¥3554!戴尔官网撩客服砍价带走高性能电脑,速来!
  14. Power Switching ----- Controlling power for power shutoff
  15. 大专生从零开始重新学习c#的第八天
  16. echarts X轴和Y轴不对应(xAxis type time)的用法
  17. OCMJ8X15B金鹏液晶屏驱动程序+字库规律
  18. 电脑显示器基本设置与故障处理
  19. 区块链solidity学习(地址、交易篇:一)
  20. es修改排序_ElasticSearch 评分排序

热门文章

  1. 从入门到退坑,详解数分行业的3个岗位,起薪高达40W的是哪个?
  2. 中小企业如何搭建数据分析平台?
  3. 计算机二级矿大考点哪个校区,计算机二级考点哪个近一点555
  4. linux防火墙为空文件夹,如何记录Linux IPTables防火墙丢弃的数据包到日志文件-linux防火墙设置...
  5. 量化交易策略matlab交易方案,【策略分享】Matlab量化交易策略源码分享
  6. 智能照明c语言程序,基于单片机的智能照明控制系统设计方案(含AD+源代码)...
  7. tomcat 启动需要java环境吗?_三分钟教你Windows环境下,如何设置Tomcat随机自动启动?...
  8. 图片太大_图片太大?手把手教你如何用java实现一个高质量图片压缩程序
  9. centos 创建mysql8数据库给django连接
  10. 卸载干净ssr之后出现无法上网