Windows自帶的畫圖軟件中能夠用虛線框選擇圖像的某個區域,以後即可以拖動、放大、縮小該區域,這是經過橡皮筋類(CRectTracker)來實現的,它將實現用線框選中一個區域,並能夠拖動、放大、縮小該區域。ide
簡介:函數
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 | 跟蹤器的當前風格 |
構造this
CRectTracker | 構造一個CRectTracker對象 |
操做spa
Draw | 顯示矩形 |
GetTrueRect | 返回矩形的寬度和高度,包括改變大小句柄 |
HitTest | 返回與CRectTracker對象關聯的光標的當前位置 |
NormalizeHit | 規範化一個單擊測試代碼 |
SetCursor | 根據光標在矩形上方的位置來設置光標 |
Track | 支持用戶操做矩形 |
TrackRubberBand | 支持用戶「橡皮筋」似的拉伸選擇 |
可重載設計
AdjustRect | 當矩形被改變大小時此函數被調用 |
DrawTrackerRect | 當畫一個CRectTracker對象的邊框時此函數被調用 |
OnChangedRect | 當矩形被改變大小或被移動時,此函數被調用 |
GetHandleMask | 調用此函數來得到一個CRectTracker項的調整大小把手的掩碼 |
1.新建一個單文檔應用程序,命名爲CRectTracker,完成。orm
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表示在該區域內部改變大小。htm
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測試鼠標在區域的什麼位置,以下表對象
返回值ci |
表明的含義 |
-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)即可以實現了.