建立一个SDI,CScrollView视图的程序,响应消息WM_HSCROLL,照 July 2000 MSDN上写了以下代码。
void CTestView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
int curpos = pScrollBar->GetScrollPos(); //就是这里出错
CScrollView::OnHScroll(nSBCode, nPos, pScrollBar);
}
但却出错,何解呢?难道是MSDN有错?
void CTestView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
int curpos = pScrollBar->GetScrollPos(); //就是这里出错
CScrollView::OnHScroll(nSBCode, nPos, pScrollBar);
}
但却出错,何解呢?难道是MSDN有错?
int curpos = pScrollBar->GetScrollPos(); //就是这里出错
只有当那个滚动条不是view自带的而是你自己创建的时候 比如formview中你做了一个 那时响应滚动时pScrollBar才为那个控件的指针
这一点你可以去看看sdk的程序设计有相关的论述
int curpos =GetScrollPos(SB_HORZ);
就行了。
你用CWnd::GetScrollBarCtrl 得到的都是NULL
CWnd::GetScrollBarCtrl 只能得到纯粹的控件cscrollbar
对于窗口的风格,本来就不存在一个cscrollbar对象,当然得不到了!
你直接使用
视图的
CScrollView::GetScrollPosition ()
CScrollView::ScrollToPosition ()
就行了
看一下源代码就清楚了----------------------
CScrollBar* CView::GetScrollBarCtrl(int nBar) const
{
ASSERT(nBar == SB_HORZ || nBar == SB_VERT);//就是下面这段代码
//==========================================
if (GetStyle() & ((nBar == SB_HORZ) ? WS_HSCROLL : WS_VSCROLL))
{
// it has a regular windows style scrollbar (no control)
return NULL;
}
//=========================================
CWnd* pParent = GetParentSplitter(this, TRUE);
if (pParent == NULL)
return NULL; // no splitter UINT nID = _AfxGetDlgCtrlID(m_hWnd);
if (nID < AFX_IDW_PANE_FIRST || nID > AFX_IDW_PANE_LAST)
return NULL; // not a standard pane ID // appropriate PANE id - look for sibling (splitter, or just frame)
UINT nIDScroll;
if (nBar == SB_HORZ)
nIDScroll = AFX_IDW_HSCROLL_FIRST + (nID - AFX_IDW_PANE_FIRST) % 16;
else
nIDScroll = AFX_IDW_VSCROLL_FIRST + (nID - AFX_IDW_PANE_FIRST) / 16; // return shared scroll bars that are immediate children of splitter
return (CScrollBar*)pParent->GetDlgItem(nIDScroll);
}