Windows內建的畫圖軟體中可以用虛線框選擇映像的某個地區,之後便可以拖動、放大、縮小該地區,這是通過橡皮筋類(CRectTracker)來實現的,它將實現用線框選中一個地區,並可以拖動、放大、縮小該地區。
簡介:
CRectTracker類允許一個項被顯示,移動,以不同的方式改變大小。雖然CRectTracker類是設計來支援使用者以圖形化介面與OLE項互動的,但是它的使用不僅限於支援OLE的應用程式。它可以使用在任何需要使用者介面的地方。
CRectTracker的邊框可以是實線,也可以是點線。可給予項一種陰影式邊框或用一種陰影樣式覆蓋項,用來指示項的不同狀態。你可以在項的外界或內部放置八個調整大小把手。(有關八個調整大小把手的解釋,參見GetHandleMask。)最後,一個CRectTracker允許你在調整項的大小時改變項的方向。
要使用CRectTracker,首先要構造一個CRectTracker對象,並指定用哪種顯示狀態來初始化。然後,應用程式就可以使用這個介面,提供給使用者有關與CRectTracker對象相關聯的OLE項目前狀態的直觀反饋了。
#include <afxext.h>
請參閱:
COleResizeBar, CRect, CRectTracker::GetHandleMask
CRectTracker類成員
資料成員
| m_nHandleSize |
確定調整大小把手的尺寸 |
| m_rect |
矩形的以像素表示的當前位置 |
| m_sizeMin |
確定矩形寬度和高度的最小值 |
| m_nStyle |
跟蹤器的當前風格 |
構造
| CRectTracker |
構造一個CRectTracker對象 |
操作
| Draw |
顯示矩形 |
| GetTrueRect |
返回矩形的寬度和高度,包括改變縮放控點 |
| HitTest |
返回與CRectTracker對象關聯的游標的當前位置 |
| NormalizeHit |
正常化一個單擊測試代碼 |
| SetCursor |
根據游標在矩形上方的位置來設定游標 |
| Track |
支援使用者操作矩形 |
| TrackRubberBand |
支援使用者“橡皮筋”似的展開選擇 |
可重載
| AdjustRect |
當矩形被改變大小時此函數被調用 |
| DrawTrackerRect |
當畫一個CRectTracker對象的邊框時此函數被調用 |
| OnChangedRect |
當矩形被改變大小或被移動時,此函數被調用 |
| GetHandleMask |
調用此函數來獲得一個CRectTracker項的調整大小把手的掩碼 |
1.建立一個單文檔應用程式,命名為CRectTracker,完成。
2.在CCRectTrackerView中建立一個CRectTracker類型的成員變數m_RectTracker,和BOOL類型的變數m_IsChosen,表示是否選擇了,
CCRectTrackerView::CCRectTrackerView()
{
m_RectTracker.m_rect.SetRect(10,10,100,100);//設定矩形地區大小
m_RectTracker.m_nStyle=CRectTracker::dottedLine|CRectTracker::resizeInside;
m_IsChosen=FALSE;//表示未選中
}
m_nStyle是設定CRectTracker對象的框的屬性,其中CRectTracker::dottedLine表示該外框是虛線框,CRectTracker::resizeInside表示在該地區內部改變大小。
3.
void CCRectTrackerView::OnLButtonDown(UINT nFlags, CPoint point)
{
if(m_RectTracker.HitTest(point)<0)
{
CRectTracker tempRectTracker;
CRect rect;
tempRectTracker.TrackRubberBand(this,point);
tempRectTracker.m_rect.NormalizeRect();
if(rect.IntersectRect(tempRectTracker.m_rect,m_RectTracker.m_rect))
m_IsChosen=TRUE;
else
m_IsChosen=FALSE;
Invalidate();
}
else
{
CClientDC dc(this);
m_RectTracker.Draw(&dc);
m_RectTracker.Track(this,point);
m_IsChosen=TRUE;
Invalidate();
}
CView::OnLButtonDown(nFlags, point);
}
HitTest(point)是用point測試滑鼠在地區的什麼位置,如下表
傳回值 |
代表的含義 |
-1 |
點在了四邊形的外部 |
0 |
左上方 |
1 |
右上方 |
2 |
右下角 |
3 |
左下角(0,1,2,3順時針轉了一圈) |
4 |
頂部 |
5 |
右部 |
6 |
底部 |
7 |
左部(還是順時針轉了一圈) |
8 |
點在了四邊形的內部,但沒有擊中前面的那八個點 |
TrackRubberBand表示跟蹤橡皮筋的邊框,其中this表示擁有該虛線框的視窗,point表示虛線框的起始點,TRUE表示可以往任意方向畫虛線框,若為FALSE,只能往右下畫虛線框。TrackRubberBand是以左鍵彈起作為結束,在此期間不能響應WM_MOUSEMOVE訊息,彈起也收不到WM_LBUTTONUP訊息。下面會介紹如何獲得WM_LBUTTONUP訊息。
m_rect.NormalizeRect()是為了防止TrackRubberBand第三個參數為FALSE引起的錯誤而實施的正規化。
CRect::IntersectRect(rect1,rect2)表示rect1和rect2是否有交集.
用CRectTracker::Draw(&dc)繪製矩形地區的8個點以及邊框線.
Track(this,point);用來即時更新矩形的變化,是最有魅力的函數,拖動,改變大小都是由它指揮完成,其中this表示擁有該矩形的視窗,point是起始點。左鍵彈起作為結束,在此期間也不能響應WM_MOUSEMOVE訊息。
4.
重載CCRectTrackerView::OnSetCursor
BOOL CCRectTrackerView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
if(pWnd==this && m_RectTracker.SetCursor(this,nHitTest))
return TRUE;
return CView::OnSetCursor(pWnd, nHitTest, message);
}
CRectTracker::SetCursor(this,nHitTest)用來捕捉滑鼠,當滑鼠在該地區裡或地區邊框上時會產生不同的滑鼠圖案,如在地區裡就是十字形的,在邊框上8點不同位置也有不同圖案,此時返回TRUE;在矩形外面就返回FALSE;然後直接返回TRUE不讓視類處理該訊息。
5.
void CCRectTrackerView::OnDraw(CDC* pDC)
{
CCRectTrackerDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
//自己添加
CBrush brush(RGB(255,0,0));//畫刷為紅色
CBrush *pbrush=pDC->SelectObject(&brush);
CRect rect;
m_RectTracker.GetTrueRect(&rect);//得到矩形地區的大小
pDC->Rectangle(&rect);//畫出矩形
if(m_IsChosen)
m_RectTracker.Draw(pDC);//若選擇了該地區,則顯示邊框以及8個調整點
}
這樣就可以完成本執行個體的功能了!但若要在WM_LBUTTONUP裡處理某些特殊的要求,只需在CRectTracker::TrackRubberBand、CRectTracker::Track下發送WM_LBUTTONUP訊息即可,
即SendMessage(WM_LBUTTONUP,NULL,NULL)便可以實現了.