Flash when clearing CTreeCtrl
Grant Shirreffs Great Elk -- Grant.S@greatelk.com
Friday, November 15, 1996
Environment: VC++ 4.2-flat, Win NT 4.0
Does anyone know how to prevent the full-window flash when clearing a
CTreeCtrl using DeleteAllItems( )? I have tried enclosing the call in
SetRedraw(FALSE)/SetRedraw(TRUE) thus:
m_Tree.SetRedraw(FALSE);
m_Tree.DeleteAllItems();
m_Tree.SetRedraw(TRUE);
m_Tree.Invalidate();
but this has the bizarre effect of, when the tree list is refilled,
making the last item in the root level not display until you expand it.
My app has a tree control being continually cleared and refilled in
response to user input, so the repeated flash from the DeleteAllItems( )
is very distracting.
Any suggestions?
Grant Shirreffs
The Great Elk Company Limited
http://www.greatelk.com
Jim Barry -- Jim.Barry@ilp.com
Monday, November 18, 1996
[Mini-digest: 2 responses]
On 15 November 1996 03:29, Grant Shirreffs (Great Elk)[SMTP:Grant.S@greatelk.com] wrote:
>Environment: VC++ 4.2-flat, Win NT 4.0
>
>Does anyone know how to prevent the full-window flash when clearing a
>CTreeCtrl using DeleteAllItems( )? I have tried enclosing the call in
>SetRedraw(FALSE)/SetRedraw(TRUE) thus:
>
> m_Tree.SetRedraw(FALSE);
> m_Tree.DeleteAllItems();
> m_Tree.SetRedraw(TRUE);
> m_Tree.Invalidate();
>
>but this has the bizarre effect of, when the tree list is refilled,
>making the last item in the root level not display until you expand it.
>
>My app has a tree control being continually cleared and refilled in
>response to user input, so the repeated flash from the DeleteAllItems( )
>is very distracting.
>
>Any suggestions?
>
>Grant Shirreffs
>The Great Elk Company Limited
>http://www.greatelk.com
This is a known problem. See article Q130611 on MSDN or Books Online. Unfortunately, the only advice offered is to not use WM_SETREDRAW.
Jim Barry
Interactive Learning Productions
Newcastle upon Tyne, UK
-----From: "GoroKhM1"
You wrote:
> Does anyone know how to prevent the full-window flash when clearing
> a CTreeCtrl using DeleteAllItems( )?
The method from my app may help you. My app has a splitter with a tree
view in left pane and a form view in right pane. In my app the current
selection in a tree view controls form view. I implemented that method
to reduce tree deletion time, but I think it will be helpful to prevent
flashing.
void CMyTreeView::DeleteAllTree()
{
if (m_hSelItem == NULL) // already empty
return;
// DeleteAllItems() works fine, with one problem.
// Deletion process is sequentional, and if currently
// deleted item is selected, the next item will be
// selected. It means that FormView will be updated.
// If there are 100 items _below_ selected item, FormView
// will be updated 100 times with all DoDataExchange()!
// It's time consuming. To prevent this move selected
// item to the highest level (without parents) and skip
// it while deletion in a loop.
m_iLockSel++;
// Move selection to the highest level (without parents)
HTREEITEM hItem = m_hSelItem;
while (m_pTree->GetParentItem(hItem))
hItem = m_pTree->GetParentItem(hItem);
m_pTree->SelectItem(hItem);
m_hSelItem = hItem;
// Delete all items except selected
while (TRUE)
{
hItem = m_pTree->GetRootItem(); // first sibling without parents
if ( hItem == m_hSelItem)
hItem = m_pTree->GetNextSiblingItem(hItem);
if (hItem)
m_pTree->DeleteItem(hItem); // with all children
else
break;
}
// Delete the rest
m_pTree->DeleteAllItems();
m_hSelItem = NULL;
m_iLockSel--;
} // CMyTreeView::DeleteAllTree()
Counter m_iLockSel is used to prevent not desired updates, eg:
void CMyTreeView::OnSelChanging(NMHDR* pNMHDR, LRESULT* pResult)
{
// TVN_SELCHANGING notification message.
if (m_iLockSel)
return;
...
} // CMyTreeView::OnSelChanging()
-mg
MarkG@usa.net
| Вернуться в корень Архива
|