2

我在这里看到了下面的这段代码。我测试了它,它工作正常。

// g_hLink is the handle of the SysLink control.
case WM_NOTIFY:
    switch (((LPNMHDR)lParam)->code)            // CAST TO NMHDR*
    {
        case NM_CLICK:          // Fall through to the next case.
        case NM_RETURN:
        {
            PNMLINK pNMLink = (PNMLINK)lParam;  // CAST TO NMLINK*
            LITEM   item    = pNMLink->item;
            if ((((LPNMHDR)lParam)->hwndFrom == g_hLink) && (item.iLink == 0))
            {
                ShellExecute(NULL, L"open", item.szUrl, NULL, NULL, SW_SHOW);
            }
            else if (wcscmp(item.szID, L"idInfo") == 0)
            {
                MessageBox(hDlg, L"This isn't much help.", L"Example", MB_OK);
            }
            break;
        }
    }
    break;

该参数lParam被强制转换为NMHDR*NMLINK*类型。message的文档WM_NOTIFYlParam可以转换成NMHDR*,但是NMLINK是封装的不同结构NMHDR

lParam当我们在这两者之间任意选择一个结构时,实际上会发生什么?

4

1 回答 1

6

NMLINK 包含 NMHDR 作为其第一个元素:

struct NMLINK {
  NMHDR hdr;
  LITEM item;
};

因此指向 NMLINK 的指针等于指向其第一个成员的指针(即位于偏移 0 处的 NMHDR 结构),它们是相同的。这意味着您可以将 NMHDR* 转换为 NMLINK*。

于 2015-10-11T04:36:25.723 回答