Files
Sun1602/Server/Shop/ClientDialog/include/tool/ScrollDialog.cpp
T
2022-10-26 12:25:11 +08:00

246 lines
6.9 KiB
C++

// ScrollDialog.cpp : implementation file
//
#include "stdafx.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// The following definitions specify how many points
// are scrolled at each press of the scrollbar arrows
#define HORZ_PTS 8
#define VERT_PTS 4
/////////////////////////////////////////////////////////////////////////////
// CGripper message map
BEGIN_MESSAGE_MAP(CGripper, CScrollBar)
//{{AFX_MSG_MAP(CGripper)
ON_WM_NCHITTEST()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGripper message handlers
#ifdef VERSION_VS2003
UINT CGripper::OnNcHitTest(CPoint point)
{
UINT ht = CScrollBar::OnNcHitTest(point);
if(ht==HTCLIENT)
{
ht = HTBOTTOMRIGHT;
}
return ht;
}
#else
LRESULT CGripper::OnNcHitTest(CPoint point)
{
LRESULT ht = CScrollBar::OnNcHitTest(point);
if(ht==HTCLIENT)
{
ht = HTBOTTOMRIGHT;
}
return ht;
}
#endif
/////////////////////////////////////////////////////////////////////////////
// CScrollDialog dialog
CScrollDialog::CScrollDialog(UINT nIDD, CWnd* pParent /*=NULL*/)
: CDialog(nIDD, pParent)
{
//{{AFX_DATA_INIT(CScrollDialog)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_bInitialized = FALSE;
}
void CScrollDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CScrollDialog)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CScrollDialog, CDialog)
//{{AFX_MSG_MAP(CScrollDialog)
ON_WM_HSCROLL()
ON_WM_VSCROLL()
ON_WM_SIZE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CScrollDialog message handlers
BOOL CScrollDialog::OnInitDialog()
{
CDialog::OnInitDialog();
// Set Initial Scroll Positions
m_nHscrollPos = 0;
m_nVscrollPos = 0;
// Get the initial dimensions of the dialog
GetClientRect(&m_ClientRect);
m_bInitialized = TRUE;
// Create a resize gripper
CRect initRect;
GetClientRect(initRect);
initRect.left = initRect.right - GetSystemMetrics(SM_CXHSCROLL);
initRect.top = initRect.bottom - GetSystemMetrics(SM_CYVSCROLL);
DWORD dwStyle = WS_CHILD |
SBS_SIZEBOX |
SBS_SIZEBOXBOTTOMRIGHTALIGN |
SBS_SIZEGRIP |
WS_VISIBLE;
m_Grip.Create(dwStyle,initRect, this, AFX_IDW_SIZE_BOX);
// Modify our window style to ensure that we have a resizeable dialog
ModifyStyle(WS_BORDER | DS_MODALFRAME,
WS_THICKFRAME | WS_OVERLAPPEDWINDOW,
SWP_FRAMECHANGED);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CScrollDialog::ResetScrollbars()
{
// Reset our window scrolling information
ScrollWindow(m_nHscrollPos*HORZ_PTS, 0, NULL, NULL);
ScrollWindow(0, m_nVscrollPos*VERT_PTS, NULL, NULL);
m_nHscrollPos = 0;
m_nVscrollPos = 0;
SetScrollPos(SB_HORZ, m_nHscrollPos, TRUE);
SetScrollPos(SB_VERT, m_nVscrollPos, TRUE);
}
void CScrollDialog::SetupScrollbars()
{
CRect tempRect;
GetClientRect(&tempRect);
WINDOWPLACEMENT wp;
GetWindowPlacement(&wp);
BOOL bMaximized = (wp.showCmd == SW_MAXIMIZE);
// Calculate how many scrolling increments for the client area
m_nHorzInc = (m_ClientRect.Width() - tempRect.Width())/HORZ_PTS;
m_nVertInc = (m_ClientRect.Height() - tempRect.Height())/VERT_PTS;
// Do not show the sizing gripper
if ((m_nHorzInc > 0) || (m_nVertInc > 0 ) || bMaximized)
m_Grip.ShowWindow(SW_HIDE);
else
m_Grip.ShowWindow(SW_SHOW);
// Set the vertical and horizontal scrolling info
m_nHscrollMax = max(0, m_nHorzInc);
m_nHscrollPos = min (m_nHscrollPos, m_nHscrollMax);
SetScrollRange(SB_HORZ, 0, m_nHscrollMax, FALSE);
SetScrollPos(SB_HORZ, m_nHscrollPos, TRUE);
m_nVscrollMax = max(0, m_nVertInc);
m_nVscrollPos = min(m_nVscrollPos, m_nVscrollMax);
SetScrollRange(SB_VERT, 0, m_nVscrollMax, FALSE);
SetScrollPos(SB_VERT, m_nVscrollPos, TRUE);
// Setup the gripper
if (!bMaximized)
{
CWnd *resizeWnd = GetDlgItem(AFX_IDW_SIZE_BOX);
if (resizeWnd)
{
CRect rect, rect2;
resizeWnd->GetWindowRect(&rect);
GetClientRect(rect2);
rect2.left = rect2.right - rect.Width();
rect2.top = rect2.bottom - rect.Height();
resizeWnd->MoveWindow(&rect2);
}
}
}
void CScrollDialog::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// Handle vertical scrollbar messages
// These can be tweaked to better fit the implementation
int nInc;
switch (nSBCode)
{
case SB_TOP: nInc = -m_nVscrollPos; break;
case SB_BOTTOM: nInc = m_nVscrollMax-m_nVscrollPos; break;
case SB_LINEUP: nInc = -1; break;
case SB_LINEDOWN: nInc = 1; break;
case SB_PAGEUP: nInc = min(-1, -m_nVertInc); break;
case SB_PAGEDOWN: nInc = max(1, m_nVertInc); break;
case SB_THUMBTRACK: nInc = nPos - m_nVscrollPos; break;
default: nInc = 0;
}
nInc = max(-m_nVscrollPos, min(nInc, m_nVscrollMax - m_nVscrollPos));
if (nInc)
{
m_nVscrollPos += nInc;
int iMove = -VERT_PTS * nInc;
ScrollWindow(0, iMove, NULL, NULL);
SetScrollPos(SB_VERT, m_nVscrollPos, TRUE);
}
CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}
void CScrollDialog::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// Handle horizontal scrollbar messages
// These can be tweaked to better fit the implementation
int nInc;
switch (nSBCode)
{
case SB_TOP: nInc = -m_nHscrollPos; break;
case SB_BOTTOM: nInc = m_nHscrollMax-m_nHscrollPos; break;
case SB_LINEUP: nInc = -1; break;
case SB_LINEDOWN: nInc = 1; break;
case SB_PAGEUP: nInc = -HORZ_PTS; break;
case SB_PAGEDOWN: nInc = HORZ_PTS; break;
case SB_THUMBTRACK: nInc = nPos - m_nHscrollPos; break;
default: nInc = 0;
}
nInc = max(-m_nHscrollPos, min(nInc, m_nHscrollMax - m_nHscrollPos));
if (nInc)
{
m_nHscrollPos += nInc;
int iMove = -HORZ_PTS * nInc;
ScrollWindow(iMove, 0, NULL, NULL);
SetScrollPos(SB_HORZ, m_nHscrollPos, TRUE);
}
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
void CScrollDialog::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
if (m_bInitialized)
{
ResetScrollbars();
SetupScrollbars();
}
}