設定屬性:
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;
套用實例:用Spin控制項完成對字元的增減
回響UDN_DELTAPOS訊息
旋轉按鈕控制項的訊息UDN_DELTAPOS
表示控制項的位置將要改變
原理 , 重載Spin控制項的UDN_DELTAPOS訊息 , 將會多出如下函式:
void CTestDlg::OnDeltaposSpin3(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
if(pNMUpDown->iDelta > 0) // 如果此值大於0 , 說明點擊了Spin的往下箭頭
{
//對字元做相關處理 , 例如將"a" 變為 "b"
}
else if(pNMUpDown->iDelta < 0) // 如果此值小於0 , 說明點擊了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;
}
使用上述做法,後來遇到一個問題:當一直按住上或者下時,增大16個後就不再增大,後來發現,將條件改成大於0和小於0就可以了,大於0表示向上按鈕。