遊戲高階之千里之行始於足下 二

2021-04-08 19:31:20 字數 2657 閱讀 2293

gdi 2

在前面的學習過程中我們了解了gdi的基本用法--裝置環境,畫筆,畫刷等。在這部分的學習中我們還是建立在裝置環境的基礎之上,來**有關字型,位圖,區域的有關話題。

使用字型:

相信大家都知道什麼是字型,字型就是字樣,就是以一定的風格樣式來繪製出文字。

作為乙個windows程式設計師,你可以使用任何安裝到系統中的字型,也有專門的工具來建立自己的字型。記住,這裡的重點是任何安裝到系統中的字型,也就是說使用前要確定系統中存在這種字型。如果你所開發的遊戲使用了一種很特別的字型,其它系統中可能不存在,這時要把你所使用的字型和遊戲的安裝檔案一起打包。

但是,你可能不想把你所建立的字型安裝到使用者字型庫中去--這樣做會使得其它應用程式也能夠使用這種字型,並且無形中加重了系統的負擔。如果你所編寫的是乙個文字處理軟體,這樣做是很好的。但是,我們寫的是遊戲,所以不必這樣做,通常的做法是把字型存到某個臨時檔案中,使用時就載入它。

addfontresource()    將指定的字型檔案載入到系統字體表中

removefontresource() 將指定的字型檔案從系統字體表中刪除

當你把一種字型載入到系統的字體表中後,你就可以建立這種字型了:

hfont createfont(

int nheight,

int nwidth,

int nescapement,

int norientation,

int fnweight,

dword fdwitalic,

dword fdwunderline,

dword fdwstrickout,

dword fdwcharset,

dword fdwoutputprecision,

dword fdwquality,

dword fdwpitchandfamily,

lpctstr lpszface

);恐怖吧,我是特意把它的引數給列舉出來的!這是乙個相當繁瑣的函式,但幸運的是,其中的大多數引數我們是不用關心的,因為它們中的大多數是個地域化有關的,你一般只需要它們的預設值即可。

為了使用我們所建立的字型,首先要把他選到裝置環境中去,就像使用畫筆跟畫刷一樣。同樣要儲存就的字型物件以便以後恢復使用。 當使用完畢後記得要銷毀它,以免造成記憶體洩露。

接著你需要設定背景模式和字型顏色,由此引出下面兩個函式的應用:

setbkmode()      設定字型背景

settextcolor()   設定字型顏色

最後,我們需要把文字列印出來,這是我們的最終目的:

textout()        在指定位置列印指定文字

以上函式的詳細定義請參閱msdn

下面我們來看這個程式段:

在你的程式裡加入類似上面的程式段就能達到我們的目的。

drawtext()     在指定位置以指定風格來繪製文字,功能與textout一致,只是使用上有不同。

區域的建立與使用:

乙個區域也是乙個gdi物件,就像是畫筆,畫刷或者字型物件一樣。區域可以使一些本來很複雜的問題變得很簡單。但是,由於處理區域的代價是比較大的,所以在實際應用中很少使用。

區域其實就是乙個形狀--矩形,圓角矩形,橢圓,多邊形等。我們也可以對區域施加多種操作:可以填充它(fillrgn()),為它制定框架(framergn())等,還可以判斷乙個點是否位於特定的區域中。

跟其它gdi物件一樣,區域物件通過控制代碼(hrgn)來操作的,下面是一些建立區域的函式:

函式                    區域型別

createellipticrgn       橢圓區域

createpolygonrgn        多邊形區域

createrectrgn           矩形區域

createroundrectrgn      圓角矩形區域 

區域的刪除和所有的gdi物件一樣是通過deleteobject()來刪除的。

區域的使用:

區域的最大用處就是將操作鎖定在乙個固定的範圍之內,這個範圍就是所建立的區域。比如我們要畫某一物體,但只想讓這個物體固定在某一範圍內,此時,區域就擔起了固定範圍的這個責任。而且我們只需要把所建立的區域物件選入到裝置環境中就可以了,跟其它gdi物件的操作一樣簡單。下面我們來看這段**段:

int nstripey=rcclient.bottom;

for(ncount=0;ncount<10;ncount++)

releasedc(hwindow);

…………

}上面就是在乙個特定的區域內繪製圖形的例子,它所繪製出的圖形如下圖:

比較有趣的一點馬上就要出現了,首先使這個視窗失去焦點,然後再恢復就變成了下面這個情形了:

我們發現只有我們所定義的那塊區域被重新繪製,其它地方沒有發生變化。也是只有這樣我們的印象才會更為深刻。

如果用這段**來代替上面建立區域的那段**輸出將是什麼樣子的呢?這個工作留給大家自己來完成:

區域的其它功能:

我們還可以利用區域來填充人意的圖形, 就像把一張郵票貼到一張紙上一樣.

我不打算在這個話題上用過多的時間,我只是將相關的函式給大家列舉在下面,具體的實踐就交給大家自己來完成了.雖然在以後的學習中我們將不會再看到這些函式,但是我感覺有必要把這些函式給大家列舉一下:

fillrgn()

paintrgn()

framergn()

以上函式的具體應用請大家參閱msdn

千里之行,始於足下

公司訂有乙份電腦報,一般也沒有時間看它,有時去廁所的時候會找一張隨便翻翻,呵呵。前天就無意中翻到了乙個大專題,說什麼計算機專業就業率低,正規軍幹不過游擊隊,甚至有個香港的大學教授說內地的計算機教學基本沒有等等,佔據了該期電腦報的好幾個主要版面,其批判原力度不可謂不大。昨天,在csdn上發現也有 由於...

千里之行始於足下

有句話叫 萬事開頭難 說得有道理,但是我覺得更難的是開頭之後,怎麼堅持下去。自己活了26年了,耳濡目染和親身經歷,我都覺得,能夠一直堅持做某件事,確實太難了,不管這個事情有多麼微小,多麼容易做到。我仔細思考了下,我理解應該有以下這麼幾個原因 1 懶惰 不愛動,不愛寫,不想跑步,不想健身,不想記錄,不...

千里之行,始於足下。

以前更多還是偏愛於看別人的技術部落格,來解決自己實際開發中遇到的問題。但是這樣做很容易忘記當時的收穫,並沒有將別人的東西變成自己的東西。同時還養成了一碰到問題就向網路伸手的壞習慣,極少自己去思考和驗證,從來都是能解決我遇到的問題就ok,解決完了問題就把曾經撿起的知識丟到一邊。從業半年以來,每當我深思...