建立spin控件,创建UDN_DELTAPOS一个消息函数后:
void CSpinDlg::OnDeltaposSpin1(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
// TODO: Add your control notification handler code here
*pResult = 0;
}
问题1:参数NMHDR* pNMHDR, LRESULT* pResult干嘛用?
NMHDR结构体,查看MSDN,经过应用,其意义如下
typedef struct tagNMHDR { HWND hwndFrom; //控件的句柄 UINT idFrom; //控件的ID号 UINT code; //通知代码,即消息类型 } NMHDR; ID号很好知道,创建的时候就有分配了一个ID,如IDC_SPIN1
通知代码,既消息类型,也可以知道该消息是UDN_DELTAPOS 控件句柄呢,马上开始想到经常用的CWnd* GetDlgItem( int nID ),然而该函数返回的是一个指针对象,并不是句柄。可以用SDK 平台函数:返回是指定控件的句柄
HWND GetDlgItem(
HWND hDlg, // handle of dialog box 对话框窗口句柄
int nIDDlgItem // identifier of control 控件标示符,即ID
);
可以执行下代码,验证是否正确
void CSpinDlg::OnDeltaposSpin1(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
HWND hwnd;
hwnd = ::GetDlgItem(m_hWnd,IDC_SPIN1); //注意写法 m_hWnd是对话框窗口句柄,父窗口
if ((pNMHDR->idFrom == IDC_SPIN1) && (pNMHDR->code == UDN_DELTAPOS) && (pNMHDR->hwndFrom == hwnd))
{
MessageBox("Spin down","Spin",MB_OK);
}
*pResult = 0;
}
当你点击Spin按钮时,弹出对话框,提示Spin down,说明是对的。
问题2:NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR; 为什么这样写,目的是干嘛呢?
首先知道NM_UPDOWN是NMUPDOWN结构体名的宏,把pNMHDR强制转化为该类型,该结构体如下
typedef struct _NM_UPDOWN { NMHDR hdr; //NMHDR structure that contains additional information about the notification message. int iPos; //该控件当前值 int iDelta; //用该值确认是往上加,还是往下减 } NMUPDOWN, FAR *LPNMUPDOWN;
在BOOL CSpinDlg::OnInitDialog()函数中加入下面几行代码,进行初始化
CSpinButtonCtrl *pSpin = (CSpinButtonCtrl *)GetDlgItem(IDC_SPIN1);
// pSpin->SetRange(100, 0); //按上面的箭头是减,按下面的箭头是加
pSpin->SetRange(0, 100); //按上面的箭头是加,按下面的箭头是减
pSpin->SetBase(10); //按十进制方式
pSpin->SetPos(8); //把当前值设置为8
然后在void CSpinDlg::OnDeltaposSpin1(NMHDR* pNMHDR, LRESULT* pResult) 加上验证代码
void CSpinDlg::OnDeltaposSpin1(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
HWND hwnd;
hwnd = ::GetDlgItem(m_hWnd,IDC_SPIN1);
if ((pNMHDR->idFrom == IDC_SPIN1) && (pNMHDR->code == UDN_DELTAPOS) && (pNMHDR->hwndFrom == hwnd))
{
MessageBox("Spin down","Spin",MB_OK); //写法1
}
if ((pNMUpDown->hdr.idFrom == IDC_SPIN1)&& (pNMUpDown->hdr.code == UDN_DELTAPOS) && (pNMUpDown->hdr.hwndFrom == hwnd))
{
MessageBox("Spin down too","Spin",MB_OK); //写法2
}
if (pNMUpDown->iPos == 8)
{
MessageBox("当前值是8","Spin",MB_OK);
}
if(pNMUpDown->iDelta == 1)
{
MessageBox("加1","Spin",MB_OK);
}
if(pNMUpDown->iDelta == -1)
{
MessageBox("减-1","Spin",MB_OK);
}
*pResult = 0;
}
可以逐步验证每个成员的意义是否正确,其中写法1和写法2是结果是相同的。
问题3:NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR
该函数中的两个不同类型结构体,经强制转换赋给另外一个结构体,最终两结构体都占用同快内存吗?还有pNMHDR里的成员会怎么传递呢?
待解............