OpenGL顯示文字 顯示漢字

2021-05-11 07:53:06 字數 1888 閱讀 9175

本文**:http://blog.sina.com.cn/s/blog_4ff085000100dew0.html

原則上,顯示中文和顯示英文並無不同,同樣是把要顯示的字元做成顯示列表,然後進行呼叫。

但是有乙個問題,英文本母很少,最多只有幾百個,為每個字母建立乙個顯示列表,沒有問題。但是漢字有非常多個,如果每個漢字都產生乙個顯示列表,這是不切實際的。

我們不能在初始化時就為每個字元建立乙個顯示列表,那就只有在每次繪製字元時建立它了。當我們需要繪製乙個字元時,建立對應的顯示列表,等繪製完畢後,再將它銷毀。

這裡還經常涉及到中文亂碼的問題,我對這個問題也不甚了解,但是網上流傳的版本中,使用了multibytetowidechar這個函式的,基本上都沒有出現亂碼,所以我也準備用這個函式:)

這裡我略知一二:也就是說中文佔兩個字元,英文佔乙個字元,當然把兩個字元的東西放到乙個字元的空間裡面會產生截斷咯,自然不能正常顯示。

不過解決辦法也不是只有一種,還有乙個方法我在後面的文章中會說到。

通常我們在c語言裡面使用的字串,如果中英文混合的話,例如「this is 中文字元.」,則英文本元只占用乙個位元組,而中文字元則占用兩個位元組。用multibytetowidechar函式,可以轉化為所有的字元都佔兩個位元組(同時解決了前面所說的亂碼問題:))。

(注:這裡會有另乙個問題:對於英文本元來說也用兩個位元組會造成不必要的空間浪費,我們理想的狀態應該是英文只用乙個位元組,漢字用兩個(這是不是可以實現呢?))

轉化的**如下:

// 計算字元的個數

// 如果是雙位元組字元的(比如中文字元),兩個位元組才算乙個字元

// 否則乙個位元組算乙個字元

len = 0;

for(i=0; str[i]!='/0'; ++i)

// 將混合字元轉化為寬字元

wstring = (

wchar_t*)

malloc((len+1) *

sizeof(

wchar_t));

multibytetowidechar(cp_acp, mb_precomposed, str, -1,

wstring, len);

wstring[len] = l'/0';

// 用完後記得釋放記憶體

free(

wstring);

加上前面所講到的wglusefontbitmaps函式,即可顯示中文字元了。

void drawcnstring(

const

char* str)

// 將混合字元轉化為寬字元

wstring = (

wchar_t*)

malloc((len+1) *

sizeof(

wchar_t));

multibytetowidechar(cp_acp, mb_precomposed, str, -1,

wstring, len);

wstring[len] = l'/0';

// 逐個輸出字元

for(i=0; iwstring[i], 1,

list);

glcalllist(

list); }

// **所有臨時資源

free(

wstring);

gldeletelists(

list, 1); }

注意我用了wglusefontbitmapsw函式,而不是wglusefontbitmaps。wglusefontbitmapsw是wglusefontbitmaps函式的寬字元版本,它認為字元都佔兩個位元組。因為這裡使用了multibytetowidechar,每個字元其實是佔兩個位元組的,所以應該用wglusefontbitmapsw。

void display(

void)

效果如圖:

opengl顯示文字

wglusefontbitmaps 函式顯示文字 使用wglusefontbitmaps 將ascii字元裝入顯示列表,然後使用glcalllists 函式利用顯示列表序列顯示文字。wglusefontbitmaps有四個引數,分別是當前使用的dc 從第幾個ascii字元起始裝入列表 裝入列表的as...

OpenGL文字顯示

opengl文字顯示 2010年06月22日 本文參考nehe第13課影象字型。大致三步 1.建立字型的函式 buildfont 建立位圖字型 glvoid buildfont glvoid 其中base是乙個全域性變數 gluint base 繪製字型的顯示列表的開始位置 關於createfont...

OpenGL顯示文字 顯示字元

opengl並沒有直接提供顯示文字的功能,並且,opengl也沒有自帶專門的字型檔。因此,要顯示文字,就必須依賴作業系統所提供的功能了。各種流行的圖形作業系統,例如windows系統和linux系統,都提供了一些功能,以便能夠在opengl程式中方便的顯示文字。最常見的方法就是,我們給出乙個字元,給...