Re: a C++ question about union
JDT <jdt_young@yahoo.com> wrote in news:_x7Xh.7473$H_5.4975
@newssvr23.news.prodigy.net:
NM_UPDOWN
With UDN_DELTAPOS notification handler, MS passes a pointer to NMHDR
which yo can cast to NM_UPDOWN*. With NMHDR (shown below) , you can
use
"iDelta" to know the amount it spins while with NMHDR you can use
"code"
to know the event type. What I don't understand is why the same
storage
(the overlap of the last int and unsigned int) can provide two
different
values by casting. Is it not union, is it? This is a C++ (or even a
C)
question. If I underhand it, I may exploit the same tech for my own.
Your advise is appreciated. JD
typedef struct _NM_UPDOWN
{
NMHDR hdr;
int iPos;
int iDelta;
} NMUPDOWN, *LPNMUPDOWN;
typedef struct tagNMHDR
{
HWND hwndFrom;
UINT_PTR idFrom;
UINT code; // NM_ code
} NMHDR;
This is more of a C question than C++, but here goes:
Note that the first member of _NM_UPDOWN is an NMHDR.
So what MS is doing behind the scenes is something like:
{
_NM_UPDOWN notification;
notification.hdr.code = NM_WhateverCode;
CallNotificationFunction(reinterpret_cast<NMHDR *>(¬ification);
}
Basically it's relying on the fact that the first part of the NM_UPDOWN
struct actually is a NMHDR object. It's kinda trying to implement
inheritance in the C world.
So when MS is passing you a pointer to NMHDR, it's really passing you a
pointer to the hdr member of an NM_UPDOWN struct. Keep in mind that the
pointer to the first member of a struct is the same as a pointer to the
struct itself.