2

このコードはhereの下にあります。テストしましたが、問題なく動作します。

// 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の両方にキャストされます。messageのドキュメントには、にキャストできると記載されていますが、 をカプセル化する別の構造です。NMHDR*NMLINK*WM_NOTIFYlParamNMHDR*NMLINKNMHDR

lParamこれら 2 つの間で任意に選択された構造にキャストすると、実際には何が起こるでしょうか?

4

1 に答える 1

6

NMLINK には、最初の要素として NMHDR が含まれています。

struct NMLINK {
  NMHDR hdr;
  LITEM item;
};

したがって、NMLINK へのポインターは、最初のメンバー (オフセット 0 にある NMHDR 構造体) へのポインターと等しくなり、それらは同じです。これは、NMHDR* を NMLINK* にキャストできることを意味します。

于 2015-10-11T04:36:25.723 に答える