




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國可伸縮乒乓球網格行業市場全景分析及前景機遇研判報告
- 2025年中國咖啡機清潔液行業市場全景分析及前景機遇研判報告
- 癌癥康復期用藥指南
- 中國防雷避雷產品行業市場深度分析及行業發展趨勢報告
- 2019-2025年中國定制酒行業市場深度分析及發展前景預測報告
- 網圍欄可行性研究報告
- 中國電動自行車電商行業發展監測及市場發展潛力預測報告
- 2025年中國豆腐行業市場深度分析及發展前景預測報告
- 起重安裝項目投資可行性研究分析報告(2024-2030版)
- 2025年 云南省觀光車駕駛-特種設備作業N2證考試練習題附答案
- 小學生匯報講課件
- 2025浙江嘉興市海寧市嘉睿人力招聘5人筆試參考題庫附帶答案詳解析版
- 2025年安徽蚌埠市龍子湖區東方人力資源有限公司招聘筆試參考題庫含答案解析
- 黨課課件含講稿:《關于加強黨的作風建設論述摘編》輔導報告
- GB/T 19023-2025質量管理體系成文信息指南
- 2025中考歷史高頻點速記大全
- 2025年特種設備作業人員氣瓶充裝P證考試題庫
- 多余物管理制度
- 2024北京朝陽區三年級(下)期末語文試題及答案
- 灌腸技術操作課件
- 電梯維保服務投標方案
評論
0/150
提交評論