CSpinButtonCtrl

CSpinButtonCtrl 是vc中的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;

套用實例:用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表示向上按鈕。

相關詞條

熱門詞條

聯絡我們