Create an Active Cursor on the Scroll Bar

CodeGuru content and product recommendations are editorially independent. We may make money when you click on links to our partners. Learn More.

Environment: VC6 SP5, VC.NET, Windows 2000

This code enables you to change the cursor dynamically on the scroll bar of the window, with scrolling capabilities. The variable m_nCursorID is used to prevent multiple loading of the cursor.


CMyWnd is derived from CWnd.

UINT m_nCursorID; //Current ID of the cursor resource

CMyWnd::CMyWnd()
{
m_nCursorID = 0;
}

BOOL CMyWnd::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
if (nHitTest == HTVSCROLL)
{
//Change cursor on the vertical scroll bar
if(m_nCursorID != IDC_VSCROLLBAR)
{
SetCursor(AfxGetApp()->LoadCursor(IDC_VSCROLLBAR));
m_nCursorID = IDC_VSCROLLBAR;
}
return true;
}
else if (nHitTest == HTHSCROLL)
{
//Change cursor on the horizontal scroll bar
if(m_nCursorID != IDC_HSCROLLBAR)
{
SetCursor(AfxGetApp()->LoadCursor(IDC_HSCROLLBAR));
m_nCursorID = IDC_HSCROLLBAR;
}
return true;
}
else
{
if(m_nCursorID != 0) m_nCursorID = 0;
return BaseClass::OnSetCursor(pWnd, nHitTest, message);
}

}

void CMyWnd::OnVScroll(UINT nSBCode, UINT nPos,
CScrollBar* pScrollBar)
{
switch (nSBCode) {
case SB_THUMBTRACK: //Drag scroll box to specified position
if(m_nCursorID != IDC_VTHUMBTRACK)
{
SetCursor(AfxGetApp()->LoadCursor(IDC_VTHUMBTRACK));
m_nCursorID = IDC_VTHUMBTRACK;
}
break;
case SB_LINEDOWN: //Scroll one line down
if(GetScrollPos(SB_VERT) == GetScrollLimit(SB_VERT))
{
if(m_nCursorID != IDC_VLINEDOWN_DISABLE)
{
SetCursor(AfxGetApp()->LoadCursor(IDC_VLINEDOWN_DISABLE));
m_nCursorID = IDC_VLINEDOWN_DISABLE;
}
}
else
{
if(m_nCursorID != IDC_VLINEDOWN)
{
SetCursor(AfxGetApp()->LoadCursor(IDC_VLINEDOWN));
m_nCursorID = IDC_VLINEDOWN;
}
}
break;
case SB_LINEUP: //Scroll one line up
SCROLLINFO info;
info.cbSize = sizeof(SCROLLINFO);
GetScrollInfo(SB_VERT, &info);
if(info.nPos == info.nMin)
{
if(m_nCursorID != IDC_VLINEUP_DISABLE)
{
SetCursor(AfxGetApp()->LoadCursor(IDC_VLINEUP_DISABLE));
m_nCursorID = IDC_VLINEUP_DISABLE;
}
}
else
{
if(m_nCursorID != IDC_VLINEUP)
{
SetCursor(AfxGetApp()->LoadCursor(IDC_VLINEUP));
m_nCursorID = IDC_VLINEUP;
}
}
break;
case SB_PAGEDOWN: //Scroll one page down
if(m_nCursorID != IDC_VPAGEDOWN)
{
SetCursor(AfxGetApp()->LoadCursor(IDC_VPAGEDOWN));
m_nCursorID = IDC_VPAGEDOWN;
}
break;
case SB_PAGEUP: //Scroll one page up
if(m_nCursorID != IDC_VPAGEUP)
{
SetCursor(AfxGetApp()->LoadCursor(IDC_VPAGEUP));
m_nCursorID = IDC_VPAGEUP;
}
break;
}
BaseClass::OnVScroll(nSBCode, nPos, pScrollBar);
}

void CMyWnd::OnHScroll(UINT nSBCode, UINT nPos,
CScrollBar* pScrollBar)
{
switch (nSBCode) {
case SB_THUMBTRACK: //Drag scroll box to specified position
if(m_nCursorID != IDC_HTHUMBTRACK)
{
SetCursor(AfxGetApp()->LoadCursor(IDC_HTHUMBTRACK));
m_nCursorID = IDC_HTHUMBTRACK;
}
break;
case SB_LINEDOWN: //Scroll one line down
if(GetScrollPos(SB_HORZ) == GetScrollLimit(SB_HORZ))
{
if(m_nCursorID != IDC_HLINEDOWN_DISABLE)
{
SetCursor(AfxGetApp()->LoadCursor(IDC_HLINEDOWN_DISABLE));
m_nCursorID = IDC_HLINEDOWN_DISABLE;
}
}
else
{
if(m_nCursorID != IDC_HLINEDOWN)
{
SetCursor(AfxGetApp()->LoadCursor(IDC_HLINEDOWN));
m_nCursorID = IDC_HLINEDOWN;
}
}
break;
case SB_LINEUP: //Scroll one line up
SCROLLINFO info;
info.cbSize = sizeof(SCROLLINFO);
GetScrollInfo(SB_HORZ, &info);
if(info.nPos == info.nMin)
{
if(m_nCursorID != IDC_HLINEUP_DISABLE)
{
SetCursor(AfxGetApp()->LoadCursor(IDC_HLINEUP_DISABLE));
m_nCursorID = IDC_HLINEUP_DISABLE;
}
}
else
{
if(m_nCursorID != IDC_HLINEUP)
{
SetCursor(AfxGetApp()->LoadCursor(IDC_HLINEUP));
m_nCursorID = IDC_HLINEUP;
}
}
break;
case SB_PAGEDOWN: //Scroll one page down
if(m_nCursorID != IDC_HPAGEDOWN)
{
SetCursor(AfxGetApp()->LoadCursor(IDC_HPAGEDOWN));
m_nCursorID = IDC_HPAGEDOWN;
}
break;
case SB_PAGEUP: //Scroll one page up
if(m_nCursorID != IDC_HPAGEUP)
{
SetCursor(AfxGetApp()->LoadCursor(IDC_HPAGEUP));
m_nCursorID = IDC_HPAGEUP;
}
break;
}
BaseClass::OnHScroll(nSBCode, nPos, pScrollBar);
}

Downloads

Download demo project – 37 Kb

More by Author

Get the Free Newsletter!

Subscribe to Developer Insider for top news, trends & analysis

Must Read