| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184 |
- // 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);
- }
|