如何将 lParam 转换为多个结构?
How can lParam be casted into more than one structures?
我在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;
The parameter lParam
is casted to both NMHDR*
and NMLINK*
types. The documentation of WM_NOTIFY
message says that lParam
can be cast to NMHDR*
, 但 NMLINK
是一个不同的结构封装 NMHDR
.
当我们将 lParam
强制转换为这两者之间任意选择的结构时,实际发生了什么?
NMLINK 包含 NMHDR 作为其第一个元素:
struct NMLINK {
NMHDR hdr;
LITEM item;
};
因此指向 NMLINK 的指针等于指向其第一个成员(位于偏移量 0 处的 NMHDR 结构)的指针,它们是相同的。这意味着您可以将 NMHDR* 转换为 NMLINK*。
我在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;
The parameter lParam
is casted to both NMHDR*
and NMLINK*
types. The documentation of WM_NOTIFY
message says that lParam
can be cast to NMHDR*
, 但 NMLINK
是一个不同的结构封装 NMHDR
.
当我们将 lParam
强制转换为这两者之间任意选择的结构时,实际发生了什么?
NMLINK 包含 NMHDR 作为其第一个元素:
struct NMLINK {
NMHDR hdr;
LITEM item;
};
因此指向 NMLINK 的指针等于指向其第一个成员(位于偏移量 0 处的 NMHDR 结构)的指针,它们是相同的。这意味着您可以将 NMHDR* 转换为 NMLINK*。