📄 atlscrl.h
字号:
ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE);
::SetRect(&m_rectLogAll, xMin, yMin, xMax, yMax);
SIZE sizeAll = { 0 };
sizeAll.cx = xMax - xMin + 1;
sizeAll.cy = yMax - yMin + 1;
// block: convert logical to device units
{
CWindowDC dc(NULL);
dc.SetMapMode(m_nMapMode);
dc.LPtoDP(&sizeAll);
}
CScrollImpl< T >::SetScrollSize(sizeAll, bRedraw, bResetOffset);
SetScrollLine(0, 0);
SetScrollPage(0, 0);
}
void SetScrollSize(RECT& rcScroll, BOOL bRedraw = TRUE, bool bResetOffset = true)
{
SetScrollSize(rcScroll.left, rcScroll.top, rcScroll.right, rcScroll.bottom, bRedraw, bResetOffset);
}
void SetScrollSize(int cx, int cy, BOOL bRedraw = TRUE, bool bResetOffset = true)
{
SetScrollSize(0, 0, cx, cy, bRedraw, bResetOffset);
}
void SetScrollSize(SIZE size, BOOL bRedraw = TRUE, bool bResetOffset = true)
{
SetScrollSize(0, 0, size.cx, size.cy, bRedraw, bResetOffset);
}
void GetScrollSize(RECT& rcScroll) const
{
ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE);
rcScroll = m_rectLogAll;
}
// line operations
void SetScrollLine(int cxLine, int cyLine)
{
ATLASSERT(cxLine >= 0 && cyLine >= 0);
ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE);
m_sizeLogLine.cx = cxLine;
m_sizeLogLine.cy = cyLine;
SIZE sizeLine = m_sizeLogLine;
// block: convert logical to device units
{
CWindowDC dc(NULL);
dc.SetMapMode(m_nMapMode);
dc.LPtoDP(&sizeLine);
}
CScrollImpl< T >::SetScrollLine(sizeLine);
}
void SetScrollLine(SIZE sizeLine)
{
SetScrollLine(sizeLine.cx, sizeLine.cy);
}
void GetScrollLine(SIZE& sizeLine) const
{
ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE);
sizeLine = m_sizeLogLine;
}
// page operations
void SetScrollPage(int cxPage, int cyPage)
{
ATLASSERT(cxPage >= 0 && cyPage >= 0);
ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE);
m_sizeLogPage.cx = cxPage;
m_sizeLogPage.cy = cyPage;
SIZE sizePage = m_sizeLogPage;
// block: convert logical to device units
{
CWindowDC dc(NULL);
dc.SetMapMode(m_nMapMode);
dc.LPtoDP(&sizePage);
}
CScrollImpl< T >::SetScrollPage(sizePage);
}
void SetScrollPage(SIZE sizePage)
{
SetScrollPage(sizePage.cx, sizePage.cy);
}
void GetScrollPage(SIZE& sizePage) const
{
ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE);
sizePage = m_sizeLogPage;
}
BEGIN_MSG_MAP(CMapScrollImpl)
MESSAGE_HANDLER(WM_VSCROLL, CScrollImpl< T >::OnVScroll)
MESSAGE_HANDLER(WM_HSCROLL, CScrollImpl< T >::OnHScroll)
MESSAGE_HANDLER(WM_MOUSEWHEEL, CScrollImpl< T >::OnMouseWheel)
#if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400))
MESSAGE_HANDLER(m_uMsgMouseWheel, CScrollImpl< T >::OnMouseWheel)
#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400))
MESSAGE_HANDLER(WM_MOUSEHWHEEL, CScrollImpl< T >::OnMouseHWheel)
MESSAGE_HANDLER(WM_SETTINGCHANGE, CScrollImpl< T >::OnSettingChange)
MESSAGE_HANDLER(WM_SIZE, CScrollImpl< T >::OnSize)
MESSAGE_HANDLER(WM_PAINT, OnPaint)
MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint)
ALT_MSG_MAP(1)
COMMAND_ID_HANDLER(ID_SCROLL_UP, CScrollImpl< T >::OnScrollUp)
COMMAND_ID_HANDLER(ID_SCROLL_DOWN, CScrollImpl< T >::OnScrollDown)
COMMAND_ID_HANDLER(ID_SCROLL_PAGE_UP, CScrollImpl< T >::OnScrollPageUp)
COMMAND_ID_HANDLER(ID_SCROLL_PAGE_DOWN, CScrollImpl< T >::OnScrollPageDown)
COMMAND_ID_HANDLER(ID_SCROLL_TOP, CScrollImpl< T >::OnScrollTop)
COMMAND_ID_HANDLER(ID_SCROLL_BOTTOM, CScrollImpl< T >::OnScrollBottom)
COMMAND_ID_HANDLER(ID_SCROLL_LEFT, CScrollImpl< T >::OnScrollLeft)
COMMAND_ID_HANDLER(ID_SCROLL_RIGHT, CScrollImpl< T >::OnScrollRight)
COMMAND_ID_HANDLER(ID_SCROLL_PAGE_LEFT, CScrollImpl< T >::OnScrollPageLeft)
COMMAND_ID_HANDLER(ID_SCROLL_PAGE_RIGHT, CScrollImpl< T >::OnScrollPageRight)
COMMAND_ID_HANDLER(ID_SCROLL_ALL_LEFT, CScrollImpl< T >::OnScrollAllLeft)
COMMAND_ID_HANDLER(ID_SCROLL_ALL_RIGHT, CScrollImpl< T >::OnScrollAllRight)
END_MSG_MAP()
LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
T* pT = static_cast<T*>(this);
ATLASSERT(::IsWindow(pT->m_hWnd));
if(wParam != NULL)
{
CDCHandle dc = (HDC)wParam;
int nMapModeSav = dc.GetMapMode();
dc.SetMapMode(m_nMapMode);
POINT ptViewportOrg = { 0, 0 };
if(m_nMapMode == MM_TEXT)
dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y, &ptViewportOrg);
else
dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y + m_sizeAll.cy, &ptViewportOrg);
POINT ptWindowOrg = { 0, 0 };
dc.SetWindowOrg(m_rectLogAll.left, m_rectLogAll.top, &ptWindowOrg);
pT->DoPaint(dc);
dc.SetMapMode(nMapModeSav);
dc.SetViewportOrg(ptViewportOrg);
dc.SetWindowOrg(ptWindowOrg);
}
else
{
CPaintDC dc(pT->m_hWnd);
dc.SetMapMode(m_nMapMode);
if(m_nMapMode == MM_TEXT)
dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y);
else
dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y + m_sizeAll.cy);
dc.SetWindowOrg(m_rectLogAll.left, m_rectLogAll.top);
pT->DoPaint(dc.m_hDC);
}
return 0;
}
};
#endif // !_WIN32_WCE
///////////////////////////////////////////////////////////////////////////////
// CMapScrollWindowImpl - Implements scrolling window with mapping
#ifndef _WIN32_WCE
template <class T, class TBase = ATL::CWindow, class TWinTraits = ATL::CControlWinTraits>
class ATL_NO_VTABLE CMapScrollWindowImpl : public ATL::CWindowImpl< T, TBase, TWinTraits >, public CMapScrollImpl< T >
{
public:
BEGIN_MSG_MAP(CMapScrollWindowImpl)
MESSAGE_HANDLER(WM_VSCROLL, CScrollImpl< T >::OnVScroll)
MESSAGE_HANDLER(WM_HSCROLL, CScrollImpl< T >::OnHScroll)
MESSAGE_HANDLER(WM_MOUSEWHEEL, CScrollImpl< T >::OnMouseWheel)
#if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400))
MESSAGE_HANDLER(m_uMsgMouseWheel, CScrollImpl< T >::OnMouseWheel)
#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400))
MESSAGE_HANDLER(WM_MOUSEHWHEEL, CScrollImpl< T >::OnMouseHWheel)
MESSAGE_HANDLER(WM_SETTINGCHANGE, CScrollImpl< T >::OnSettingChange)
MESSAGE_HANDLER(WM_SIZE, CScrollImpl< T >::OnSize)
MESSAGE_HANDLER(WM_PAINT, CMapScrollImpl< T >::OnPaint)
MESSAGE_HANDLER(WM_PRINTCLIENT, CMapScrollImpl< T >::OnPaint)
ALT_MSG_MAP(1)
COMMAND_ID_HANDLER(ID_SCROLL_UP, CScrollImpl< T >::OnScrollUp)
COMMAND_ID_HANDLER(ID_SCROLL_DOWN, CScrollImpl< T >::OnScrollDown)
COMMAND_ID_HANDLER(ID_SCROLL_PAGE_UP, CScrollImpl< T >::OnScrollPageUp)
COMMAND_ID_HANDLER(ID_SCROLL_PAGE_DOWN, CScrollImpl< T >::OnScrollPageDown)
COMMAND_ID_HANDLER(ID_SCROLL_TOP, CScrollImpl< T >::OnScrollTop)
COMMAND_ID_HANDLER(ID_SCROLL_BOTTOM, CScrollImpl< T >::OnScrollBottom)
COMMAND_ID_HANDLER(ID_SCROLL_LEFT, CScrollImpl< T >::OnScrollLeft)
COMMAND_ID_HANDLER(ID_SCROLL_RIGHT, CScrollImpl< T >::OnScrollRight)
COMMAND_ID_HANDLER(ID_SCROLL_PAGE_LEFT, CScrollImpl< T >::OnScrollPageLeft)
COMMAND_ID_HANDLER(ID_SCROLL_PAGE_RIGHT, CScrollImpl< T >::OnScrollPageRight)
COMMAND_ID_HANDLER(ID_SCROLL_ALL_LEFT, CScrollImpl< T >::OnScrollAllLeft)
COMMAND_ID_HANDLER(ID_SCROLL_ALL_RIGHT, CScrollImpl< T >::OnScrollAllRight)
END_MSG_MAP()
};
#endif // !_WIN32_WCE
///////////////////////////////////////////////////////////////////////////////
// CFSBWindow - Use as a base instead of CWindow to get flat scroll bar support
#if defined(__ATLCTRLS_H__) && (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
template <class TBase = ATL::CWindow>
class CFSBWindowT : public TBase, public CFlatScrollBarImpl<CFSBWindowT< TBase > >
{
public:
// Constructors
CFSBWindowT(HWND hWnd = NULL) : TBase(hWnd)
{ }
CFSBWindowT< TBase >& operator =(HWND hWnd)
{
m_hWnd = hWnd;
return *this;
}
// CWindow overrides that use flat scroll bar API
// (only those methods that are used by scroll window classes)
int SetScrollPos(int nBar, int nPos, BOOL bRedraw = TRUE)
{
ATLASSERT(::IsWindow(m_hWnd));
return FlatSB_SetScrollPos(nBar, nPos, bRedraw);
}
BOOL GetScrollInfo(int nBar, LPSCROLLINFO lpScrollInfo)
{
ATLASSERT(::IsWindow(m_hWnd));
return FlatSB_GetScrollInfo(nBar, lpScrollInfo);
}
BOOL SetScrollInfo(int nBar, LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE)
{
ATLASSERT(::IsWindow(m_hWnd));
return FlatSB_SetScrollInfo(nBar, lpScrollInfo, bRedraw);
}
};
typedef CFSBWindowT<ATL::CWindow> CFSBWindow;
#endif // defined(__ATLCTRLS_H__) && (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)
///////////////////////////////////////////////////////////////////////////////
// CZoomScrollImpl - Provides zooming and scrolling support to any window
#ifndef _WIN32_WCE
// The zoom modes that can be set with the SetZoomMode method
enum
{
ZOOMMODE_OFF,
ZOOMMODE_IN, // If left mouse button is clicked or dragged, zoom in on point clicked or rectangle dragged.
ZOOMMODE_OUT // If left mouse button clicked, zoom out on point clicked.
};
// Notification to parent that zoom scale changed as a result of user mouse action.
#define ZSN_ZOOMCHANGED (NM_FIRST - 50)
template <class T>
class CZoomScrollImpl : public CScrollImpl< T >
{
public:
enum { m_cxyMinZoomRect = 12 }; // min rect size to zoom in on rect.
// Data members
SIZE m_sizeLogAll;
SIZE m_sizeLogLine;
SIZE m_sizeLogPage;
float m_fZoomScale;
float m_fZoomScaleMin;
float m_fZoomDelta; // Used in ZOOMMODE_IN and ZOOMMODE_OUT on left-button click.
int m_nZoomMode;
RECT m_rcTrack;
bool m_bTracking;
// Constructor
CZoomScrollImpl():
m_fZoomScale(1.0),
m_fZoomScaleMin(0.5),
m_fZoomDelta(0.5),
m_nZoomMode(ZOOMMODE_OFF),
m_bTracking(false)
{
m_sizeLogAll.cx = 0;
m_sizeLogAll.cy = 0;
m_sizeLogPage.cx = 0;
m_sizeLogPage.cy = 0;
m_sizeLogLine.cx = 0;
m_sizeLogLine.cy = 0;
::SetRectEmpty(&m_rcTrack);
}
// Attributes & Operations
// size operations
void SetScrollSize(int cxLog, int cyLog, BOOL bRedraw = TRUE, bool bResetOffset = true)
{
ATLASSERT(cxLog >= 0 && cyLog >= 0);
// Set up the defaults
if (cxLog == 0 && cyLog == 0)
{
cxLog = 1;
cyLog = 1;
}
m_sizeLogAll.cx = cxLog;
m_sizeLogAll.cy = cyLog;
SIZE sizeAll = { 0 };
sizeAll.cx = (int)((float)m_sizeLogAll.cx * m_fZoomScale);
sizeAll.cy = (int)((float)m_sizeLogAll.cy * m_fZoomScale);
CScrollImpl< T >::SetScrollSize(sizeAll, bRedraw, bResetOffset);
}
void SetScrollSize(SIZE sizeLog, BOOL bRedraw = TRUE, bool bResetOffset = true)
{
SetScrollSize(sizeLog.cx, sizeLog.cy, bRedraw, bResetOffset);
}
void GetScrollSize(SIZE& sizeLog) const
{
sizeLog = m_sizeLogAll;
}
// line operations
void SetScrollLine(int cxLogLine, int cyLogLine)
{
ATLASSERT(cxLogLine >= 0 && cyLogLine >= 0);
m_sizeLogLine.cx = cxLogLine;
m_sizeLogLine.cy = cyLogLine;
SIZE sizeLine = { 0 };
sizeLine.cx = (int)((float)m_sizeLogLine.cx * m_fZoomScale);
sizeLine.cy = (int)((float)m_sizeLogLine.cy * m_fZoomScale);
CScrollImpl< T >::SetScrollLine(sizeLine);
}
void SetScrollLine(SIZE sizeLogLine)
{
SetScrollLine(sizeLogLine.cx, sizeLogLine.cy);
}
void GetScrollLine(SIZE& sizeLogLine) const
{
sizeLogLine = m_sizeLogLine;
}
// page operations
void SetScrollPage(int cxLogPage, int cyLogPage)
{
ATLASSERT(cxLogPage >= 0 && cyLogPage >= 0);
m_sizeLogPage.cx = cxLogPage;
m_sizeLogPage.cy = cyLogPage;
SIZE sizePage = { 0 };
sizePage.cx = (int)((float)m_sizeLogPage.cx * m_fZoomScale);
sizePage.cy = (int)((float)m_sizeLogPage.cy * m_fZoomScale);
CScrollImpl< T >::SetScrollPage(sizePage);
}
void SetScrollPage(SIZE sizeLogPage)
{
SetScrollPage(sizeLogPage.cx, sizeLogPage.cy);
}
void GetScrollPage(SIZE& sizeLogPage) const
{
sizeLogPage = m_sizeLogPage;
}
void SetZoomScale(float fZoomScale)
{
ATLASSERT(fZoomScale > 0);
if(fZoomScale > 0 && fZoomScale >= m_fZoomScaleMin)
m_fZoomScale = fZoomScale;
}
float GetZoomScale() const
{
return m_fZoomScale;
}
void SetZoomScaleMin(float fZoomScaleMin)
{
m_fZoomScaleMin = fZoomScaleMin;
}
float GetZoomScaleMin() const
{
return m_fZoomScaleMin;
}
void SetZoomDelta(float fZoomDelta)
{
ATLASSERT(fZoomDelta >= 0);
if(fZoomDelta >= 0)
m_fZoomDelta = fZoomDelta;
}
float GetZoomDelta() const
{
return m_fZoomDelta;
}
void SetZoomMode(int nZoomMode)
{
m_nZoomMode = nZoomMode;
}
int GetZoomMode() const
{
return m_nZoomMode;
}
void Zoom(int x, int y, float fZoomScale)
{
if(fZoomScale <= 0)
return;
fZoomScale = max(fZoomScale, m_fZoomScaleMin);
T* pT = static_cast<T*>(this);
POINT pt = { x, y };
if(!pT->PtInDevRect(pt))
return;
pT->ViewDPtoLP(&pt);
pT->Zoom(fZoomScale, false);
pT->CenterOnLogicalPoint(pt);
}
void Zoom(POINT pt, float fZoomScale)
{
T* pT = static_cast<T*>(this);
pT->Zoom(pt.x, pt.y, fZoomScale);
}
void Zoom(RECT& rc)
{
T* pT = static_cast<T*>(this);
RECT rcZoom = rc;
pT->NormalizeRect(rcZoom);
SIZE size = { rcZoom.right - rcZoom.left, rcZoom.bottom - rcZoom.top };
POINT pt = { rcZoom.left + size.cx / 2, rcZoom.top + size.cy / 2 };
if(size.cx < m_cxyMinZoomRect || size.cy < m_cxyMinZoomRect)
{
pT->Zoom(pt, m_fZoomScale + m_fZoomDelta);
return;
}
ATLASSERT(size.cx > 0 && size.cy > 0);
float fScaleH = (float)(m_sizeClient.cx + 1) / (float)size.cx;
float fScaleV = (float)(m_sizeClient.cy + 1) / (float)size.cy;
float fZoomScale = min(fScaleH, fScaleV) * m_fZoomScale;
pT->Zoom(pt, fZoomScale);
}
void Zoom(float fZoomScale, bool bCenter = true)
{
if(fZoomScale <= 0)
return;
fZoomScale = max(fZoomScale, m_fZoomScaleMin);
T* pT = static_cast<T*>(this);
POINT pt = { 0 };
if(bCenter)
{
RECT rc;
::GetClientRect(pT->m_hWnd, &rc);
pt.x = rc.right / 2;
pt.y = rc.bottom / 2;
pT->ViewDPtoLP(&pt);
}
// Modify the Viewport extent
m_fZoomScale = fZoomScale;
SIZE sizeAll = { 0 };
sizeAll.cx = (int)((float)m_sizeLogAll.cx * fZoomScale);
sizeAll.cy = (int)((float)m_sizeLogAll.cy * fZoomScale);
// Update scroll bars and window
CScrollImpl< T >::SetScrollSize(sizeAll);
if(bCenter)
pT->CenterOnLogicalPoint(pt);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -