一个“旋转按钮控件”(也称为上下控件)是一对箭头按钮,用户点击它们来增加或减小一个值,比如一个滚动位置或显示在相应控件中的一个数字。与一个旋转按钮控件相联系的值被称为它的当前位置。一个旋转控件通常是与一个相伴的控件一起使用的,称为“伙伴窗口”。
先创建一个编辑窗口,在创建一个上下控件,把编辑窗口设置为上下控件的伙伴窗口,但是疑问就出来了,设置为伙伴窗口有什么用,其中的上下控件的创建时候的属性
UDS_SETBUDDYINT当位置改变时,使控件设置伙伴窗口的文本(使用WM_SETTEXT消息),文本本是按十进制或十六进制格式化后的位置值。
这个属性又是有什么作用的?我很迷惑==========================
第一
The spin button control (also called an up-down control) provides a pair of arrows that the user can click to adjust a value. This value is called the current position. The position stays within the range of the spin button. When the user clicks the up arrow, the position moves toward the maximum; and when the user clicks the down arrow, the position moves toward the minimum.
The spin button control is represented in MFC by class CSpinButtonCtrl.
Note: |
---|
The default range for the spin button has the maximum set to zero (0) and the minimum set to 100. Since the maximum value is less than the minimum value, clicking the up arrow will decrease the position and clicking the down arrow will increase it. Use CSpinButtonCtrl::SetRange to adjust these values. |
Typically, the current position is displayed in a companion control. The companion control is called the "buddy window." For an illustration of a spin button control, see About Up-Down Controls in the Windows SDK.
DDX_Text(pDX,1016,m_spinint);
//创建一个编辑控件,作为上下按钮控件的伙伴窗口
m_edit.Create(WS_CHILD|WS_VISIBLE,CRect(60,190,120,210),this,1016);
m_spin.Create(UDS_WRAP|WS_CHILD|WS_VISIBLE|UDS_ALIGNRIGHT|UDS_ARROWKEYS,CRect(120,190,130,210),this,1017);
CDialog::OnInitDialog();
说明:
默认的范围是0-100,可以通过调用SetRange函数来改变
构造一个CSpinButtonCtrl对象要分两步。首先调用构造函数,然后调用Create,该函数创建旋转按钮控件并将它与CSpinButtonCtrl对象连接。
可以指定下面的风格给旋转按钮控件:
· | UDS_HORZ | 控件的箭头指向左和右,而不是指向上和下。 |
· | UDS_WRAP | 如果控件的增加或减小超过了结尾或开始,使控件可以“环绕”。 |
· | UDS_ARROWKEYS | 当按下向上和向下键时,使控件可以增加或减小。 |
· | UDS_SETBUDDYINT | 当位置改变时,使控件设置伙伴窗口的文本(使用WM_SETTEXT消息)。文本是按十进制或十六进制格式化后的位置值。 |
· | UDS_NOTHOUSANDS | 不要在每隔三个十进制数字的地方加千分隔符。 |
· | UDS_AUTOBUDDY | 自动选择一个Z-order中的前一个窗口作为控件的伙伴窗口。 |
· | UDS_ALIGNRIGHT | 将旋转按钮窗口定位在伙伴窗口的右边。伙伴窗口的宽度被减小来适应此控件的宽度。 |
· | UDS_ALIGNLEFT | 将旋转按钮窗口定位在伙伴窗口的右边。伙伴窗口被移动到右边,并且它的宽度被减小来适应此控件的宽度。 |
然后当控件按下箭头的时候,会发送UDN_DELETEPOS,添加该消息的响应函数
会在消息映射添加 ON_NOTIFY(UDN_DELTAPOS, 1017, &C控件学习Dlg::OnDeltaposSpin2)
1017为上下按钮的ID,第三个参数为消息响应函数
void C控件学习Dlg::OnDeltaposSpin2(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMUPDOWN pNMUpDown = reinterpret_cast(pNMHDR);
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;
if(pNMUpDown->iDelta>0)
{
pNMUpDown->iPos--;
}
if(pNMUpDown->iDelta<0)
{
pNMUpDown->iPos++;
}
m_spinint=pNMUpDown->iPos;
UpdateData(false);
//SetDlgItemInt(1016,pNMUpDown->iPos,true);
}
通过第一个参数指针转换wieldLPNMUPDOWN型的指针,可以该结构体有三个参数,第一个参数是信息,第二参数是iPos表示滚动条的位置,即是当前的值
第三个参数是iDelta,大于0,表示按了享受按钮,小于0按了向下按钮,
点击向上箭头使当前位置向最大值方向移动,而点击向下箭头使当前位置向最小值的方向移动。缺省的,最小值是100,最大值是0。任何时候,最小值的设置都大于最大值(例如,当使用缺省值时),点击向上箭头减少位置值,而点击向下箭头则增加它。
如果是关联变量的方法显示值的话,那么需要调用UpdateData()函数
还有一种响应方式是响应WM_VSCROLL
这种方式没有试过,贴下网上代码
void CSyssetDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
switch( pScrollBar->GetDlgCtrlID())
{
case IDC_AMAL_SPIN:
{
float nStep=0.1;
CString str;
str.Format("%f",nPos*nStep);
m_AMalEdit.SetWindowText( str );
}
break;
}
}
效果图: