gpt4 book ai didi

c++ - CListCtrl 用鼠标选择多行

转载 作者:搜寻专家 更新时间:2023-10-31 02:02:48 24 4
gpt4 key购买 nike

有一个CListCtrl带有SetExtendedStyle (LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT),单选是false。我希望能够用鼠标选择多行。从空白区域开始选择时,它有效: enter image description here

如果我不是从空白区域开始选择,它就不起作用。选择框不出现: enter image description here

如何让它发挥作用?

最佳答案

改变通用控件的工作方式并不是一个好主意,因为用户希望它们像在所有其他应用程序中一样发挥作用。

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);

此代码删除了全行选择样式,并在 ListView 处理初始鼠标按下消息时使第一列“不可见”,以便内部 ListView HitTest 返回 LVHT_NOWHERE 并且选取框选择可以开始。你应该认为这是一个丑陋的 hack,我建议你只在 ControlShift 关闭时拦截 WM_LBUTTONDOWN...

关于c++ - CListCtrl 用鼠标选择多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56619044/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com