使用CListCtrl的InsertItem往前插记录时LVS_REPORT显示正确而LVS_ICON显示乱序

LorDong 2008-02-27 05:08:33
我在使用CListCtrl控件时只使用LVS_ICON和LVS_SMALLICON两种模式,现在有个需求就是想动态的在数据中插入新记录,比如InsertItem(0,xxx)插一条记录到最前面。调用是成功的,但新插入的记录只在显示在最后,此时如果切换成LVS_REPORT模式时,新插入的记录显示在最前。后面这种情况算是正确的,那不使用这种模式时如何解决乱序的问题呢?

实例:
CListCtrl m_lvw;

m_lvw.ModifyStyle(LVS_ALIGNMASK, LVS_AUTOARRANGE);
m_lvw.InsertColumn(0, "Header", LVCFMT_CENTER, 100);

void CTestLvwDlg::OnBnClickedInsert()
{
static int index = 1;

CString strIndex;

strIndex.Format("%d", index++);
m_lvw.InsertItem(0, strIndex);
}

void CTestLvwDlg::OnBnClickedSmallIcon()
{
m_lvw.ModifyStyle(LVS_TYPEMASK, LVS_SMALLICON, 0);
}

void CTestLvwDlg::OnBnClickedLargeIcon()
{
m_lvw.ModifyStyle(LVS_TYPEMASK, LVS_ICON, 0);
}

void CTestLvwDlg::OnBnClickedReport()
{
m_lvw.ModifyStyle(LVS_TYPEMASK, LVS_REPORT, 0);
}
不断的调用OnBnClickedInsert()插入新记录时,LVS_REPORT显示正确而另外两种模式显示的是乱的。
...全文
353 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
LorDong 2008-05-08
  • 打赏
  • 举报
回复
试了一下资源管理器的各种显示方式,发现并没有提供SmallIcon模式,而List模式的标签总是显示的,突发奇想——内部使用List模式来显示。
把“m_lvwAlarmList.ModifyStyle(LVS_TYPEMASK, LVS_SMALLICON, 0);”改成“m_lvwAlarmList.ModifyStyle(LVS_TYPEMASK, LVS_LIST, 0);”,果然满足要求。

在此记录一下,希望对大伙有帮助。
LorDong 2008-05-08
  • 打赏
  • 举报
回复
谢谢支持!
同时使用以下的方法:
m_lvwAlarmList.Arrange(LVA_DEFAULT);
m_lvwAlarmList.RedrawItems(0, m_lvwAlarmList.GetItemCount());
m_lvwAlarmList.RedrawWindow();
m_lvwAlarmList.UpdateWindow();

m_lvwAlarmList.ModifyStyle(LVS_TYPEMASK, LVS_ICON, 0);
m_lvwAlarmList.ModifyStyle(LVS_TYPEMASK, LVS_SMALLICON, 0);
只有最后两句一起用时才有效,只用上面的4句仍然无效。
LorDong 2008-05-07
  • 打赏
  • 举报
回复
试过obj.RedrawItems(0, obj.GetItemCount());还是一样的效果——右边的图标被前左边的文字盖住了,如右下图。
zgl7903 2008-05-07
  • 打赏
  • 举报
回复
使用RedrawItems()呢?
LorDong 2008-05-07
  • 打赏
  • 举报
回复
换到大图标模式(m_lvwAlarmList.ModifyStyle(LVS_TYPEMASK, LVS_ICON, 0);)再换回来可以正常显示,但这样每次都手动去切换,用户烦都烦S了。
LorDong 2008-05-07
  • 打赏
  • 举报
回复
又遇上新问题了,见附图:
在小图标模式,如果删除一条记录,怎么让控件保持删除记录之前的样子——每个图标都能看得到。
UpdateWindow,RedrawWindow我都试过了,还是不行。
zgl7903 2008-05-07
  • 打赏
  • 举报
回复
再试试 m_lvwAlarmList.Arrange(LVA_DEFAULT);
datoucaicai 2008-02-27
  • 打赏
  • 举报
回复
mark
LorDong 2008-02-27
  • 打赏
  • 举报
回复
相关链接:http://www.codeguru.com/forum/archive/index.php/t-139506.html
LorDong 2008-02-27
  • 打赏
  • 举报
回复
自己搞定了,每次增加一条记录时将ItemData设置成index的值,然后调用一下SortItems排序。
// Sort items by associated lParam
static int CALLBACK MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
return (int)(lParam2 - lParam1);
}

void CTestLvwDlg::OnBnClickedInsert()
{
static int index = 1;

CString strIndex;

strIndex.Format("%d", index);
m_lvw.InsertItem(0, strIndex);
m_lvw.SetItemData(0, index);
m_lvw.SortItems(MyCompareProc, 0);

index++;
}

void CTestLvwDlg::OnBnClickedSmallIcon()
{
m_lvw.ModifyStyle(LVS_TYPEMASK, LVS_SMALLICON, 0);
m_lvw.SortItems(MyCompareProc, 0);
}

void CTestLvwDlg::OnBnClickedLargeIcon()
{
m_lvw.ModifyStyle(LVS_TYPEMASK, LVS_ICON, 0);
m_lvw.SortItems(MyCompareProc, 0);
}

void CTestLvwDlg::OnBnClickedReport()
{
m_lvw.ModifyStyle(LVS_TYPEMASK, LVS_REPORT, 0);
m_lvw.SortItems(MyCompareProc, 0);
}

void CTestLvwDlg::OnBnClickedSort()
{
m_lvw.SortItems(MyCompareProc, 0);
}

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧