??具體實(shí)現(xiàn)
??在實(shí)現(xiàn)3D文字時(shí)一般不使用缺省的字體設(shè)置,而是通過(guò)對(duì)字體的設(shè)置而使產(chǎn)生的3D文字在視覺(jué)上更美觀。在使用CFont類時(shí),首先要通過(guò)其成員函數(shù)CreateFontIndirect根據(jù)預(yù)先設(shè)定好的LOGFONT結(jié)構(gòu)來(lái)初始化CFont對(duì)象:
CFont m_font;
……
m_font.CreateFontIndirect(&lf);
??其參數(shù)為一個(gè)指向LOGFONT結(jié)構(gòu)的指針。LOGFONT結(jié)構(gòu)主要定義了字體的屬性,其定義可通過(guò)MSDN幫助查到:
typedef struct tagLOGFONT {
LONG lfHeight;
//字符字體高度
LONG lfWidth; //字符平均寬度
LONG lfEscapement;
//文本行逆時(shí)針旋轉(zhuǎn)角度
LONG lfOrientation; //字體角度
LONG lfWeight; //字體粗細(xì)程度
BYTE lfItalic; //傾斜
BYTE lfUnderline; //下劃線
BYTE lfStrikeOut; //刪除線
……
} LOGFONT;
??在對(duì)其進(jìn)行設(shè)置時(shí),lfOutPrecision、lfClipPrecision、lfQuality 以及l(fā)fPitchAndFamily這幾個(gè)成員變量一般可如下設(shè)置而無(wú)需改動(dòng):
LOGFONT lf;
//lf定義字體屬性
lf.lfOutPrecision= OUT_STROKE_PRECIS;
lf.lfClipPrecision= CLIP_STROKE_PRECIS;
lf.lfQuality = DRAFT_QUALITY;
lf.lfPitchAndFamily= VARIABLE_
PITCH|FF_MODERN;
??對(duì)于其他的成員變量則要根據(jù)實(shí)際需求進(jìn)行具體的設(shè)定。例如,對(duì)于本文要顯示的沒(méi)有下劃線和刪除線并且沒(méi)有傾斜處理的粗體幼圓漢字,可以采取如下設(shè)置:
lf.lfHeight = 50;
lf.lfWidth = 0;
lf.lfEscapement = 0;
lf.lfOrientation = 0;
lf.lfWeight = FW_HEAVY;
lf.lfItalic = FALSE;
lf.lfUnderline = FALSE;
lf.lfStrikeOut = FALSE;
lf.lfCharSet = GB2312_CHARSET; strcpy(lf.lfFaceName,“幼圓”);
??同其他使用CDC繪圖類進(jìn)行繪圖的程序類似,對(duì)字體進(jìn)行繪制處理也是在視類的OnDraw()函數(shù)中完成的。首先需要選擇前面設(shè)定好的字體,由于3D文字的顯示是靠?jī)蓪樱ㄉ踔粮鄬樱┪淖值寞B加而成,因此需要并將其背景設(shè)定透明,否則將僅在文字的輪廓處有3D效果,而文字內(nèi)部仍是平面的:
CFont* pOldFont = (CFont*)pDC->SelectObject(&m_font);
pDC->SetBkMode(TRANSPARENT);
??在此為了說(shuō)明原理僅選擇了兩層文字進(jìn)行疊加,可通過(guò)API函數(shù)GetSysColor獲得當(dāng)前系統(tǒng)的三維高亮度色和三維低亮度色,并對(duì)字體進(jìn)行設(shè)置,由于3維文字是文字在前,陰影在后,所以需要先對(duì)陰影部分進(jìn)行繪制:
pDC->SetTextColor(::GetSysColor(COLOR_3DDKSHADOW));
pDC->TextOut(10,10,sTemp); //sTemp為待顯示文字
??此時(shí)的效果如下圖所示,但仍是2維文字:
:[[center]][[image1]][[/center]]
??為了顯示出3維效果,需要在其上覆蓋上一層高亮度文字,顯然坐標(biāo)不能仍是(10,10),否則顯示出的文字仍是2維的。一般可通過(guò)錯(cuò)開(kāi)一兩個(gè)像素來(lái)達(dá)到不同光源位置的3D文字效果,比如在此就是在原位置向右上移動(dòng)了3個(gè)像素,可通過(guò)在平面移動(dòng)適當(dāng)?shù)木嚯x來(lái)控制3D效果的深度:
pDC->SetTextColor(::GetSysColor(COLOR_3DHILIGHT));
pDC->TextOut(13,7,sTemp);
??從下圖可以看出此時(shí)已經(jīng)具有了立體感相當(dāng)強(qiáng)的視覺(jué)效果了::
[[center]][[image2]][[/center]]
??另外,還可以通過(guò)設(shè)置路徑對(duì)象來(lái)對(duì)普通的3D文字進(jìn)行輪廓勾勒,使之具備特殊的3D效果:
pDC->BeginPath(); //開(kāi)始路徑
pDC->TextOut(13,7,sTemp,19);
//向路徑輸出漢字
pDC->EndPath(); //結(jié)束路徑
pDC->SetPolyFillMode(WINDING); //填充路徑
pDC->StrokeAndFillPath(); //繪制路徑外觀、設(shè)置填充模式
??下圖便為通過(guò)路徑輸出而得到的勾勒出輪廓的空心3D文字:
:[[center]][[image3]][[/center]]
結(jié)束語(yǔ)
??本文通過(guò)對(duì)CFont類和CDC繪圖類的使用,結(jié)合色彩學(xué)的有關(guān)知識(shí),成功地在VC下以簡(jiǎn)單的代碼實(shí)現(xiàn)了效果比較好的3維立體文字。CFont類對(duì)字體控制的能力還是很強(qiáng)的,通過(guò)對(duì)CFont類的深入研究,可對(duì)字體的顯示做出更加完備的控制。