Не очень хорошая идея менять работу общего элемента управления, потому что пользователи ожидают, что они будут работать так же, как и во всех других приложениях.
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 не работает ...