C++ 有没有人用过;滚动箭头“;在水平滚动条中滚动位置?
我希望使用滚动条两端的滚动箭头来滚动条的位置。众所周知,滚动条不像其他控件那样具有通知功能,因此我面临一个问题 我的滚动条代码如下-C++ 有没有人用过;滚动箭头“;在水平滚动条中滚动位置?,c++,visual-c++,mfc,user-controls,C++,Visual C++,Mfc,User Controls,我希望使用滚动条两端的滚动箭头来滚动条的位置。众所周知,滚动条不像其他控件那样具有通知功能,因此我面临一个问题 我的滚动条代码如下- void CScrollBarExDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { if(nSBCode==SB_THUMBPOSITION) { if(pScrollBar==&m_Scroll) {
void CScrollBarExDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
if(nSBCode==SB_THUMBPOSITION)
{
if(pScrollBar==&m_Scroll)
{
m_Edit=nPos;
m_Scroll.SetScrollPos(nPos);
}
}
UpdateData(FALSE);
CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}
要使用滚动条控件,您必须稍微修改:
//add to message map
ON_WM_HSCROLL()
//initialize in OnInitDialog
SCROLLINFO info = { sizeof(SCROLLINFO) };
info.nMin = 0;
info.nMax = 100;
info.nPage = 1;
info.fMask = SIF_ALL;
m_Scroll.SetScrollInfo(&info, TRUE);
如果info.nPage
大于1,则可能超出范围。添加此行以修复它:
info.nMax += info.nPage - 1;
添加重载:
void CMyDialog::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
if (pScrollBar == &m_Scroll)
{
//get scrollbar information
SCROLLINFO info;
m_Scroll.GetScrollInfo(&info, SIF_ALL);
int pos = info.nPos;
//calculate the new position of scroll box
switch (nSBCode)
{
case SB_LEFT: pos = info.nMin; break;
case SB_RIGHT: pos = info.nMax; break;
case SB_LINELEFT: pos--; break;
case SB_LINERIGHT: pos++; break;
case SB_PAGELEFT: pos -= info.nPage; break;
case SB_PAGERIGHT: pos += info.nPage; break;
case SB_THUMBPOSITION: pos = nPos; break;
case SB_THUMBTRACK: pos = nPos; break;
}
//make sure the new position is within range
if (pos < info.nMin) pos = info.nMin;
//adjust the max value, incase we had changed it earlier in OnInitDialog
int max = info.nMax - info.nPage + 1;
if (pos > max) pos = max;
//set the new position
m_Scroll.SetScrollPos(pos);
}
}
void CMyDialog::OnHScroll(UINT nSBCode、UINT npo、CScrollBar*pScrollBar)
{
CDialog::OnVScroll(nSBCode、npo、pScrollBar);
如果(pScrollBar==&m_滚动)
{
//获取滚动条信息
滚动信息;
m_Scroll.GetScrollInfo(&info,SIF_ALL);
int pos=info.nPos;
//计算滚动框的新位置
交换机(nSBCode)
{
案例SB_左:pos=info.nMin;中断;
案例SB_RIGHT:pos=info.nMax;break;
案例SB_LINELEFT:位置--;中断;
case SB_LINERIGHT:pos++;break;
case SB_PAGELEFT:pos-=info.nPage;break;
case SB_PAGERIGHT:pos+=info.nPage;break;
案例SB_拇指位置:位置=NPO;断裂;
案例SB_指迹:pos=NPO;中断;
}
//确保新位置在范围内
如果(pos最大值)位置=最大值;
//设置新位置
m_滚动设置滚动位置(位置);
}
}
因此我面临一个问题
您似乎忘记了解释您面临的问题。您在处理滚动箭头时遇到了什么问题?您是否阅读了OnHScroll
的文档,特别是nSBCode
参数的说明?除了SB_THUMBPOSITION
,它还有什么其他值?是的,我说的是MSDN文档。如果在函数中放置断点,单击箭头,然后在调试器中检查nSBCode
,一旦遇到断点,变量有什么值?nPage
应设置为1。如果需要将nPage
设置为其他值,请参见编辑。虽然这不是必须的。您可能还想看看滑块控制。