CRectTracker(橡皮筋)類的使用

https://blog.csdn.net/zb774095236/article/details/84229820

CRectTracker(俗稱“橡皮筋”類)是一個非常有意思的類建钥。你在Windows中粹污,在桌面上用鼠標拖拽,便可以看到一個虛線的矩形框募胃,它便是橡皮筋.它可以用做顯示邊界全陨,你也可以扽它的八個角用來放大縮小,做框選使用。如何通過編程來實現(xiàn)這種功能呢刁品?這就是CRectTracker類的作用;

一浩姥、CrectTracker 類成員:
一 數(shù)據(jù)成員

  1. m_rect
    當前橡皮筋矩形的矩形框的位置
  2. 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ù)是很有用的喉钢。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市良姆,隨后出現(xiàn)的幾起案子肠虽,更是在濱河造成了極大的恐慌,老刑警劉巖玛追,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件税课,死亡現(xiàn)場離奇詭異,居然都是意外死亡痊剖,警方通過查閱死者的電腦和手機韩玩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來陆馁,“玉大人找颓,你說我怎么就攤上這事《7罚” “怎么了击狮?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長妇汗。 經常有香客問我帘不,道長,這世上最難降的妖魔是什么杨箭? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任寞焙,我火速辦了婚禮,結果婚禮上互婿,老公的妹妹穿的比我還像新娘捣郊。我一直安慰自己,他們只是感情好慈参,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布呛牲。 她就那樣靜靜地躺著,像睡著了一般驮配。 火紅的嫁衣襯著肌膚如雪娘扩。 梳的紋絲不亂的頭發(fā)上着茸,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天,我揣著相機與錄音琐旁,去河邊找鬼涮阔。 笑死,一個胖子當著我的面吹牛灰殴,可吹牛的內容都是我干的敬特。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼牺陶,長吁一口氣:“原來是場噩夢啊……” “哼伟阔!你這毒婦竟也來了?” 一聲冷哼從身側響起掰伸,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤皱炉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后狮鸭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體娃承,經...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年怕篷,在試婚紗的時候發(fā)現(xiàn)自己被綠了历筝。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡廊谓,死狀恐怖梳猪,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情蒸痹,我是刑警寧澤春弥,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站叠荠,受9級特大地震影響匿沛,放射性物質發(fā)生泄漏。R本人自食惡果不足惜榛鼎,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一逃呼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧者娱,春花似錦抡笼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至框沟,卻和暖如春藏古,著一層夾襖步出監(jiān)牢的瞬間增炭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工拧晕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留弟跑,地道東北人。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓防症,卻偏偏與公主長得像,于是被迫代替她去往敵國和親哎甲。 傳聞我的和親對象是個殘疾皇子蔫敲,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內容