2013年4月17日 星期三

MFC controls//Spin


Spin

這是一個簡單又特別的spin,可以設定buddy(夥伴)可以控制其它的control。



參數設定

參數對話框針對這個控制項的部份在Styles,Extended Styles是通用的(吧?)

Orientation
設定spin的方向。
Alignment
設定spin和buddy control結合方式

剩下的參數用下面的表格解釋[1]
  打勾ˇ  不打勾□ 
Auto buddy 以前一個Tab Order為buddy 前一個Tab Order不為buddy
自訂buddy
Set Buddy interger 自訂buddy
CSpinButtonCtrl::SetBuddy()有效
SetBuddy()無效
No thousands (在Edit中)顯示千位分隔符號 無分隔符
Wrap 循環 到上限或下限停止
Arrow keys 鍵盤方向鍵可控制 鍵盤不可控制
Hot track    
關於spin的init,我只有寫了這樣
BOOL CTestSpinDlg::OnInitDialog()
{
//...
m_spin.SetRange(0, 100);
m_spin.SetBase(16); //16進制表示
m_spin.SetPos(0);
m_spin.SetBuddy(GetDlgItem(IDC_EDIT1)); //該打勾的要打勾
return TRUE; // return TRUE unless you set the focus to a control
}
按了有反應就增加Delta Pos這個函數
Delta指的是"差",判斷方向
Pos指的是"Position",也就是點的位置
不要使用m_spin.GetPos()會得到一個滿大的數字,一樣會改變,只是要歸零。
void CTestSpinDlg::OnDeltaposSpin1(NMHDR* pNMHDR, LRESULT* pResult) 
{
NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
// TODO: Add your control notification handler code here

CWnd* pWnd = (CWnd*)GetDlgItem(IDC_EDIT1);
CString strValue;
pWnd->GetWindowText(strValue);

CString debugpNMHDR, debugpNMUpDown, debugpResult;

CString a, b, c;
a.Format("%x %x\n", pNMUpDown->hdr.hwndFrom, pNMUpDown->hdr);
b.Format("%d %d\n", pNMUpDown->hdr.idFrom , pNMUpDown->iPos);
c.Format("%d %d\n", pNMUpDown->hdr.code , pNMUpDown->iDelta);
//看右邊這個。

CString str;
str.Format("%s%s%s", a, b, c);
m_debugBoard.SetWindowText(str);

*pResult = 0;
}
其中這一行
NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
它的資料結構如下
真正有值的是在NM_UPDOWN* pNMUpDown。
如下圖,右邊的值。


上圖數據中。
pNMUpDown->iPos = 80
pNMUpDown->iDelta = 5
只有這兩個用得到。

心得:


  1. pNMUpDown->iDelta
    值是多少,就是前進一步加(或減)多少,按久了會變大,也就是會加速。
    正負代表方向。
  2. 我試了一下,同時使用Auto buddy和Set buddy interger兩個屬性
    Auto buddy設定成EDIT2有初始化,不會互動
    Set buddy interger設定成EDIT1沒有初始化,會互動。


參考資料:

[1] (转)VC中Spin控件的使用
[2] wince sdk基本控件(一)(Spin微调按钮)

沒有留言:

張貼留言