MFC中的NMHDR结构体

建立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

时间: 2024-08-03 11:21:49

MFC中的NMHDR结构体的相关文章

C中多变的结构体 struct typedef

 这几天看代码,看到几种类型的结构体,结构声明如下: struct    book{ string name; int price; int num; }; 此种结构定义结构变量的格式如下: struct    book      student; struct      book{ string name; int price; int num; }student; 此种形式代表声明结构的过程和定义结构变量的过程被合并成一步 typedef    struct  (book){   //b

Objective-C中常用的结构体NSRange,NSPoint,NSSize(CGSize),NSRect

1   NSRange NSRange 的原型为 typedef struct _NSRange { NSUInteger location; NSUInteger length; } NSRange; NSMakeRange的函数 NS_INLINEz是内联函数 typedef NSRange *NSRangePointer; NS_INLINE NSRange NSMakeRange(NSUInteger loc, NSUInteger len) { NSRange r; r.locatio

ffmpeg中对AVInputFormat结构体中函数的调用

http://blog.csdn.net/junllee/article/details/7722605 opt_input_file()->      avformat_open_input()->             init_input()->                   av_probe_input_format()->                          av_probe_input_format2()->                 

剔除list中相同的结构体数据

剔除list中相同的结构体数据,有三个思路: 1.两层循环,逐个比较 2.使用set容器来剔除 3.使用unique方法去重 // deduplication.cpp : 定义控制台应用程序的入口点. // #include <list> #include <set> #include <iostream> #include <algorithm> #include <vector> #include <tchar.h> using

f2fs解析(七)node管理器中的 free_nid 结构体

除了node_info之外, node管理器中还有还有个重要的数据结构: 145 struct free_nid { 146 struct list_head list; /* for free node id list */ 147 nid_t nid; /* node id */ 148 int state; /* in use or not: NID_NEW or NID_ALLOC */ 149 }; 这个结构体体很简单,比刚才的node_info轻量级多了,仅仅是标识了当前可以使用的n

Foundation 框架中常用的结构体详解

Foundation 框架包含了很多开发常用的数据类型: Foundation中包含的数据类型: 结构体 枚举 类 要想使用 Foundation 中的数据类型,只要包含主头文件即可. #impot <Foundation/Foundation.h> 结构体: 我们常用的结构体有:NSRange.NSPoint (CGPint ).NSSize(CGSize).NSRect(CGRect) NSRange:是用来表示位置和范围的. 本质是: 1 typedef struct _NSRange

Swift中元组(Tuples),结构体(Struct),枚举(Enums)之间的区别

Swift有许多种存储数据方式,你可以用枚举(enums),元组(tuples),结构体(structs),类(classes),在这篇文章中我们将比较枚举.元组.结构体之间区别,首先从最简单的开始-元组(tuples). 元组(tuple) 元组是多个值组成的复合值类型,例如,你可以定义一个含有整形和字符串的tuple let amout=(100,"EUR") 当你函数需要返回多个值时,元组这个时候非常有用,你可以使用下标方式来访问元组中的值,如.0,.1以此类推,如下: let

在C的头文件中定义的结构体,如何在cpp文件中引用

解决方案1:在cpp文件中放置.c,且在该文件中引用变量 解决方案2:在一个cpp文件中包含.c,但在另一个cpp文件中使用结构体变量 cpp文件1 cpp文件2 #include "dialog3.h" #include <QDebug> extern "C" { typedef struct PRINT { unsigned char Parameters;//BitDepthAC,BitDepthDC,q unsigned char PlaneCo

foundation框架中的常用结构体

1.CGPoint/NSPoint :表示坐标点的 创建:CGPoint *cp=NSMakePoint(10,10)  //x,y 或   NSPonit  *cp=CGPointMake(10,10) 2.CGSize/NSSize : 用来表示尺寸的 创建: CGSize *s=NSMakeSize(100,100) //width,height NSSize  *s=CGSizeMake(100,100) 3.CGRect/NSRect :用来描述控件的具体位置 创建:CGRect *r