// FreeViewDemoView.cpp : implementation of the CFreeViewDemoView class
//
#include "stdafx.h"
#include "FreeViewDemo.h"
#include "FreeViewDemoDoc.h"
#include "FreeViewDemoView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CFreeViewDemoView
IMPLEMENT_DYNCREATE(CFreeViewDemoView, CScrollView)
BEGIN_MESSAGE_MAP(CFreeViewDemoView, CScrollView)
ON_WM_CREATE()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONUP()
ON_WM_SIZE()
END_MESSAGE_MAP()
// CFreeViewDemoView construction/destruction
CFreeViewDemoView::CFreeViewDemoView()
{
// TODO: add construction code here
m_pDargButton = NULL;
}
CFreeViewDemoView::~CFreeViewDemoView()
{
}
BOOL CFreeViewDemoView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CScrollView::PreCreateWindow(cs);
}
// CFreeViewDemoView drawing
void CFreeViewDemoView::OnDraw(CDC* /*pDC*/)
{
CFreeViewDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: add draw code for native data here
}
void CFreeViewDemoView::OnInitialUpdate()
{
// CScrollView::OnInitialUpdate();
AdjustViewFitButtons();
}
// CFreeViewDemoView diagnostics
#ifdef _DEBUG
void CFreeViewDemoView::AssertValid() const
{
CScrollView::AssertValid();
}
void CFreeViewDemoView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CFreeViewDemoDoc* CFreeViewDemoView::GetDocument() const // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFreeViewDemoDoc)));
return (CFreeViewDemoDoc*)m_pDocument;
}
#endif //_DEBUG
// CFreeViewDemoView message handlers
int CFreeViewDemoView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CScrollView::OnCreate(lpCreateStruct) == -1)
return -1;
CRect rect(100, 100, 180, 130);
for (int i = 0; i < _countof(m_wndButton); i++)
{
m_wndButton[i].Create(_T("Darg me"), WS_CHILD | WS_VISIBLE, rect, this, 123);
rect.left += 100;
rect.right += 100;
}
return 0;
}
void CFreeViewDemoView::OnButtonMoved( CRect& rect )
{
SCROLLINFO si = {sizeof(SCROLLINFO), SIF_RANGE | SIF_POS | SIF_PAGE};
CRect rectView = m_rectView;
CRect rectWnd;
GetClientRect(&rectWnd);
rectView |= rectWnd;
rectView |= rect;
CSize sizeClient = rectWnd.Size();
CSize sizeSb;
GetScrollBarSizes(sizeSb);
CSize sizeView = rectView.Size();
// 计算是否有滚动条
BOOL bNeedH = sizeView.cx > sizeClient.cx;
if (bNeedH)
{
sizeClient.cy -= sizeSb.cy;
if (m_rectView.bottom <= sizeClient.cy)
sizeView.cy -= sizeSb.cy;
}
BOOL bNeedV = sizeView.cy > sizeClient.cy;
if (bNeedV)
{
sizeClient.cx -= sizeSb.cx;
if (m_rectView.right <= sizeClient.cx)
sizeView.cx -= sizeSb.cx;
if (!bNeedH)
{
bNeedH = sizeView.cx > sizeClient.cx;
if (bNeedH)
{
sizeClient.cy -= sizeSb.cy;
if (m_rectView.bottom <= sizeClient.cy)
sizeView.cy -= sizeSb.cy;
}
}
}
// 更新滚动条
ShowScrollBar(SB_HORZ, bNeedH);
if (bNeedH)
{
si.nPage = sizeClient.cx;
si.nMax = sizeView.cx - 1;
si.nPos = -rectView.left;
SetScrollInfo(SB_HORZ, &si, TRUE);
}
ShowScrollBar(SB_VERT, bNeedV);
if (bNeedV)
{
si.nPage = sizeClient.cy;
si.nMax = sizeView.cy - 1;
si.nPos = -rectView.top;
SetScrollInfo(SB_VERT, &si, TRUE);
}
}
void CFreeViewDemoView::OnBeginDargButton( CDargButton* pBtn, CPoint point )
{
m_pDargButton = pBtn;
m_pointDarg = point;
m_rectView.SetRectEmpty();
CRect rect;
for (int i = 0; i < _countof(m_wndButton); i++)
{
if (&m_wndButton[i] != pBtn)
{
m_wndButton[i].GetWindowRect(&rect);
ScreenToClient(&rect);
m_rectView |= rect;
}
}
SetCapture();
}
void CFreeViewDemoView::OnMouseMove(UINT nFlags, CPoint point)
{
if (m_pDargButton)
{
CRect rect;
m_pDargButton->GetClientRect(&rect);
rect.MoveToXY(point.x - m_pointDarg.x, point.y - m_pointDarg.y);
OnButtonMoved(rect);
m_pDargButton->SetWindowPos(NULL, rect.left, rect.top, 0, 0,
SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOSENDCHANGING);
}
CScrollView::OnMouseMove(nFlags, point);
}
void CFreeViewDemoView::OnLButtonUp(UINT nFlags, CPoint point)
{
if (GetCapture() == this)
ReleaseCapture();
m_pDargButton = NULL;
// 在拖动时已经调整,不需要再调
//AdjustViewFitButtons();
CScrollView::OnLButtonUp(nFlags, point);
}
void CFreeViewDemoView::AdjustViewFitButtons()
{
CRect rectView(0, 0, 0, 0), rect;
for (int i = 0; i < _countof(m_wndButton); i++)
{
m_wndButton[i].GetWindowRect(&rect);
ScreenToClient(&rect);
rectView |= rect;
}
rectView.left = -GetScrollPos(SB_HORZ);
rectView.top = -GetScrollPos(SB_VERT);
SetScrollSizes(MM_TEXT, rectView.Size());
}
void CFreeViewDemoView::OnSize(UINT nType, int cx, int cy)
{
if (m_pDargButton)
return;
CScrollView::OnSize(nType, cx, cy);
}
CFreeView继承自CScrollView
5星 · 超过95%的资源 需积分: 12 82 浏览量
2012-07-25
22:40:03
上传
评论
收藏 26KB ZIP 举报
__lover__
- 粉丝: 4
- 资源: 8
最新资源
- 纸板缺陷检测数据集VOC+YOLO格式1055张1类别.7z
- 基于CarNet实现裂缝检测python源码+文档说明+数据+图片(课程设计)
- 课程设计-基于耐火材料裂缝剥落检测python源码+课件
- 基于OpenCV的视频道路车道检测python源码+文档说明+实验演示+图片+使用方法(高分毕业设计)
- 基于OpenCV的案例:图像边缘、角点和轮廓检测,图像分割,图像增强;图片拼接;运动目标检测,颜色直方图比较,三帧帧差法,抠图
- SmartPlug-html大一笔记
- SmartPlug-proteusdemo
- Preliminary Findings on Handmade Rattan Baby Crib andBassinet Designs Regarding.zip
- aveebfq_v1.2.83_downyi.com.apk
- 基于有机发光二极管(OLED)的建模优化算法的matlab仿真源码+数据+文档说明+项目说明(高分课程设计)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈