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