Spin控件使用总结
不知道为什么每个控件都会为难我很久,然后再突然给我提示使我顿悟,唉,可能真的是VC在考验我这个懒人吧,呵呵,我虽然比较懒可是有时候还真的很叫真儿的.这不,一个小小的spin控件和我打了一天的太极,终于今天早晨被我降服了,哈哈…. 扭扭屁股,庆祝一下……
其实spin控件与其它的控件相比,还是比较简单的,这里我提供一种学习这个控件的捷径.
几乎写mfc程序的时候,标准控件栏给提供的每个控件,都对应有一种标准的mfc类,这个控件也不例外,与这个控件对应的类名为CSpinButtonCtrl,建议每一位学习mfc的人手头都备一个<MFC类库详解>的CHM帮助文档,每多的东西在这里都可以查到.
下面显示的是mfc类库详解里的说明,我原样贴过来的,具体的用法,自己跟据需要研究就可以了.
CSpinButtonCtrl
└CWnd |
└CSpinButtonCtrl |
一个“旋转按钮控件”(也称为上下控件)是一对箭头按钮,用户点击它们来增加或减小一个值,比如一个滚动位置或显示在相应控件中的一个数字。与一个旋转按钮控件相联系的值被称为它的当前位置。一个旋转控件通常是与一个相伴的控件一起使用的,称为“伙伴窗口”。
CSpinButtonCtrl类提供了Windows通用旋转按钮控件的功能。这个控件(也就是CSpinButtonCtrl类)只对运行在Windows95和Windows NT3.51或更高版本下的程序来说是可用的。
对用户来说,一个旋转按钮控件和它的伙伴窗口看起来通常就象一个单一的控件。你可以指定一个旋转按钮控件自动将它自己定位在它的伙伴窗口的旁边,并且它自动将它的伙伴窗口的标题设置为它的当前位置。可以将一个旋转按钮控件与一个编辑控件一起使用,以提示用户进行数字输入。
点击向上箭头使当前位置向最大值方向移动,而点击向下箭头使当前位置向最小值的方向移动。缺省的,最小值是100,最大值是0。任何时候,最小值的设置都大于最大值(例如,当使用缺省值时),点击向上箭头减少位置值,而点击向下箭头则增加它。
一个没有伙伴窗口的旋转按钮控件就象简化了的滚动条。例如,一个tab控件有时显示一个旋转按钮控件来使它的用户能够滚动其它的tab进入视。
有关使用CSpinButtonCtrl的更多信息,参见“VisualC++程序员指南”中的“控件主题”和“使用CSpinButtonCtrl”。
#include <afxcmn.h>
请参阅:CSliderCtrl
CSpinButtonCtrl类成员
Construction
构造一个CSpinButtonCtrl对象 | |
创建一个旋转按钮控件并将它连接到一个CSpinButtonCtrl对象 |
Attributes
为一个旋转按钮控件设置加速 | |
获取一个旋转按钮控件的加速信息 | |
为一个旋转按钮控件设置基数 | |
获取一个旋转按钮控件的当前基数 | |
为一个旋转按钮控件设置伙伴窗口 | |
获取指向当前伙伴窗口的指针 | |
设置控件的当前位置 | |
获取一个旋转按钮控件的当前位置 | |
设置一个旋转按钮控件的上限和下限(范围) | |
获取一个旋转按钮控件的上限和下限(范围) | |
设置旋转按钮控件的32位范围 | |
获取旋转按钮控件的32位范围 |
下面是我自己写的一个示例:
在我的程序里我用到了两个函数,SetRange()和SetBuddy().
SetRange()函数的作用是设定spin控件向上与向下按钮所能调整的最大和最小值.
SetBuddy()函数选择一个与spin搭伙的控件,一般选用的是edit
1\建立一个mfc对话框类工程,名称为SpinTest1
2\在对话框窗口里加入一个Edit(ID号为IDC_EDIT_VALUE)和一个spin(ID号为IDC_SPIN_ABC)控件.
为IDC_SPIN_ABC控件建一个关联变量m_abc
3\在CSpinTest1Dlg类的OnInitDialog()里添加下面代码
m_abc.SetRange(1900,2000);
m_abc.SetBuddy((CWnd*)GetDlgItem(IDC_EDIT_VALUE));
4\你可以根据需要为Edit控件设定一个初始值,这样这个spin控件就基本可以使用了
说明:
有关这个控件,我在网上查了很多的资料,结果都说的很复杂,例如,在没有设定SetRange()范围之前,如何运行程序,会发现点击向上键头的按钮,数值是减少的,反之是增加的,这个问题网上有人还专门用了一个OnDeltaPos*()函数来解决,而我通过实践证明,只要设定了范围,就可以校正这个问题(当然这个只适用于数值数据的方面),网上还有有关点击了按钮之后在edit控件里显示字符的程序,如果做这样的程序可能会用到OnDeltaPos*()函数,下面我引用一下有关这个函数的添加方法:
旋转按钮控件的通知消息
旋转按钮控件的通知消息只有一个:UDN_DELTAPOS,它表示控件的位置将要改变。
用ClassWizard可以映射此消息,在此消息的处理函数中有个NM_UPDOWN结构需要进行
说明,其结构如下:
typedef struct_NM_UPDOWN{
NMHDR hdr; //通知代码的其他信息
int iPos; //当前位置
int iDelta; //位置的增减量,单击向上箭头此值为负数
}NMUPDOWN,FAR* LPNMUPDOWN;
应用实例:用Spin控件完成对字符的增减
响应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"
}
elseif(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 , 点击"AddFunction" 按钮.将弹出"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;
}
使用上述做法,后来遇到一个问题:当一直按住上或者下时,增大16个后就不再增大,后来发现,将条件改成大于0和小于0就可以了,大于0表示向上按钮。
当然上面引用的这个程序,我没有亲自动手试过,不过为了以后备查,我还是添加在这里了.
注: 第一:edit与spin的顺序号必须连着.
第二: 一定要注意spin属性页里属性的选择