Win32更改列表视图项索引
Win32 change list view item index
我在Windows上使用MSVC 2012下的c++。我用的是纯Win32的对话框,没有MFC。
我有一个给定项目的LVITEM结构体。我想改变给定ListView上项目的索引,以便我可以重新排序项目的位置。.iItem
属性本质上是我想改变的,但是,我不知道如何在列表视图中反映更改。
如果可能的话,我希望ListView在我移动项目的地方自动移动下面的项目,而不是在新位置覆盖现有的项目。
列表视图项的索引只会作为操作项集合的副作用而改变。通过在它之前插入一个新项来增加它,LVM_INSERTITEM。您可以通过删除它前面的项来减少它,LVM_DELETEITEM。移动一个项的方法是先删除它,然后在另一个位置重新插入它。或者通过交换LVITEM属性。
必须照顾子项使这有点尴尬,但这是编写本机win32代码的麻烦。这就是为什么有这么多可用的类库使这更容易。推荐。
有一种方法可以移动listview的项目而不需要删除/重新创建它们:
如果你想把一个项移动到另一个引用项之前,这段代码必须做到这一点:
struct info {
int item_to_move_before_reference;
int item_reference;
};
int CALLBACK CompareFunc(LPARAM item1, LPARAM item2, info* i) {
if(item1 == i->item_to_move_before_reference) {
item1 = i->item_reference;
} else if(item1 >= i->item_reference) {
item1++;
}
if(item2 == i->item_to_move_before_reference) {
item2 = i->item_reference;
} else if(item2 >= i->item_reference) {
item2++;
}
return item1 - item2;
}
bool sort_items(HWND listview, int item_to_move_before_reference, int item_reference) {
if(item_to_move_before_reference < item_reference) return false;
info i;
i.item_to_move_before_reference = item_to_move_before_reference;
i.item_reference = item_reference;
ListView_SortItemsEx(listview, CompareFunc, &i);
return true;
}
代码片段:)
bool isUp = ...;
HWND hListWnd = ...;
int pos = ListView_GetNextItem(hListWnd, -1, LVNI_SELECTED);
if (pos == -1 || pos == 0 && isUp || pos == ListView_GetItemCount(hListWnd) - 1 && !isUp)
return true;
pos = isUp ? pos - 1 : pos;
HWND hHeader = ListView_GetHeader(hListWnd);
for (int i = 0; i < Header_GetItemCount(hHeader); i++) {
TCHAR buf[255]{0};
ListView_GetItemText(hListWnd, pos, i, buf, 255);
LVITEM lvi = {0};
lvi.mask = LVIF_TEXT;
lvi.iItem = pos + 2;
lvi.iSubItem = i;
lvi.pszText = buf;
lvi.cchTextMax = 255;
if (i == 0)
ListView_InsertItem(hListWnd, &lvi);
else
ListView_SetItem(hListWnd, &lvi);
}
ListView_DeleteItem(hListWnd, pos);
if (!isUp)
ListView_SetItemState (hListWnd, pos + 1, LVIS_FOCUSED | LVIS_SELECTED, 0x000F);
相关文章:
- 数组索引的值没有增加
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 芬威克树(BIT).找到具有给定累积频率的最小索引,单位为 O(logN)
- 视图中的参数推导失败:take_while
- 查找最接近的大于当前数字的数字的索引
- 在C++中调整向量中的索引
- 重载元组索引运算符-C++
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 为std::string的某个索引赋值
- 并行用于C++17中数组索引范围内的循环
- 如何维护资源管理器项目视图中当前可见的项目列表
- 跟随整数索引列表的自定义类迭代器
- 如何在for循环中包含两个索引值的测试条件
- D3D11-将混合权重和索引传递到顶点着色器
- 在另一个类视图中添加最多2个图表的正确方法是什么
- 将转换字符键入 int 以用作向量C++的索引
- 转到特定页面后,如何将滑动视图的当前索引设置为选项卡栏"by reference"的当前索引?
- 特征中索引的子矩阵视图
- 了解Qt视图模型架构:何时创建以及如何在QAbstractItemModel实现中清除索引
- Win32更改列表视图项索引