不知道爲什麼每個控件都會爲難我很久,然後再突然給我提示使我頓悟,唉,可能真的是VC在考驗我這個懶人吧,呵呵,我雖然比較懶可是有時候還真的很叫真兒的.這不,一個小小的spin控件和我打了一天的太極,終於今天早晨被我降服了,哈哈…. 扭扭屁股,慶祝一下……
其實spin控件與其它的控件相比,還是比較簡單的,這裏我提供一種學習這個控件的捷徑.
幾乎寫mfc程序的時候,標準控件欄給提供的每個控件,都對應有一種標準的mfc類,這個控件也不例外,與這個控件對應的類名爲CSpinButtonCtrl,建議每一位學習mfc的人手頭都備一個<MFC類庫詳解>的CHM幫助文檔,每多的東西在這裏都可以查到.
下面顯示的是mfc類庫詳解裏的說明,我原樣貼過來的,具體的用法,自己跟據需要研究就可以了.
CSpinButtonCtrl
└CWnd |
└CSpinButtonCtrl |
一個“旋轉按鈕控件”(也稱爲上下控件)是一對箭頭按鈕,用戶點擊它們來增加或減小一個值,比如一個滾動位置或顯示在相應控件中的一個數字。與一個旋轉按鈕控件相聯繫的值被稱爲它的當前位置。一個旋轉控件通常是與一個相伴的控件一起使用的,稱爲“夥伴窗口”。
CSpinButtonCtrl類提供了Windows通用旋轉按鈕控件的功能。這個控件(也就是CSpinButtonCtrl類)只對運行在Windows95和Windows NT3.51或更高版本下的程序來說是可用的。
對用戶來說,一個旋轉按鈕控件和它的夥伴窗口看起來通常就象一個單一的控件。你可以指定一個旋轉按鈕控件自動將它自己定位在它的夥伴窗口的旁邊,並且它自動將它的夥伴窗口的標題設置爲它的當前位置。可以將一個旋轉按鈕控件與一個編輯控件一起使用,以提示用戶進行數字輸入。
點擊向上箭頭使當前位置向最大值方向移動,而點擊向下箭頭使當前位置向最小值的方向移動。缺省的,最小值是100,最大值是0。任何時候,最小值的設置都大於最大值(例如,當使用缺省值時),點擊向上箭頭減少位置值,而點擊向下箭頭則增加它。
一個沒有夥伴窗口的旋轉按鈕控件就象簡化了的滾動條。例如,一個tab控件有時顯示一個旋轉按鈕控件來使它的用戶能夠滾動其它的tab進入視。
有關使用CSpinButtonCtrl的更多信息,參見“VisualC++程序員指南”中的“控件主題”和“使用CSpinButtonCtrl”。
#include <afxcmn.h>
請參閱:CSliderCtrl
CSpinButtonCtrl類成員
Construction
構造一個CSpinButtonCtrl對象 |
|
創建一個旋轉按鈕控件並將它連接到一個CSpinButtonCtrl對象 |
Attributes
爲一個旋轉按鈕控件設置加速 |
|
獲取一個旋轉按鈕控件的加速信息 |
|
爲一個旋轉按鈕控件設置基數 |
|
獲取一個旋轉按鈕控件的當前基數 |
|
爲一個旋轉按鈕控件設置夥伴窗口 |
|
獲取指向當前夥伴窗口的指針 |
|
設置控件的當前位置 |
|
獲取一個旋轉按鈕控件的當前位置 |
|
設置一個旋轉按鈕控件的上限和下限(範圍) |
|
獲取一個旋轉按鈕控件的上限和下限(範圍) |
|
設置旋轉按鈕控件的32位範圍 |
|
獲取旋轉按鈕控件的32位範圍 |
下面是我自己寫的一個示例:
在我的程序裏我用到了兩個函數,SetRange()和SetBuddy().
SetRange()函數的作用是設定spin控件向上與向下按鈕所能調整的最大和最小值.
SetBuddy()函數選擇一個與spin搭夥的控件,一般選用的是edit
1\建立一個mfc對話框類工程,名稱爲SpinTest1
2\在對話框窗口裏加入一個Edit(ID號爲IDC_EDIT_VALUE)和一個spin(ID號爲IDC_SPIN_ABC)控件.
爲IDC_SPIN_ABC控件建一個關聯變量m_abc
3\在CSpinTest1Dlg類的OnInitDialog()裏添加下面代碼
m_abc.SetRange(1900,2000);
m_abc.SetBuddy((CWnd*)GetDlgItem(IDC_EDIT_VALUE));
4\你可以根據需要爲Edit控件設定一個初始值,這樣這個spin控件就基本可以使用了
說明:
有關這個控件,我在網上查了很多的資料,結果都說的很複雜,例如,在沒有設定SetRange()範圍之前,如何運行程序,會發現點擊向上鍵頭的按鈕,數值是減少的,反之是增加的,這個問題網上有人還專門用了一個OnDeltaPos*()函數來解決,而我通過實踐證明,只要設定了範圍,就可以校正這個問題(當然這個只適用於數值數據的方面),網上還有有關點擊了按鈕之後在edit控件裏顯示字符的程序,如果做這樣的程序可能會用到OnDeltaPos*()函數,下面我引用一下有關這個函數的添加方法:
旋轉按鈕控件的通知消息
旋轉按鈕控件的通知消息只有一個: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"
}
elseif(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 , 點擊"AddFunction" 按鈕.將彈出"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表示向上按鈕。
當然上面引用的這個程序,我沒有親自動手試過,不過爲了以後備查,我還是添加在這裏了.
注: 第一:edit與spin的順序號必須連着.
第二: 一定要注意spin屬性頁裏屬性的選擇