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成员呢?

解决方案 »

  1.   

    结构体除非是重载了强制转换符,否则不能强制转换,不信试试:
    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;
    而这张转化也仅仅是按内存依次转变。
      

  2.   

    to: pomelowu(羽战士)
         能详细的解释一下这个函数是怎样实现的吗?谢谢!!
      

  3.   

    注意void CListCtrlEx::OnHeaderClicked(NMHDR* pNMHDR, LRESULT* pResult)
    他的形参在内存中是连续的。 HD_NOTIFY *phdn = (HD_NOTIFY *) pNMHDR;
    这一句的操作实际上把pNMHDR给了phdn->hdr,然后phdn结构中后面的成员则是从pResult中转换的。也就是说,phdn->iButton实际上在是pResult指向的long型的低四位