Как получить дескриптор ListView из события Header, используя WinApi - PullRequest
0 голосов
/ 06 марта 2020

На основе этого вопроса: Фильтр столбцов в ListView на win api

Я изменил программу (описано в моем первом вопросе), и теперь у нее есть два ListViews ... проблема в том, что теперь я не знаю, как узнать, в каком списке произошло событие ... Параметр WPARAM равен 0, когда событие запускается в фильтре ListView, а в приведении LPARAM у него нет идентификатора ListView

enter image description here

1 Ответ

0 голосов
/ 07 марта 2020

В сообщении WM_NOTIFY поле NMHDR::hwndFrom сообщает вам точный элемент управления, отправляющий уведомление, в данном случае ie, который является точным элементом управления заголовка ListView. Вы можете получить HWND элемента управления заголовка ListView с помощью ListView_GetHeader(), а затем сравнить его с 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, чтобы даже получить уведомление HDN_FILTERCHANGE для ListView, вы должны создать подкласс самого 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;
        }

        ...
    }
}

В любом случае, как вы можете видеть, идентификаторы элементов управления не являются требуется. Вы не должны возиться с контрольными идентификаторами HWND s, которые вам не принадлежат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...