橡皮筋類(CRectTracker)

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)即可以實現了.

相關文章
相關標籤/搜索