// MyView.h
#pragma once
#include <afxwin.h>
class CMyView : public CView
{
protected:
afx_msg void OnInitialUpdate();
afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
DECLARE_MESSAGE_MAP()
};
// MyView.cpp
#include "pch.h"
#include "MyView.h"
BEGIN_MESSAGE_MAP(CMyView, CView)
ON_WM_INITIALUPDATE()
ON_WM_VSCROLL()
ON_WM_HSCROLL()
END_MESSAGE_MAP()
void CMyView::OnInitialUpdate()
{
CView::OnInitialUpdate();
// 设置滚动条信息
SCROLLINFO si;
memset(&si, 0, sizeof(si));
si.cbSize = sizeof(si);
si.fMask = SIF_RANGE | SIF_PAGE;
// 设置水平滚动条
si.nMin = 0;
si.nMax = 1000; // 假设内容宽度为1000
si.nPage = GetClientRect().Width();
SetScrollInfo(SB_HORZ, &si, TRUE);
// 设置垂直滚动条
si.nMin = 0;
si.nMax = 1000; // 假设内容高度为1000
si.nPage = GetClientRect().Height();
SetScrollInfo(SB_VERT, &si, TRUE);
}
void CMyView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
SCROLLINFO si;
memset(&si, 0, sizeof(si));
si.cbSize = sizeof(si);
si.fMask = SIF_ALL;
GetScrollInfo(SB_VERT, &si);
int nScrollPos = si.nPos;
switch (nSBCode)
{
case SB_LINEUP:
nScrollPos -= 1;
break;
case SB_LINEDOWN:
nScrollPos += 1;
break;
case SB_PAGEUP:
nScrollPos -= si.nPage;
break;
case SB_PAGEDOWN:
nScrollPos += si.nPage;
break;
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
nScrollPos = nPos;
break;
}
si.nPos = nScrollPos;
si.fMask = SIF_POS;
SetScrollInfo(SB_VERT, &si, TRUE);
}
void CMyView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
SCROLLINFO si;
memset(&si, 0, sizeof(si));
si.cbSize = sizeof(si);
si.fMask = SIF_ALL;
GetScrollInfo(SB_HORZ, &si);
int nScrollPos = si.nPos;
switch (nSBCode)
{
case SB_LINELEFT:
nScrollPos -= 1;
break;
case SB_LINERIGHT:
nScrollPos += 1;
break;
case SB_PAGELEFT:
nScrollPos -= si.nPage;
break;
case SB_PAGERIGHT:
nScrollPos += si.nPage;
break;
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
nScrollPos = nPos;
break;
}
si.nPos = nScrollPos;
si.fMask = SIF_POS;
SetScrollInfo(SB_HORZ, &si, TRUE);
}
- 初始化一个
SCROLLINFO
结构体 si
,并设置其大小和掩码 fMask
。SIF_RANGE
表示要设置滚动条的范围,SIF_PAGE
表示要设置页面大小。 - 分别设置水平和垂直滚动条的范围和页面大小。范围的设置使得内容大小超出了客户区大小,从而确保滚动条显示。
- 使用
SetScrollInfo
函数将设置的滚动条信息应用到窗口。