Spin控件使用总结
不知道為什么每個控件都會為難我很久,然后再突然給我提示使我頓悟,唉,可能真的是VC在考驗我這個懶人吧,呵呵,我雖然比較懶可是有時候還真的很叫真兒的.這不,一個小小的spin控件和我打了一天的太極,終于今天早晨被我降服了,哈哈…. 扭扭屁股,慶祝一下……
?????? 其實spin控件與其它的控件相比,還是比較簡單的,這里我提供一種學(xué)習(xí)這個控件的捷徑.
?????? 幾乎寫mfc程序的時候,標(biāo)準(zhǔn)控件欄給提供的每個控件,都對應(yīng)有一種標(biāo)準(zhǔn)的mfc類,這個控件也不例外,與這個控件對應(yīng)的類名為CSpinButtonCtrl,建議每一位學(xué)習(xí)mfc的人手頭都備一個<MFC類庫詳解>的CHM幫助文檔,每多的東西在這里都可以查到.
?????? 下面紅色字體顯示的是mfc類庫詳解里的說明,我原樣貼過來的,具體的用法,自己跟據(jù)需要研究就可以了.
?
CSpinButtonCtrl
| CObject |
| ?└CCmdTarget |
| ????└CWnd |
| ???????└CSpinButtonCtrl |
一個“旋轉(zhuǎn)按鈕控件”(也稱為上下控件)是一對箭頭按鈕,用戶點擊它們來增加或減小一個值,比如一個滾動位置或顯示在相應(yīng)控件中的一個數(shù)字。與一個旋轉(zhuǎn)按鈕控件相聯(lián)系的值被稱為它的當(dāng)前位置。一個旋轉(zhuǎn)控件通常是與一個相伴的控件一起使用的,稱為“伙伴窗口”。
CSpinButtonCtrl類提供了Windows通用旋轉(zhuǎn)按鈕控件的功能。這個控件(也就是CSpinButtonCtrl類)只對運行在Windows95和Windows NT3.51或更高版本下的程序來說是可用的。
對用戶來說,一個旋轉(zhuǎn)按鈕控件和它的伙伴窗口看起來通常就象一個單一的控件。你可以指定一個旋轉(zhuǎn)按鈕控件自動將它自己定位在它的伙伴窗口的旁邊,并且它自動將它的伙伴窗口的標(biāo)題設(shè)置為它的當(dāng)前位置。可以將一個旋轉(zhuǎn)按鈕控件與一個編輯控件一起使用,以提示用戶進(jìn)行數(shù)字輸入。
點擊向上箭頭使當(dāng)前位置向最大值方向移動,而點擊向下箭頭使當(dāng)前位置向最小值的方向移動。缺省的,最小值是100,最大值是0。任何時候,最小值的設(shè)置都大于最大值(例如,當(dāng)使用缺省值時),點擊向上箭頭減少位置值,而點擊向下箭頭則增加它。
一個沒有伙伴窗口的旋轉(zhuǎn)按鈕控件就象簡化了的滾動條。例如,一個tab控件有時顯示一個旋轉(zhuǎn)按鈕控件來使它的用戶能夠滾動其它的tab進(jìn)入視。
有關(guān)使用CSpinButtonCtrl的更多信息,參見“Visual C++程序員指南”中的“控件主題”和“使用CSpinButtonCtrl”。
#include <afxcmn.h>
請參閱:CSliderCtrl
CSpinButtonCtrl類成員
Construction
| CSpinButtonCtrl | 構(gòu)造一個CSpinButtonCtrl對象 |
| Create | 創(chuàng)建一個旋轉(zhuǎn)按鈕控件并將它連接到一個CSpinButtonCtrl對象 |
Attributes
| SetAccel | 為一個旋轉(zhuǎn)按鈕控件設(shè)置加速 |
| GetAccel | 獲取一個旋轉(zhuǎn)按鈕控件的加速信息 |
| SetBase | 為一個旋轉(zhuǎn)按鈕控件設(shè)置基數(shù) |
| GetBase | 獲取一個旋轉(zhuǎn)按鈕控件的當(dāng)前基數(shù) |
| SetBuddy | 為一個旋轉(zhuǎn)按鈕控件設(shè)置伙伴窗口 |
| GetBuddy | 獲取指向當(dāng)前伙伴窗口的指針 |
| SetPos | 設(shè)置控件的當(dāng)前位置 |
| GetPos | 獲取一個旋轉(zhuǎn)按鈕控件的當(dāng)前位置 |
| SetRange | 設(shè)置一個旋轉(zhuǎn)按鈕控件的上限和下限(范圍) |
| GetRange | 獲取一個旋轉(zhuǎn)按鈕控件的上限和下限(范圍) |
| SetRange32 | 設(shè)置旋轉(zhuǎn)按鈕控件的32位范圍 |
| GetRange32 | 獲取旋轉(zhuǎn)按鈕控件的32位范圍 |
?
?
下面是我自己寫的一個示例:
在我的程序里我用到了兩個函數(shù),SetRange()和SetBuddy().
SetRange()函數(shù)的作用是設(shè)定spin控件向上與向下按鈕所能調(diào)整的最大和最小值.
SetBuddy()函數(shù)選擇一個與spin搭伙的控件,一般選用的是edit
?
1/建立一個mfc對話框類工程,名稱為SpinTest1
2/在對話框窗口里加入一個Edit(ID號為IDC_EDIT_VALUE)和一個spin(ID號為IDC_SPIN_ABC)控件.
為IDC_SPIN_ABC控件建一個關(guān)聯(lián)變量m_abc
3/在CSpinTest1Dlg類的OnInitDialog()里添加下面代碼
?????? m_abc.SetRange(1900,2000);
?????? m_abc.SetBuddy((CWnd *)GetDlgItem(IDC_EDIT_VALUE));
4/你可以根據(jù)需要為Edit控件設(shè)定一個初始值,這樣這個spin控件就基本可以使用了
?
說明:
有關(guān)這個控件,我在網(wǎng)上查了很多的資料,結(jié)果都說的很復(fù)雜,例如,在沒有設(shè)定SetRange()范圍之前,如何運行程序,會發(fā)現(xiàn)點擊向上鍵頭的按鈕,數(shù)值是減少的,反之是增加的,這個問題網(wǎng)上有人還專門用了一個OnDeltaPos*()函數(shù)來解決,而我通過實踐證明,只要設(shè)定了范圍,就可以校正這個問題(當(dāng)然這個只適用于數(shù)值數(shù)據(jù)的方面),網(wǎng)上還有有關(guān)點擊了按鈕之后在edit控件里顯示字符的程序,如果做這樣的程序可能會用到OnDeltaPos*()函數(shù),下面我引用一下有關(guān)這個函數(shù)的添加方法:
旋轉(zhuǎn)按鈕控件的通知消息
??? 旋轉(zhuǎn)按鈕控件的通知消息只有一個:UDN_DELTAPOS,它表示控件的位置將要改變。
用ClassWizard可以映射此消息,在此消息的處理函數(shù)中有個NM_UPDOWN結(jié)構(gòu)需要進(jìn)行
??? 說明,其結(jié)構(gòu)如下:
??? typedef struct _NM_UPDOWN{
??????? NMHDR hdr; //通知代碼的其他信息
??????? int iPos; //當(dāng)前位置
??????? int iDelta; //位置的增減量,單擊向上箭頭此值為負(fù)數(shù)
?? }NMUPDOWN,FAR* LPNMUPDOWN;
應(yīng)用實例:用Spin控件完成對字符的增減
?
響應(yīng)UDN_DELTAPOS消息
旋轉(zhuǎn)按鈕控件的消息UDN_DELTAPOS
表示控件的位置將要改變
原理 , 重載Spin控件的UDN_DELTAPOS消息 , 將會多出如下函數(shù):
void CTestDlg::OnDeltaposSpin3(NMHDR* pNMHDR, LRESULT* pResult)
{
??? NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
??? if(pNMUpDown->iDelta == 1)??????? // 如果此值為1 , 說明點擊了Spin的往下箭頭
??? {
???????? //對字符做相關(guān)處理 , 例如將"a" 變?yōu)?/span>?"b"
??? }
??? else if(pNMUpDown->iDelta == -1) // 如果此值為-1 , 說明點擊了Spin的往上箭頭
??? {
???????? //對字符做相關(guān)處理 , 例如將"b" 變?yōu)?/span>?"a"
??? }
??? *pResult = 0;
}
詳細(xì)做法:
1: 假設(shè)你編輯框為IDC_EDIT , SPIN按鈕為IDC_SPIN .
2: Ctrl + W?, 進(jìn)入Class Wizard , 在Object IDs列選擇IDC_SPIN , 在Messages列選擇UDN_DELTAPOS , 點擊"Add Function" 按鈕.將彈出"OnDeltaposSpin"的對話框 ,點OK 添加這個函數(shù).然后點"Edit Code"?, 進(jìn)入新添加的函數(shù)里 .
3: 將會新添加一個函數(shù).
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);???????????????? //得到編輯框中的內(nèi)容
?
??? 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;
}
使用上述做法,后來遇到一個問題:當(dāng)一直按住上或者下時,增大16個后就不再增大,后來發(fā)現(xiàn),將條件改成大于0和小于0就可以了,大于0表示向上按鈕。
?
?
當(dāng)然上面引用的這個程序,我沒有親自動手試過,不過為了以后備查,我還是添加在這里了.
總結(jié)
以上是生活随笔為你收集整理的Spin控件使用总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php可以支持代码重用技术的命令,Lin
- 下一篇: php实现注销功能,laravel 实现