【发布时间】:2015-06-06 02:58:34
【问题描述】:
简介:
为了使这篇文章尽可能简短,我只想说我需要将列表视图中的所有选定项目移动到某个(未选定)项目下方。
浏览列表视图文档时我遇到了LVM_SORTITEMSEX message。
问题:
如何使用上面的信息来实现我的目标。
我为解决这个问题所做的努力:
到目前为止,通过使用此消息,我能够将所有选定的项目移动到列表的底部 -> 列表视图的排序方式是未选定的项目在选定的项目之前。
我只是不知道如何实现将所选项目移动到某个项目下方。
以下是我得到的图像以及我想要实现的目标:
左图显示了我使用下面提交的代码时得到的结果,右图显示了我想要的结果。
这里是相关代码sn-ps:
// compare function -> see the documentation
int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM hwnd)
{
LVITEM lvi1 = { 0 }, lvi2 = { 0 };
// get selected state of the first item
lvi1.iItem = (int)lParam1;
lvi1.iSubItem = 0;
lvi1.mask = LVIF_STATE;
lvi1.stateMask = LVIS_SELECTED;
ListView_GetItem((HWND)hwnd, &lvi1);
// get selected state of the second item
lvi2.iItem = (int)lParam2;
lvi2.iSubItem = 0;
lvi2.mask = LVIF_STATE;
lvi2.stateMask = LVIS_SELECTED;
ListView_GetItem((HWND)hwnd, &lvi2);
// if first is selected and second is not selected, swap them
if ((lvi1.state & LVIS_SELECTED) && (0 == (lvi2.state & LVIS_SELECTED)))
return 1;
return 0;
}
// somewhere in code, on button click for example
ListView_SortItemsEx(hwndListView, CompareFunc, hwndListView);
我已将列表视图句柄作为第三个参数传递给ListView_SortItemsEx,因此我可以在CompareFunc 中使用ListView_GetItem。
【问题讨论】:
-
Visual C++的标签有点模糊,它有点指编译器的名称,或特定于它的问题。您可能应该将您的问题标记为C或C++,或两者兼有(对我来说C++通常包括C,但我知道什么)。另外我认为sort标签指的是qsort与merge-sort之类的东西,这不是你感兴趣的,因此无关紧要。 -
@BarmakShemirani:根据您的建议更正了标签。