橡皮筋類(CRectTracker)

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.