更改通用控件的工作方式并不是一个好主意,因为用户希望它们能够像在所有其他应用程序中一样工作。
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 并且可以开始选取框。你应该认为这是一个丑陋的黑客,我建议你只在 Control 或 Shift 关闭时拦截WM_LBUTTONDOWN...