CRectTracker類的使用 經典教學!!

2021-08-25 18:06:15 字數 3045 閱讀 1548

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

(框選) (顯示邊界並可以縮放)

例子(源程式)

你開啟上面的那個工程檔案,編譯執行一下。你將看到crecttracker的幾種功能;

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

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

第一步:

在crectdoc類中生成乙個公有的資料成員:m_recttracker;之所以設成公有,因為要在view中呼叫它。接著我們來初始化它,在crectdoc::crectdoc建構函式中:

crectdoc::crectdoc()

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

第二步:

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

void crectview::ondraw(cdc* pdc) 

注釋已經在程式裡了,不用再多說,編譯一下。乙個橢圓外帶四邊形邊界(點劃線),且四邊形的四周有八個黑點;這就是crecttracker.,你現在可以改變一下m_nstyle試試看各引數的含義;

第三步:如何象例子中的那樣隨著滑鼠的移動自動在橢圓的周圍改變游標呢?很簡單只要將下面的**加入到crectview::onsetcursor()就可以了:它呼叫了crecttracker中的setcursor()函式:

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

編譯執行一下,滑鼠變化了。 第四步:我們再做另乙個用於滑鼠的crecttracker類。它的作用是在滑鼠按下以後可以顯示虛線的選擇框: 先讓我們看看效果:

在crectview中的加入如下**:

void crectview::onlbuttondown(uint nflags, cpoint point) 

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

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

第乙個引數,畫「橡皮筋」的窗體的指標,當然是this

第二個引數,畫「橡皮筋」的起始點。

讓我們注意第三個引數,它非常有意思。當你使用 false時(true 值是預設的),你的「橡皮筋」只能從左上到右下的畫,不允許反向。編譯執行一下false這個值。

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

第五步:

讓我們回到那個藍色的橢圓,在開始新的步驟之前,首先來介紹一下hittest(cpoint point)的功能:當你滑鼠被按下的時候,你可以呼叫這個函式,它將返回滑鼠點在了四邊形的什麼位置:

返回值代表的含義

-1點在了四邊形的外部

0左上角

1右上角

2右下角

3左下角(0,1,2,3順時針轉了一圈)4頂部

5右部6底部

7左部(還是順時針轉了一圈)

8點在了四邊形的內部,但沒有擊中前面的那八個點

可以看出,返回值如果大於等於零則在四邊形區域之內。如果小於則說明不在區域範圍之內。因此我們需要加乙個公有的成員函式:bool bdraw;為了方便起見,我把它加到crectview中,(你也許會說,為什麼不加到doc中,我也知道這有勃程式設計的原理,反正我高興就得,都說c++給人了很大的自由度,所以你也別限制我)。先把它初始化為false,表示不畫邊界,當true時,表示要畫邊界。 定義:

class crectview : public cview

初始化:

crectview::crectview()

將ondraw改一下,加一句話:

void crectview::ondraw(cdc* pdc)

編譯執行一下,橢圓的邊界沒有了。

好了,預備知識講完了,讓我們來完成這個程式吧:

void crectview::onlbuttondown(uint nflags, cpoint point)

else

//在四邊形區域內:

cview::onlbuttondown(nflags, point);

}

你也許會問,為什麼我沒有編寫mousemove函式,它就自動的變大小了呢?這就是track()函式的功勞,從呼叫它到抬起滑鼠鍵為止,它時刻的改變m_recttracker的四邊形的大小。然後由於我們使用了invalidate()函式,所以重新畫了這個橢圓,因此它好象被放大縮小了似

CRectTracker類的使用

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

CRectTracker類的使用

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

CRectTracker類的使用

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