www.pudn.com > ScrollableChildDialog_demo.zip > DlgScrollable.cpp


// DlgScrollable.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "P01.h" 
#include "DlgScrollable.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CDlgScrollable dialog 
 
 
CDlgScrollable::CDlgScrollable(CWnd* pParent /*=NULL*/) 
	: CDialog(CDlgScrollable::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CDlgScrollable) 
		// NOTE: the ClassWizard will add member initialization here 
	//}}AFX_DATA_INIT 
 
	m_bDragging=FALSE; 
 
	// modeless dialog - don't forget to force the 
	// WS_CHILD style in the resource template and remove 
	// caption and system menu 
	Create(CDlgScrollable::IDD,pParent); 
} 
 
 
void CDlgScrollable::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CDlgScrollable) 
		// NOTE: the ClassWizard will add DDX and DDV calls here 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(CDlgScrollable, CDialog) 
	//{{AFX_MSG_MAP(CDlgScrollable) 
	ON_WM_VSCROLL() 
	ON_WM_SIZE() 
	ON_WM_MOUSEWHEEL() 
	ON_WM_LBUTTONDOWN() 
	ON_WM_LBUTTONUP() 
	ON_WM_MOUSEMOVE() 
	ON_WM_KILLFOCUS() 
	//}}AFX_MSG_MAP 
	ON_WM_SETCURSOR() 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CDlgScrollable message handlers 
 
BOOL CDlgScrollable::OnInitDialog()  
{ 
	CDialog::OnInitDialog(); 
 
	m_hCursor1=AfxGetApp()->LoadCursor(IDC_CURSOR1); 
	m_hCursor2=AfxGetApp()->LoadCursor(IDC_CURSOR2); 
 
	//SetClassLong(m_hWnd,GCL_HCURSOR,(long)m_hCursor1); 
	 
	// save the original size 
	GetWindowRect(m_rcOriginalRect); 
 
	// initial scroll position 
	m_nScrollPos = 0;  
	 
	return TRUE;  // return TRUE unless you set the focus to a control 
	              // EXCEPTION: OCX Property Pages should return FALSE 
} 
 
void CDlgScrollable::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)  
{ 
	int nDelta; 
	int nMaxPos = m_rcOriginalRect.Height() - m_nCurHeight; 
 
	switch (nSBCode) 
	{ 
	case SB_LINEDOWN: 
		if (m_nScrollPos >= nMaxPos) 
			return; 
 
		nDelta = min(max(nMaxPos/20,5),nMaxPos-m_nScrollPos); 
		break; 
 
	case SB_LINEUP: 
		if (m_nScrollPos <= 0) 
			return; 
		nDelta = -min(max(nMaxPos/20,5),m_nScrollPos); 
		break; 
	case SB_PAGEDOWN: 
		if (m_nScrollPos >= nMaxPos) 
			return; 
		nDelta = min(max(nMaxPos/10,5),nMaxPos-m_nScrollPos); 
		break; 
	case SB_THUMBTRACK: 
	case SB_THUMBPOSITION: 
		nDelta = (int)nPos - m_nScrollPos; 
		break; 
 
	case SB_PAGEUP: 
		if (m_nScrollPos <= 0) 
			return; 
		nDelta = -min(max(nMaxPos/10,5),m_nScrollPos); 
		break; 
	 
         default: 
		return; 
	} 
	m_nScrollPos += nDelta; 
	SetScrollPos(SB_VERT,m_nScrollPos,TRUE); 
	ScrollWindow(0,-nDelta); 
	CDialog::OnVScroll(nSBCode, nPos, pScrollBar); 
} 
 
void CDlgScrollable::OnSize(UINT nType, int cx, int cy)  
{ 
	CDialog::OnSize(nType, cx, cy); 
 
	m_nCurHeight = cy; 
 
	SCROLLINFO si; 
	si.cbSize = sizeof(SCROLLINFO); 
	si.fMask = SIF_ALL;  
	si.nMin = 0; 
	si.nMax = m_rcOriginalRect.Height(); 
	si.nPage = cy; 
	si.nPos = 0; 
    SetScrollInfo(SB_VERT, &si, TRUE); 	 
 
} 
 
BOOL CDlgScrollable::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)  
{ 
	int nMaxPos = m_rcOriginalRect.Height() - m_nCurHeight; 
 
	if (zDelta<0) 
	{ 
		if (m_nScrollPos < nMaxPos) 
		{ 
			zDelta = min(max(nMaxPos/20,5),nMaxPos-m_nScrollPos); 
 
			m_nScrollPos += zDelta; 
			SetScrollPos(SB_VERT,m_nScrollPos,TRUE); 
			ScrollWindow(0,-zDelta); 
		} 
	} 
	else 
	{ 
		if (m_nScrollPos > 0) 
		{ 
			zDelta = -min(max(nMaxPos/20,5),m_nScrollPos); 
 
			m_nScrollPos += zDelta; 
			SetScrollPos(SB_VERT,m_nScrollPos,TRUE); 
			ScrollWindow(0,-zDelta); 
		} 
	} 
	 
	return CDialog::OnMouseWheel(nFlags, zDelta, pt); 
} 
 
void CDlgScrollable::OnCancel()  
{ 
} 
 
void CDlgScrollable::OnOK()  
{ 
} 
 
void CDlgScrollable::OnLButtonDown(UINT nFlags, CPoint point)  
{ 
	m_bDragging=TRUE; 
	SetCapture(); 
 
	m_ptDragPoint=point; 
 
	SetCursor(m_hCursor2); 
	 
	CDialog::OnLButtonDown(nFlags, point); 
} 
 
void CDlgScrollable::OnLButtonUp(UINT nFlags, CPoint point)  
{ 
	EndDrag(); 
	 
	CDialog::OnLButtonUp(nFlags, point); 
} 
 
void CDlgScrollable::OnMouseMove(UINT nFlags, CPoint point)  
{ 
	if (m_bDragging) 
	{ 
		int nDelta=m_ptDragPoint.y-point.y; 
		m_ptDragPoint=point; 
 
		int nNewPos=m_nScrollPos+nDelta; 
 
		if (nNewPos<0) 
			nNewPos=0; 
		else if (nNewPos>m_rcOriginalRect.Height() - m_nCurHeight) 
			nNewPos=m_rcOriginalRect.Height() - m_nCurHeight; 
 
		nDelta=nNewPos-m_nScrollPos; 
		m_nScrollPos=nNewPos; 
 
		SetScrollPos(SB_VERT,m_nScrollPos,TRUE); 
		ScrollWindow(0,-nDelta); 
	} 
	 
	CDialog::OnMouseMove(nFlags, point); 
} 
 
void CDlgScrollable::OnKillFocus(CWnd* pNewWnd)  
{ 
	CDialog::OnKillFocus(pNewWnd); 
 
	EndDrag(); 
} 
 
void CDlgScrollable::EndDrag() 
{ 
	m_bDragging=FALSE; 
	ReleaseCapture(); 
	SetCursor(m_hCursor1); 
} 
 
BOOL CDlgScrollable::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
{ 
	BOOL bRet=TRUE; 
 
	if (nHitTest==HTCLIENT) 
	{ 
		SetCursor(m_hCursor1); 
		bRet=FALSE; 
	} 
	else 
		bRet=CDialog::OnSetCursor(pWnd,nHitTest,message); 
 
	return bRet; 
}