网上介绍MFC实现Tooltip有这么一段程序:
BOOL YourDlg::SetTipText( UINT id, NMHDR *pTTTStruct, LRESULT *pResult )
{
    TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pTTTStruct;
    
    wcscpy(pTTT->lpszText, L"tooltip text");
    
}
我看头文件中TOOLTIPTEXT结构的定义中包含了一个NMHDR结构。那么程序第一行就相当于用一个子结构体的指针去指向一个父结构体,并且下面的语句还对只存在于子结构体的成员进行了赋值!试着运行了一下,发现程序能够正常运行,这是为什么?子结构体难道在定义指针时就被创建了吗?

解决方案 »

  1.   

    首先你要知道什么是NMHDR,这个上网找一下就知道了
    我转帖一个过来给你看看NMHDR   =   Notify   Message   HandlerWM_NOTIFY消息在lParam参数中携带着指向NMHDR结构的指针,NMHDR定义如下:
    typedef struct tagNMHDR {
        HWND hwndFrom;
        UINT idFrom;
        UINT code;
    } NMHDR;hwndFrom是发送通知消息的窗口句柄。对属性页来说,就是属性页窗口。如果是控件发送通知的话,idFrom就是控件ID。最后一个code域包含的是通知码。虽然这个基本结构没有包含任何更多的信息,但它几乎总是可以扩展的,可以使用附加域来扩展它。通知码指出有什么样的附加域附加到了该通知结构里。不同的控件,不同的消息可能需要传递的信息不同。
    结构NMHDR包含最基本的信息,其他不同的结构都是以NMHDR为基础,在后面附加各自的信息。
    你通过结构的命名,可以知道这个结构是用于哪个控件的。
    如NMLISTVIEW显然是用于ListView,NMTREEVIEW 显然是用于TreeView。所以,要判断转成哪一种形式,就要知道是针对的哪个控件,哪个消息 
      

  2.   

    NMHDR只是一个结构体的头部,后面的内容取决于发送这个消息的控件。
      

  3.   

    pTTTStruct只是个绳子头,默认情况下能捯出一只羊来(NMHDR);
    在有些情况下,绳子的另一头可能拴着驴、牛、马等等。但把绳子交给你的时候还是声明:这是拴着羊的绳子(NMHDR*)。如果那一头拴的是头驴(TOOLTIPTEXT ),当听到“给你,拴着羊的绳子”时,别理它(操作系统),你要坚信:那一头拴的是驴(TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pTTTStruct; )好了,捯出来后就可以拉磨了。不要父啊子的。有没有这个关系无所谓,只是类型的转换。