MFC垂直滚动条实现

新建一个Hello.h头文件

代码如下:

class CMyApp :public CWinApp
{
public:
	virtual BOOL InitInstance();
};

class CMainWindow :public CFrameWnd
{
public:
	CMainWindow();
protected:
	//声明消息映射
	DECLARE_MESSAGE_MAP();
	afx_msg void OnPaint();
protected:
	int m_nVScrollPos;//滚动条的位置
	int m_nViewHeight;//数据的高度
	int m_nVPageSize; //页面的大小
public:
	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
	afx_msg void OnSize(UINT nType, int cx, int cy);
	afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
};

新建一个Hello.cpp头文件

代码如下:

#include"hello.h"
#define MAXLINE 100
#define LINESIZE 17
CMyApp myApp;
BOOL CMyApp::InitInstance()
{
	this->m_pMainWnd = new CMainWindow();
	this->m_pMainWnd->ShowWindow(this->m_nCmdShow);
	this->m_pMainWnd->UpdateWindow();
	return TRUE;
}
BEGIN_MESSAGE_MAP(CMainWindow, CFrameWnd)
	ON_WM_PAINT()
	ON_WM_CREATE()
	ON_WM_SIZE()
	ON_WM_VSCROLL()
END_MESSAGE_MAP()
CMainWindow::CMainWindow()
{
	this->Create(NULL, TEXT("the Hello Application"),WS_OVERLAPPEDWINDOW|WS_VSCROLL);
}
void CMainWindow::OnPaint() 
{
	CPaintDC dc(this);
	dc.SetWindowOrg(0, m_nVScrollPos);
	TCHAR szBuffer[1024];

	for (int i = 0; i < MAXLINE; ++i)
	{
		_sntprintf(szBuffer, 1024, TEXT("Hello %d"), i);
		dc.TextOutW(0, i * LINESIZE, szBuffer, lstrlen(szBuffer));
	}
}

int CMainWindow::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;

	// TODO:  在此添加您专用的创建代码
	m_nViewHeight = LINESIZE * MAXLINE;
	m_nVScrollPos = 0;
	return 0;
}


void CMainWindow::OnSize(UINT nType, int cx, int cy)
{
	CFrameWnd::OnSize(nType, cx, cy);
	int nVScrollMax = 0;
	// TODO: 在此处添加消息处理程序代码
	m_nVPageSize = 0;
	if (cy < m_nViewHeight)
	{
		nVScrollMax = m_nViewHeight - 1;
		m_nVPageSize = cy;
		m_nVScrollPos = min(m_nVScrollPos, m_nViewHeight - m_nVPageSize);
	}
	SCROLLINFO si;
	si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS;
	si.nMin = 0;
	si.nMax = nVScrollMax;
	si.nPos = m_nVScrollPos;
	si.nPage = m_nVPageSize;
	this->SetScrollInfo(SB_VERT, &si, TRUE);

}

//滚动条消息
void CMainWindow::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	CFrameWnd::OnVScroll(nSBCode, nPos, pScrollBar);
	int nDelta = 0;
	switch (nSBCode)
	{
	case SB_LINEUP:
		nDelta = -LINESIZE;
		break;
	case SB_PAGEUP:
		nDelta = -m_nVPageSize;
		break;
	case SB_THUMBTRACK:
		nDelta = (int)nPos - m_nVScrollPos;
		break;
	case SB_PAGEDOWN:
		nDelta = m_nVPageSize;
		break;
	case SB_LINEDOWN:
		nDelta = LINESIZE;
		break;
	default:
		return;
	}
	if (nDelta != 0)
	{
		m_nVScrollPos += nDelta;
		SetScrollPos(SB_VERT, m_nVScrollPos, TRUE);
		ScrollWindow(0, -nDelta);
	}
}

猜你喜欢

转载自blog.csdn.net/damowangsx/article/details/107584885