CRectTracker類的使用

2022-05-10 15:42:13 字數 2862 閱讀 5669

crecttracker(俗稱「橡皮筋」類)是乙個非常有意思的類。你在windows中經常看到這樣的情況:它可以用做顯示邊界,你也可以扽它的八個角用來放大縮小,或做框選使用。如何通過程式設計來實現這種功能呢?這就是crecttracker類的作用。下圖是這個程式執行的結果:

下面讓我們來從頭做乙個新的工程檔案,來慢慢掌握它的功能吧。

建立乙個單文件的工程檔案,將其命名為recttracke。單擊finish完成工程的建立;先編譯一下,第一次生成obj檔案吧,在它生成的過程中,我們繼續往下講解;

第一步:

在crecttrackedoc類中生成乙個公有的資料成員:m_recttracker;之所以設成公有,因為要在view中呼叫它。

class crecttrackedoc : public

cdocument

其中: m_rect是crecttracker中用來控制四邊形的大小位置的資料成員, setrect使用的是view的座標; m_nstyle是crecttracker的型別,crecttracker::resizeinside和crecttracker::resizeoutside是說明在m_rect的內部還是外部畫區域(它們是互異的),crecttrakcer::dottedline是用點劃線來畫四邊形的區域邊界。 其他的值還有: crecttracker::solidline:用來畫實線邊界;(和dottedline是互異的) crecttracker::hatchedborder:邊界帶拋麵線; crecttracker::hatchinside:內部帶拋麵線; 你可以執行前面的例子,上述引數都有使用。你也可以在第二步中逐一使用它們來加深理解它們各自的含義;

第二步:

在crecttrackeview 類中新增乙個公有成員變數bdraw,用來判斷是否需要在矩形框中畫橢圓

class crecttrackeview : public

cview

第三步:接著我門在檢視中畫乙個藍色的橢圓; 在crectview的ondraw中繼續我們的工作:

void crecttrackeview::ondraw(cdc*pdc)

pdoc->m_recttracker.draw(pdc); //

這句畫才真正的將這個四邊形畫出來;

pdc->selectobject(oldbrush);

//todo: add draw code for native data here

}

這個時候執行程式,將會看到在視類客戶區200,200,100,100的位置出現乙個矩形區域,因為bdraw引數為false,此時並沒有畫出橢圓。如下圖:

第四步:

如何像例子中的那樣隨著滑鼠的移動自動在橢圓的周圍改變游標呢?很簡單只要將下面的**加入到crecttrackeview::onsetcursor()就可以了:它呼叫了crecttracker中的setcursor()函式。 注意:onsetcursor是乙個訊息響應函式,當滑鼠在改矩形區域中的時候,會產出訊息,並呼叫onsetcursor函式。

bool crecttrackeview::onsetcursor(cwnd*pwnd, uint nhittest, uint message) 

return

cview::onsetcursor(pwnd, nhittest, message);

}

編譯執行一下,滑鼠變化了。

第五步:

新增滑鼠左鍵按下訊息響應函式,該函式功能呢:當在矩形區域內點選左鍵並拖動的時候,則在矩形區域內把橢圓繪製出來, 當在矩形區域外點選滑鼠左鍵並拖動的時候,則重新繪製乙個矩形區域。執行結果如第一張圖。

void

crecttrackeview::onlbuttondown(uint nflags, cpoint point)

else

//在矩形區域內

cview::onlbuttondown(nflags, point);

}

編譯執行,當你按下滑鼠並拖動,你將看到效果了。

我們如何讓滑鼠畫乙個「橡皮筋」區域呢? 在crecttracker類中的成員函式就是:trackrubberband(this,point,true); 注意其中的三個引數:

第乙個引數,畫「橡皮筋」的窗體的指標,當然是this; 第二個引數,畫「橡皮筋」的起始點。 讓我們注意第三個引數,它非常有意思。當你使用 false時(true 值是預設的),你的「橡皮筋」只能從左上到右下的畫,不允許反向。也就是不能夠從下往上繪圖。編譯執行一下false這個值。

特別值得注意的是:在trackrubberband的過程中是以右鍵的抬起為結束的,這其間並沒有cview的mousemove發生。這一點一定要記住!這時滑鼠畫過的區域已經記錄在temp的m_rect 中了,你可以根據它進行後續的判斷工作。至於下面的正規化語句函式的作用與crect中的正規化函式的作用一致:使四邊形的四個角的座標符合右大於左,底大於頂的座標值。它主要是為了防止你使用trackrubberband 的false引數而引起的可能出現的錯誤。

hittest(cpoint point)的功能:當你滑鼠被按下的時候,你可以呼叫這個函式,它將返回滑鼠點在了四邊形的什麼位置:

以上就是crecttracker類的用法。

CRectTracker類的使用

crecttracker類的使用crecttracker 俗稱 橡皮筋 類 是乙個非常有意思的類。你在windows中經常看到這樣的情況 它可以用做顯示邊界,你也可以扽它的八個角用來放大縮小,或做框選使用。如何通過程式設計來實現這種功能呢?這就是crecttracker類的作用 框選 顯示邊界並可以...

CRectTracker類的使用

crecttracker 俗稱 橡皮筋 類 是乙個非常有意思的類。你在windows中經常看到這樣的情況 它可以用做顯示邊界,你也可以扽它的八個角用來放大縮小,或做框選使用。如何通過程式設計來實現這種功能呢?這就是crecttracker類的作用 你開啟上面的那個工程檔案,編譯執行一下。你將看到cr...

CRectTracker類的使用

crecttracker 俗稱 橡皮筋 類 是乙個非常有意思的類。你在windows中經常看到這樣的情況 它可以用做顯示邊界,你也可以扽它的八個角用來放大縮小,或做框選使用。如何通過程式設計來實現這種功能呢?這就是crecttracker類的作用 框選 顯示邊界並可以縮放 你開啟上面的那個工程檔案,...