




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、使用CRectTracker類進(jìn)行對(duì)象動(dòng)態(tài)定位內(nèi)容提要使用VC,VB,Delphi等可視化工具進(jìn)行程序設(shè)計(jì)的時(shí)候用的最多的可能就是控件的拾取,拖動(dòng)以及動(dòng)態(tài)定位了。例如我們可以在VC中用鼠標(biāo)一次拾取數(shù)個(gè)控件,然后通過鼠標(biāo)或者通過左右上下方向鍵進(jìn)行控件的微移,從而使控件移到合適的位置,這種技術(shù)就是對(duì)象動(dòng)態(tài)定位。動(dòng)態(tài)定位也是交互式程序設(shè)計(jì)中最基本的操作之一。在VC中我們可以通過CRectTracker類來實(shí)現(xiàn)這些操作。文章正文一關(guān)于中的OLE在內(nèi)的應(yīng)用程序。首先我們了解一下類的成員變量和成員函數(shù)1. CRectTracker類的成員變量:m_nHandleSize:對(duì)象的調(diào)整句柄的數(shù)目,默認(rèn)情況下為
2、8個(gè)m_rect:對(duì)象矩形目前所占大小的位置m_sizeMin:對(duì)象所占的矩形的最小寬度和最小高度m_nStyle:目前對(duì)象邊框和調(diào)整句柄的類型2.CRectTracker類的成員函數(shù)Draw(CDC* pDC:通過調(diào)用這個(gè)函數(shù)來畫對(duì)象邊框和調(diào)整句柄的類型。對(duì)象邊框和調(diào)整句柄的具體類型由成員變量m_nStyle決定,一共有以下幾種形式:CRectTracker:solidLine 外部邊界使用實(shí)線形式外部邊界使用點(diǎn)虛線形式CRectTracker:hatchedBorder 外部邊界使用帶陰影的形式調(diào)整句柄處于對(duì)象內(nèi)部區(qū)域CRectTracker:resizeOutside 調(diào)整句柄處于對(duì)象外
3、部區(qū)域CRectTracker:hatchInside 內(nèi)部所有區(qū)域使用帶陰影的形式CRectTracker:solidLine和CRectTracker:resizeOutside不能同時(shí)共存Track(CWnd* pWnd,CPoint point,BOOL bAllowInvert=FALSE,CWnd* pWndClipTo=NULL這個(gè)函數(shù)和下面的TrackRubberBand函數(shù)是整個(gè)CRectTracker類中最重要的函數(shù),通常在消息,如果鼠標(biāo)指針落在矩形的邊框上,用戶就可以拖動(dòng)以調(diào)整矩形的大小;如果鼠標(biāo)落在了矩形的內(nèi)部,則用戶可以拖動(dòng)鼠標(biāo)移動(dòng)矩形。當(dāng)ESC鍵按下時(shí)候,函數(shù)返回F
4、ALSE,函數(shù)沒有起作用, 否則松開鼠標(biāo)時(shí)候,返回TRUE;那么鼠標(biāo)移動(dòng)時(shí)候?qū)?huì)產(chǎn)生橡皮條,這個(gè)”GetTrueRect(LPRECT lpTrueRect:獲取對(duì)象所占矩形的大小,如果邊框形式為CRectTracker:hatchOutside則矩形大小包括外部調(diào)整句柄的范圍Int HitTest(Cpoint point:函數(shù)返回光標(biāo)在CrectTrack類中的位置,通過返回值可以確定拖動(dòng)句柄的位置CRectTracker:hitNothing 1:沒有點(diǎn)擊任何地方CRectTracker:hitTopLeft 0 :點(diǎn)擊調(diào)整標(biāo)記的左上角CRectTracker:hitTopRight 1
5、 :點(diǎn)擊調(diào)整標(biāo)記的右上角CRectTracker:hitBottomRight 2:點(diǎn)擊調(diào)整標(biāo)記的右下角CRectTracker:hitBottomLeft 3:點(diǎn)擊調(diào)整標(biāo)記的左下角CRectTracker:hitTop 4 :點(diǎn)擊調(diào)整標(biāo)記的上方CRectTracker:hitRight 5:點(diǎn)擊調(diào)整標(biāo)記的右方CRectTracker:hitBottom 6:點(diǎn)擊調(diào)整標(biāo)記的下方CRectTracker:hitLeft 7:點(diǎn)擊調(diào)整標(biāo)記的左方CRectTracker:hitMiddle 8:點(diǎn)擊調(diào)整標(biāo)記的中央BOOL SetCursor(CWnd* pWnd,UINT nHitTest:當(dāng)點(diǎn)擊特
6、定的位置時(shí)改變光標(biāo)的形狀二.應(yīng)用示例整個(gè)程序界面如下,我們可以通過工具欄來設(shè)置圖像的邊界和調(diào)整句柄的類型,同時(shí)我們可以用鼠標(biāo)移動(dòng)和調(diào)整整個(gè)圖像,另外程序還支持用來微調(diào)矩形的位置,通過Shift+來微調(diào)矩形的大小.程序的開發(fā)步驟如下:步驟一:使用VC的MFC AppWizard創(chuàng)建單文檔應(yīng)用程序ExamTracker,創(chuàng)建過程中保留默認(rèn)值。步驟二.在CExamTrackerDoc中增加兩個(gè)成員變量CRectTracker m_tracker;BOOL m_bAllowInvert:是否允許逆向拖動(dòng),即橡皮條的落點(diǎn)是否小于起點(diǎn)。步驟三:在CrectTrckerDemoDoc的構(gòu)造函數(shù)中給m_tra
7、cker對(duì)象賦初值/初始邊界形式為實(shí)線m_tracker.m_nStyle=CRectTracker:solidLine;/允許逆向拖動(dòng)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;/設(shè)置字體顯示方式為中間對(duì)齊方式pDC->SetBkMode(TRANSPARENT;/設(shè)置背景色為透明色int nCenterX, nCenterY;TEXTMETRIC tm;pDC->GetTextMetrics(&tm;/獲取字體大小brush1.CreateSolidBrush(RGB(255, 0, 0;pOldBrush = pDC->SelectObject(&brush1;/設(shè)置第一個(gè)圖形區(qū)域矩形的大小函數(shù)為自定義./繪制矩形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(;/這一行代碼是必不可少的,通過它可以繪制限定形式的圖形區(qū)域的外部邊界和內(nèi)部區(qū)域. pDoc->m_tracker.Draw(pDC;CATCH_ALL(eif (pOldBrush != NULLpDC->Select
14、Object(pOldBrush;END_CA TCH_ALL在程序中用到了自定義的全局函數(shù)static void SetNormalRect(CRect& rect, int left, int top, int width, int height,函數(shù)用來設(shè)置矩形的大小,同時(shí)對(duì)矩形進(jìn)行相應(yīng)的校正.這種校正一般在逆向拖動(dòng)時(shí)候需要,作用相當(dāng)于CRect:NormalizeRect(.函數(shù)定義如下: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處理消息,在函數(shù)中我們必須處理三種情況;鼠標(biāo)選中矩形對(duì)象但是不處于矩形邊界,這種情況僅僅是對(duì)矩形進(jìn)行移動(dòng),第二種情況:鼠標(biāo)處于矩形邊界,這時(shí)候拖動(dòng)鼠標(biāo)將會(huì)調(diào)整矩形的大小.第三種情況時(shí)鼠標(biāo)沒有選中矩形的任何地方,這個(gè)時(shí)候?qū)?huì)產(chǎn)生橡皮條效果,橡皮條內(nèi)的所有內(nèi)容被選中.具體代碼如下:void CExamTrackerView:OnLButtonDown(UINT nFlags, CPoint pointCExamTrackerDoc* pDoc = GetDocument(;CRect rectSave;/獲取圖形區(qū)域矩形對(duì)象的大小pDoc->m_tracker.GetTrue
17、Rect(rectSave;/如果沒有點(diǎn)中圖形,這時(shí)候HitTest將返回-1.這時(shí)候產(chǎn)生橡皮條.if (pDoc->m_tracker.HitTest(point < 0CRectTracker tracker;/畫橡皮擦if (tracker.TrackRubberBand(this, point, pDoc->m_bAllowInvert/ 下面的工作將用來檢查橡皮條的矩形是否與圖形區(qū)域的矩形相交.CRect rectT;/對(duì)橡皮條的矩形進(jìn)行校正./橡皮條區(qū)域與圖形區(qū)域的交叉區(qū)域不為空,則將圖形區(qū)域的調(diào)整句柄進(jìn)行相應(yīng)/的設(shè)置if (rectT.IntersectRect
18、(tracker.m_rect, pDoc->m_tracker.m_rect/如果調(diào)整句柄位于矩形內(nèi)部(resizeInside則將調(diào)整句柄設(shè)置在矩形的外/部(resizeOutsideif (pDoc->m_tracker.m_nStyle & CRectTracker:resizeInside/去除resizeInside 形式pDoc->m_tracker.m_nStyle &= CRectTracker:resizeInside;/設(shè)置resizeOutside形式pDoc->m_tracker.m_nStyle |= CRectTracker:resizeOutside;/否則如果調(diào)整句柄在外部就將調(diào)整句柄放在區(qū)域內(nèi)部else/ just use inside resize handles on first timepDoc->m_tracker.m_nStyle &= CRectTracker:resizeOutside;pDoc->m_tracker.m_nStyle |= CRectTracker:resizeInside;/更新所有視圖,顯示調(diào)整后的圖形pDoc->UpdateAllViews(NULL, (LPARAM(LPCRECTrectSave;pDoc->Upd
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 寵物醫(yī)生助理崗位面試問題及答案
- UI 設(shè)計(jì)師崗位面試問題及答案
- 山東省東營市利津一中2025屆化學(xué)高一下期末監(jiān)測模擬試題含解析
- 2025屆云南省麗江市玉龍縣第一中學(xué)高一化學(xué)第二學(xué)期期末檢測試題含解析
- 江西省贛州市寧師中學(xué)2025年高二化學(xué)第二學(xué)期期末綜合測試模擬試題含解析
- 民事審判團(tuán)隊(duì)管理辦法
- 醫(yī)療安全事件管理辦法
- 保安公司公章管理辦法
- 桐鄉(xiāng)疫情出入管理辦法
- 江蘇公司商旅管理辦法
- 2025年武漢市漢陽區(qū)社區(qū)干事崗位招聘考試筆試試題(含答案)
- 2025屆山東煙臺(tái)中考?xì)v史真題試卷【含答案】
- 志愿者心理調(diào)適培訓(xùn)(改)
- 黨課課件含講稿:《關(guān)于加強(qiáng)黨的作風(fēng)建設(shè)論述摘編》輔導(dǎo)報(bào)告
- 國家開放大學(xué)行管??啤侗O(jiān)督學(xué)》期末紙質(zhì)考試總題庫2025春期版
- GB/T 3280-2015不銹鋼冷軋鋼板和鋼帶
- 斯巴達(dá)勇士賽
- 住院醫(yī)師規(guī)范化培訓(xùn)臨床小講課指南(2021年版)
- T∕CQAP 2002-2022 基于水泡性口炎病毒載體的新型冠狀病毒核酸檢測用陽性假病毒質(zhì)控品
- 1#球磨機(jī)襯板更換及方案
- 常用塑料改性加工工藝
評(píng)論
0/150
提交評(píng)論