Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Scroll для CTreeView при больших обьёмах данных


Автор: budweiser 10.5.2006, 14:55
Помогите!

В существующем проекте используется класс CTreeView. Например, class CLeftView : public CTreeView
Когда очень много данных (>65535) добавленных обычным InsertItem scroll bar сходит с ума.
MSDN советует использовать GetScrollInfo и SetScrollInfo для 32 битов. Свой scroll (точнее я его выудил в сетке) не помогает.
В тоже время вроде бы все работает с другими классами (пробовал разные примеры). 
Это что — проблема только класса CTreeView?  Я тут видел ссылки на баг Microsoft Q182231. Но там только Бейсик в <View products that this article applies to>. Хотя MSDN (в разделе Visual C++) про TVM_GETCOUNT также ссылается на Q182231.
Это можно как-то пофиксить или нет?  Может кто уже боролся с этим?  

заранее спасибо! 

а скролл такой:
Код

void CLeftView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
int iScrollBarPos = GetScrollPos( SB_VERT );

CRect rFrame;

GetClientRect( rFrame );

switch( nSBCode )
{
case SB_LINEUP:
iScrollBarPos = max( iScrollBarPos — m_iLineHeight, 0 );
break;

case SB_LINEDOWN:
iScrollBarPos = min( iScrollBarPos + m_iLineHeight, GetScrollLimit( SB_VERT ) );
break;

case SB_PAGEUP:
iScrollBarPos = max( iScrollBarPos — rFrame.Height(), 0 );
break;

case SB_PAGEDOWN:
iScrollBarPos = min( iScrollBarPos + rFrame.Height(), GetScrollLimit( SB_VERT ) );
break;

case SB_THUMBTRACK:
case SB_THUMBPOSITION:
{
SCROLLINFO si;

ZeroMemory( &si, sizeof(SCROLLINFO) );

si.cbSize = sizeof(SCROLLINFO);
si.fMask = SIF_TRACKPOS;

if( GetScrollInfo( SB_VERT, &si, SIF_TRACKPOS ) )
iScrollBarPos = si.nTrackPos;
else
iScrollBarPos = (UINT)nPos;
break;
}
} 

SetScrollPos( SB_VERT, iScrollBarPos );
Invalidate();
CWnd::OnVScroll(nSBCode, nPos, pScrollBar);
}
  
     

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)