//SCrollAblePropertyPage.h #pragma once // CSCrollAblePropertyPage 对话框 class CSCrollAblePropertyPage : public CPropertyPage { DECLARE_DYNAMIC(CSCrollAblePropertyPage) public: CSCrollAblePropertyPage(UINT nIDD=IDC_STATIC); virtual ~CSCrollAblePropertyPage(); // 对话框数据 protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 protected: int m_nCurWidth, m_nCurHeight; int m_nHScrollPos, m_nVScrollPos; CRect m_nOrgRect; protected: afx_msg void OnSize(UINT nType, int cx, int cy); afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); DECLARE_MESSAGE_MAP() public: virtual BOOL OnInitDialog(); }; // SCrollAblePropertyPage.cpp : 实现文件 // #include "stdafx.h" #include "SCrollAblePropertyPage.h" // CSCrollAblePropertyPage 对话框 IMPLEMENT_DYNAMIC(CSCrollAblePropertyPage, CPropertyPage) CSCrollAblePropertyPage::CSCrollAblePropertyPage(UINT nIDD) : CPropertyPage(nIDD) { } CSCrollAblePropertyPage::~CSCrollAblePropertyPage() { } void CSCrollAblePropertyPage::DoDataExchange(CDataExchange* pDX) { CPropertyPage::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CSCrollAblePropertyPage, CPropertyPage) ON_WM_SIZE() ON_WM_VSCROLL() ON_WM_HSCROLL() //}}AFX_MSG_MAP END_MESSAGE_MAP() // CSCrollAblePropertyPage 消息处理程序 BOOL CSCrollAblePropertyPage::OnInitDialog() { CPropertyPage::OnInitDialog(); // TODO: 在此添加额外的初始化 GetWindowRect(m_nOrgRect); m_nHScrollPos = m_nVScrollPos = 0; m_nCurWidth = m_nOrgRect.Width(); m_nCurHeight = m_nOrgRect.Height(); return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE } void CSCrollAblePropertyPage::OnSize(UINT nType, int cx, int cy) { CPropertyPage::OnSize(nType, cx, cy); // TODO: Add your message handler code here. { m_nCurWidth = cx; int nScrollMax = 0; if (cx < m_nOrgRect.Width()) nScrollMax = m_nOrgRect.Width() - cx; SCROLLINFO si; si.cbSize = sizeof(SCROLLINFO); si.fMask = SIF_ALL; // SIF_ALL = SIF_PAGE | SIF_RANGE | SIF_POS; si.nMin = 0; si.nMax = nScrollMax; si.nPage = si.nMax/10; si.nPos = 0; SetScrollInfo(SB_HORZ, &si, TRUE); } { m_nCurHeight = cy; int nScrollMax = 0; if (cy < m_nOrgRect.Height()) nScrollMax = m_nOrgRect.Height() - cy; SCROLLINFO si; si.cbSize = sizeof(SCROLLINFO); si.fMask = SIF_ALL; // SIF_ALL = SIF_PAGE | SIF_RANGE | SIF_POS; si.nMin = 0; si.nMax = nScrollMax; si.nPage = si.nMax/10; si.nPos = 0; SetScrollInfo(SB_VERT, &si, TRUE); } } void CSCrollAblePropertyPage::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: 在此添加消息处理程序代码和/或调用默认值 // TODO: Add your message handler code here and/or call default. int nDelta; int nMaxPos = m_nOrgRect.Height() - m_nCurHeight; switch (nSBCode) { case SB_LINEDOWN: if (m_nVScrollPos >= nMaxPos) return; nDelta = min(nMaxPos/100,nMaxPos-m_nVScrollPos); break; case SB_LINEUP: if (m_nVScrollPos <= 0) return; nDelta = -min(nMaxPos/100,m_nVScrollPos); break; case SB_PAGEDOWN: if (m_nVScrollPos >= nMaxPos) return; nDelta = min(nMaxPos/10,nMaxPos-m_nVScrollPos); break; case SB_THUMBPOSITION: nDelta = (int)nPos - m_nVScrollPos; break; case SB_PAGEUP: if (m_nVScrollPos <= 0) return; nDelta = -min(nMaxPos/10,m_nVScrollPos); break; default: return; } m_nVScrollPos += nDelta; SetScrollPos(SB_VERT,m_nVScrollPos,TRUE); ScrollWindow(0,-nDelta); CPropertyPage::OnVScroll(nSBCode, nPos, pScrollBar); } void CSCrollAblePropertyPage::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: 在此添加消息处理程序代码和/或调用默认值 int nDelta; int nMaxPos = m_nOrgRect.Width() - m_nCurWidth; switch (nSBCode) { case SB_LINERIGHT: if (m_nHScrollPos >= nMaxPos) return; nDelta = min(nMaxPos/100,nMaxPos-m_nHScrollPos); break; case SB_LINELEFT: if (m_nVScrollPos <= 0) return; nDelta = -min(nMaxPos/100,m_nHScrollPos); break; case SB_PAGERIGHT: if (m_nHScrollPos >= nMaxPos) return; nDelta = min(nMaxPos/10,nMaxPos-m_nHScrollPos); break; case SB_THUMBPOSITION: nDelta = (int)nPos - m_nHScrollPos; break; case SB_PAGEUP: if (m_nHScrollPos <= 0) return; nDelta = -min(nMaxPos/10,m_nHScrollPos); break; default: return; } m_nHScrollPos += nDelta; SetScrollPos(SB_HORZ,m_nHScrollPos,TRUE); ScrollWindow(-nDelta, 0); CPropertyPage::OnVScroll(nSBCode, nPos, pScrollBar); } //参考MSDN帮助 如何用 Visual c + + 中的滚动条创建一个 resizeable 对话框