国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
字體設(shè)置
一般情況下,程序開發(fā)人員都希望自己的程序美觀大方,為了達(dá)到這一個要求,想盡辦法美化自己的程序,另一方面,文字是程序界面上不可或缺的一種傳遞信息的途徑,如果在界面上適當(dāng)?shù)牡胤教砑硬@示各種特殊效果的文字,將不失為一個好的選擇,可以達(dá)到事半功倍的效果,本例針對Visual C++中編程實現(xiàn)文字的特殊顯示效果這一問題,通過編寫一個簡單的小程序,介紹如何實現(xiàn)這一目標(biāo)。讀者朋友可以稍加改動,將該方法應(yīng)用到自己的程序中去。

圖一 字符串的環(huán)繞顯示

圖二、3D文字效果


  一、實現(xiàn)方法

  在講述文字的各種處理效果之前,我們首先來介紹Visual C++中的MFC提供的用來創(chuàng)建字體的CFont類。對于Windows程序開發(fā)人員來說,可以創(chuàng)建的字體有兩種:庫存字體(該字體直接使用字體的索引選入設(shè)備上下文就可以了,例如:CDC::CreateStockObject(int nIndex ))和自定義字體。

  CFONT類從CgdiObject派生而來,該類的對象可以通過Createfont()、CreateFontIndirect()等函數(shù)創(chuàng)建自定義的字體。兩個函數(shù)原型分別如下:
CFont::CreateFontIndirect(const LOGFONT* lpLogFont );
CFont::CreateFont( int nHeight, int nWidth, int nEscapement, int nOrientation, int nWeight, BYTE bItalic, BYTE bUnderline, BYTE cStrikeOut, BYTE nCharSet, BYTE nOutPrecision, BYTE nClipPrecision, BYTE nQuality, BYTE nPitchAndFamily, LPCTSTR lpszFacename )。


  其中第二個函數(shù)的參數(shù)和第一個函數(shù)中的LOGFONT類型的參數(shù)的的分量有一一對應(yīng)的關(guān)系。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;


  在對LOGFONT結(jié)構(gòu)進(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,"幼圓");


 ?。ㄒ唬╋@示傾斜的文字

  上文中的圖一顯示了通過顯示一系列的傾斜字符串來實現(xiàn)環(huán)繞顯示的效果,下面來詳細(xì)說明如何實現(xiàn)這個效果。

  實現(xiàn)上述的效果其實很容易,只要使用CFONT類和LOGFONT結(jié)構(gòu)來靈活的創(chuàng)建字體,設(shè)置字體的屬性,就可以實現(xiàn)傾斜文字的效果。LOGFONT結(jié)構(gòu)中包含了所要創(chuàng)建的字體中的全部信息,其中的ifEscapement 成員制定了所創(chuàng)建的字體與水平方向所傾斜的角度,需要讀者注意的是該成員變量角度的單位是十分之一度而不是度,例如,如果ifEscapement定義為450,它表示字體的傾斜角度為45度。為了保證所有的字體按照一個方向旋轉(zhuǎn),一定要設(shè)置ifEscapenent的CLIP_LH_ANGLES位,否則字體有可能向反方向旋轉(zhuǎn)。

  如同使用其它GDI(圖形用戶界面接口)對象一樣,在使用你定義的字體以前,必須要將創(chuàng)建的字體選入DC中(設(shè)備上下文)。

 ?。ǘ崿F(xiàn)3D文字

  計算機(jī)屏幕是平面二維的,我們之所以能欣賞到真如實物般的三維圖像,是因為顯示在計算機(jī)屏幕上時色彩灰度的不同而使人眼產(chǎn)生視覺上的錯覺,而將二維的計算機(jī)屏幕感知為三維圖像?;谏蕦W(xué)的有關(guān)知識,三維物體邊緣的凸出部分一般顯高亮度色,而凹下去的部分由于受光線的遮擋而顯暗色。這一認(rèn)識被廣泛應(yīng)用于網(wǎng)頁或其他應(yīng)用中對按鈕、3D線條的繪制。對于本文所要繪制的3D文字同樣也適用,即在原始位置顯示高亮度顏色,而在左下或右上等位置用低亮度顏色勾勒出其輪廓,這樣在視覺上便會產(chǎn)生3D文字的效果。具體實現(xiàn)時,可用完全一樣的字體在不同的位置分別繪制兩個不同顏色的2D文字,只要使兩個文字的坐標(biāo)合適,就完全可以在視覺上產(chǎn)生出不同效果的3D文字。

  具體實現(xiàn)的思想是通過CDC::SetTextColor()分別設(shè)置文字的顏色為高亮(3DHILIGHT)和陰影(3DSHADOW)的狀態(tài)下顯示文字;同時注意在兩次顯示文字時要錯開幾個像素,這樣才能達(dá)到預(yù)期的效果。實現(xiàn)的效果上文的圖二所示。

  (三)文字的漸變效果

  為了實現(xiàn)文字的漸變效果,需要設(shè)置一個定時器(使用SetTimer()函數(shù)),在定時器響應(yīng)函數(shù)處理過程中,通過調(diào)用CDC:SetTextColor()函數(shù)不斷改變設(shè)備上下文中文本的顯示顏色,從而實現(xiàn)文字的漸變效果。文本的顏色是通過RGB(紅、綠、蘭)三種基本顏色的混合所形成的最終結(jié)果,RGB三基色的變化范圍都是(0,255),R=G=B時,顏色的效果是灰色的,所謂灰色,就是在純白和純黑之間的一種過渡色,當(dāng)R=G=B=0時,顏色為黑色,當(dāng)R=G=B=255時,顏色為純白色,可以定義一個修正變量,不斷的對該三基色進(jìn)行遞增或遞減,從而實現(xiàn)文字的漸變顯示。這里僅僅給出實現(xiàn)的思路,讀者自己可以很容易的實現(xiàn)代碼。

 ?。ㄋ模┢渌?br>
  另外,還可以通過設(shè)置路徑對象來對普通的文字進(jìn)行輪廓勾勒,使之具備特殊的效果。路徑是Win32中新增的一個GDI對象,下面先從概念上談起。

  1)路徑的概念

  在Windows 95/NT 這樣的Win32操作系統(tǒng)中,除了已有的位圖,畫筆,畫刷,字體,調(diào)色板和區(qū)域之外,還增加了一個新的GDI對象:路徑。路徑是可以被填充,畫出輪廓或同時被畫出輪廓并填充的一個或多個圖形。路徑的引入,大大地豐富了Windows的圖形功能,使得應(yīng)用程序可以方便地建立復(fù)雜區(qū)域,繪制和填充不規(guī)則圖形。這里說的不規(guī)則圖形是指由直線和貝塞爾曲線組成的圖形(相對于矩形,多邊形,橢圓等規(guī)則圖形)。

  2)路徑的使用

  與其它原有的GDI對象不同的是,MFC類庫沒有專門用一個C++類來封裝路徑對象(或許在以后的版本中會得到支持)。有關(guān)路徑的定義和使用等各種操作都必須通過調(diào)用API函數(shù)(或CDC類中對應(yīng)的成員函數(shù))來實現(xiàn)。路徑的使用過程大致如下:

 ?。?)調(diào)用BeginPath()函數(shù)開始路徑定義;

  (2)調(diào)用GDI繪圖函數(shù)來定義路徑;在Win32中,可以用于定義路徑的GDI繪圖函數(shù)包括:AngleArc()、 Arc()、 ArcToChord()、Ellipse ()、LineTo()、TextOut()等函數(shù);

 ?。?)調(diào)用EndPath()函數(shù)結(jié)束路徑定義; 

  完成路徑定義后,所定義的路徑即被同時選進(jìn)設(shè)備描述表,設(shè)備描述表中原有的路徑對象在調(diào)用BeginPath()函數(shù)開始路徑定義時即被廢棄。

 ?。?)使用路徑對象。

  完成路徑定義工作之后,應(yīng)用程序便可以利用有關(guān)GDI函數(shù)來使用路徑,這些函數(shù)包括繪制路徑輪廓StrokePath(),填充路徑FillPath(),繪制輪廓并填充StrokeAndFillPath(),把路徑轉(zhuǎn)換成區(qū)域PathToRegion(),把路徑直線化FlattenPath(),提取路徑數(shù)據(jù)GetPath(),加寬路徑WidenPath()和設(shè)置裁剪路徑SelectClipPath()等。這些函數(shù)的具體使用方法可參閱有關(guān)的SDK文檔。

  下面的代碼演示了如何實現(xiàn)字體的空心效果
////////////////////////////////////// 應(yīng)用程序主窗口的重繪函數(shù)
void CMyWnd::OnPaint()
{
 // 獲得窗口的客戶區(qū)設(shè)備上下文句柄
 CPaintDC dc(this); // 更改當(dāng)前字體
 LOGFONT lf;
 dc.GetCurrentFont()->GetLogFont(&lf);
 CFont font;
 CFont *pOldFont; // 保存設(shè)備上下文最初使用的字體對象
 lf.lfCharSet=134;
 lf.lfHeight=-150;
 lf.lfHeight=-150;
 lf.lfWidth=0;
 strcpy(lf.lfFaceName, "隸書");
 font.CreateFontIndirect(&lf);
 pOldFont=dc.SelectObject(&font);
 dc.SetBkMode(TRANSPARENT); // 更改當(dāng)前畫筆
 CPen pen(PS_SOLID, 1, #ff0000);
 CPen *pOldPen;
 pOldPen=dc.SelectObject(&pen); // 開始一個路徑
 dc.BeginPath();
 dc.TextOut(10, 10, "空心字");
 dc.EndPath(); // 繪制路徑
 dc.StrokePath();
 //可以用dc.StrokeAndFillPath()函數(shù)來代替,不過該函數(shù)會使用當(dāng)前刷子填充路徑的內(nèi)部。
 dc.SelectObject(pOldFont);
 dc.SelectObject(pOldPen);
}


  二、編程步驟

  1、啟動Visual C++6.0,生成一個單文檔視圖結(jié)構(gòu)的程序(對于旋轉(zhuǎn)字體的程序:項目名為ViewFont;對于3D效果的程序:項目名為 3DText);

  2、重載應(yīng)用程序的OnDraw(CDC* pDC)函數(shù);

  3、添加代碼,編譯運行程序;
三、程序代碼
////////////////////////////////////旋轉(zhuǎn)字體
void CViewFontView::OnDraw(CDC* pDC)
{
 CViewFontDoc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 // TODO: add draw code for native data here
 CString str(_T("Visua C++6.0編程實例"));//定義要顯示的字符串;
 CRect rect;
 GetClientRect(&rect);
 pDC->SetBkMode(TRANSPARENT);//設(shè)置背景為透明效果;
 pDC->SetTextColor(#6464ff);//設(shè)置顯示的文本顏色;
 CFont font;
 LOGFONT stFont;//定義字體結(jié)構(gòu);
 memset(&stFont,0,sizeof(stFont));//設(shè)置字體結(jié)構(gòu)的屬性;
 stFont.lfHeight=30;
 stFont.lfWeight=FW_NORMAL;
 stFont.lfClipPrecision=CLIP_LH_ANGLES;
 strcpy(stFont.lfFaceName,"Arial");
 //下面的代碼以視圖中心為圓點,在半徑100的圓周上每隔30度顯示字符串;
 for(double i=0;i<3600;i+=300)
 {
  stFont.lfEscapement=i;//設(shè)置字體的傾斜角度;
  font.CreateFontIndirect(&stFont);//根據(jù)字體結(jié)構(gòu)創(chuàng)建字體對象;
  CFont *oldFont;
  oldFont=pDC->SelectObject(&font);//將創(chuàng)建的字體選入設(shè)備上下文;
  if(i<900)
   pDC->TextOut(rect.left+rect.Width )/2+100*cos(i/1800*3.14),rect.top+rect.Height ()/2-100*sin(i/1800*3.14),str);
  if(i>=900&&i<1800)
   pDC->TextOut(rect.left+rect.Width ()/2+100*cos(i/1800*3.14),
rect.top+rect.Height ()/2-100*sin(i/1800*3.14),str);
  if(i>=1800&&i<2700)
   pDC->TextOut(rect.left+rect.Width ()/2+100*cos(i/1800*3.14),
rect.top+rect.Height ()/2-100*sin(i/1800*3.14),str);
  if(i>=2700&&i<=3600)
   pDC->TextOut(rect.left+rect.Width ()/2+100*cos(i/1800*3.14),
rect.top+rect.Height ()/2-100*sin(i/1800*3.14),str);
  pDC->SelectObject(oldFont);//恢復(fù)設(shè)備上下文的字體;
  font.DeleteObject ();//刪除創(chuàng)建的字體;
 }
}

//////////////////////////////////////////顯示3D效果的程序

void CMy3DTextView::OnDraw(CDC* pDC)
{
 CMy3DTextDoc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 // TODO: add draw code for native data here
 CString string;
 string="Visual C++6.0編程實例";
 CFont m_fontLogo;
 m_fontLogo.CreateFont(144, 0, 0, 0, 155, FALSE, FALSE,0,0,0,0,0,0, "Arial");
 //創(chuàng)建字體;
 pDC->SetBkMode(TRANSPARENT);
 CRect rectText;
 GetClientRect(&rectText);
 CFont * OldFont = pDC->SelectObject(&m_fontLogo);
 COLORREF OldColor = pDC->SetTextColor( ::GetSysColor( COLOR_3DSHADOW));
 //陰影狀態(tài)顯示文字;
 pDC->DrawText( string, rectText+CPoint(2,2) , DT_SINGLELINE | DT_LEFT |DT_VCENTER|DT_CENTER);
 pDC->SetTextColor(::GetSysColor( COLOR_3DHILIGHT) );
 //高亮狀態(tài)顯示文字;
 pDC->DrawText( string, rectText, DT_SINGLELINE | DT_LEFT |DT_VCENTER|DT_CENTER);
 pDC->SetTextColor( OldColor);
 pDC->SelectObject(OldFont);
 m_fontLogo.DeleteObject();
}


  四、小結(jié)

  讀者只要掌握了上面的內(nèi)容,靈活運用Cfont和LOGFONT結(jié)構(gòu)創(chuàng)建不同的字體,再結(jié)合顯示顏色、位置、時間的設(shè)置,相信一定還可以實現(xiàn)更多的動態(tài)效果來。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
vc中控件字體的設(shè)置
怎樣在對話框上輸出文字使它豎著顯示?
beginpath路徑
文本和字體
從CStatic派生新類,形成具有可以改變字體、背景顏色 和字體顏色的控件類
VC 中的字體設(shè)置
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服