synchronizing scrolling in two CListViews
Todd C. Englund -- tenglund@sybase.com Thursday, September 26, 1996 To: mfc-l Subject: synchronizing scrolling in two CListViews Environment: VC++ 4.2, WinNT 3.51 I have an application that displays two CListViews side by side. Both views always contain the same number of items, and I would like to keep the vertical scroll position of both views synchronized. This can (almost) be done with an OnVScroll handler something like this: void CTestListView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: Add your message handler code here and/or call default CListView::OnVScroll(nSBCode, nPos, pScrollBar); POINT pt; m_pListCtrl->GetItemPosition(0, &pt); CBrowserDoc* pDoc = (CBrowserDoc*) GetDocument(); ASSERT(pDoc != NULL); POSITION pos = pDoc->GetFirstViewPosition(); while (pos != NULL) { CView* pView = pDoc->GetNextView(pos); if (pView->IsKindOf(RUNTIME_CLASS(CCompanionListView))) { CTestListView* pListView = (CCompanionListView *) pView; POINT otherpt; pListView->GetItemPosition(0, &otherpt); CSize sz; sz.cx = 0; sz.cy = otherpt.y - pt.y; pListView->Scroll(sz); } } } This OnVScroll handler looks for views that should be synchronized and calls their Scroll() member function. The Scroll() member simply calls Scroll() on the CListCtrl. The one problem that I have found with this approach occurs when one list view has a horizontal scrollbar and the other does not. A horizontal scrollbar reduces the height of the list control so the scroll range and position are changed slightly. What I would like to do is force both views to have a horizontal scrollbar when either requires one. I thought I could add some logic to a CListView::OnSize() handler that would determine if the list control's horizontal scrollbar is visible, and if so, set it to visible in the companion view. The problem is that GetScrollBar(SB_HORZ) always returns a NULL pointer when called for the list control. Even if I could get a pointer to the scroll bar in the list control, I suspect that there is no way to prevent the list control from hiding it again. Anyone have any idea how to take charge of a scroll bar in a list control? If not, perhaps there is another way to synchronize the views that will handle this case? Todd
Mario Contestabile -- Mario_Contestabile.UOS__MTL@UOSMTL2.universal.com Monday, September 30, 1996 >by side. Both views always contain the same number of items, >and I would like to keep the vertical scroll position of both >views synchronized. An easy was of achieving this might simply be to determine which item in the lists should be the first, and call CTreeCtrl::Select() with TVGN_FIRSTVISIBLE; That way regardless of the view sizes, their first item is the same, and it manages the rest of the items. mcontest@universal.com
| Вернуться в корень Архива |