https://blog.csdn.net/zb774095236/article/details/84229820
CRectTracker(俗稱“橡皮筋”類)是一個(gè)非常有意思的類。你在Windows中,在桌面上用鼠標(biāo)拖拽,便可以看到一個(gè)虛線的矩形框,它便是橡皮筋.它可以用做顯示邊界,你也可以扽它的八個(gè)角用來放大縮小,做框選使用。如何通過編程來實(shí)現(xiàn)這種功能呢?這就是CRectTracker類的作用;
一、CrectTracker 類成員:
一 數(shù)據(jù)成員
- m_rect
當(dāng)前橡皮筋矩形的矩形框的位置 - m_sizeMin
決定橡皮筋最小矩形的最新的長和寬
3.m_nHandleSize 調(diào)節(jié)句柄的像素大小
4.m_nStyle
橡皮筋矩形的形式如:
CRectTracker::solidLine 用實(shí)線標(biāo)記矩形框
CRectTracker::dottedLine 虛線
CRectTracker::hatchedBorder 影陰線
CRectTracker::resizeInside 改變大小的句柄在橡皮筋矩形框內(nèi)部(點(diǎn)在橡皮筋矩形框
里面來改變大?。?br>
CRectTracker::resizeOutside 改變大小的句柄在橡皮筋矩形框外部
CRectTracker::hatchInside 影陰線布滿總個(gè)矩形框
二、 CrectTracker 成員函數(shù):
1.void Draw( CDC* pDC ) const;
這個(gè)函數(shù)用來劃矩形框的邊框和內(nèi)部區(qū)域。
2.void GetTrueRect( LPRECT lpTrueRect ) const;
這個(gè)函數(shù)用來獲取矩形框的 矩形坐標(biāo),參數(shù)為CRECT類型的指針,返回矩形
3.int HitTest( CPoint point ) const;
當(dāng)你鼠標(biāo)被按下的時(shí)候,你可以調(diào)用這個(gè)函數(shù),它將返回鼠標(biāo)點(diǎn)在了矩形框的什么位置:
返回值代表的含義
-1點(diǎn)在了四邊形的外部
0左上角
1右上角
2右下角
3左下角(0,1,2,3正好是順時(shí)針轉(zhuǎn)了一圈)
4頂部
5右部
6底部
7左部(還是順時(shí)針轉(zhuǎn)了一圈)
8點(diǎn)在了四邊形的內(nèi)部,但沒有擊中前面的那八個(gè)調(diào)節(jié)點(diǎn)
可以看出,返回值如果大于等于零則在四邊形區(qū)域之內(nèi)。如果小于則說明不在區(qū)域范圍之內(nèi)。
4.BOOL SetCursor( CWnd* pWnd, UINT nHitTest ) const;
調(diào)用這個(gè)函數(shù)用來當(dāng)鼠標(biāo)放在矩形框時(shí),顯示各種鼠標(biāo)形象
5.BOOL Track( CWnd* pWnd, CPoint point, BOOL bAllowInvert = FALSE, CWnd* pWndClipTo = NULL );
這個(gè)函數(shù)用來支持人們用鼠標(biāo)改變矩形框大小 或 拖拽矩形框時(shí)顯示矩形框動(dòng)作
(用來調(diào)整各個(gè)調(diào)節(jié)柄以改變選區(qū)的大小和位置)
一般由WM_LBUTTONDOWN 消息來觸發(fā)這個(gè)函數(shù), 不需要編寫MouseMove函數(shù),矩形框它就自動(dòng)的變大小了呢?這就是Track()函數(shù)的功勞,從調(diào)用它到抬起鼠標(biāo)鍵為止,它時(shí)刻的改變四邊形的大小。
6.BOOL TrackRubberBand( CWnd* pWnd, CPoint point, BOOL bAllowInvert = TRUE );
當(dāng)鼠標(biāo)在空區(qū)域拖拽時(shí)顯示橡皮筋矩形框,讓鼠標(biāo)畫一個(gè)“橡皮筋”區(qū)域,第一個(gè)參數(shù),畫“橡皮筋”的窗體的指針,當(dāng)然是this ,第二個(gè)參數(shù),畫“橡皮筋”的起始點(diǎn)。 讓我們注意第三個(gè)參數(shù),它非常有意思。當(dāng)你使用 FALSE時(shí)(TRUE 值是缺省的),你的“橡皮筋”只能從左上到右下的畫,不允許反向。
(一般可以用來重新繪制選區(qū))
特別值得注意的是:在TrackRubberBand的過程中是以右鍵的抬起為結(jié)束的,這其間并沒有CView的MouseMove發(fā)生。這一點(diǎn)一定要記??!這時(shí)鼠標(biāo)畫過的區(qū)域已經(jīng)記錄在CrectTracker 類數(shù)據(jù)成員 m_rect里面了,即CrectTracker:: m_rect.
三、具體實(shí)現(xiàn)示例
1、在窗口類中申明成員變量 CRectTracker m_RectTracker
2、在初始化函數(shù)中初始化成員的屬性,比如:
m_RectTracker.m_nStyle=CRectTracker::resizeInside|CRectTracker::dottedLine;//設(shè)置RectTracker樣式
m_RectTracker.m_nHandleSize = 5; //控制柄的像素大小
m_RectTracker.m_rect.SetRect(0,0,0,0); //初始化m_rect的值
3、一般在OnLButtonDown事件中操作CrectTracker對(duì)象,代碼如下
void CDM_CtrlPadDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
CRect cwrect;
GetDlgItem(IDC_STATIC_IMGCAPTURE)->GetWindowRect(&cwrect); //獲取窗體中控件的區(qū)域
ScreenToClient(&cwrect); //轉(zhuǎn)換為相對(duì)區(qū)域的CRect if(point.x>cwrect.left && point.y>cwrect.top //確保按下的坐標(biāo)在控件區(qū)域內(nèi) && point.x
{
if(m_RectTracker.HitTest(point)<0) //如果未擊中矩形選擇框,重新畫選擇框
{
m_RectTracker.TrackRubberBand(this,point,TRUE);
m_RectTracker.m_rect.NormalizeRect(); //正規(guī)化矩形(關(guān)于正規(guī)化矩形下面有介紹)
}
else //如果擊中矩形選擇框
{
m_RectTracker.Track(this,point,TRUE);
m_RectTracker.m_rect.NormalizeRect(); //正規(guī)化矩形
//SendMessage(WM_LBUTTONUP,NULL,NULL);
}
Invalidate(); //刷新窗口區(qū)域,使得CrectTracker對(duì)象重繪到窗口上
}
CDialog::OnLButtonDown(nFlags, point);
}
4、相應(yīng)OnPaint消息(顯示CrectTracker對(duì)象)
只需要調(diào)用CrectTracker的Draw方法即可
m_RectTracker.Draw(&dc);//將這個(gè)四邊形選區(qū)畫出來
四、關(guān)于正規(guī)化矩形的說明
CRect::NormalizeRect
void NormalizeRect( );
說明:
此函數(shù)用來使CRect符合規(guī)范,使其高度和寬度均為正值。矩形被從四個(gè)象限規(guī)范化,通常這四個(gè)象限就是Windows用來確定坐標(biāo)的。NormalizeRect比較上、下坐標(biāo)的值,如果上坐標(biāo)值大于下坐標(biāo)的值,則將它們互換。類似的,如果左坐標(biāo)的值大于右坐標(biāo)的值,則將左、右坐標(biāo)互換。當(dāng)處理不同的映射模式和轉(zhuǎn)化的矩形時(shí),這個(gè)函數(shù)是很有用的。