📄 scrollwnd.h
字号:
#if !defined(AFX_SCROLLWND_H__99F78BC8_8F4F_4862_B0B3_F42505EAC39D__INCLUDED_)
#define AFX_SCROLLWND_H__99F78BC8_8F4F_4862_B0B3_F42505EAC39D__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// ScrollWnd.h : header file
//
#include <afxpriv.h>
/////////////////////////////////////////////////////////////////////////////
// CScrollWnd window
//这是一个从MFC的源码中扒出来的一个滚动窗口类,功能基本类似于CScrollView, 但是它的
//基类是CWnd,这样为一些不需要使用Document View结构但又想使用滚动窗口的小程序提供了
//比较方便的方法,他的接口除了两个坐标转换函数以外与CScrollView基本相同,同时在画图
//的地方采用了内存DC缓冲,避免了闪烁,这下你可以随意的刷新了(当然刷新太多了对效率
//还是有一些影响的)
//
//因为是工作需要,所以设计了这个类,目前只测试了基本的功能,映射模式为MM_TEXT在屏幕上
//显示正常,至于打印的支持还没有做。
//
//因为跟CScrollView功能基本相同,所以没有写什么注释,大家可以查MSDN中CScrollView的帮助
//如果发现跟CScrollView不一致的地方给我mail吧
class CScrollWnd : public CWnd
{
int m_nMapMode;
CSize m_totalLog; // total size in logical units (no rounding)
CSize m_totalDev; // total size in device units
CSize m_pageDev; // per page scroll size in device units
CSize m_lineDev; // per line scroll size in device units
BOOL m_bCenter; // Center output if larger than total size
BOOL m_bInsideUpdate; // internal state for OnSize callback
static const SIZE sizeDefault;
//下面这些基本上都是Helper函数
void ScrollToDevicePosition(POINT ptDev); // explicit scrolling no checking
void UpdateBars(); // adjust scrollbars etc
BOOL GetTrueClientSize(CSize& size, CSize& sizeSb);
void GetScrollBarSizes(CSize& sizeSb);
void GetScrollBarState(CSize sizeClient, CSize& needSb, CSize& sizeRange, CPoint& ptMove, BOOL bInsideClient);
protected:
BOOL PreCreateWindow(CREATESTRUCT& cs);
//CenterOnPoint可能会有问题,没有测试
void CenterOnPoint(CPoint ptCenter);
virtual void CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType = adjustBorder);
virtual void OnPrepareDC(CDC* pDC, CPrintInfo* pInfo = NULL);
virtual void OnDraw(CDC* pDC) = 0;
virtual void OnInitialUpdate() = 0;
// scrolling implementation support for OLE
virtual BOOL OnScroll(UINT nScrollCode, UINT nPos, BOOL bDoScroll = TRUE);
virtual BOOL OnScrollBy(CSize sizeScroll, BOOL bDoScroll = TRUE);
//{{AFX_MSG(CScrollView)
afx_msg void OnPaint();
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
afx_msg BOOL OnMouseWheel(UINT fFlags, short zDelta, CPoint point);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
public:
CScrollWnd();
virtual ~CScrollWnd();
//坐标转换:从虚拟空间坐标到窗口客户区坐标
void DocumentToClient(CPoint& pt);
//坐标转换:从窗口客户区坐标到虚拟空间坐标
void ClientToDocument(CPoint& pt);
BOOL Create(CWnd* pParent, const RECT& rc, DWORD dwStyle, UINT nID = 0);
CPoint GetScrollPosition() const; // upper corner of scrolling
CSize GetTotalSize() const; // logical size
// for device units
CPoint GetDeviceScrollPosition() const;
void GetDeviceScrollSizes(int& nMapMode, SIZE& sizeTotal, SIZE& sizePage, SIZE& sizeLine) const;
void SetScrollSizes(int nMapMode, SIZE sizeTotal, const SIZE& sizePage = sizeDefault, const SIZE& sizeLine = sizeDefault);
void SetScaleToFitSize(SIZE sizeTotal);
void ScrollToPosition(POINT pt); // set upper left position
void FillOutsideRect(CDC* pDC, CBrush* pBrush);
void ResizeParentToFit(BOOL bShrinkOnly = TRUE);
BOOL DoMouseWheel(UINT fFlags, short zDelta, CPoint point);
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_SCROLLWND_H__99F78BC8_8F4F_4862_B0B3_F42505EAC39D__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -