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;

    範圍及當前位置的設定和獲取

    成員函數SetPosSetRange是用來設置一個旋轉按鈕控件的當前位置和範圍,其原型如下:

      int SetPos(int nPos);

    參數nPos表示控件的新位置.這個值必須在控件的上限和下限指定的範圍之內.

      void SetRange(int nLower,int nUpper);
      void SetRange32(int nLower,int nUpper);

    參數nLowernUpper表示控件的上限和下限.任何一個界限值都不能大於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 == 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;

}

 

使用上述做法,後來遇到一個問題:當一直按住上或者下時,增大16個後就不再增大,後來發現,將條件改成大於0和小於0就可以了,大於0表示向上按鈕。

發佈了7 篇原創文章 · 獲贊 2 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章