【问题标题】:How to get the ListView handle from Header event using WinApi如何使用 WinApi 从 Header 事件中获取 ListView 句柄
【发布时间】:2020-03-06 20:22:09
【问题描述】:

基于这个问题:Column filter in ListView on win api

我修改了程序(在我的第一个问题中描述),现在它有两个 ListViews ...问题是现在我不知道如何知道事件发生在哪个列表中... WPARAM 参数为 0当事件在 ListView 过滤器中触发时,并且在 LPARAM 转换中它没有 ListView ID

【问题讨论】:

  • hwndFrom 告诉您消息来自的窗口(即控件)。 idFrom 是 0,因为你没有给你的控件一个 ID。 CreateWindowExHMENU 参数用于此目的。
  • 我尝试更改ID,但它一直返回0...就像我需要为ListView Header设置一个ID,但是,没有功能或方法可以做到这一点
  • 解决了!我使用此命令为 ListViewHeader 设置 ID:SetWindowLong(hHeader, GWL_ID, 0x8803);
  • 对不起,我错过了您试图识别的标题控件。最好通过窗口句柄来识别它(将hwndFrom 与您从ListView_GetHeader 返回的值进行比较),而不是更改您未创建的窗口的属性。

标签: c windows listview winapi


【解决方案1】:

WM_NOTIFY 消息中,NMHDR::hwndFrom 字段告诉您发送通知的确切控件,即在这种情况下,确切的 ListView 标头控件。您可以使用ListView_GetHeader() 获取ListView 标题控件的HWND,然后将其与通知的hwndFrom 进行比较,例如:

switch (pnmhdr->code)
{
    case HDN_FILTERCHANGE:
    {
        if (ListView_GetHeader(hwndListView1) == pnmhdr->hwndFrom)
        {
            // event happened in ListView1...
        }
        else if (ListView_GetHeader(hwndListView2) == pnmhdr->hwndFrom)
        {
            // event happened in ListView2...
        }

        break;
    }

    ...
}

另一方面,由于标头控件是 ListView 的子控件,为了接收 ListView 的HDN_FILTERCHANGE 通知,您必须对 ListView 本身进行子类化,因为标头控件会将其通知发送到ListView,而不是你的窗口。因此,提供给您的子类过程的HWND 将是标头通知发送到的 ListView,例如:

LRESULT CALLBACK MyListViewWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ...)
{
    switch (uMsg)
    {
        case WM_NOTIFY:
        {
            NMHDR *pnmhdr = (NMHDR*) lParam;

            switch (pnmhdr->code)
            {
                case HDN_FILTERCHANGE:
                {
                    if (hwnd == hwndListView1)
                    {
                        // event happened in ListView1...
                    }
                    else if (hwnd == hwndListView2)
                    {
                        // event happened in ListView2...
                    }

                    break;
                }

                ...
            }

            break;
        }

        ...
    }
}

如您所见,无论哪种方式,都不需要控件 ID。您不应该乱用不属于您的 HWNDs 的控件 ID。

【讨论】:

    猜你喜欢
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 2018-05-10
    • 2014-05-22
    相关资源
    最近更新 更多