使用CRectTracker類進(jìn)行對(duì)象動(dòng)態(tài)定位_第1頁
使用CRectTracker類進(jìn)行對(duì)象動(dòng)態(tài)定位_第2頁
使用CRectTracker類進(jìn)行對(duì)象動(dòng)態(tài)定位_第3頁
使用CRectTracker類進(jìn)行對(duì)象動(dòng)態(tài)定位_第4頁
使用CRectTracker類進(jìn)行對(duì)象動(dòng)態(tài)定位_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論