zoukankan      html  css  js  c++  java
  • MFC Spin 控件

    一般应用:

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

  • 相关阅读:
    事务传播机制,搞懂。
    洛谷 P1553 数字反转(升级版) 题解
    洛谷 P1200 [USACO1.1]你的飞碟在这儿Your Ride Is Here 题解
    洛谷 P1055 ISBN号码 题解
    洛谷 P2141 珠心算测验 题解
    洛谷 P1047 校门外的树 题解
    洛谷 P1980 计数问题 题解
    洛谷 P1008 三连击 题解
    HDU 1013 题解
    HDU 1012 题解
  • 原文地址:https://www.cnblogs.com/UnGeek/p/3584838.html
Copyright © 2011-2022 走看看