https://blog.csdn.net/zb774095236/article/details/84229820
CRectTracker(俗稱“橡皮筋”類)是一個非常有意思的類建钥。你在Windows中粹污,在桌面上用鼠標拖拽,便可以看到一個虛線的矩形框募胃,它便是橡皮筋.它可以用做顯示邊界全陨,你也可以扽它的八個角用來放大縮小,做框選使用。如何通過編程來實現(xiàn)這種功能呢刁品?這就是CRectTracker類的作用;
一浩姥、CrectTracker 類成員:
一 數(shù)據(jù)成員
- m_rect
當前橡皮筋矩形的矩形框的位置 - m_sizeMin
決定橡皮筋最小矩形的最新的長和寬
3.m_nHandleSize 調節(jié)句柄的像素大小
4.m_nStyle
橡皮筋矩形的形式如:
CRectTracker::solidLine 用實線標記矩形框
CRectTracker::dottedLine 虛線
CRectTracker::hatchedBorder 影陰線
CRectTracker::resizeInside 改變大小的句柄在橡皮筋矩形框內部(點在橡皮筋矩形框
里面來改變大刑羲妗)
CRectTracker::resizeOutside 改變大小的句柄在橡皮筋矩形框外部
CRectTracker::hatchInside 影陰線布滿總個矩形框
二、 CrectTracker 成員函數(shù):
1.void Draw( CDC* pDC ) const;
這個函數(shù)用來劃矩形框的邊框和內部區(qū)域勒叠。
2.void GetTrueRect( LPRECT lpTrueRect ) const;
這個函數(shù)用來獲取矩形框的 矩形坐標兜挨,參數(shù)為CRECT類型的指針,返回矩形
3.int HitTest( CPoint point ) const;
當你鼠標被按下的時候眯分,你可以調用這個函數(shù)拌汇,它將返回鼠標點在了矩形框的什么位置:
返回值代表的含義
-1點在了四邊形的外部
0左上角
1右上角
2右下角
3左下角(0,1弊决,2噪舀,3正好是順時針轉了一圈)
4頂部
5右部
6底部
7左部(還是順時針轉了一圈)
8點在了四邊形的內部魁淳,但沒有擊中前面的那八個調節(jié)點
可以看出,返回值如果大于等于零則在四邊形區(qū)域之內与倡。如果小于則說明不在區(qū)域范圍之內界逛。
4.BOOL SetCursor( CWnd* pWnd, UINT nHitTest ) const;
調用這個函數(shù)用來當鼠標放在矩形框時,顯示各種鼠標形象
5.BOOL Track( CWnd* pWnd, CPoint point, BOOL bAllowInvert = FALSE, CWnd* pWndClipTo = NULL );
這個函數(shù)用來支持人們用鼠標改變矩形框大小 或 拖拽矩形框時顯示矩形框動作
(用來調整各個調節(jié)柄以改變選區(qū)的大小和位置)
一般由WM_LBUTTONDOWN 消息來觸發(fā)這個函數(shù), 不需要編寫MouseMove函數(shù)纺座,矩形框它就自動的變大小了呢息拜?這就是Track()函數(shù)的功勞,從調用它到抬起鼠標鍵為止比驻,它時刻的改變四邊形的大小该溯。
6.BOOL TrackRubberBand( CWnd* pWnd, CPoint point, BOOL bAllowInvert = TRUE );
當鼠標在空區(qū)域拖拽時顯示橡皮筋矩形框,讓鼠標畫一個“橡皮筋”區(qū)域别惦,第一個參數(shù)狈茉,畫“橡皮筋”的窗體的指針,當然是this 掸掸,第二個參數(shù)氯庆,畫“橡皮筋”的起始點。 讓我們注意第三個參數(shù)扰付,它非常有意思堤撵。當你使用 FALSE時(TRUE 值是缺省的),你的“橡皮筋”只能從左上到右下的畫,不允許反向羽莺。
(一般可以用來重新繪制選區(qū))
特別值得注意的是:在TrackRubberBand的過程中是以右鍵的抬起為結束的实昨,這其間并沒有CView的MouseMove發(fā)生。這一點一定要記籽喂獭荒给!這時鼠標畫過的區(qū)域已經記錄在CrectTracker 類數(shù)據(jù)成員 m_rect里面了,即CrectTracker:: m_rect.
三刁卜、具體實現(xiàn)示例
1志电、在窗口類中申明成員變量 CRectTracker m_RectTracker
2、在初始化函數(shù)中初始化成員的屬性蛔趴,比如:
m_RectTracker.m_nStyle=CRectTracker::resizeInside|CRectTracker::dottedLine;//設置RectTracker樣式
m_RectTracker.m_nHandleSize = 5; //控制柄的像素大小
m_RectTracker.m_rect.SetRect(0,0,0,0); //初始化m_rect的值
3挑辆、一般在OnLButtonDown事件中操作CrectTracker對象,代碼如下
void CDM_CtrlPadDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
CRect cwrect;
GetDlgItem(IDC_STATIC_IMGCAPTURE)->GetWindowRect(&cwrect); //獲取窗體中控件的區(qū)域
ScreenToClient(&cwrect); //轉換為相對區(qū)域的CRect if(point.x>cwrect.left && point.y>cwrect.top //確保按下的坐標在控件區(qū)域內 && point.x
{
if(m_RectTracker.HitTest(point)<0) //如果未擊中矩形選擇框,重新畫選擇框
{
m_RectTracker.TrackRubberBand(this,point,TRUE);
m_RectTracker.m_rect.NormalizeRect(); //正規(guī)化矩形(關于正規(guī)化矩形下面有介紹)
}
else //如果擊中矩形選擇框
{
m_RectTracker.Track(this,point,TRUE);
m_RectTracker.m_rect.NormalizeRect(); //正規(guī)化矩形
//SendMessage(WM_LBUTTONUP,NULL,NULL);
}
Invalidate(); //刷新窗口區(qū)域孝情,使得CrectTracker對象重繪到窗口上
}
CDialog::OnLButtonDown(nFlags, point);
}
4鱼蝉、相應OnPaint消息(顯示CrectTracker對象)
只需要調用CrectTracker的Draw方法即可
m_RectTracker.Draw(&dc);//將這個四邊形選區(qū)畫出來
四、關于正規(guī)化矩形的說明
CRect::NormalizeRect
void NormalizeRect( );
說明:
此函數(shù)用來使CRect符合規(guī)范箫荡,使其高度和寬度均為正值魁亦。矩形被從四個象限規(guī)范化,通常這四個象限就是Windows用來確定坐標的菲茬。NormalizeRect比較上吉挣、下坐標的值,如果上坐標值大于下坐標的值婉弹,則將它們互換睬魂。類似的,如果左坐標的值大于右坐標的值镀赌,則將左氯哮、右坐標互換。當處理不同的映射模式和轉化的矩形時商佛,這個函數(shù)是很有用的喉钢。