MFC学习(02) 矩形移动 (VC++6.0版本)
来源:互联网 发布:asynchttp post json 编辑:程序博客网 时间:2024/05/01 10:53
MFC学习(02) 矩形移动 (VC++6.0版本)
小注:这是一次计算机图形学的课后作业,作业原文:给定一个矩形(顶点和大小自己给定),利用鼠标与鼠标响应函数,如果鼠标落入矩形区域内,点击鼠标左键,矩形改变颜色(即作业中实现题2.exe示例中的虚线变为实线并着与初始矩形不同的色),移动鼠标,矩形进行移动,左键释放时矩形变为初始色。
仅供参考,不喜请喷
- MFC学习02 矩形移动 VC60版本
- 代码地址
- 先来看看老师提供的样例程序
- 分析
- 伪代码
- 手把手开始做框架
- 新建项目
- 基本设置
- 添加类变量
- 添加自定义消息处理函数
- 一步步写代码
- 总结
0. 代码地址
- Visual C++ 6.0
点击查看代码
1. 先来看看老师提供的样例程序
2. 分析
- 矩形初始是黑色的,实线
- 在矩形区域内按下时,鼠标样式改变,拖动时矩形是棕色虚线(这里为了视觉效果,我会改成红色)
- 拖动时,鼠标指针始终处于矩形中央(我写的版本里没有这种效果)
- 拖动结束的时候(鼠标左键弹起时),矩形恢复成黑色实线
3. 伪代码
// 鼠标左键按下事件void OnLButtonDown(单击的坐标点point){ m_IsReadyToMove = false; // 初始标记一下不能移动 if (光标在矩形内) { 记录开始移动的点p1; m_IsReadyToMove = true; // 标记一下可以移动了 修改当前画笔颜色; 修改鼠标指针样式; }}
// 鼠标移动事件void OnMouseMove(移动的当前坐标点point){ // 我们只考虑鼠标可以移动时鼠标的移动事件 if (true == m_IsReadyToMove) { 利用当前鼠标位置和初始记录的位置来修改矩形的每个顶点; // 做到图随鼠标动的效果 }}
// 鼠标左键弹起事件void OnLButtonUp(弹起的坐标点point){ if (可以移动) { 修改画笔颜色为黑色; 清空移动信息; } 恢复鼠标样式; m_IsReadyToMove = false; // 标记一下此时不可以移动了}
4. 手把手开始做框架
1.新建项目
2.基本设置
- 单文档、MFC标准、静态库,然后点“完成”
3.添加类变量
- 找到类视图
- 右键CRectangleMoveView
- 单击Add Member Variable…
- 依次添加以下类变量
bool m_IsReadyToMove; // 是否可以开始移动CPoint p1; // 移动矩形的时候会用到CPen * m_CurrentPen; // 指向当前画笔,初始化指向黑色画笔CPoint m_Points[4]; // 保存矩形的四个顶点
4.添加自定义消息处理函数
- **在CRectangleMove类上右键
- 依次添加下列消息处理函数
WM_LBUTTONDOWNWM_MOUSEMOVEWM_LBUTTONUP
- 完成时应该是这样的:
至此,我们已经完成了基础的“框架”
接下来就是代码部分了
按照我们的伪代码思路,一步一步来
5.一步步写代码
- 1.在CRectangleMoveView.cpp里定义三种不同颜色的画笔
CPen BlackPen(BS_SOLID, 1, RGB(0, 0, 0));// PS_DASH 是虚线钢笔CPen RedPen(PS_DASH , 1, RGB(255, 0, 0));
- 2.在CRectangleMoveView.cpp开头定义一个用于坐标转换的宏
#define Trans(p1, rect) CPoint(long((p1.x+0.5)/1) - rect.Width()/2, long((p1.y+0.5)/1) - rect.Height()/2)
- 3.在CRectangleMoveView类构造函数里对类变量赋值
//初始不可以移动m_IsReadyToMove = false;p1 = 0;m_Points[0] = CPoint(121, 100);m_Points[1] = CPoint(367, 100);m_Points[2] = CPoint(367, 245);m_Points[3] = CPoint(121, 245);//初始指向黑色画笔m_CurrentPen = &BlackPen;
- 4.在OnDraw函数里
void CRectangleMoveView::OnDraw(CDC* pDC){ CRectangleMoveDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: 在此处为本机数据添加绘制代码 CRect rect; GetClientRect(&rect); pDC->SetWindowExt(rect.Width(), rect.Height()); pDC->SetViewportExt(rect.Width(), -rect.Height()); pDC->SetViewportOrg(rect.Width() / 2, rect.Height() / 2); CDC memDC; // 声明内存DC CBitmap NewBitmap, *pOldBitmap; memDC.CreateCompatibleDC(pDC); // 创建一个与显示DC兼容的内存DC NewBitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height()); // 创建兼容内存位图 pOldBitmap = memDC.SelectObject(&NewBitmap); // 将兼容位图选入内存DC memDC.FillSolidRect(rect, pDC->GetBkColor()); // 按原来背景色填充客户区,否则是黑色 rect.OffsetRect(-rect.Width() / 2, -rect.Height() / 2); memDC.SetWindowExt(rect.Width(), rect.Height()); memDC.SetViewportExt(rect.Width(), -rect.Height()); memDC.SetViewportOrg(rect.Width() / 2, rect.Height() / 2); memDC.SetROP2(R2_COPYPEN); // 设置绘图方式 DrawObject(&memDC, rect); // 画矩形的代码在这一个函数里 // 将内存DC中的位图拷贝到设备DC pDC->BitBlt(rect.left, rect.top, rect.Width(), rect.Height(), &memDC, -rect.Width() / 2, -rect.Height() / 2, SRCCOPY); memDC.SelectObject(pOldBitmap);}
- DrawObject函数的声明与定义
// 在CRectangleMoveView.h里CRectangleMoveView类内部public部分声明void CRectangleMoveView::DrawObject(CDC* pDC, const CRect& rect);
// 在CRectangleMoveView.cpp里实现void CRectangleMoveView::DrawObject(CDC* pDC, const CRect& rect){ int i = 0; CPen * oldPen = pDC->SelectObject(m_CurrentPen); // 画出矩形 pDC->Rectangle(CRect(Trans(m_Points[0], rect), Trans(m_Points[2], rect))); pDC->SelectObject(oldPen);}
至此,我们可以编译运行看一下矩形效果图了
- 5.在OnLButtonDown函数里
void CRectangleMoveView::OnLButtonDown(UINT nFlags, CPoint point){ // TODO: 在此添加消息处理程序代码和/或调用默认值 m_IsReadyToMove = false; // 初始标记一下不能移动 if (m_Points[0].x <= point.x && point.x <= m_Points[2].x && m_Points[0].y <= point.y && point.y <= m_Points[2].y) { p1 = point; m_IsReadyToMove = true; // 标记一下可以移动了 m_CurrentPen = &RedPen; SetCapture(); // 设置鼠标捕获 SetCursor(LoadCursor(NULL, IDC_SIZEALL)); // 设置光标为八个方向 } // 触发OnDraw函数,动态效果 Invalidate(FALSE); CView::OnLButtonDown(nFlags, point);}
- 6.在OnOnMouseMove函数里
void CRectangleMoveView::OnMouseMove(UINT nFlags, CPoint point){ // TODO: 在此添加消息处理程序代码和/或调用默认值 // 我们只考虑鼠标可以移动时鼠标的移动事件 if (true == m_IsReadyToMove) { SetCursor(LoadCursor(NULL, IDC_SIZEALL)); // 设置光标为八个方向 // 利用当前鼠标位置和初始记录的位置来修改矩形的每个顶点,做到图随鼠标动的效果 for (int i = 0; i < 4; i++) { m_Points[i] += point - p1; } p1 = point; } // 触发OnDraw函数,动态效果 Invalidate(FALSE); CView::OnMouseMove(nFlags, point);}
- 7.在OnLButtonUp函数里
void CRectangleMoveView::OnLButtonUp(UINT nFlags, CPoint point){ // TODO: 在此添加消息处理程序代码和/或调用默认值 // 如果可以移动 if (true == m_IsReadyToMove) { m_CurrentPen = &BlackPen; // 修改画笔颜色为黑色 p1 = NULL; // 清空移动信息 } ReleaseCapture(); // 释放鼠标捕获 m_IsReadyToMove = false; // 标记一下此时不可以移动了 // 触发OnDraw函数,动态效果 Invalidate(FALSE); CView::OnLButtonUp(nFlags, point);}
6.总结
- 本人能力有限,希望这篇文章能帮到你
0 0
- MFC学习(02) 矩形移动 (VC++6.0版本)
- MFC学习(01) 矩形框选择移动三角形 (VC++6.0版本)
- MFC学习(02) 矩形移动 (VS2015版本)
- MFC学习(01) 矩形框选择移动三角形 (VS2015版本)
- 问题日记:VC MFC 鼠标移动画矩形
- MFC 鼠标移动画矩形
- VC++6.0 MFC窗口中移动的圆
- (VC,MFC) 检测操作系统版本
- 我的VC 6.0+MFC学习之路(一)
- 我的VC 6.0+MFC学习之路(二)
- 我的VC 6.0+MFC学习之路(三)
- GDI+绘制矩形,并且实现可旋转、缩放、移动功能(基于MFC对话框)
- mfc版本及其对应vc版本一览表
- MFC 对话框上画矩形,怎么让矩形跟着对话框移动而移动
- VC|MFC学习笔记(一)
- VC++ MFC编程学习笔记(1)
- VC++ MFC编程学习笔记(2)
- VC++ MFC编程学习笔记(3)
- 2017年5月1日13:01:52 389. Find the Difference [easy]
- golang 中的http包详解
- 项目开发感想
- golang 中的http包详解
- 508. Most Frequent Subtree Sum
- MFC学习(02) 矩形移动 (VC++6.0版本)
- Mac上超强的网络请求调试工具whistle,堪比Fiddler!
- Jenkins的使用
- 个人笔记:linux基本操作-进阶操作
- 初始化 State
- Android.mk添加大量.cpp 免除麻烦,只需添加
- [时间管理]TED-如何掌控你的时间
- Nginx配置基础-rewrite
- MJRefresh—快速集成下拉上拉刷新