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