CListCtrl выделить несколько строк с помощью мыши - PullRequest
2 голосов
/ 16 июня 2019

Существует CListCtrl с SetExtendedStyle (LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT), один выбор ложен. Я хочу иметь возможность выбрать несколько строк с помощью мыши. При запуске выделения из пустой области это работает: enter image description here

Не работает, если я начинаю выделение не с пустой области. Рамка выбора не появляется: enter image description here

Как заставить это работать?

1 Ответ

2 голосов
/ 17 июня 2019

Не очень хорошая идея менять работу общего элемента управления, потому что пользователи ожидают, что они будут работать так же, как и во всех других приложениях.

ListView (CListCtrl) не поддерживает эту функцию, но если вам не нужно делать не перетаскиваемые выделения, вы можете создать подкласс управления и вроде бы заставить его работать:

WNDPROC g_OrgWndProc = 0;

static LRESULT CALLBACK LVSubClass(HWND hWnd, UINT Msg, WPARAM wp, LPARAM lp)
{
    if (Msg == WM_LBUTTONDOWN)
    {
        UINT oldexstyle = (UINT) ListView_SetExtendedListViewStyleEx(hWnd, LVS_EX_FULLROWSELECT, 0);
        LRESULT oldcolw = ListView_GetColumnWidth(hWnd, 0);
        ListView_SetColumnWidth(hWnd, 0, 0);
        PostMessage(hWnd, WM_APP, oldexstyle, oldcolw); // Restore delay
        return CallWindowProc(g_OrgWndProc, hWnd, Msg, wp, lp);
    }
    if (Msg == WM_APP)
    {
        ListView_SetExtendedListViewStyleEx(hWnd, LVS_EX_FULLROWSELECT, (UINT) wp);
        ListView_SetColumnWidth(hWnd, 0, (UINT) lp);
    }
    return CallWindowProc(g_OrgWndProc, hWnd, Msg, wp, lp);
}

...

g_OrgWndProc = (WNDPROC) SetWindowLongPtr(listviewhandle, GWLP_WNDPROC, (LONG_PTR) LVSubClass);

Этот код удаляет стиль выбора полной строки и делает первый столбец «невидимым», когда просмотр списка обрабатывает начальное сообщение мыши, так что внутреннее тестирование попаданий в просмотр списка возвращает LVHT_NOWHERE и может начаться выбор области. Вы должны считать это уродливым взломом, и я бы порекомендовал вам перехватывать WM_LBUTTONDOWN только тогда, когда Control или Shift не работает ...

...