void CListCtrlEx::OnHeaderClicked(NMHDR* pNMHDR, LRESULT* pResult)
{
HD_NOTIFY *phdn = (HD_NOTIFY *) pNMHDR; if(phdn->iButton == 0 && m_bSort)// Button is the left mouse button
{
SortColumn(phdn->iItem);
}
*pResult = 0;
}(HD_NOTIFY *) pNMHDR是把传进来的参数pNMHDR转换成HD_NOTIFY吧,它是怎样转换的,查了msdn,其两个结构分别是
typedef struct tagNMHDR {
HWND hwndFrom;
UINT idFrom;
UINT code;
} NMHDR; typedef struct tagNMHEADER{
NMHDR hdr;
int iItem;
int iButton;
HDITEM FAR* pitem;
} NMHEADER, FAR* LPNMHEADER;NMHDR结构是HD_NOTIFY结构的一个成员.
问:1 强制类型转换结构是怎样转换的?
2
在函数中 if(phdn->iButton == 0 && m_bSort) 它又查看phdn结构中的iButton成员是否点击的是左键,但函数传进来的只是NMHDR结构啊,它为何判断iButton成员呢?
{
HD_NOTIFY *phdn = (HD_NOTIFY *) pNMHDR; if(phdn->iButton == 0 && m_bSort)// Button is the left mouse button
{
SortColumn(phdn->iItem);
}
*pResult = 0;
}(HD_NOTIFY *) pNMHDR是把传进来的参数pNMHDR转换成HD_NOTIFY吧,它是怎样转换的,查了msdn,其两个结构分别是
typedef struct tagNMHDR {
HWND hwndFrom;
UINT idFrom;
UINT code;
} NMHDR; typedef struct tagNMHEADER{
NMHDR hdr;
int iItem;
int iButton;
HDITEM FAR* pitem;
} NMHEADER, FAR* LPNMHEADER;NMHDR结构是HD_NOTIFY结构的一个成员.
问:1 强制类型转换结构是怎样转换的?
2
在函数中 if(phdn->iButton == 0 && m_bSort) 它又查看phdn结构中的iButton成员是否点击的是左键,但函数传进来的只是NMHDR结构啊,它为何判断iButton成员呢?
NMHDR pNMHDR;
HD_NOTIFY phdn = (HD_NOTIFY) pNMHDR;肯定编译不过。楼主你的代码是结构体指针之间的转换。不信你试试这个,都能编译通过的。
struct sA {
int A;
int C;
int B;
};struct sB {
char c;
}; sA* psa;
sB* psb = (sB *)psa;
而这张转化也仅仅是按内存依次转变。
能详细的解释一下这个函数是怎样实现的吗?谢谢!!
他的形参在内存中是连续的。 HD_NOTIFY *phdn = (HD_NOTIFY *) pNMHDR;
这一句的操作实际上把pNMHDR给了phdn->hdr,然后phdn结构中后面的成员则是从pResult中转换的。也就是说,phdn->iButton实际上在是pResult指向的long型的低四位