- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个包含 10000 条记录的 CListCtrl,当程序启动时它会被填满,这个操作的时间约为 1.3 秒。但如果用户刷新列表,它会在 ~2.5 - 3 秒内填满。
在这两种情况下工作的是同一段代码:
SetRedraw(FALSE);
SetItemCount(nCount);
// insert
SetRedraw(TRUE);
变量 nCount 在程序启动时等于 0,在用户刷新列表时等于 10000。
为什么填表的时间相差这么大?
UPD:最少的代码
void CTestList::Init()
{
InsertColumn(0, _T("Number"), 0, 50);
InsertColumn(1, _T("Obj name"), 0, 150);
InsertColumn(2, _T("Creator"), 0, 100);
InsertColumn(3, _T("Editor"), 0, 100);
}
void CTestList::Reset()
{
LVITEM item;
item.iItem = 0;
for (int i = 0; i < 10000; i++)
{
InsertRow(item, i);
item.iItem++;
}
}
void CTestList::InsertRow(LVITEM& item, int num)
{
CString strNum;
//
item.iSubItem = 0;
item.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
item.lParam = NULL;
item.iImage = 0;
strNum.Format(_T("%d"), num);
item.pszText = (LPTSTR)(LPCTSTR)strNum;
InsertItem(&item);
//
item.mask = LVIF_TEXT;
item.iSubItem = 1;
item.pszText = _T("Test object");
SetItem(&item);
//
item.mask = LVIF_TEXT;
item.iSubItem = 2;
item.pszText = _T("Any one");
SetItem(&item);
//
item.iSubItem = 3;
item.pszText = _T("Another one");
SetItem(&item);
}
void CApp::FillList()
{
CWaitCursor wait;
m_list.DeleteAllItems();
clock_t begin = clock();
m_list.SetRedraw(FALSE);
m_list.SetItemCount(nCount);
m_list.Reset();
m_list.SetRedraw(TRUE);
clock_t end = clock();
double dif = static_cast<double>(end - begin) / CLOCKS_PER_SEC;
CString str;
str.Format(_T("Insertion time: %f"), dif);
AfxMessageBox(str);
}
最佳答案
我已经在我的机器上测试了你的代码。只有当我在调试器中运行程序(使用 F5)时,我才能重现不同的时序,但如果我在没有调试器的情况下运行它(使用 Ctrl+F5 )。所以这似乎与您的代码或 Windows API 没有直接关系,而是与调试器有关。
关于c++ - 相同数量的记录执行 CListCtrl::InsertItem 的时间不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27984399/
我有一个CListCtrl(报告样式),可以在其中清除列表并在特定时间重新填充它。在执行此操作时,我想保持垂直滚动位置。我发现有两种方法看起来很有希望: EnsureVisible() GetScro
如何更改 Clistctrl 项(报 TableView )的文本颜色? 最佳答案 您需要处理 NM_CUSTOMDRAW消息并更改该处理程序中的文本颜色。 有关示例,请参阅 this article
我有一个 CListCtrl,其中包含大约 2500 个不同的元素,其中包含一个 48x48 的图标和文本。 由于数据量大,我将其实现为提供的虚拟列表 ON_NOTIFY(LVN_GETDISPINF
如何保持CListCtrl的水平滚动条位置?我会定期转储并重新填充列表控件的内容,因此无需显式记住旧位置并将其恢复,滚动只返回到左上角。 我早些时候问了一个相关的问题CListCtrl: How to
我有一个显示多个系统的多个数据的 clistctrl。不同系统只能选择 1 个项目。 最初,clistctrl 会加载从不同系统的控件中选择的第一个项目。 但是当我在更改模型中的数据并设置选择后通过单
我在图标 View 中使用 CListCtrl,但它会水平滚动: 1 3 5 7 --> 2 4 6 8 --> 我宁愿它水平滚动: 1 2 3 4 5 6 | | V V 有办法吗? 最佳答案 将设
我正在为 Windows Mobile 创建 MFC 应用程序,但不知道如何为列表控件 (CListCtrl) 启用多选。在属性面板中 Single Selection 设置为 False 但仍然无法
我必须根据 CListViewCtrl 中的值启用/禁用对话框上的按钮。基于所选行。我做到了这一点: NOTIFY_HANDLER(IDC_LIST, LVN_ITEMCHANGED, OnMyLis
我需要在 MFC 中创建一个 ListControl,每行具有不同的列数。我该怎么做? 最佳答案 那是不可能的。解决方法很简单,只是不要在子项中放置任何文本。 关于c++ - 自定义 CListCtr
如何使用标题文本获取项目的索引号?我正在使用 MFC 的 CListCtrl 类。我有项目的标题文本,我可以获取该项目的索引然后更新其文本吗?如果您能提供示例,将会很有帮助。 最佳答案 CListCt
CMyListCtrl 处于虚拟数据模式和所有者绘制。当控件需要数据时,将发送一个 LVN_GETDISPINFO 通知。 下面的代码工作正常,除了它多次显示每一行。 文档说如果我设置项目的掩码的 L
有一个CListCtrl带有SetExtendedStyle (LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT),单选是false。我希望能够用鼠标选择多行。从空白区域
我有一个包含多个列的 CListCtrl,所有列都可以作为排序依据。我想添加 up 和 down 图标,以便清楚当前按哪一列排序以及朝哪个方向排序;很像 Windows 资源管理器。我的想法是向列名添
我正在使用 CListCtrl 控件在我的 MFC 应用程序中显示信息。目前,我在 SetExtendedStyle 中设置了 LVS_EX_CHECKBOXES,因此控件中的所有行旁边都有一个复选框
我目前有 NM_CUSTOMDRAW 消息调用一个函数来在报告模式下为 listctrl 的行着色。我可以检测何时选择了一行并自己为其着色,但是不会为选定的单元格调用此方法,因此我无法为该单元格着色。
谁能帮我知道,CListCtrl::GetItemData() 在 MFC、VC++ 中有什么用? 我查阅了 MSDN 描述,但不够清楚。 如果有人可以提供简短的解释和一些示例,那就太好了并且会有很大
如何使 CListCtrl 自动调整其列的宽度?通常,当列表中的项目太长时,后端会从 View 中消失,用户必须手动调整相应列的宽度。有没有办法通过代码来做到这一点? 最佳答案 自动调整列大小很容易:
我想将 CListCtrl 控件的任何单元格的字体更改为粗体。任何人都可以告诉如何为 CList Ctrl 做到这一点。 我已经为 CTreeCtrl 做了这个,就像这样 pTC->SetItemSt
我想为列表的任何列使用 CListCtrl.EditLabel()。我该如何实现这样的功能? 最佳答案 这是可行的,但它确实需要大量填充鼠标点击和焦点事件。 简而言之,您捕获鼠标左键按下消息并将其转换
我想将特定列的背景颜色更改为对话框的颜色(灰色)。我怎样才能实现它? void CUcsOpTerminalDlg::OnCustomdrawFeatureList(NMHDR *pNMHDR, LR
我是一名优秀的程序员,十分优秀!