版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、使用CRectTracker类进行对象动态定位内容提要使用VC,VB,Delphi等可视化工具进行程序设计的时候用的最多的可能就是控件的拾取,拖动以及动态定位了。例如我们可以在VC中用鼠标一次拾取数个控件,然后通过鼠标或者通过左右上下方向键进行控件的微移,从而使控件移到合适的位置,这种技术就是对象动态定位。动态定位也是交互式程序设计中最基本的操作之一。在VC中我们可以通过CRectTracker类来实现这些操作。文章正文一关于中的OLE在内的应用程序。首先我们了解一下类的成员变量和成员函数1. CRectTracker类的成员变量:m_nHandleSize:对象的调整句柄的数目,默认情况下为
2、8个m_rect:对象矩形目前所占大小的位置m_sizeMin:对象所占的矩形的最小宽度和最小高度m_nStyle:目前对象边框和调整句柄的类型2.CRectTracker类的成员函数Draw(CDC* pDC:通过调用这个函数来画对象边框和调整句柄的类型。对象边框和调整句柄的具体类型由成员变量m_nStyle决定,一共有以下几种形式:CRectTracker:solidLine 外部边界使用实线形式外部边界使用点虚线形式CRectTracker:hatchedBorder 外部边界使用带阴影的形式调整句柄处于对象内部区域CRectTracker:resizeOutside 调整句柄处于对象外
3、部区域CRectTracker:hatchInside 内部所有区域使用带阴影的形式CRectTracker:solidLine和CRectTracker:resizeOutside不能同时共存Track(CWnd* pWnd,CPoint point,BOOL bAllowInvert=FALSE,CWnd* pWndClipTo=NULL这个函数和下面的TrackRubberBand函数是整个CRectTracker类中最重要的函数,通常在消息,如果鼠标指针落在矩形的边框上,用户就可以拖动以调整矩形的大小;如果鼠标落在了矩形的内部,则用户可以拖动鼠标移动矩形。当ESC键按下时候,函数返回F
4、ALSE,函数没有起作用, 否则松开鼠标时候,返回TRUE;那么鼠标移动时候将会产生橡皮条,这个”GetTrueRect(LPRECT lpTrueRect:获取对象所占矩形的大小,如果边框形式为CRectTracker:hatchOutside则矩形大小包括外部调整句柄的范围Int HitTest(Cpoint point:函数返回光标在CrectTrack类中的位置,通过返回值可以确定拖动句柄的位置CRectTracker:hitNothing 1:没有点击任何地方CRectTracker:hitTopLeft 0 :点击调整标记的左上角CRectTracker:hitTopRight 1
5、 :点击调整标记的右上角CRectTracker:hitBottomRight 2:点击调整标记的右下角CRectTracker:hitBottomLeft 3:点击调整标记的左下角CRectTracker:hitTop 4 :点击调整标记的上方CRectTracker:hitRight 5:点击调整标记的右方CRectTracker:hitBottom 6:点击调整标记的下方CRectTracker:hitLeft 7:点击调整标记的左方CRectTracker:hitMiddle 8:点击调整标记的中央BOOL SetCursor(CWnd* pWnd,UINT nHitTest:当点击特
6、定的位置时改变光标的形状二.应用示例整个程序界面如下,我们可以通过工具栏来设置图像的边界和调整句柄的类型,同时我们可以用鼠标移动和调整整个图像,另外程序还支持用来微调矩形的位置,通过Shift+来微调矩形的大小.程序的开发步骤如下:步骤一:使用VC的MFC AppWizard创建单文档应用程序ExamTracker,创建过程中保留默认值。步骤二.在CExamTrackerDoc中增加两个成员变量CRectTracker m_tracker;BOOL m_bAllowInvert:是否允许逆向拖动,即橡皮条的落点是否小于起点。步骤三:在CrectTrckerDemoDoc的构造函数中给m_tra
7、cker对象赋初值/初始边界形式为实线m_tracker.m_nStyle=CRectTracker:solidLine;/允许逆向拖动m_bAllowInvert=TRUE;CExamTrackerDoc* pDoc = GetDocument(;ASSERT_V ALID(pDoc;CBrush* pOldBrush = NULL;TRY/用不同的画刷绘制矩形CBrush brush1, brush2;CRect rect;int nSgnX = nWidth != 0 ? nWidth / abs(nWidth : 1;int nSgnY = nHeight != 0 ? nHeight
8、 / abs(nHeight : 1;pDC->SetTextAlign(TA_CENTER;/设置字体显示方式为中间对齐方式pDC->SetBkMode(TRANSPARENT;/设置背景色为透明色int nCenterX, nCenterY;TEXTMETRIC tm;pDC->GetTextMetrics(&tm;/获取字体大小brush1.CreateSolidBrush(RGB(255, 0, 0;pOldBrush = pDC->SelectObject(&brush1;/设置第一个图形区域矩形的大小函数为自定义./绘制矩形pDC->P
9、atBlt(rect.left, rect.top, rect.Width(, rect.Height(, PA TCOPY;nCenterX = rect.left + rect.Width(/2;nCenterY = rect.top + rect.Height(/2 - tm.tmHeight/2;/在矩形中央显示字符1pDC->ExtTextOut(nCenterX, nCenterY, ETO_CLIPPED, rect, _T("1", 1, NULL;brush2.CreateSolidBrush(RGB(0, 255, 0;pDC->Select
10、Object(&brush2;brush1.DeleteObject(;pDC->PatBlt(rect.left, rect.top, rect.Width(, rect.Height(, PA TCOPY;nCenterX = rect.left + rect.Width(/2;nCenterY = rect.top + rect.Height(/2 - tm.tmHeight/2;pDC->ExtTextOut(nCenterX, nCenterY, ETO_CLIPPED, rect, _T("2", 1, NULL;brush1.CreateS
11、olidBrush(RGB(0, 0, 255;pDC->SelectObject(&brush1;brush2.DeleteObject(;pDC->PatBlt(rect.left, rect.top, rect.Width(, rect.Height(, PA TCOPY;nCenterX = rect.left + rect.Width(/2;nCenterY = rect.top + rect.Height(/2 - tm.tmHeight/2;pDC->ExtTextOut(nCenterX, nCenterY, ETO_CLIPPED, rect, _T
12、("3", 1, NULL;brush2.CreateSolidBrush(RGB(192, 192, 192;pDC->SelectObject(&brush2;brush1.DeleteObject(;(nWidth+nSgnX/2, (nHeight+nSgnY/2;pDC->PatBlt(rect.left, rect.top, rect.Width(, rect.Height(, PA TCOPY;nCenterX = rect.left + rect.Width(/2;nCenterY = rect.top + rect.Height(/2
13、- tm.tmHeight/2;pDC->ExtTextOut(nCenterX, nCenterY, ETO_CLIPPED, rect, _T("4", 1, NULL;/ cleanup DCif (pOldBrush != NULLpDC->SelectObject(pOldBrush;brush2.DeleteObject(;/这一行代码是必不可少的,通过它可以绘制限定形式的图形区域的外部边界和内部区域. pDoc->m_tracker.Draw(pDC;CATCH_ALL(eif (pOldBrush != NULLpDC->Select
14、Object(pOldBrush;END_CA TCH_ALL在程序中用到了自定义的全局函数static void SetNormalRect(CRect& rect, int left, int top, int width, int height,函数用来设置矩形的大小,同时对矩形进行相应的校正.这种校正一般在逆向拖动时候需要,作用相当于CRect:NormalizeRect(.函数定义如下:static void SetNormalRect(CRect& rect, int left, int top, int width, int heightrect.left = l
15、eft;rect.top = top;rect.right = left + width;rect.bottom = top + height;int nTemp;if (rect.left > rect.rightnTemp = rect.left;rect.left = rect.right;rect.right = nTemp;if (rect.top > rect.bottomnTemp = rect.top;rect.top = rect.bottom;rect.bottom = nTemp;步骤五:使用AppWizard为CExamTrackerView增加WM_LBU
16、TTONDOWN处理消息,在函数中我们必须处理三种情况;鼠标选中矩形对象但是不处于矩形边界,这种情况仅仅是对矩形进行移动,第二种情况:鼠标处于矩形边界,这时候拖动鼠标将会调整矩形的大小.第三种情况时鼠标没有选中矩形的任何地方,这个时候将会产生橡皮条效果,橡皮条内的所有内容被选中.具体代码如下:void CExamTrackerView:OnLButtonDown(UINT nFlags, CPoint pointCExamTrackerDoc* pDoc = GetDocument(;CRect rectSave;/获取图形区域矩形对象的大小pDoc->m_tracker.GetTrue
17、Rect(rectSave;/如果没有点中图形,这时候HitTest将返回-1.这时候产生橡皮条.if (pDoc->m_tracker.HitTest(point < 0CRectTracker tracker;/画橡皮擦if (tracker.TrackRubberBand(this, point, pDoc->m_bAllowInvert/ 下面的工作将用来检查橡皮条的矩形是否与图形区域的矩形相交.CRect rectT;/对橡皮条的矩形进行校正./橡皮条区域与图形区域的交叉区域不为空,则将图形区域的调整句柄进行相应/的设置if (rectT.IntersectRect
18、(tracker.m_rect, pDoc->m_tracker.m_rect/如果调整句柄位于矩形内部(resizeInside则将调整句柄设置在矩形的外/部(resizeOutsideif (pDoc->m_tracker.m_nStyle & CRectTracker:resizeInside/去除resizeInside 形式pDoc->m_tracker.m_nStyle &= CRectTracker:resizeInside;/设置resizeOutside形式pDoc->m_tracker.m_nStyle |= CRectTracker:resizeOutside;/否则如果调整句柄在外部就将调整句柄放在区域内部else/ just use inside resize handles on first timepDoc->m_tracker.m_nStyle &= CRectTracker:resizeOutside;pDoc->m_tracker.m_nStyle |= CRectTracker:resizeInside;/更新所有视图,显示调整后的图形pDoc->UpdateAllViews(NULL, (LPARAM(LPCRECTrectSave;pDoc->Upd
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026湖北武汉消防招聘270人备考题库及答案详解(名校卷)
- 2026湖北事业单位联考天门市招聘248人备考题库含答案详解(完整版)
- 2026贵州安顺市国土资源勘测规划院招聘临时聘用人员1人备考题库完整答案详解
- 2026黑龙江哈尔滨工业大学商学院招聘备考题库及答案详解(基础+提升)
- 2026浙江嘉兴市海宁市青少年宫公益性岗位招聘2人备考题库带答案详解(满分必刷)
- 水库疫情防控管理制度
- 托班安全管理制度及流程
- 项目投资现金管理制度
- 武馆场馆管理制度
- 大庆第三采油厂请假制度
- 健康体检中心质量管理手册
- 人教版(2026)八年级下册英语UNIT 4 Wonders of Nature讲义
- Unit 1 Time to Relax Section A(1a-2d)教学课件 人教新教材2024版八年级英语下册
- 矿山各类安全标识牌规范及设计标准
- 人文知识竞赛重点题库及答案
- 2025年大学《法医学-法医毒物分析》考试模拟试题及答案解析
- 醋酸回收系统工艺流程图
- 节假日工地安全监理通知模板
- DLT 593-2016 高压开关设备和控制设备
- 形象代言人合同模板
- 个人廉洁承诺内容简短
评论
0/150
提交评论