jean philippe phan
2010-02-12 12:02:01 UTC
Hi
I experienced a CTreeCtrl performance issue only on Window7, not on XP, not
on Vista.
- I insert 5000 items into a CTreeCtrl.
- When i click on a button, i will call SetItem with the integral=2
(TVIF_INTEGRAL) on 1000 first items.
XP takes 1 second to execute this command, W7 takes 8 seconds
Please could some one help me?
Here is my code in MFC modal window:
BOOL CMFCTreeDlg::OnInitDialog()
{
CDialog::OnInitDialog();
...
// TODO: Add extra initialization here
CTreeCtrl* pTreeCtrl = (CTreeCtrl*)GetDlgItem(IDC_TREE1);
if (pTreeCtrl != NULL )
{
for(int i=0; i<5000; ++i)
{
wchar_t ws[125];
wsprintf( ws, L"Tree1: item%ld", i);
pTreeCtrl->InsertItem(ws);
}
}
return TRUE; // return TRUE unless you set the focus to a control
}
void CMFCTreeDlg::OnBnClickedOk()
{
// TODO: Add your control notification handler code here
CTreeCtrl* pTreeCtrl = (CTreeCtrl*)GetDlgItem(IDC_TREE1);
if (pTreeCtrl != NULL )
{
pTreeCtrl->SetRedraw(FALSE);
HTREEITEM hRoot = pTreeCtrl->GetRootItem();
for(int i=0; i<1000; ++i)
{
hRoot = pTreeCtrl->GetNextItem(hRoot, TVGN_NEXT);
// Set iIntegral
TVITEMEX tvItemEx;
memset(&tvItemEx, 0, sizeof(tvItemEx));
tvItemEx.mask = TVIF_INTEGRAL;
tvItemEx.hItem = hRoot;
tvItemEx.iIntegral = 2;
pTreeCtrl->SetItem((TVITEMW *)&tvItemEx);
}
pTreeCtrl->SetRedraw(TRUE);
pTreeCtrl->Invalidate();
pTreeCtrl->UpdateWindow();
}
//OnOK();
}
void CMFCTreeDlg::OnTvnSelchangedTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
// TODO: Add your control notification handler code here
*pResult = 0;
}
I experienced a CTreeCtrl performance issue only on Window7, not on XP, not
on Vista.
- I insert 5000 items into a CTreeCtrl.
- When i click on a button, i will call SetItem with the integral=2
(TVIF_INTEGRAL) on 1000 first items.
XP takes 1 second to execute this command, W7 takes 8 seconds
Please could some one help me?
Here is my code in MFC modal window:
BOOL CMFCTreeDlg::OnInitDialog()
{
CDialog::OnInitDialog();
...
// TODO: Add extra initialization here
CTreeCtrl* pTreeCtrl = (CTreeCtrl*)GetDlgItem(IDC_TREE1);
if (pTreeCtrl != NULL )
{
for(int i=0; i<5000; ++i)
{
wchar_t ws[125];
wsprintf( ws, L"Tree1: item%ld", i);
pTreeCtrl->InsertItem(ws);
}
}
return TRUE; // return TRUE unless you set the focus to a control
}
void CMFCTreeDlg::OnBnClickedOk()
{
// TODO: Add your control notification handler code here
CTreeCtrl* pTreeCtrl = (CTreeCtrl*)GetDlgItem(IDC_TREE1);
if (pTreeCtrl != NULL )
{
pTreeCtrl->SetRedraw(FALSE);
HTREEITEM hRoot = pTreeCtrl->GetRootItem();
for(int i=0; i<1000; ++i)
{
hRoot = pTreeCtrl->GetNextItem(hRoot, TVGN_NEXT);
// Set iIntegral
TVITEMEX tvItemEx;
memset(&tvItemEx, 0, sizeof(tvItemEx));
tvItemEx.mask = TVIF_INTEGRAL;
tvItemEx.hItem = hRoot;
tvItemEx.iIntegral = 2;
pTreeCtrl->SetItem((TVITEMW *)&tvItemEx);
}
pTreeCtrl->SetRedraw(TRUE);
pTreeCtrl->Invalidate();
pTreeCtrl->UpdateWindow();
}
//OnOK();
}
void CMFCTreeDlg::OnTvnSelchangedTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
// TODO: Add your control notification handler code here
*pResult = 0;
}