// CfgDialog.cpp : 实现文件 // #include "stdafx.h" #include "FirstStep.h" #include "CfgDialog.h" #include "afxdialogex.h" // CCfgDialog 对话框 IMPLEMENT_DYNAMIC(CCfgDialog, CDialogEx) CCfgDialog::CCfgDialog(UINT Page, UINT IDTemplate, CWnd* pParent /*=NULL*/) : CDialogEx(IDTemplate, pParent), m_Page(Page), m_MaxPos(0), m_PrevPos(1) { } CCfgDialog::~CCfgDialog() { } void CCfgDialog::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); } /***************************************************************** **【函数名称】 __getScrollPos **【函数功能】 计算页面滚动范围 **【参数】 **【返回值】 ****************************************************************/ int CCfgDialog::_getScrollPos( int Bar, UINT SBCode ) { SCROLLINFO si; si.cbSize = sizeof(SCROLLINFO); si.fMask = SIF_PAGE | SIF_POS | SIF_RANGE | SIF_TRACKPOS; GetScrollInfo(Bar, &si); const int minPos = si.nMin; const int maxPos = si.nMax - (si.nPage - 1); int result = -1; switch(SBCode) { case SB_LINEUP /*SB_LINELEFT*/: result = max(si.nPos - 1, minPos); break; case SB_LINEDOWN /*SB_LINERIGHT*/: result = min(si.nPos + 1, maxPos); break; case SB_PAGEUP /*SB_PAGELEFT*/: result = max(si.nPos - (int)si.nPage, minPos); break; case SB_PAGEDOWN /*SB_PAGERIGHT*/: result = min(si.nPos + (int)si.nPage, maxPos); break; case SB_THUMBPOSITION: // do nothing break; case SB_THUMBTRACK: result = si.nTrackPos; break; case SB_TOP /*SB_LEFT*/: result = minPos; break; case SB_BOTTOM /*SB_RIGHT*/: result = maxPos; break; case SB_ENDSCROLL: // do nothing break; } return result; } /***************************************************************** **【函数名称】 __scrollClient **【函数功能】 滚动页面 **【参数】 **【返回值】 ****************************************************************/ void CCfgDialog::_scrollClient( int Bar, int Pos ) { int cy = 0; cy = m_PrevPos - Pos; m_PrevPos = Pos; if(cy) { ScrollWindow(0, cy, NULL, NULL); } } /***************************************************************** **【函数名称】 __vScrool **【函数功能】 垂直滚动页面 **【参数】 **【返回值】 ****************************************************************/ void CCfgDialog::_vScrool( int Bar, UINT SBCode, bool IsMouseWheel, bool IsUp ) { int scrollPos = _getScrollPos(Bar, SBCode); if(scrollPos == -1) return; if(IsMouseWheel) { if(IsUp) { scrollPos -= 25; scrollPos = (scrollPos < 1) ? 1 : scrollPos; } else { scrollPos += 25; scrollPos = (scrollPos > m_MaxPos) ? m_MaxPos : scrollPos; } } SetScrollPos(Bar, scrollPos, TRUE); _scrollClient(Bar, scrollPos); } BEGIN_MESSAGE_MAP(CCfgDialog, CDialogEx) ON_WM_VSCROLL() ON_WM_MOUSEWHEEL() END_MESSAGE_MAP() // CCfgDialog 消息处理程序 BOOL CCfgDialog::OnInitDialog() { CDialogEx::OnInitDialog(); // TODO: 在此添加额外的初始化 CRect rc; GetClientRect(&rc); const SIZE sz = { rc.right - rc.left, rc.bottom - rc.top }; SCROLLINFO si; si.cbSize = sizeof(SCROLLINFO); si.fMask = SIF_PAGE | SIF_POS | SIF_RANGE; si.nPos = si.nMin = 1; si.nMax = sz.cy * m_Page; si.nPage = sz.cy; m_MaxPos = sz.cy; SetScrollInfo(SB_VERT, &si, FALSE); //此函数将产生一个垂直滚动条 return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE } void CCfgDialog::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: 在此添加消息处理程序代码和/或调用默认值 _vScrool(SB_VERT, nSBCode, false, false); CDialogEx::OnVScroll(nSBCode, nPos, pScrollBar); } BOOL CCfgDialog::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) { // TODO: 在此添加消息处理程序代码和/或调用默认值 if(zDelta < 0) _vScrool(SB_VERT, SB_LINEDOWN, true, false); else _vScrool(SB_VERT, SB_LINEUP, true, true); return CDialogEx::OnMouseWheel(nFlags, zDelta, pt); }