跟随CList::InsertItem()后的SetItemText() 不显示的问题

本文解决了CListCtrl在特定情况下无法正确显示的问题。通过调整代码实现方式,确保了即使在数据量较大时也能正常显示所有信息。同时,讨论了线程操作与CListCtrl显示之间的潜在冲突。

这个问题困扰我几天了...

终于在网上看到解决方案


更令人费解的是,并不是每次都出现这种情况.
同样的程序段在其它地方运行正常,唯一的变化就是数据量稍大些.


//原来不会显示

m_listmsg.InsertItem(g_nRow,sMsg[0]); // 显示成功

m_listmsg.SetItemText(g_nRow,1,sMsg[1]);// 这一句就是显示不成功


//修改一下可以显示

int nIndex =m_listmsg.InsertItem(g_nRow,sMsg[0]); 

m_listmsg.SetItemText(nIndex,sMsg[1]); 


g_nRow同步!


//add:

ClistView的显示与线程操作会发生冲突,若在改变某个参数后,弹出一个对话框,线程执行就不会被阻塞.
修改下列代码,在初始化中默认为GB为单位,实现当checkbox被点击时,显示MB为内存单位,取消点击时为GB单位。void CTxt2Dlg::OnBnClickedCheck1() { // TODO: 在此添加控件通知处理程序代码 //m_bShowMB = (m_bUseMB.GetCheck() == BST_CHECKED); //m_bShowMB = ((CButton*)GetDlgItem(IDC_CHECK1))->GetCheck(); // 刷新磁盘信息显示 //UpdateDiskInfo(); m_bShowMB = TRUE; if (m_bShowMB) { CString CstrTotalGB, CstrFreeGB; CstrTotalGB.Format(_T("%.2fMB"), dCTotalGB * 1024); CstrFreeGB.Format(_T("%.2fMB"), dCFreeGB * 1024); Clist2.SetItemText(0, 4, CstrTotalGB); Clist2.SetItemText(0, 5, CstrFreeGB); //D CString DstrTotalGB, DstrFreeGB; DstrTotalGB.Format(_T("%.2fMB"), dDTotalGB * 1024); DstrFreeGB.Format(_T("%.2fMB"), dDFreeGB * 1024); Clist2.SetItemText(1, 4, DstrTotalGB); Clist2.SetItemText(1, 5, DstrFreeGB); ////list3 CString CT, CF, DT, DF; CT.Format(TEXT("总容量%.2fMB"), dCTotalGB * 1024); CF.Format(_T("剩余容量%.2fMB"), dCFreeGB * 1024); DT.Format(_T("总容量%.2fMB"), dDTotalGB * 1024); DF.Format(_T("剩余容量%.2fMB"), dDFreeGB * 1024); Clist3.InsertItem(0, CT); Clist3.InsertItem(1, CF); Clist3.SetItemText(0, 1, DT); Clist3.SetItemText(1, 1, DF); } else { CString CstrTotalGB, CstrFreeGB; CstrTotalGB.Format(_T("%.2fGB"), dCTotalGB); CstrFreeGB.Format(_T("%.2fGB"), dCFreeGB); Clist2.SetItemText(0, 4, CstrTotalGB); Clist2.SetItemText(0, 5, CstrFreeGB); //D CString DstrTotalGB, DstrFreeGB; DstrTotalGB.Format(_T("%.2fGB"), dDTotalGB); DstrFreeGB.Format(_T("%.2fGB"), dDFreeGB); Clist2.SetItemText(1, 4, DstrTotalGB); Clist2.SetItemText(1, 5, DstrFreeGB); ////list3 CString CT, CF, DT, DF; CT.Format(TEXT("总容量%.2fGB"), dCTotalGB); CF.Format(_T("剩余容量%.2fGB"), dCFreeGB); DT.Format(_T("总容量%.2fGB"), dDTotalGB); DF.Format(_T("剩余容量%.2fGB"), dDFreeGB); Clist3.InsertItem(0, CT); Clist3.InsertItem(1, CF); Clist3.SetItemText(0, 1, DT); Clist3.SetItemText(1, 1, DF); } }
最新发布
09-10
MFC中,在下列代码的基础上修改,通过check box实现同列表中内存数据单位由GB切换MB.m_ListCtrl.InsertColumn(0, _T("软件名称"), LVCFMT_LEFT, 300); m_ListCtrl.InsertColumn(1, _T("版本号"), LVCFMT_LEFT, 300); m_ListCtrl.InsertColumn(2, _T("发布者"), LVCFMT_LEFT, 300); m_ListCtrl.InsertColumn(3, _T("安装路径"), LVCFMT_LEFT, 300); // 枚举注册表获取软件信息 EnumerateInstalledSoftware(); Clist2.InsertColumn(0, _T("盘符"), LVCFMT_LEFT, 200); Clist2.InsertColumn(1, _T("磁盘类型"), LVCFMT_LEFT, 200); Clist2.InsertColumn(2, _T("磁盘名称"), LVCFMT_LEFT, 200); Clist2.InsertColumn(3, _T("系统文件"), LVCFMT_LEFT, 200); Clist2.InsertColumn(4, _T("全部容量"), LVCFMT_LEFT, 200); Clist2.InsertColumn(5, _T("剩余容量"), LVCFMT_LEFT, 200); // 新列表 Clist3.InsertColumn(1, TEXT("C盘"), LVCFMT_LEFT,600); Clist3.InsertColumn(2, TEXT("D盘"), LVCFMT_LEFT,600); // 定义要处理的磁盘数组 CStringArray drives; drives.Add(_T("C:\\")); drives.Add(_T("D:\\")); for (int i = 0; i < drives.GetSize(); i++) { CString strDrive = drives[i]; // 获取磁盘类型 UINT nDiskType = GetDriveType(strDrive); CString strDiskType; switch (nDiskType) { case DRIVE_FIXED: strDiskType = _T("硬盘"); break; case DRIVE_REMOVABLE: strDiskType = _T("移动式磁盘"); break; case DRIVE_CDROM: strDiskType = _T("光驱"); break; case DRIVE_REMOTE: strDiskType = _T("网络磁盘"); break; case DRIVE_RAMDISK: strDiskType = _T("虚拟RAM磁盘"); break; case DRIVE_UNKNOWN: strDiskType = _T("未知设备"); break; default: strDiskType = _T("未知类型"); break; } // 获取磁盘名称和系统文件类型 TCHAR szVolumeName[MAX_PATH] = { 0 }; TCHAR szFileSystemName[MAX_PATH] = { 0 }; GetVolumeInformation(strDrive, szVolumeName, MAX_PATH, NULL, NULL, NULL, szFileSystemName, MAX_PATH); CString strVolumeName(szVolumeName); CString strFileSystemName(szFileSystemName); // 获取磁盘容量信息 ULARGE_INTEGER liTotalBytes, liFreeBytes; if (GetDiskFreeSpaceEx(strDrive, &liFreeBytes, &liTotalBytes, NULL)) { double dTotalGB = (double)liTotalBytes.QuadPart / (1024 * 1024 * 1024); double dFreeGB = (double)liFreeBytes.QuadPart / (1024 * 1024 * 1024); CString strTotalGB, strFreeGB; strTotalGB.Format(_T("%.2fGB"), dTotalGB); strFreeGB.Format(_T("%.2fGB"), dFreeGB); // 插入行 int nItem = Clist2.InsertItem(i, strDrive); Clist2.SetItemText(nItem, 1, strDiskType); Clist2.SetItemText(nItem, 2, strVolumeName); Clist2.SetItemText(nItem, 3, strFileSystemName); Clist2.SetItemText(nItem, 4, strTotalGB); Clist2.SetItemText(nItem, 5, strFreeGB); Clist3.InsertItem(0, TEXT("总容量:100GB")); Clist3.InsertItem(1, TEXT("可用容量:2GB")); Clist3.SetItemText(0, 1, strTotalGB); Clist3.SetItemText(1, 1, strFreeGB); } }
09-10
下列是在OnInitDialog中编写的显示系统磁盘内存情况代码,修改代码通过按键实现所有磁盘内存单位切换成MB // 初始化列表控件 m_ListCtrl.InsertColumn(0, _T("软件名称"), LVCFMT_LEFT, 300); m_ListCtrl.InsertColumn(1, _T("版本号"), LVCFMT_LEFT, 300); m_ListCtrl.InsertColumn(2, _T("发布者"), LVCFMT_LEFT, 300); m_ListCtrl.InsertColumn(3, _T("安装路径"), LVCFMT_LEFT, 300); // 枚举注册表获取软件信息 EnumerateInstalledSoftware(); Clist2.InsertColumn(0, _T("盘符"), LVCFMT_LEFT, 200); Clist2.InsertColumn(1, _T("磁盘类型"), LVCFMT_LEFT, 200); Clist2.InsertColumn(2, _T("磁盘名称"), LVCFMT_LEFT, 200); Clist2.InsertColumn(3, _T("系统文件"), LVCFMT_LEFT, 200); Clist2.InsertColumn(4, _T("全部容量"), LVCFMT_LEFT, 200); Clist2.InsertColumn(5, _T("剩余容量"), LVCFMT_LEFT, 200); // 新列表 Clist3.InsertColumn(1, TEXT("C盘"), LVCFMT_LEFT,600); Clist3.InsertColumn(2, TEXT("D盘"), LVCFMT_LEFT,600); // 定义要处理的磁盘数组 CStringArray drives; drives.Add(_T("C:\\")); drives.Add(_T("D:\\")); for (int i = 0; i < drives.GetSize(); i++) { CString strDrive = drives[i]; // 获取磁盘类型 UINT nDiskType = GetDriveType(strDrive); CString strDiskType; switch (nDiskType) { case DRIVE_FIXED: strDiskType = _T("硬盘"); break; case DRIVE_REMOVABLE: strDiskType = _T("移动式磁盘"); break; case DRIVE_CDROM: strDiskType = _T("光驱"); break; case DRIVE_REMOTE: strDiskType = _T("网络磁盘"); break; case DRIVE_RAMDISK: strDiskType = _T("虚拟RAM磁盘"); break; case DRIVE_UNKNOWN: strDiskType = _T("未知设备"); break; default: strDiskType = _T("未知类型"); break; } // 获取磁盘名称和系统文件类型 TCHAR szVolumeName[MAX_PATH] = { 0 }; TCHAR szFileSystemName[MAX_PATH] = { 0 }; GetVolumeInformation(strDrive, szVolumeName, MAX_PATH, NULL, NULL, NULL, szFileSystemName, MAX_PATH); CString strVolumeName(szVolumeName); CString strFileSystemName(szFileSystemName); // 获取磁盘容量信息 ULARGE_INTEGER liTotalBytes, liFreeBytes; if (GetDiskFreeSpaceEx(strDrive, &liFreeBytes, &liTotalBytes, NULL)) { double dTotalGB = (double)liTotalBytes.QuadPart / (1024 * 1024 * 1024); double dFreeGB = (double)liFreeBytes.QuadPart / (1024 * 1024 * 1024); CString strTotalGB, strFreeGB; strTotalGB.Format(_T("%.2fGB"), dTotalGB); strFreeGB.Format(_T("%.2fGB"), dFreeGB); // 插入行 int nItem = Clist2.InsertItem(i, strDrive); Clist2.SetItemText(nItem, 1, strDiskType); Clist2.SetItemText(nItem, 2, strVolumeName); Clist2.SetItemText(nItem, 3, strFileSystemName); Clist2.SetItemText(nItem, 4, strTotalGB); Clist2.SetItemText(nItem, 5, strFreeGB); Clist3.InsertItem(0, TEXT("总容量:100GB")); Clist3.InsertItem(1, TEXT("可用容量:2GB")); Clist3.SetItemText(0, 1, strTotalGB); Clist3.SetItemText(1, 1, strFreeGB); } }
09-09
MFC中通过check box按键实现代码中所有内存单位切换为MB // 初始化列表控件 m_ListCtrl.InsertColumn(0, _T("软件名称"), LVCFMT_LEFT, 300); m_ListCtrl.InsertColumn(1, _T("版本号"), LVCFMT_LEFT, 300); m_ListCtrl.InsertColumn(2, _T("发布者"), LVCFMT_LEFT, 300); m_ListCtrl.InsertColumn(3, _T("安装路径"), LVCFMT_LEFT, 300); // 枚举注册表获取软件信息 EnumerateInstalledSoftware(); Clist2.InsertColumn(0, _T("盘符"), LVCFMT_LEFT, 200); Clist2.InsertColumn(1, _T("磁盘类型"), LVCFMT_LEFT, 200); Clist2.InsertColumn(2, _T("磁盘名称"), LVCFMT_LEFT, 200); Clist2.InsertColumn(3, _T("系统文件"), LVCFMT_LEFT, 200); Clist2.InsertColumn(4, _T("全部容量"), LVCFMT_LEFT, 200); Clist2.InsertColumn(5, _T("剩余容量"), LVCFMT_LEFT, 200); // 新列表 Clist3.InsertColumn(1, TEXT("C盘"), LVCFMT_LEFT,600); Clist3.InsertColumn(2, TEXT("D盘"), LVCFMT_LEFT,600); // 定义要处理的磁盘数组 CStringArray drives; drives.Add(_T("C:\\")); drives.Add(_T("D:\\")); for (int i = 0; i < drives.GetSize(); i++) { CString strDrive = drives[i]; // 获取磁盘类型 UINT nDiskType = GetDriveType(strDrive); CString strDiskType; switch (nDiskType) { case DRIVE_FIXED: strDiskType = _T("硬盘"); break; case DRIVE_REMOVABLE: strDiskType = _T("移动式磁盘"); break; case DRIVE_CDROM: strDiskType = _T("光驱"); break; case DRIVE_REMOTE: strDiskType = _T("网络磁盘"); break; case DRIVE_RAMDISK: strDiskType = _T("虚拟RAM磁盘"); break; case DRIVE_UNKNOWN: strDiskType = _T("未知设备"); break; default: strDiskType = _T("未知类型"); break; } // 获取磁盘名称和系统文件类型 TCHAR szVolumeName[MAX_PATH] = { 0 }; TCHAR szFileSystemName[MAX_PATH] = { 0 }; GetVolumeInformation(strDrive, szVolumeName, MAX_PATH, NULL, NULL, NULL, szFileSystemName, MAX_PATH); CString strVolumeName(szVolumeName); CString strFileSystemName(szFileSystemName); // 获取磁盘容量信息 ULARGE_INTEGER liTotalBytes, liFreeBytes; if (GetDiskFreeSpaceEx(strDrive, &liFreeBytes, &liTotalBytes, NULL)) { double dTotalGB = (double)liTotalBytes.QuadPart / (1024 * 1024 * 1024); double dFreeGB = (double)liFreeBytes.QuadPart / (1024 * 1024 * 1024); CString strTotalGB, strFreeGB; strTotalGB.Format(_T("%.2fGB"), dTotalGB); strFreeGB.Format(_T("%.2fGB"), dFreeGB); // 插入行 int nItem = Clist2.InsertItem(i, strDrive); Clist2.SetItemText(nItem, 1, strDiskType); Clist2.SetItemText(nItem, 2, strVolumeName); Clist2.SetItemText(nItem, 3, strFileSystemName); Clist2.SetItemText(nItem, 4, strTotalGB); Clist2.SetItemText(nItem, 5, strFreeGB); Clist3.InsertItem(0, TEXT("总容量:100GB")); Clist3.InsertItem(1, TEXT("可用容量:2GB")); Clist3.SetItemText(0, 1, strTotalGB); Clist3.SetItemText(1, 1, strFreeGB); } }
09-10
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值