首页 > 其他 > 详细

MFC中的NMHDR结构体

时间:2014-06-17 13:23:11      阅读:850      评论:0      收藏:0      [点我收藏+]

建立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里的成员会怎么传递呢?

待解............

MFC中的NMHDR结构体,布布扣,bubuko.com

MFC中的NMHDR结构体

原文:http://www.cnblogs.com/wen2376/p/3791666.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!