FillRect、FrameRect、Rectangle 矩形繪製函數使用對比分析

FillRect、FrameRect函數與Rectangle函數都是用於矩形操作。Rectangle函數用於繪製矩形,包括繪製矩 形邊框線和填充矩形,而FillRect函數只用於填充矩形內部,FrameRect函數則只畫矩形的線。也就是說, Rectangle=FillRect+FrameRect。


  以上是這三個函數的關係。然而我要進一步瞭解這三個函數,還是有必要的。不要看到上面一段就覺得沒 有必要往下看了。上面的只是最基本的一個關係。實際上,我們需要了解一點其他的東西。對於函數本身來說 ,實際上沒有什麼好說的,重點在於函數背後的技術知識和一些實現的方式。


  我們要來看看矩形繪製模型。下面是矩形繪製模型圖:


  在Windows中,在GDI函數中傳入的參數指定的矩形大小,起始的座標會繪畫,而結束的座標則不會畫到, 也就是至於結束座標的前面一個像素。所以,從圖上可以看到,我們繪製一個寬80高50的矩形,實際上,我們 繪製的結束xy座標爲(79,49),而不是(80,50),而這樣剛好達到了80x50個像素的大小。只是我們需要清楚這些 細節,纔好讓我們做繪圖是可以很精確,不會再被這些細節問題煩擾。


  Rectangle函數的大小是包含了邊框和內部填充在內的。FrameRect只包含邊框線,所以,指定的座標就是 邊框線所佔據的位置。FillRect則只包含內部的填充部分。所以,FillRect指定的座標就是內部填充部分的起 始座標。


  基本上GDI矩形繪圖模型都是起始座標會在繪製的範圍內,結束的座標不再繪圖範圍內。所以,我們在交錯 使用這三個函數時,一定要注意這些細節,纔會讓繪製的圖形能夠很精確,以達到我們的目的。而不是靠不斷 的該參數瞎試。編程中是一個實踐的藝術,很多時候,你確實可以不用很清楚每一個細節,就可以通過試驗而 得到想要的結果。但是這不是推薦的做法。如果能夠把握細節而精確,就不要去試驗猜測。


  不過我們的細節掌握,還是得用程序去驗證。下面就是我測試寫的一個程序,即在客戶區隔50個像素畫一 個格子,然後鼠標左鍵單擊則將對應的格子填充成紅色,右擊則恢復爲白色。單擊的格子的矩形所在的位置, 先除以50得到行數和列數,然後再乘以50還原出一行一列的起始座標,從而計算出矩形的起點,然後每一個矩 形是50x50,所以矩形的右下角座標也就可以通過左上角(起始點)的座標計算得到。


  因爲我們是填充矩形,不是將矩形完全覆蓋,所以要將起點xy都加1,結束點xy都減一,這樣就是填充內部 的48x48個像素,這樣不會覆蓋邊框線。當然,瞭解了上述的矩形模型後,你想怎麼玩就怎麼玩。


  而通過右擊填充白色來恢復格子,當然此時的填充的位置和左鍵單擊時一樣的,只是顏色不一樣。不過我 用了FrameRect,這樣你可以看到填充的是一個邊框而已,這裏主要就是讓你熟悉一下FrameRect函數罷了。推薦 使用FillRect,因爲和着色一致,最方便。


  不過你也可以使用Rectangle函數來恢復,不過你得處理一下邊框線的顏色,因爲默認的是黑色的,所以因 此顯得麻煩點。對於這個程序的填充應用,最好的就是FillRect函數了。這也是Rectangle=FillRect +FrameRect,即Rectangle函數被分解成兩個函數的原因。分解的兩個函數書上講的少,所以特此分析了一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章