一般应用:

设置属性:
Auto Buddy(自动取关联控件为TAB顺序前一个)
Set Buddy Interger(使控件设置关联控件数值,这个值可以是十进制或十六进制)
Wrap(数值超过范围时循环)
Arrow keys(当按下向上和向下方向键时,控件可以增加或减小)

OnInitDialog函数中设置控件数值范围:
SetRange(0,255);

旋转按钮控件

“旋转按钮控件”(也称为上下控件)是一对箭头按钮,用户点击它们来增加或减小某个
值,比如一个滚动位置或显示在相应控件中的一个数字。一个旋转控件通常是与一个相伴的
控件一起使用的,这个控件称为“伙伴窗口”。

一个旋转按钮控件可以自动定位在它的伙伴窗口的旁边,看起来就像一个单一的控件。
通常,将一个旋转按钮控件与一个编辑控件一起使用,以提示用户进行数字输入。点击向上
箭头使当前位置向最大值方向移动,而点击向下箭头使当前位置向最小值的方向移动。缺省
时,最小值是100,最大值是0,当用户点击向上箭头则减少数值,而点击向下箭头则增加
它,这看起来就像颠倒一样,因此我们还需使用成员函数CSpinButtonCtrl::SetRange来改变
最大和最小值。

(1)旋转按钮控件常用的风格

旋转按钮控件常用的风格有:

 

UDS_HORZ

控件的箭头指向左和右,而不是指向上和下。

 

UDS_WRAP

若控件的增加或减小超过了结尾或开始,使数值可以“循环”。

 

UDS_ARROWKEYS

当按下向上和向下方向键时,控件可以增加或减小。

 

UDS_SETBUDDYINT

使控件设置伙伴窗口数值,这个值可以是十进制或十六进制。

 

UDS_NOTHOUSANDS

不在每隔三个十进制数字的地方加上千分隔符。

 

UDS_AUTOBUDDY

自动选择一个Z-order中的前一个窗口作为控件的伙伴窗口。

 

UDS_ALIGNRIGHT

将旋转按钮窗口定位在伙伴窗口的右边。伙伴窗口的宽度被减小来适应此控件的宽度。

 

UDS_ALIGNLEFT

将旋转按钮窗口定位在伙伴窗口的右边。伙伴窗口被移动到右边,并且它的宽度被减小来适应此控件的宽度。

这些风格也可通过旋转按钮控件属性对话框来设置,其Styles属性说明如下:

 

.Orientation

控件放置方向:Vedical(垂直)、Hofizontal(水平,同UDS_HORZ)。

 

.Alignment

控件在伙伴窗口的位置安排:Unattached(不相干)、Right(右边,同UDS_ALIGNRIGHT)、Left(左边, 同UDS_ALlGNLEFT)。

 

.Auto buddy

同UDS_AUTOBUDDY。

 

.Set buddy integer

同UDS_SETBUDDYINT。

 

.No thousands

同UDS_NOTHOUSANDS。

 

.Wrap

同UDS_WRAP。

 

.Arrow keys

同UDS_ARROWKEYS。

 

.Hot track

鼠标热点跟踪。

(2)旋转按钮控件的基本操作

基本操作包括基数、范围、位置设置和获取,分别说明如下:

基数的设置和获取

成员函数SetBase是用来设置其基数的,其原型如下:

int SetBase(int nBase);

此成员函数用来设置一个旋转按钮控件的基数.这个基数值决定了伙伴窗口显示的数字是十进制的还
    是十六进制的.十六进制的数总是无符号的;十进制的数是有符号的.如果成功则返回先前的基数值,
    如果给出的是一个无效的基数则返回一个非零值。参数nBase表示控件的新的基数.

与此函数相对应的是获取一个旋转按钮控件的基数的成员函数:UINT GetBase()const;

范围及当前位置的设定和获取

成员函数SetPos、SetRange是用来设置一个旋转按钮控件的当前位置和范围,其原型如下:

int SetPos(int nPos);

参数nPos表示控件的新位置.这个值必须在控件的上限和下限指定的范围之内.

void SetRange(int nLower,int nUpper);
      void SetRange32(int nLower,int nUpper);

参数nLower和nUpper表示控件的上限和下限.任何一个界限值都不能大于UD_MAXVAL或小于
    UD_MINVAL。另外,两个界限值之间的差值必须不超过UD_MAXVAL。成员函数SetRange32为此
    旋转按钮控件设置32位的范围。

与上述函数相对应的成员函数有:

int GetPos()const;
      DWORD GetRange()const;
      void GetRange(int& lower,int& upper)const;
      void GetRange32(int& lower,int& upper)const;

其他操作成员函数

CWnd* SetBuddy(CWnd* pWndBuddy);

此成员函数用来为一个旋转控件设置伙伴窗口。返回值一个指向先前的伙伴窗口的指针。参数
     pWndBuddy表示指向新的伙伴窗口的指针。

BOOL SetAccel(int nAccel,UDACCEL* pAccel);

此成员函数用来设置一个旋转按钮控件的加速。如果成功则返回非零值;否则返回0。参数nAccel表
    示由pAccel指定的UDACCEL结构的数目.pAccel指向一个UDACCEL结构数组的指针,该数组包含了加速
    信息,其结构如下:
    typedef struct{
      UINT nSec;//位置改变前所等待的秒数。
      UINT nInc;//位置增量。
    }UDACCEL,FAR* LPUDACCEL;

与上述函数相对应的成员函数有:

CWnd* GetBuddy()const;
  UINT GetAccel(int nAccel,UDACCEL* pAccel)const;

(3)旋转按钮控件的通知消息

旋转按钮控件的通知消息只有一个:UDN_DELTAPOS,它表示控件的位置将要改变。
用ClassWizard可以映射此消息,在此消息的处理函数中有个NM_UPDOWN结构需要进行

说明,其结构如下:

typedef struct _NM_UPDOWN{
        NMHDR hdr; //通知代码的其他信息
        int iPos; //当前位置
        int iDelta; //位置的增减量,单击向上箭头此值为负数
   }NMUPDOWN,FAR* LPNMUPDOWN;

///////////////////////////////////////////////////////////////////////////////////

响应UDN_DELTAPOS消息

旋转按钮控件的消息UDN_DELTAPOS

表示控件的位置将要改变

原理 , 重载Spin控件的UDN_DELTAPOS消息 , 将会多出如下函数:

void CTestDlg::OnDeltaposSpin3(NMHDR* pNMHDR, LRESULT* pResult)

{

NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;

if(pNMUpDown->iDelta == 1)        // 如果此值为1 , 说明点击了Spin的往下箭头

{

//对字符做相关处理 , 例如将"a" 变为  "b"

}

else if(pNMUpDown->iDelta == -1) // 如果此值为-1 , 说明点击了Spin的往上箭头

{

//对字符做相关处理 , 例如将"b" 变为  "a"

}

*pResult = 0;

}

详细做法:

1: 假设你编辑框为IDC_EDIT , SPIN按钮为IDC_SPIN .

2: Ctrl + W  , 进入Class Wizard , 在Object IDs列选择IDC_SPIN , 在Messages列选择UDN_DELTAPOS , 点击"Add Function" 按钮.将弹出"OnDeltaposSpin"的对话框 ,点OK 添加这个函数.然后点"Edit Code"  , 进入新添加的函数里 .

3: 将会新添加一个函数.

void CTestDlg::OnDeltaposSpin(NMHDR* pNMHDR, LRESULT* pResult) . . .

4: 添加如下代码:

void CTestDlg::OnDeltaposSpin(NMHDR* pNMHDR, LRESULT* pResult)

{

NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;

CWnd* pWnd = (CWnd*)GetDlgItem(IDC_EDIT);    //得到指向编辑框的窗口指针

CString strValue ;

pWnd->GetWindowText(strValue);                 //得到编辑框中的内容

if(pNMUpDown->iDelta == 1)                    //如果点击的是Spin中的往上按钮

{

if(!strValue.IsEmpty())

{

strValue.SetAt(0 , strValue[0] + 1);   //编辑框首字母加1

pWnd->SetWindowText(strValue);         //保存修改

}

}

else if(pNMUpDown->iDelta == - 1)    //如果点击的是Spin中往下按钮

{

if(!strValue.IsEmpty())

{

strValue.SetAt(0 , strValue[0] - 1);   //编辑框首字母减1

pWnd->SetWindowText(strValue);         //保存修改

}

}

*pResult = 0;

}

//////////////////////////////////////////////////////////////////////

数值调节钮控件 (Spin Control)(也称为 up-down 控件)提供一对箭头键,用户可以单击它们来调整数值。该值称为当前位置。该位置保持在数值调节钮范围内。当用户单击上箭头键,该位置移向最大值;当用户单击下箭头键,该位置移向最小值。

数值调节钮控件 (Spin Control) 在 MFC 中由类 CSpinButtonCtrl 表示。

注意    数值调节钮的默认范围为最大设置到零 (0) 和最小设置到 100。由于最大值小于最小值,因此单击上箭头键将减小位置,而单击下箭头键将增大位置。用 CSpinButtonCtrl::SetRange 调整这些值。

一般情况下,当前位置显示在同伴控件中。同伴控件称为“合作者窗口”。有关数值调节钮控件 (Spin Control)的说明信息,请参见 Platform SDK 中的关于 Up-Down 控件。

数值调节钮样式

数值调节钮 (CSpinButtonCtrl) 的许多设置由样式控制。可以用对话框编辑器中的“属性”窗口设置下列样式。

  • 方向    “垂直”或者“水平”。控制箭头按钮的方向。与 UDS_HORZ 样式相关联。
  • 对齐    “取消附加”、“左”和“右”中的一个。控制数值调节钮的位置。合作者窗口旁边的数值调节钮的“左”位置和“右”位置。合作者窗口的宽度将减小以适应数值调节钮。与 UDS_ALIGNLEFTUDS_ALIGNRIGHT 样式相关联。
  • 自动合作者    自动以 Z 顺序选择上一窗口作为数值调节钮的合作者窗口。在对话框模板上,这是以 Tab 键顺序在数值调节钮之前的控件。与 UDS_AUTOBUDDY 样式相关联。
  • 设置合作者整数    导致数值调节钮控件 (Spin Control) 随当前位置的更改而增大和减小合作者窗口的标题。与 UDS_SETBUDDYINT 样式相关联。
  • 无千位分隔符    不在合作者窗口标题的数值中插入千位分隔符。与 UDS_NOTHOUSANDS 样式相关联。

    注意    若要用对话框数据交换 (DDX) 从合作者控件中获取整数值,请设置该样式。DDX_Text 不接受嵌入的千位分隔符。

  • 换行    当增大或减小的数值超出了控件范围时导致位置“换行”。与 UDS_WRAP 样式相关联。
  • 箭头键    当按下上箭头键和下箭头键时导致数值调节钮增大或减小位置。与 UDS_ARROWKEYS 样式相关联。

数值调节钮成员函数

有几个成员函数可用于数值调节钮控件 (Spin Control) (CSpinButtonCtrl)。使用这些函数更改数值调节钮的下列属性。

  • 加速    可以调整用户按下箭头按钮时位置更改的速率。若要使用加速,请使用 SetAccel 和 GetAccel 成员函数。
  • 基数    可以更改用于在合作者窗口标题中显示位置的基数(10 或 16)。若要使用基数,请使用 GetBase 和 SetBase 成员函数。
  • 合作者窗口    可以动态设置合作者窗口。若要查询或更改作为合作者窗口的控件,请使用 GetBuddy 和 SetBuddy 成员函数。
  • 位置    可以查询和更改位置。若要直接处理位置,请使用 GetPos 和 SetPos 成员函数。由于合作者控件的标题可能已经更改(例如,在合作者为编辑控件 (Edit Control) 的情况下),所以 GetPos 检索当前标题并相应地调整位置。
  • 范围    可以更改数值调节钮的最大和最小位置。默认情况下,最大值设置为 0,最小值设置为 100。由于默认最大值小于默认最小值,所以箭头按钮的操作正好与直觉相反。一般情况下,用 SetRange 成员函数设置范围。若要查询范围,请使用 GetRange。

///////////////////////////////////////////////////////

VC旋转控件测试的时候老是报错,原因是,勾选了属性里的自动结伴整数,而代码里没有设置(或者说与之结伴的编辑框没有设置整数),导致出错,先取消,即可。

MFC Spin 控件的更多相关文章

  1. 发布MFC ActiveX控件并实现自动更新

    一.        引言 上一篇我们讲了如何使用 VC 2005来开发 MFC ActiveX控件,我们开发 ActiveX控件最终目的是将 ActiveX控件发布出来并嵌入在 Web网页中,随着控件 ...

  2. 如何将 MFC ActiveX 控件标记为安全,脚本和初始化

    MSDN原文.ActiveX控件标记安全(可以不仅仅是MFC ActiveX) 概要 默认情况下,MFC ActiveX 控件未标记为对脚本编写是安全的和对初始化是安全的.控制运行在 Internet ...

  3. MFC TabCtrl 控件修改标签尺寸

    注意:无论那种方法,都要先设置Tab控件的Style属性为fixed width. 第一种方法 MFC,tabcontrol控件改变标签大小 - CSDN博客 https://blog.csdn.ne ...

  4. vs2010开发activex(MFC)控件/ie插件(一)

    原文:http://blog.csdn.net/yhhyhhyhhyhh/article/details/50782904  vs2010开发activex(MFC)控件:      第一步:生成ac ...

  5. MFC 改变控件的大小和位置

    mfc 改变控件大小和位置用到的函数: ) void MoveWindow(int x, int y, int nWidth, int nHeight); ) void MoveWindow(LPCR ...

  6. 开发ActiveX控件调用另一个ActiveX系列1——开发一个MFC ActiveX控件

    ActiveX开发的教程有很多,我也从中受益匪浅,例如以下这几篇: 基本教程:http://www.cnblogs.com/guenli/articles/1629915.html 注意事项:http ...

  7. VS2008/MFC —常用控件使用总结 转载

    在公司培训期间,经理给了我们没人10个界面草图,让我们在VS2008下使用MFC设计,因为在经理的帮助和自己的努力下,终于在三天时间内完成,现在就根据在这三天 时间里所用到的控件做出如下总结: 1.D ...

  8. MFC 对话框控件自动布局

    MFC 设计界面程序总是不够智能,没有这样,没有那样. 今天为了加强mfc功能,设计了一个自动布局的类,使用非常简单. 原理: 每个控件都有一个矩形区域,矩形区域就是控件在对话框中的显示位置和大小, ...

  9. MFC各种控件的常见操作(逐步添加中......)

    由于经常切换系统或界面框架进行编程,难免有时会忘记之前的编程函数等等.所有在此自己做一个备份,以防止重新充电带来的痛苦! 1.CButton 1.1 在VC中编程实现按钮的启用(enable)和禁用( ...

随机推荐

  1. C语言 · 逆序排列

    算法提高 逆序排列   时间限制:1.0s   内存限制:512.0MB      问题描述 编写一个程序,读入一组整数(不超过20个),并把它们保存在一个整型数组中.当用户输入0时,表示输入结束.然 ...

  2. STM32F1_常见外设资源汇总

    前言 STM32F1系列芯片算是在STM32中最早的一系列,在实际生活中应用的比较广泛.因此,汇总一下STM32F1系列芯片常见片内资源,每一篇文章把重点提出来讲解,并提供软件源代码工程. 汇总常见资 ...

  3. Linux上的free命令简介

    每次使用free时都比较迷惑,对于上面的内容一直都不是很清楚,今天仔细查了以下,和大家一起分享以下: 先看一下free的运行结果: free打印出的内存信息主要分为两种,一种是安装的内存,一种是用磁盘 ...

  4. xubuntu14.04下编译pjsip及pjsua2 java

    Run "./configure" without any options to let the script detect the appropriate settings fo ...

  5. css样式整理

    字体属性:(font) 大小 {font-size: x-large;}(特大) xx-small;(极小) 一般中文用不到,只要用数值就可以,单位:PX.PD 样式 {font-style: obl ...

  6. tensorflow 保存训练模型ckpt 查看ckpt文件中的变量名和对应值

    TensorFlow 模型保存与恢复 一个快速完整的教程,以保存和恢复Tensorflow模型. 在本教程中,我将会解释: TensorFlow模型是什么样的? 如何保存TensorFlow模型? 如 ...

  7. 【BZOJ】1045: [HAOI2008]糖果传递(中位数)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1045 白书上有讲 没ac的坑点在,数据范围n<=1,000,000 #include < ...

  8. ie中自动识别单屏与双屏(js)

    <!DOCTYPE html> <html> <head> <meta name="viewport" content="wid ...

  9. request Dispatch

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletExcepti ...

  10. log4net写txt日志

    1.配置: <configSections>节点下添加: <section name="log4net" type="log4net.Config.Lo ...